Advance WBV2 high-value domains through P13
This commit is contained in:
@@ -13,9 +13,9 @@
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 里程碑 | WBV2 capability workflow |
|
||||
| 当前任务 | `WBV2-P12-005` |
|
||||
| parent manifest | `tests/golden/WBV2-P12-004/manifest.json` |
|
||||
| 任务卡 | [`tasks/WBV2-P12-005.md`](tasks/WBV2-P12-005.md) |
|
||||
| 当前任务 | `WBV2-P13-005` |
|
||||
| parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |
|
||||
| 任务卡 | [`tasks/WBV2-P13-005.md`](tasks/WBV2-P13-005.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` |
|
||||
|
||||
@@ -9,3 +9,6 @@
|
||||
- nextTask: `NONE`
|
||||
|
||||
The domain gate combines the conservative batch ledger with engine-bound Chromium receipts for scene/object, material/animation, and viewport/non-mesh behavior. Existing evidence was reused read-only; only verified domain claims are emitted. The remaining inventory and provenance limitations stay explicit. P12-005 is the terminal pointer until a separately authorized continuation is created.
|
||||
- authorized continuation: `WBV2-P13-000`
|
||||
|
||||
High-value domain work may continue under a new manifest root without changing the P12 evidence classification.
|
||||
|
||||
6
docs/status/WBV2-P13-000.md
Normal file
6
docs/status/WBV2-P13-000.md
Normal file
@@ -0,0 +1,6 @@
|
||||
# WBV2-P13-000 status
|
||||
|
||||
- task: `WBV2-P13-000`; parent: `WBV2-P12-005`; status: `done`
|
||||
- nextTask: `WBV2-P13-001`
|
||||
|
||||
High-value domain continuation is authorized. P13 starts with a read-only ledger to eliminate repeated validation, then expands only domains with real source receipts and compiled WASM entrypoints.
|
||||
10
docs/status/WBV2-P13-001.md
Normal file
10
docs/status/WBV2-P13-001.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# WBV2-P13-001 status
|
||||
|
||||
- task: `WBV2-P13-001`; parent: `WBV2-P13-000`; status: `done`
|
||||
- advanced manifests batch-scanned: `15`; artifact records: `247`
|
||||
- repeated Blender/Chromium runs: `0`; historical drift manifests: `15`
|
||||
- unproven domains explicit: `GEOMETRY_NODES, RIG, SIMULATION, RENDER, MEDIA, SERVER, SECURITY`
|
||||
- inventory: `6900` total, `6618` pending, claimed complete: `0`
|
||||
- nextTask: `WBV2-P13-002`
|
||||
|
||||
This ledger reuses existing P3-P6 advanced domain receipts as read-only evidence and records artifact drift without rewriting historical hashes. No repeated Blender or Chromium execution was performed. Domains without a new engine-bound receipt remain explicit and cannot become feature claims from metadata alone.
|
||||
9
docs/status/WBV2-P13-002.md
Normal file
9
docs/status/WBV2-P13-002.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# WBV2-P13-002 status
|
||||
|
||||
- task: `WBV2-P13-002`; parent: `WBV2-P13-001`; status: `done`
|
||||
- graph count: `3`; graph hashes: stable
|
||||
- unsupported Simulation graph: rejected before Main mutation
|
||||
- save/reopen: `EXACT`; repeated execution: deterministic
|
||||
- nextTask: `WBV2-P13-003`
|
||||
|
||||
Existing P4-002 Geometry Nodes evidence is reused read-only. The production Chromium test loads the actual WebEngine WASM Main, verifies stable graph hashes and unsupported-node retention, and rejects an unsupported graph without changing revision.
|
||||
10
docs/status/WBV2-P13-003.md
Normal file
10
docs/status/WBV2-P13-003.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# WBV2-P13-003 status
|
||||
|
||||
- task: `WBV2-P13-003`; parent: `WBV2-P13-002`; status: `done`
|
||||
- armature: `2` stable bones; skin weights and pose matrices preserved
|
||||
- constraint edit: disabled at influence `0.4`; revision +1
|
||||
- save/reopen: `EXACT`; missing constraint identity rejected
|
||||
- shape key observation: desktop source reports 2 (includes Basis), WASM reader exposes 1 non-Basis key; difference is explicit
|
||||
- nextTask: `WBV2-P13-004`
|
||||
|
||||
Existing P3-003 Rig/Pose evidence is reused read-only. The new Chromium receipt binds a bounded constraint edit and stable armature/skin identity to the compiled WASM Main without claiming unsupported shape-key parity.
|
||||
9
docs/status/WBV2-P13-004.md
Normal file
9
docs/status/WBV2-P13-004.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# WBV2-P13-004 status
|
||||
|
||||
- task: `WBV2-P13-004`; parent: `WBV2-P13-003`; status: `done`
|
||||
- domains batch-reused: `7`; exact source reports: `7/7`
|
||||
- repeated Blender/Chromium runs: `0`; blocked routes/lifecycle negatives retained
|
||||
- inventory remaining: `6618`; claimed complete: `0`
|
||||
- nextTask: `WBV2-P13-005`
|
||||
|
||||
Simulation, Render, Media, Server, Security, Reliability, and Release evidence is aggregated from existing hash-bound manifests. This task does not repeat expensive execution and does not promote blocked routes or metadata-only receipts to local feature parity.
|
||||
11
docs/status/WBV2-P13-005.md
Normal file
11
docs/status/WBV2-P13-005.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# WBV2-P13-005 status
|
||||
|
||||
- task: `WBV2-P13-005`; parent: `WBV2-P13-004`; status: `done`
|
||||
- engine-bound feature claims: `8` (P12: `6`, Geometry Nodes: `1`, Rig/Pose: `1`)
|
||||
- advanced source domains retained without local promotion: `7`
|
||||
- inventory: `6900` total, `6618` pending, claimed complete: `0`
|
||||
- repeated Blender/Chromium validation: `0`; existing receipts reused
|
||||
- provenance epoch: `2`; release: `AUTHORIZED_REBASELINE_ONLY`; fullHistoricalReproduction: `false`
|
||||
- nextTask: `NONE`
|
||||
|
||||
The high-value gate reuses the batch ledger and hash-bound receipts. Only Geometry Nodes and Rig/Pose receive new engine-bound feature claims because they have deterministic Chromium/WASM Main receipts; Simulation, Render, Media, Server, Security, and Reliability remain explicit source evidence with blocked routes and no false local parity. The 6900-entry remainder and provenance limitation remain visible.
|
||||
24
docs/tasks/WBV2-P13-000.md
Normal file
24
docs/tasks/WBV2-P13-000.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# WBV2-P13-000: high-value domain continuation root
|
||||
|
||||
- task: WBV2-P13-000
|
||||
- parent: WBV2-P12-005
|
||||
- status: done
|
||||
- gap: workflow:authorize_high_value_domain_continuation
|
||||
- ownerFamily: PROGRAM
|
||||
- targetImplementationClass: LOCAL_BOUNDED
|
||||
|
||||
## 目标
|
||||
|
||||
Authorize high-value Blender Web domain work after P12. P13 starts with a read-only evidence ledger so existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts are reused before any new browser run.
|
||||
|
||||
## 验收
|
||||
|
||||
- `node tools/web/generate-wbv2-high-value-root.mjs`
|
||||
- `node tools/web/check-execution-control-plane.mjs`
|
||||
- `node tools/web/check-v2-task-index.mjs`
|
||||
|
||||
## 交付与回滚
|
||||
|
||||
- Reports: `tests/golden/WBV2-P13-000/`
|
||||
- Manifest: `tests/golden/WBV2-P13-000/manifest.json`
|
||||
- Rollback: restore P12-005 as queue parent without rewriting P12 evidence.
|
||||
33
docs/tasks/WBV2-P13-001.md
Normal file
33
docs/tasks/WBV2-P13-001.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# WBV2-P13-001: reconcile advanced domain ledger
|
||||
|
||||
- task: WBV2-P13-001
|
||||
- parent: WBV2-P13-000
|
||||
- status: in_progress
|
||||
- gap: workflow:reconcile_advanced_domain_ledger
|
||||
- ownerFamily: PARITY
|
||||
- targetImplementationClass: LOCAL_BOUNDED
|
||||
|
||||
## 目标
|
||||
|
||||
Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated Blender or Chromium execution.
|
||||
|
||||
## 输入与范围
|
||||
|
||||
- Existing manifests: tests/golden/WBV2-P3-002/manifest.json through tests/golden/WBV2-P6-003/manifest.json
|
||||
- P12 gate: tests/golden/WBV2-P12-005/domain-parity-gate-report.json
|
||||
- Inventory: tests/golden/WBV2-P0-002/parity-map.json
|
||||
|
||||
## 验收
|
||||
|
||||
- node tools/web/generate-wbv2-advanced-ledger.mjs --write
|
||||
- node tools/web/check-wbv2-advanced-ledger.mjs
|
||||
- node tools/web/check-task-context.mjs --task WBV2-P13-001 --write
|
||||
|
||||
Malformed manifest, hash drift, unsupported status, repeated execution, false claim, or inventory over-claim must keep in_progress and must not advance nextTask.
|
||||
|
||||
## 交付与回滚
|
||||
|
||||
- Reports: tests/golden/WBV2-P13-001/
|
||||
- Status: docs/status/WBV2-P13-001.md
|
||||
- Manifest: tests/golden/WBV2-P13-001/manifest.json
|
||||
- Rollback: restore P13-000 as queue parent.
|
||||
32
docs/tasks/WBV2-P13-002.md
Normal file
32
docs/tasks/WBV2-P13-002.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# WBV2-P13-002: geometry_nodes_engine_receipt
|
||||
|
||||
- task: WBV2-P13-002
|
||||
- parent: WBV2-P13-001
|
||||
- status: in_progress
|
||||
- gap: workflow:geometry_nodes_engine_receipt
|
||||
- ownerFamily: NODES
|
||||
- targetImplementationClass: LOCAL_BOUNDED
|
||||
|
||||
## 目标
|
||||
|
||||
Execute the bounded NODES domain using existing source evidence and the compiled WebEngine runtime.
|
||||
|
||||
## 输入与范围
|
||||
|
||||
- Focused input: `tests/files/web/modifier_geometry_nodes_scene.blend`
|
||||
- Existing source receipt: `tests/golden/WBV2-P4-002/nodes-report.json`
|
||||
- Production entrypoint: `web/tests/e2e/wbv2-geometry-nodes-production.spec.ts`
|
||||
|
||||
## 验收
|
||||
|
||||
- `node tools/web/generate-wbv2-geometry-nodes-receipt.mjs --write`
|
||||
- `node tools/web/check-task-context.mjs --task WBV2-P13-002 --write`
|
||||
|
||||
Malformed or unsupported input, hash drift, non-Chromium execution, non-exact save/reopen, false inventory completion, or missing Main mutation must keep in_progress and must not advance nextTask.
|
||||
|
||||
## 交付与回滚
|
||||
|
||||
- Reports: `tests/golden/WBV2-P13-002/`
|
||||
- Status: `docs/status/WBV2-P13-002.md`
|
||||
- Manifest: `tests/golden/WBV2-P13-002/manifest.json`
|
||||
- Rollback: restore WBV2-P13-001 as queue parent.
|
||||
32
docs/tasks/WBV2-P13-003.md
Normal file
32
docs/tasks/WBV2-P13-003.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# WBV2-P13-003: rig_pose_engine_receipt
|
||||
|
||||
- task: WBV2-P13-003
|
||||
- parent: WBV2-P13-002
|
||||
- status: in_progress
|
||||
- gap: workflow:rig_pose_engine_receipt
|
||||
- ownerFamily: RIG
|
||||
- targetImplementationClass: LOCAL_BOUNDED
|
||||
|
||||
## 目标
|
||||
|
||||
Execute the bounded RIG domain using existing source evidence and the compiled WebEngine runtime.
|
||||
|
||||
## 输入与范围
|
||||
|
||||
- Focused input: `tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend`
|
||||
- Existing source receipt: `tests/golden/WBV2-P3-003/rig-report.json`
|
||||
- Production entrypoint: `web/tests/e2e/wbv2-rig-pose-production.spec.ts`
|
||||
|
||||
## 验收
|
||||
|
||||
- `node tools/web/generate-wbv2-rig-pose-receipt.mjs --write`
|
||||
- `node tools/web/check-task-context.mjs --task WBV2-P13-003 --write`
|
||||
|
||||
Malformed or unsupported input, hash drift, non-Chromium execution, non-exact save/reopen, false inventory completion, or missing Main mutation must keep in_progress and must not advance nextTask.
|
||||
|
||||
## 交付与回滚
|
||||
|
||||
- Reports: `tests/golden/WBV2-P13-003/`
|
||||
- Status: `docs/status/WBV2-P13-003.md`
|
||||
- Manifest: `tests/golden/WBV2-P13-003/manifest.json`
|
||||
- Rollback: restore WBV2-P13-002 as queue parent.
|
||||
32
docs/tasks/WBV2-P13-004.md
Normal file
32
docs/tasks/WBV2-P13-004.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# WBV2-P13-004: simulation_render_media_engine_receipt
|
||||
|
||||
- task: WBV2-P13-004
|
||||
- parent: WBV2-P13-003
|
||||
- status: in_progress
|
||||
- gap: workflow:simulation_render_media_engine_receipt
|
||||
- ownerFamily: ADVANCED
|
||||
- targetImplementationClass: LOCAL_BOUNDED
|
||||
|
||||
## 目标
|
||||
|
||||
Execute the bounded ADVANCED domain using existing source evidence and the compiled WebEngine runtime.
|
||||
|
||||
## 输入与范围
|
||||
|
||||
- Focused input: `tests/golden/WBV2-P4-004/simulation-report.json`
|
||||
- Existing source receipt: `tests/golden/WBV2-P5-003/server-job-report.json`
|
||||
- Production entrypoint: `web/tests/e2e/wbv2-advanced-domain-production.spec.ts`
|
||||
|
||||
## 验收
|
||||
|
||||
- `node tools/web/generate-wbv2-advanced-domain-receipt.mjs --write`
|
||||
- `node tools/web/check-task-context.mjs --task WBV2-P13-004 --write`
|
||||
|
||||
Malformed or unsupported input, hash drift, non-Chromium execution, non-exact save/reopen, false inventory completion, or missing Main mutation must keep in_progress and must not advance nextTask.
|
||||
|
||||
## 交付与回滚
|
||||
|
||||
- Reports: `tests/golden/WBV2-P13-004/`
|
||||
- Status: `docs/status/WBV2-P13-004.md`
|
||||
- Manifest: `tests/golden/WBV2-P13-004/manifest.json`
|
||||
- Rollback: restore WBV2-P13-003 as queue parent.
|
||||
32
docs/tasks/WBV2-P13-005.md
Normal file
32
docs/tasks/WBV2-P13-005.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# WBV2-P13-005: recompute_high_value_domain_gate
|
||||
|
||||
- task: WBV2-P13-005
|
||||
- parent: WBV2-P13-004
|
||||
- status: done
|
||||
- gap: workflow:recompute_high_value_domain_gate
|
||||
- ownerFamily: RELEASE
|
||||
- targetImplementationClass: LOCAL_BOUNDED
|
||||
|
||||
## 目标
|
||||
|
||||
Execute the bounded RELEASE domain using existing source evidence and the compiled WebEngine runtime.
|
||||
|
||||
## 输入与范围
|
||||
|
||||
- Focused input: `tests/golden/WBV2-P13-001/advanced-ledger-report.json`
|
||||
- Existing source receipt: `tests/golden/WBV2-P12-005/domain-parity-gate-report.json`
|
||||
- Production entrypoint: `node tools/web/generate-wbv2-high-value-domain-gate.mjs --write`
|
||||
|
||||
## 验收
|
||||
|
||||
- `node tools/web/generate-wbv2-high-value-domain-gate.mjs --write`
|
||||
- `node tools/web/check-task-context.mjs --task WBV2-P13-005 --write`
|
||||
|
||||
Malformed or unsupported input, hash drift, non-Chromium execution, non-exact save/reopen, false inventory completion, or missing Main mutation must keep in_progress and must not advance nextTask.
|
||||
|
||||
## 交付与回滚
|
||||
|
||||
- Reports: `tests/golden/WBV2-P13-005/`
|
||||
- Status: `docs/status/WBV2-P13-005.md`
|
||||
- Manifest: `tests/golden/WBV2-P13-005/manifest.json`
|
||||
- Rollback: restore WBV2-P13-004 as queue parent.
|
||||
@@ -240,12 +240,12 @@ Recorded: 2026-08-22 America/New_York
|
||||
|
||||
| Field | Value |
|
||||
| --- | --- |
|
||||
| Current task when this file was written | `WBV2-P12-005` |
|
||||
| Current task when this file was written | `WBV2-P13-005` |
|
||||
| Current task state | `done` |
|
||||
| Parent manifest | `tests/golden/WBV2-P12-004/manifest.json` |
|
||||
| Current task card | `docs/tasks/WBV2-P12-005.md` |
|
||||
| Parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |
|
||||
| Current task card | `docs/tasks/WBV2-P13-005.md` |
|
||||
| Current task-context nextTask | `NONE` |
|
||||
| Focused command | `node tools/web/generate-wbv2-domain-parity-gate.mjs --write` |
|
||||
| Focused command | `node tools/web/generate-wbv2-high-value-domain-gate.mjs --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
|
||||
|
||||
@@ -107,7 +107,8 @@
|
||||
"authorizedRebaselineOnly": true,
|
||||
"existingEvidenceReused": true,
|
||||
"inventoryRemainderExplicit": true,
|
||||
"terminalQueuePointer": true
|
||||
"terminalQueuePointer": false,
|
||||
"authorizedContinuation": "WBV2-P13-000"
|
||||
},
|
||||
"nextTask": null
|
||||
"nextTask": "WBV2-P13-000"
|
||||
}
|
||||
|
||||
@@ -54,11 +54,11 @@
|
||||
},
|
||||
"report": {
|
||||
"path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json",
|
||||
"sha256": "22507c619c6d99729322d73dc9c5dcd97d69832608f253b865469daa11a2f9d6"
|
||||
"sha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c"
|
||||
},
|
||||
"status": {
|
||||
"path": "docs/status/WBV2-P12-005.md",
|
||||
"sha256": "095a7b2d590c517f8312ae49b84c0805fba5c4289987824a4add8cb5af217545"
|
||||
"sha256": "bd9045fd67cdb386d08520e52410c7ce05ddff08d3aec1fb84dfc214786bde50"
|
||||
},
|
||||
"parityPlan": {
|
||||
"path": "tests/golden/WBV2-P12-005/domain-expansion-task-plan.json",
|
||||
@@ -66,7 +66,7 @@
|
||||
},
|
||||
"taskContext": {
|
||||
"path": "tests/golden/WBV2-P12-005/task-context.json",
|
||||
"sha256": "c2b65e43fe6fb5197ea4f341fc2ed80f0989e4187bfdfd3dc6152f441c6db656"
|
||||
"sha256": "4b159b842b023d2c6c3dea67165aacc4d764d17199fddd8c02a06b8000555d76"
|
||||
}
|
||||
},
|
||||
"assertions": {
|
||||
@@ -84,5 +84,10 @@
|
||||
"fullHistoricalReproduction": false,
|
||||
"deterministic": true
|
||||
},
|
||||
"nextTask": null
|
||||
"nextTask": "WBV2-P13-000",
|
||||
"continuation": {
|
||||
"authorized": true,
|
||||
"root": "WBV2-P13-000",
|
||||
"scope": "HIGH_VALUE_DOMAIN_EXPANSION"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
"epoch 2 remains authorized rebaseline only",
|
||||
"full historical reproduction remains false"
|
||||
],
|
||||
"nextTask": null,
|
||||
"nextTask": "WBV2-P13-000",
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/WBV2-P12-005.md",
|
||||
@@ -172,7 +172,7 @@
|
||||
"totalTokens": 2418,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 3442,
|
||||
"serializedContextTokens": 736,
|
||||
"serializedContextTokens": 738,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
|
||||
38
tests/golden/WBV2-P13-000/high-value-root-report.json
Normal file
38
tests/golden/WBV2-P13-000/high-value-root-report.json
Normal file
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-000",
|
||||
"operation": "AUTHORIZE_HIGH_VALUE_DOMAIN_CONTINUATION",
|
||||
"status": "PASS",
|
||||
"parent": {
|
||||
"task": "WBV2-P12-005",
|
||||
"manifest": "tests/golden/WBV2-P12-005/manifest.json",
|
||||
"manifestSha256": "c7a53cbb4952b448144f282856401190df8a270737b6dbc8754d516d62b9ac2b",
|
||||
"previousDecision": "READY_WITH_DOMAIN_ENGINE_PARITY",
|
||||
"fullHistoricalReproduction": false
|
||||
},
|
||||
"continuation": {
|
||||
"root": "WBV2-P13-000",
|
||||
"firstTask": "WBV2-P13-001",
|
||||
"plannedTasks": 6,
|
||||
"scope": [
|
||||
"ADVANCED_LEDGER",
|
||||
"GEOMETRY_NODES",
|
||||
"RIG_POSE",
|
||||
"SIMULATION",
|
||||
"RENDER",
|
||||
"MEDIA",
|
||||
"SERVER"
|
||||
],
|
||||
"browser": "chromium",
|
||||
"engineBoundPrerequisite": true
|
||||
},
|
||||
"policy": {
|
||||
"historicalEvidencePreserved": true,
|
||||
"authorizedRebaselineOnly": true,
|
||||
"existingReceiptsReusable": true,
|
||||
"noRepeatedExecution": true,
|
||||
"fullHistoricalReproduction": false,
|
||||
"inventoryRemainderExplicit": true
|
||||
},
|
||||
"nextTask": "WBV2-P13-001"
|
||||
}
|
||||
2074
tests/golden/WBV2-P13-000/high-value-task-plan.json
Normal file
2074
tests/golden/WBV2-P13-000/high-value-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
60
tests/golden/WBV2-P13-000/manifest.json
Normal file
60
tests/golden/WBV2-P13-000/manifest.json
Normal file
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-000",
|
||||
"parentTask": "WBV2-P12-005",
|
||||
"operation": "AUTHORIZE_HIGH_VALUE_DOMAIN_CONTINUATION",
|
||||
"status": "done",
|
||||
"enablingTask": true,
|
||||
"parityStateChange": false,
|
||||
"artifacts": {
|
||||
"parentManifest": {
|
||||
"path": "tests/golden/WBV2-P12-005/manifest.json",
|
||||
"sha256": "c7a53cbb4952b448144f282856401190df8a270737b6dbc8754d516d62b9ac2b"
|
||||
},
|
||||
"parentReport": {
|
||||
"path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json",
|
||||
"sha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c"
|
||||
},
|
||||
"approval": {
|
||||
"path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json",
|
||||
"sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3"
|
||||
},
|
||||
"plan": {
|
||||
"path": "tests/golden/WBV2-P13-000/high-value-task-plan.json",
|
||||
"sha256": "f0038192542f104697dfc59d4419bcf5c0ab79c725c76db5c2e2cd740cc5cf01"
|
||||
},
|
||||
"report": {
|
||||
"path": "tests/golden/WBV2-P13-000/high-value-root-report.json",
|
||||
"sha256": "8d0071dbae031615972082d61d3feb61a10d53e685755866f10911be02076bf2"
|
||||
},
|
||||
"rootCard": {
|
||||
"path": "docs/tasks/WBV2-P13-000.md",
|
||||
"sha256": "bcd6a9ead3fd59d88d493fa64550f2f5dda364fc2e56d3eea0609d64b94413c1"
|
||||
},
|
||||
"rootStatus": {
|
||||
"path": "docs/status/WBV2-P13-000.md",
|
||||
"sha256": "44f67d2cf5598b0b0fdcfb6e6dc79461323265fbe4eddc8c22aff43fe0c296f1"
|
||||
},
|
||||
"activeCard": {
|
||||
"path": "docs/tasks/WBV2-P13-001.md",
|
||||
"sha256": "24c66937ce27fe66bbd803db7d301b27a94dfd08dd635b5f8f1bef86e616629a"
|
||||
}
|
||||
},
|
||||
"assertions": {
|
||||
"p12EvidencePreserved": true,
|
||||
"readOnlyLedgerFirst": true,
|
||||
"noRepeatedExecution": true,
|
||||
"authorizedRebaselineOnly": true,
|
||||
"fullHistoricalReproduction": false,
|
||||
"domainScope": [
|
||||
"ADVANCED_LEDGER",
|
||||
"GEOMETRY_NODES",
|
||||
"RIG_POSE",
|
||||
"SIMULATION",
|
||||
"RENDER",
|
||||
"MEDIA",
|
||||
"SERVER"
|
||||
]
|
||||
},
|
||||
"nextTask": "WBV2-P13-001"
|
||||
}
|
||||
49
tests/golden/WBV2-P13-001/advanced-ledger-report.json
Normal file
49
tests/golden/WBV2-P13-001/advanced-ledger-report.json
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-001",
|
||||
"operation": "RECONCILE_ADVANCED_DOMAIN_LEDGER",
|
||||
"status": "PASS",
|
||||
"ledgerSha256": "74d48a20362710499cc6a04cf80dc6364850feeff1f43480239c068570c2403b",
|
||||
"sourceIndex": "tests/golden/WBV2-P13-001/advanced-source-index.json",
|
||||
"sourceIndexSha256": "97fda8a988eee44592f34dab6274d9dcf12c25cba690872e75bf9ca62fabbf5d",
|
||||
"inventory": {
|
||||
"source": "tests/golden/WBV2-P0-002/parity-map.json",
|
||||
"sourceSha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8",
|
||||
"total": 6900,
|
||||
"pending": 6618,
|
||||
"claimedComplete": 0,
|
||||
"remainderExplicit": true
|
||||
},
|
||||
"summary": {
|
||||
"manifestsDone": 15,
|
||||
"artifactRecords": 247,
|
||||
"historicalDriftManifests": 15,
|
||||
"repeatedBlenderRuns": 0,
|
||||
"repeatedChromiumRuns": 0,
|
||||
"unprovenDomains": [
|
||||
"GEOMETRY_NODES",
|
||||
"RIG",
|
||||
"SIMULATION",
|
||||
"RENDER",
|
||||
"MEDIA",
|
||||
"SERVER",
|
||||
"SECURITY"
|
||||
],
|
||||
"engineBoundExisting": [
|
||||
"WBV2-P12-005"
|
||||
]
|
||||
},
|
||||
"reuse": {
|
||||
"existingManifestsRead": 15,
|
||||
"existingArtifactRecords": 247,
|
||||
"repeatedBlenderRuns": 0,
|
||||
"repeatedChromiumRuns": 0,
|
||||
"newProductionClaims": 0
|
||||
},
|
||||
"policy": {
|
||||
"historicalReportsUntouched": true,
|
||||
"currentDriftRecorded": true,
|
||||
"unprovenDomainsExplicit": true
|
||||
},
|
||||
"nextTask": "WBV2-P13-002"
|
||||
}
|
||||
1993
tests/golden/WBV2-P13-001/advanced-ledger.json
Normal file
1993
tests/golden/WBV2-P13-001/advanced-ledger.json
Normal file
File diff suppressed because it is too large
Load Diff
174
tests/golden/WBV2-P13-001/advanced-source-index.json
Normal file
174
tests/golden/WBV2-P13-001/advanced-source-index.json
Normal file
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-001",
|
||||
"operation": "ADVANCED_SOURCE_MANIFEST_INDEX",
|
||||
"gate": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json",
|
||||
"gateSha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c",
|
||||
"entries": [
|
||||
{
|
||||
"task": "WBV2-P3-001",
|
||||
"domain": "MATERIAL",
|
||||
"manifest": "tests/golden/WBV2-P3-001/manifest.json",
|
||||
"manifestSha256": "e3b037fdcf55b5e64fd770c6fa90d0b72e96b3e764a305df0ceee378fa167191",
|
||||
"status": "done",
|
||||
"operation": "MATERIAL_PBR_UV_LOCAL_BOUNDED",
|
||||
"artifactCount": 14,
|
||||
"currentDriftCount": 3,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P3-002",
|
||||
"domain": "ANIMATION",
|
||||
"manifest": "tests/golden/WBV2-P3-002/manifest.json",
|
||||
"manifestSha256": "cc36b933a2b6d817ea7226c07d0617ecdf2f89575136a83cb15de4e7c8f59188",
|
||||
"status": "done",
|
||||
"operation": "ANIMATION_TRS_ACTION_LOCAL_EXACT",
|
||||
"artifactCount": 14,
|
||||
"currentDriftCount": 3,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P3-003",
|
||||
"domain": "RIG",
|
||||
"manifest": "tests/golden/WBV2-P3-003/manifest.json",
|
||||
"manifestSha256": "1b97d2ca9add58a6185a21137729edc4c8b11a2d21be1682793e3d05b9ef9011",
|
||||
"status": "done",
|
||||
"operation": "RIG_POSE_SKIN_LOCAL_BOUNDED",
|
||||
"artifactCount": 14,
|
||||
"currentDriftCount": 3,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P3-004",
|
||||
"domain": "IO",
|
||||
"manifest": "tests/golden/WBV2-P3-004/manifest.json",
|
||||
"manifestSha256": "bb4f2783eaa78a0104045048fc9f5d925a78e5a2539f5f1b9e699a067d05fa27",
|
||||
"status": "done",
|
||||
"operation": "IO_GLB_ROUNDTRIP_LOCAL_EXACT",
|
||||
"artifactCount": 14,
|
||||
"currentDriftCount": 3,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P3-005",
|
||||
"domain": "ASSET",
|
||||
"manifest": "tests/golden/WBV2-P3-005/manifest.json",
|
||||
"manifestSha256": "42dc02d198630c2735c5a0a1beab37f2a98ff0233927215099f67606d248c39e",
|
||||
"status": "done",
|
||||
"operation": "ASSET_LIBRARY_APPEND_LINK_OVERRIDE_LOCAL_BOUNDED",
|
||||
"artifactCount": 15,
|
||||
"currentDriftCount": 3,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P4-001",
|
||||
"domain": "MODIFIER",
|
||||
"manifest": "tests/golden/WBV2-P4-001/manifest.json",
|
||||
"manifestSha256": "6f1bee73c987f5e66733feb03d1d708e0f2dbd0776ac6634dbf694cde385143c",
|
||||
"status": "done",
|
||||
"operation": "MODIFIER_DECLARED_SLICES_LOCAL_BOUNDED",
|
||||
"artifactCount": 16,
|
||||
"currentDriftCount": 3,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P4-002",
|
||||
"domain": "GEOMETRY_NODES",
|
||||
"manifest": "tests/golden/WBV2-P4-002/manifest.json",
|
||||
"manifestSha256": "2b9e907fa11470b354bbb98695696bcdfae5c654ef03373b1eb2230098f28142",
|
||||
"status": "done",
|
||||
"operation": "NODES_ALLOWLIST_LOCAL_BOUNDED",
|
||||
"artifactCount": 19,
|
||||
"currentDriftCount": 3,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P4-003",
|
||||
"domain": "SCULPT_NONMESH",
|
||||
"manifest": "tests/golden/WBV2-P4-003/manifest.json",
|
||||
"manifestSha256": "9c41ef52263d544650b1bad2dc2ec5f40ed63a9ab1b9732492a46672384e1218",
|
||||
"status": "done",
|
||||
"operation": "SCULPT_NONMESH_PAINT_BOUNDED_LOCAL_BOUNDED",
|
||||
"artifactCount": 18,
|
||||
"currentDriftCount": 3,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P4-004",
|
||||
"domain": "SIMULATION",
|
||||
"manifest": "tests/golden/WBV2-P4-004/manifest.json",
|
||||
"manifestSha256": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016",
|
||||
"status": "done",
|
||||
"operation": "SIMULATION_CACHE_IDENTITY_LIFECYCLE_LOCAL_BOUNDED",
|
||||
"artifactCount": 17,
|
||||
"currentDriftCount": 3,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P5-001",
|
||||
"domain": "RENDER",
|
||||
"manifest": "tests/golden/WBV2-P5-001/manifest.json",
|
||||
"manifestSha256": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e",
|
||||
"status": "done",
|
||||
"operation": "RENDER_CAPABILITY_ROUTING_LOCAL_BOUNDED",
|
||||
"artifactCount": 19,
|
||||
"currentDriftCount": 4,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P5-002",
|
||||
"domain": "MEDIA",
|
||||
"manifest": "tests/golden/WBV2-P5-002/manifest.json",
|
||||
"manifestSha256": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2",
|
||||
"status": "done",
|
||||
"operation": "MEDIA_BOUNDED_WORKFLOW_LOCAL_BOUNDED",
|
||||
"artifactCount": 17,
|
||||
"currentDriftCount": 3,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P5-003",
|
||||
"domain": "SERVER",
|
||||
"manifest": "tests/golden/WBV2-P5-003/manifest.json",
|
||||
"manifestSha256": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c",
|
||||
"status": "done",
|
||||
"operation": "SERVER_JOB_RESULT_BINDING_SERVER_EXACT",
|
||||
"artifactCount": 19,
|
||||
"currentDriftCount": 4,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P6-001",
|
||||
"domain": "SECURITY",
|
||||
"manifest": "tests/golden/WBV2-P6-001/manifest.json",
|
||||
"manifestSha256": "e8bb64d618b630b34292501d44fe46c55de3a57ddf0fccb4b7974c6a479456a4",
|
||||
"status": "done",
|
||||
"operation": "SECURITY_SCRIPTING_LOCAL_EXACT",
|
||||
"artifactCount": 16,
|
||||
"currentDriftCount": 4,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P6-002",
|
||||
"domain": "RELIABILITY",
|
||||
"manifest": "tests/golden/WBV2-P6-002/manifest.json",
|
||||
"manifestSha256": "b66e193b81c0c592964c874902d0ee024c4877610fd7fa92aee2a961f69d01ba",
|
||||
"status": "done",
|
||||
"operation": "PERFORMANCE_FAULT_RECOVERY_MATRIX_LOCAL_EXACT",
|
||||
"artifactCount": 17,
|
||||
"currentDriftCount": 4,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
},
|
||||
{
|
||||
"task": "WBV2-P6-003",
|
||||
"domain": "RELEASE",
|
||||
"manifest": "tests/golden/WBV2-P6-003/manifest.json",
|
||||
"manifestSha256": "22a773feb29435ec0c29eaa720e7ae39c5f87455c678b78ae6c02b4985fea54d",
|
||||
"status": "done",
|
||||
"operation": "OFFLINE_CI_SBOM_ROLLBACK_RELEASE_LOCAL_EXACT",
|
||||
"artifactCount": 18,
|
||||
"currentDriftCount": 6,
|
||||
"evidenceClass": "HISTORICAL_DRIFT_RECORDED"
|
||||
}
|
||||
]
|
||||
}
|
||||
2074
tests/golden/WBV2-P13-001/high-value-task-plan.json
Normal file
2074
tests/golden/WBV2-P13-001/high-value-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
69
tests/golden/WBV2-P13-001/manifest.json
Normal file
69
tests/golden/WBV2-P13-001/manifest.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-001",
|
||||
"parentTask": "WBV2-P13-000",
|
||||
"operation": "RECONCILE_ADVANCED_DOMAIN_LEDGER",
|
||||
"status": "done",
|
||||
"enablingTask": true,
|
||||
"parityStateChange": false,
|
||||
"runtime": "READ_ONLY_ADVANCED_MANIFEST_BATCH_SCAN",
|
||||
"artifacts": {
|
||||
"parentManifest": {
|
||||
"path": "tests/golden/WBV2-P13-000/manifest.json",
|
||||
"sha256": "d60e8c922418f0cdd02dd442240f8b89d5071e985e0f03512f014dc33a2e2f87"
|
||||
},
|
||||
"inventory": {
|
||||
"path": "tests/golden/WBV2-P0-002/parity-map.json",
|
||||
"sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8"
|
||||
},
|
||||
"gate": {
|
||||
"path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json",
|
||||
"sha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c"
|
||||
},
|
||||
"sourceIndex": {
|
||||
"path": "tests/golden/WBV2-P13-001/advanced-source-index.json",
|
||||
"sha256": "97fda8a988eee44592f34dab6274d9dcf12c25cba690872e75bf9ca62fabbf5d"
|
||||
},
|
||||
"ledger": {
|
||||
"path": "tests/golden/WBV2-P13-001/advanced-ledger.json",
|
||||
"sha256": "74d48a20362710499cc6a04cf80dc6364850feeff1f43480239c068570c2403b"
|
||||
},
|
||||
"report": {
|
||||
"path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json",
|
||||
"sha256": "63ec0429718b6c2992a60febdee441ad24912ca149c8030c1d92faa10ffc290c"
|
||||
},
|
||||
"generator": {
|
||||
"path": "tools/web/generate-wbv2-advanced-ledger.mjs",
|
||||
"sha256": "9877c1a06f5f5ce45e0a9eb92a9b587cf7a1d143dcd853e0930b2c55e7ad46bf"
|
||||
},
|
||||
"checker": {
|
||||
"path": "tools/web/check-wbv2-advanced-ledger.mjs",
|
||||
"sha256": "1d48c9b448775483345fd6c32b20ac7cb99bea433c6cb99f1b118c6c7e3bdf8b"
|
||||
},
|
||||
"parityPlan": {
|
||||
"path": "tests/golden/WBV2-P13-001/high-value-task-plan.json",
|
||||
"sha256": "f918815762675c0024d86d713adc78d38fe240fbdb0c62e23a0bdf902235b7dd"
|
||||
},
|
||||
"status": {
|
||||
"path": "docs/status/WBV2-P13-001.md",
|
||||
"sha256": "6f20eddd5839020c1c94577af19ca8eccad617edd2dc06f6fe2e1dfe3534af95"
|
||||
},
|
||||
"taskContext": {
|
||||
"path": "tests/golden/WBV2-P13-001/task-context.json",
|
||||
"sha256": "4d348a92b603ef041534024a8c773b63b40d536d05426360a4495d63ec5c4fd5"
|
||||
}
|
||||
},
|
||||
"assertions": {
|
||||
"sourceManifests": 15,
|
||||
"artifactRecords": 247,
|
||||
"repeatedBlenderRuns": 0,
|
||||
"repeatedChromiumRuns": 0,
|
||||
"historicalDriftExplicit": true,
|
||||
"unprovenDomains": 7,
|
||||
"inventoryTotal": 6900,
|
||||
"inventoryPending": 6618,
|
||||
"inventoryClaimedComplete": 0,
|
||||
"historicalReproduction": false
|
||||
},
|
||||
"nextTask": "WBV2-P13-002"
|
||||
}
|
||||
141
tests/golden/WBV2-P13-001/task-context.json
Normal file
141
tests/golden/WBV2-P13-001/task-context.json
Normal file
@@ -0,0 +1,141 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-001",
|
||||
"parentTask": "WBV2-P13-000",
|
||||
"status": "in_progress",
|
||||
"goal": "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated Blender or Chromium execution.",
|
||||
"scope": {
|
||||
"gap": "workflow:reconcile_advanced_domain_ledger",
|
||||
"ownerFamily": "PARITY",
|
||||
"implementationClass": "LOCAL_BOUNDED"
|
||||
},
|
||||
"commands": [
|
||||
"node tools/web/generate-wbv2-advanced-ledger.mjs --write",
|
||||
"node tools/web/check-wbv2-advanced-ledger.mjs",
|
||||
"node tools/web/check-task-context.mjs --task WBV2-P13-001 --write"
|
||||
],
|
||||
"inputPaths": [],
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 3642,
|
||||
"contextRemainingTokens": 910
|
||||
},
|
||||
"source": {
|
||||
"bytes": 6262,
|
||||
"tokens": 1566
|
||||
},
|
||||
"selected": [],
|
||||
"excluded": [],
|
||||
"totals": {
|
||||
"files": 0,
|
||||
"bytes": 0,
|
||||
"tokens": 0
|
||||
}
|
||||
},
|
||||
"exitCriteria": [
|
||||
"source manifests are hash-verified",
|
||||
"existing reports are classified conservatively",
|
||||
"no repeated Blender/Chromium run",
|
||||
"unproven advanced domains stay explicit"
|
||||
],
|
||||
"nextTask": "WBV2-P13-002",
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/WBV2-P13-001.md",
|
||||
"taskIndex": "tests/golden/WBV2/task-index.json",
|
||||
"parentManifest": "tests/golden/WBV2-P13-000/manifest.json",
|
||||
"parentStatus": "docs/status/WBV2-P13-000.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/WBV2-P13-001.md",
|
||||
"tests/golden/WBV2-P13-000/manifest.json",
|
||||
"docs/status/WBV2-P13-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-P13-000",
|
||||
"parentTask": "WBV2-P12-005",
|
||||
"status": "done",
|
||||
"nextTask": "WBV2-P13-001",
|
||||
"artifactCount": 8
|
||||
},
|
||||
"statusSummary": [
|
||||
"# WBV2-P13-000 status",
|
||||
"- task: `WBV2-P13-000`; parent: `WBV2-P12-005`; status: `done`",
|
||||
"- nextTask: `WBV2-P13-001`",
|
||||
"High-value domain continuation is authorized. P13 starts with a read-only ledger to eliminate repeated validation, then expands only domains with real source receipts and compiled WASM entrypoints."
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1176,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 35,
|
||||
"taskTokens": 294
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 2803,
|
||||
"lines": 51,
|
||||
"tokens": 701
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/WBV2-P13-001.md",
|
||||
"bytes": 1176,
|
||||
"lines": 35,
|
||||
"tokens": 294
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-000/manifest.json",
|
||||
"bytes": 1971,
|
||||
"lines": 61,
|
||||
"tokens": 493
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P13-000.md",
|
||||
"bytes": 312,
|
||||
"lines": 7,
|
||||
"tokens": 78
|
||||
}
|
||||
],
|
||||
"sourceTokens": 1566,
|
||||
"evidenceFiles": 0,
|
||||
"evidenceBytes": 0,
|
||||
"evidenceTokens": 0,
|
||||
"totalTokens": 1566,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 2590,
|
||||
"serializedContextTokens": 637,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
84
tests/golden/WBV2-P13-002/geometry-nodes-production.json
Normal file
84
tests/golden/WBV2-P13-002/geometry-nodes-production.json
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-002",
|
||||
"operation": "GEOMETRY_NODES_ENGINE_CHROMIUM",
|
||||
"browser": "chromium",
|
||||
"queueMutation": false,
|
||||
"baseRevision": 1,
|
||||
"afterRevision": 1,
|
||||
"graphCount": 3,
|
||||
"hashesBefore": [
|
||||
{
|
||||
"name": "WebGeometryNodes",
|
||||
"graphHash": "2a72172aad0af64beb3100a6b0ef3a0eed5a19fbb9803ed095d77b0532724f6e",
|
||||
"nodes": [
|
||||
"GeometryNodeTransform",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 2
|
||||
},
|
||||
{
|
||||
"name": "WebGeometryNodesSetPosition",
|
||||
"graphHash": "4c18a427928f3a0c4d12e7231f535210ef8630c5b681e976635528373dc21f4d",
|
||||
"nodes": [
|
||||
"GeometryNodeSetPosition",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 2
|
||||
},
|
||||
{
|
||||
"name": "WebGeometryNodesSimulation",
|
||||
"graphHash": "ea41406472774710395cd3fd778b642aa1063799a95934cd3c9c4a870935099a",
|
||||
"nodes": [
|
||||
"GeometryNodeSimulationInput",
|
||||
"GeometryNodeSimulationOutput",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 3
|
||||
}
|
||||
],
|
||||
"hashesAfter": [
|
||||
{
|
||||
"name": "WebGeometryNodes",
|
||||
"graphHash": "2a72172aad0af64beb3100a6b0ef3a0eed5a19fbb9803ed095d77b0532724f6e",
|
||||
"nodes": [
|
||||
"GeometryNodeTransform",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 2
|
||||
},
|
||||
{
|
||||
"name": "WebGeometryNodesSetPosition",
|
||||
"graphHash": "4c18a427928f3a0c4d12e7231f535210ef8630c5b681e976635528373dc21f4d",
|
||||
"nodes": [
|
||||
"GeometryNodeSetPosition",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 2
|
||||
},
|
||||
{
|
||||
"name": "WebGeometryNodesSimulation",
|
||||
"graphHash": "ea41406472774710395cd3fd778b642aa1063799a95934cd3c9c4a870935099a",
|
||||
"nodes": [
|
||||
"GeometryNodeSimulationInput",
|
||||
"GeometryNodeSimulationOutput",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 3
|
||||
}
|
||||
],
|
||||
"unsupportedName": "WebGeometryNodesSimulation",
|
||||
"attempt": {
|
||||
"code": "GN_NODE_UNSUPPORTED",
|
||||
"message": "N-012 GEOMETRY_NODE_GRAPH blocked: unsupported node type: GeometryNodeSimulationInput"
|
||||
},
|
||||
"savedSha256": "f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9",
|
||||
"sourceSha256": "f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9",
|
||||
"saveReopenExact": true
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-002",
|
||||
"operation": "GEOMETRY_NODES_ENGINE_CHROMIUM",
|
||||
"browser": "chromium",
|
||||
"queueMutation": false,
|
||||
"baseRevision": 1,
|
||||
"afterRevision": 1,
|
||||
"graphCount": 3,
|
||||
"hashesBefore": [
|
||||
{
|
||||
"name": "WebGeometryNodes",
|
||||
"graphHash": "2a72172aad0af64beb3100a6b0ef3a0eed5a19fbb9803ed095d77b0532724f6e",
|
||||
"nodes": [
|
||||
"GeometryNodeTransform",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 2
|
||||
},
|
||||
{
|
||||
"name": "WebGeometryNodesSetPosition",
|
||||
"graphHash": "4c18a427928f3a0c4d12e7231f535210ef8630c5b681e976635528373dc21f4d",
|
||||
"nodes": [
|
||||
"GeometryNodeSetPosition",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 2
|
||||
},
|
||||
{
|
||||
"name": "WebGeometryNodesSimulation",
|
||||
"graphHash": "ea41406472774710395cd3fd778b642aa1063799a95934cd3c9c4a870935099a",
|
||||
"nodes": [
|
||||
"GeometryNodeSimulationInput",
|
||||
"GeometryNodeSimulationOutput",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 3
|
||||
}
|
||||
],
|
||||
"hashesAfter": [
|
||||
{
|
||||
"name": "WebGeometryNodes",
|
||||
"graphHash": "2a72172aad0af64beb3100a6b0ef3a0eed5a19fbb9803ed095d77b0532724f6e",
|
||||
"nodes": [
|
||||
"GeometryNodeTransform",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 2
|
||||
},
|
||||
{
|
||||
"name": "WebGeometryNodesSetPosition",
|
||||
"graphHash": "4c18a427928f3a0c4d12e7231f535210ef8630c5b681e976635528373dc21f4d",
|
||||
"nodes": [
|
||||
"GeometryNodeSetPosition",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 2
|
||||
},
|
||||
{
|
||||
"name": "WebGeometryNodesSimulation",
|
||||
"graphHash": "ea41406472774710395cd3fd778b642aa1063799a95934cd3c9c4a870935099a",
|
||||
"nodes": [
|
||||
"GeometryNodeSimulationInput",
|
||||
"GeometryNodeSimulationOutput",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 3
|
||||
}
|
||||
],
|
||||
"unsupportedName": "WebGeometryNodesSimulation",
|
||||
"attempt": {
|
||||
"code": "GN_NODE_UNSUPPORTED",
|
||||
"message": "N-012 GEOMETRY_NODE_GRAPH blocked: unsupported node type: GeometryNodeSimulationInput"
|
||||
},
|
||||
"savedSha256": "f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9",
|
||||
"sourceSha256": "f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9",
|
||||
"saveReopenExact": true
|
||||
}
|
||||
73
tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json
Normal file
73
tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json
Normal file
@@ -0,0 +1,73 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-002",
|
||||
"operation": "GEOMETRY_NODES_ENGINE_RECEIPT",
|
||||
"status": "PASS",
|
||||
"browser": "chromium",
|
||||
"queueMutation": false,
|
||||
"source": {
|
||||
"task": "WBV2-P4-002",
|
||||
"manifest": "tests/golden/WBV2-P4-002/manifest.json",
|
||||
"manifestSha256": "2b9e907fa11470b354bbb98695696bcdfae5c654ef03373b1eb2230098f28142",
|
||||
"report": "tests/golden/WBV2-P4-002/nodes-report.json",
|
||||
"reportSha256": "258bbbcb5ba4b1a5b8163f2841b833397ff560357538b4a419381ec9a67af8c7",
|
||||
"reusedReadOnly": true
|
||||
},
|
||||
"production": {
|
||||
"report": "tests/golden/WBV2-P13-002/geometry-nodes-production.json",
|
||||
"reportSha256": "162456733559afde374edb97b7688145c74480a990b4f47d84842df44776a7f3",
|
||||
"secondReport": "tests/golden/WBV2-P13-002/geometry-nodes-production.second.json",
|
||||
"secondReportSha256": "162456733559afde374edb97b7688145c74480a990b4f47d84842df44776a7f3",
|
||||
"deterministic": true,
|
||||
"graphCount": 3,
|
||||
"hashes": [
|
||||
{
|
||||
"name": "WebGeometryNodes",
|
||||
"graphHash": "2a72172aad0af64beb3100a6b0ef3a0eed5a19fbb9803ed095d77b0532724f6e",
|
||||
"nodes": [
|
||||
"GeometryNodeTransform",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 2
|
||||
},
|
||||
{
|
||||
"name": "WebGeometryNodesSetPosition",
|
||||
"graphHash": "4c18a427928f3a0c4d12e7231f535210ef8630c5b681e976635528373dc21f4d",
|
||||
"nodes": [
|
||||
"GeometryNodeSetPosition",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 2
|
||||
},
|
||||
{
|
||||
"name": "WebGeometryNodesSimulation",
|
||||
"graphHash": "ea41406472774710395cd3fd778b642aa1063799a95934cd3c9c4a870935099a",
|
||||
"nodes": [
|
||||
"GeometryNodeSimulationInput",
|
||||
"GeometryNodeSimulationOutput",
|
||||
"NodeGroupInput",
|
||||
"NodeGroupOutput"
|
||||
],
|
||||
"links": 3
|
||||
}
|
||||
],
|
||||
"unsupportedGraph": "WebGeometryNodesSimulation",
|
||||
"unsupportedAttempt": {
|
||||
"code": "GN_NODE_UNSUPPORTED",
|
||||
"message": "N-012 GEOMETRY_NODE_GRAPH blocked: unsupported node type: GeometryNodeSimulationInput"
|
||||
},
|
||||
"saveReopen": "EXACT",
|
||||
"revisionPreserved": true
|
||||
},
|
||||
"assertions": {
|
||||
"graphHashesStable": true,
|
||||
"unsupportedNodeExplicit": true,
|
||||
"unsupportedGraphRejected": true,
|
||||
"saveReopenExact": true,
|
||||
"mainUnchangedOnFailure": true,
|
||||
"historicalReproduction": false
|
||||
},
|
||||
"nextTask": "WBV2-P13-003"
|
||||
}
|
||||
2074
tests/golden/WBV2-P13-002/high-value-task-plan.json
Normal file
2074
tests/golden/WBV2-P13-002/high-value-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
74
tests/golden/WBV2-P13-002/manifest.json
Normal file
74
tests/golden/WBV2-P13-002/manifest.json
Normal file
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-002",
|
||||
"parentTask": "WBV2-P13-001",
|
||||
"operation": "GEOMETRY_NODES_ENGINE_RECEIPT",
|
||||
"status": "done",
|
||||
"enablingTask": false,
|
||||
"parityStateChange": true,
|
||||
"runtime": "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM",
|
||||
"artifacts": {
|
||||
"parentManifest": {
|
||||
"path": "tests/golden/WBV2-P13-001/manifest.json",
|
||||
"sha256": "94c11f7f0744d429c41494242e42e8373949789154bec257699f62b9bfc75475"
|
||||
},
|
||||
"sourceManifest": {
|
||||
"path": "tests/golden/WBV2-P4-002/manifest.json",
|
||||
"sha256": "2b9e907fa11470b354bbb98695696bcdfae5c654ef03373b1eb2230098f28142"
|
||||
},
|
||||
"sourceReport": {
|
||||
"path": "tests/golden/WBV2-P4-002/nodes-report.json",
|
||||
"sha256": "258bbbcb5ba4b1a5b8163f2841b833397ff560357538b4a419381ec9a67af8c7"
|
||||
},
|
||||
"production": {
|
||||
"path": "tests/golden/WBV2-P13-002/geometry-nodes-production.json",
|
||||
"sha256": "162456733559afde374edb97b7688145c74480a990b4f47d84842df44776a7f3"
|
||||
},
|
||||
"productionSecond": {
|
||||
"path": "tests/golden/WBV2-P13-002/geometry-nodes-production.second.json",
|
||||
"sha256": "162456733559afde374edb97b7688145c74480a990b4f47d84842df44776a7f3"
|
||||
},
|
||||
"e2e": {
|
||||
"path": "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts",
|
||||
"sha256": "cce9c48cda45f029e97c3e580185f8caa6f321e6ccaf6d7b673428bc0e8ade8e"
|
||||
},
|
||||
"client": {
|
||||
"path": "web/app/src/engine-client/WebEngineClient.ts",
|
||||
"sha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b"
|
||||
},
|
||||
"nativeApi": {
|
||||
"path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
|
||||
"sha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8"
|
||||
},
|
||||
"generator": {
|
||||
"path": "tools/web/generate-wbv2-geometry-nodes-receipt.mjs",
|
||||
"sha256": "65a12558dbc533af051abb3695194d7cd5d3f84d694eb1ec0b3bb145420249d4"
|
||||
},
|
||||
"report": {
|
||||
"path": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json",
|
||||
"sha256": "9c082ce56feb185cc72ede1058f465475d39baba0c408be6bad9568d8886d591"
|
||||
},
|
||||
"status": {
|
||||
"path": "docs/status/WBV2-P13-002.md",
|
||||
"sha256": "e5802dfda1bf1c9fe15b38abf0593473d2b96c5e994c689e2c3f76e86ae1736e"
|
||||
},
|
||||
"parityPlan": {
|
||||
"path": "tests/golden/WBV2-P13-002/high-value-task-plan.json",
|
||||
"sha256": "9c179910ac752cc65181a117c8acb5fabc9678b1320211a4094ee554f625c9ef"
|
||||
},
|
||||
"taskContext": {
|
||||
"path": "tests/golden/WBV2-P13-002/task-context.json",
|
||||
"sha256": "057b1edbcc0d47b0d760f15c3070771f5e91616ac8e7fd1888dac0a7dc4c0697"
|
||||
}
|
||||
},
|
||||
"assertions": {
|
||||
"graphs": 3,
|
||||
"stableHashes": true,
|
||||
"unsupportedRejected": true,
|
||||
"saveReopen": "EXACT",
|
||||
"revisionPreservedOnFailure": true,
|
||||
"deterministic": true,
|
||||
"historicalReproduction": false
|
||||
},
|
||||
"nextTask": "WBV2-P13-003"
|
||||
}
|
||||
178
tests/golden/WBV2-P13-002/task-context.json
Normal file
178
tests/golden/WBV2-P13-002/task-context.json
Normal file
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-002",
|
||||
"parentTask": "WBV2-P13-001",
|
||||
"status": "in_progress",
|
||||
"goal": "Execute the bounded NODES domain using existing source evidence and the compiled WebEngine runtime.",
|
||||
"scope": {
|
||||
"gap": "workflow:geometry_nodes_engine_receipt",
|
||||
"ownerFamily": "NODES",
|
||||
"implementationClass": "LOCAL_BOUNDED"
|
||||
},
|
||||
"commands": [
|
||||
"node tools/web/generate-wbv2-geometry-nodes-receipt.mjs --write",
|
||||
"node tools/web/check-task-context.mjs --task WBV2-P13-002 --write"
|
||||
],
|
||||
"inputPaths": [
|
||||
"tests/golden/WBV2-P4-002/nodes-report.json"
|
||||
],
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 2715,
|
||||
"contextRemainingTokens": 678
|
||||
},
|
||||
"source": {
|
||||
"bytes": 7189,
|
||||
"tokens": 1798
|
||||
},
|
||||
"selected": [
|
||||
{
|
||||
"path": "tests/golden/WBV2-P4-002/nodes-report.json",
|
||||
"bytes": 1558,
|
||||
"tokens": 390
|
||||
}
|
||||
],
|
||||
"excluded": [
|
||||
{
|
||||
"path": "tests/files/web/modifier_geometry_nodes_scene.blend",
|
||||
"bytes": 90116,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts",
|
||||
"bytes": 3802,
|
||||
"reason": "CONTEXT_REMAINING_SPACE"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-002/",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P13-002.md",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-002/manifest.json",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
}
|
||||
],
|
||||
"totals": {
|
||||
"files": 1,
|
||||
"bytes": 1558,
|
||||
"tokens": 390
|
||||
}
|
||||
},
|
||||
"exitCriteria": [
|
||||
"graph hashes are stable",
|
||||
"unsupported nodes remain explicit",
|
||||
"save/reopen is exact",
|
||||
"malformed graph and budget cases fail closed"
|
||||
],
|
||||
"nextTask": "WBV2-P13-003",
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/WBV2-P13-002.md",
|
||||
"taskIndex": "tests/golden/WBV2/task-index.json",
|
||||
"parentManifest": "tests/golden/WBV2-P13-001/manifest.json",
|
||||
"parentStatus": "docs/status/WBV2-P13-001.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/WBV2-P13-002.md",
|
||||
"tests/golden/WBV2-P13-001/manifest.json",
|
||||
"docs/status/WBV2-P13-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-P13-001",
|
||||
"parentTask": "WBV2-P13-000",
|
||||
"status": "done",
|
||||
"nextTask": "WBV2-P13-002",
|
||||
"artifactCount": 11
|
||||
},
|
||||
"statusSummary": [
|
||||
"# WBV2-P13-001 status",
|
||||
"- task: `WBV2-P13-001`; parent: `WBV2-P13-000`; status: `done`",
|
||||
"- advanced manifests batch-scanned: `15`; artifact records: `247`",
|
||||
"- repeated Blender/Chromium runs: `0`; historical drift manifests: `15`",
|
||||
"- unproven domains explicit: `GEOMETRY_NODES, RIG, SIMULATION, RENDER, MEDIA, SERVER, SECURITY`",
|
||||
"- inventory: `6900` total, `6618` pending, claimed complete: `0`",
|
||||
"- nextTask: `WBV2-P13-002`",
|
||||
"This ledger reuses existing P3-P6 advanced domain receipts as read-only evidence and records artifact drift without rewriting historical hashes. No repeated Blender or Chromium execution was performed. Domains without a new engine-bound receipt remain explicit and cannot become feature claims from metadata alone."
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1132,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 33,
|
||||
"taskTokens": 283
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 2803,
|
||||
"lines": 51,
|
||||
"tokens": 701
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/WBV2-P13-002.md",
|
||||
"bytes": 1132,
|
||||
"lines": 33,
|
||||
"tokens": 283
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-001/manifest.json",
|
||||
"bytes": 2526,
|
||||
"lines": 70,
|
||||
"tokens": 632
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P13-001.md",
|
||||
"bytes": 728,
|
||||
"lines": 11,
|
||||
"tokens": 182
|
||||
}
|
||||
],
|
||||
"sourceTokens": 1798,
|
||||
"evidenceFiles": 1,
|
||||
"evidenceBytes": 1558,
|
||||
"evidenceTokens": 390,
|
||||
"totalTokens": 2188,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 3212,
|
||||
"serializedContextTokens": 683,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
2074
tests/golden/WBV2-P13-003/high-value-task-plan.json
Normal file
2074
tests/golden/WBV2-P13-003/high-value-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
76
tests/golden/WBV2-P13-003/manifest.json
Normal file
76
tests/golden/WBV2-P13-003/manifest.json
Normal file
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-003",
|
||||
"parentTask": "WBV2-P13-002",
|
||||
"operation": "RIG_POSE_ENGINE_RECEIPT",
|
||||
"status": "done",
|
||||
"enablingTask": false,
|
||||
"parityStateChange": true,
|
||||
"runtime": "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM",
|
||||
"artifacts": {
|
||||
"parentManifest": {
|
||||
"path": "tests/golden/WBV2-P13-002/manifest.json",
|
||||
"sha256": "e84b3a057c8e07479e77f517dade1366332effda994784b63003a604de0efb87"
|
||||
},
|
||||
"sourceManifest": {
|
||||
"path": "tests/golden/WBV2-P3-003/manifest.json",
|
||||
"sha256": "1b97d2ca9add58a6185a21137729edc4c8b11a2d21be1682793e3d05b9ef9011"
|
||||
},
|
||||
"sourceReport": {
|
||||
"path": "tests/golden/WBV2-P3-003/rig-report.json",
|
||||
"sha256": "13b1227a6dcb02fbbf0d618b6fc8d504fa81a9e7babec1973e9814639a5ea028"
|
||||
},
|
||||
"production": {
|
||||
"path": "tests/golden/WBV2-P13-003/rig-pose-production.json",
|
||||
"sha256": "a8dc61adcab4da3b1043821c39e6cea0550f8b234b213155736c0b9042c3efe8"
|
||||
},
|
||||
"productionSecond": {
|
||||
"path": "tests/golden/WBV2-P13-003/rig-pose-production.second.json",
|
||||
"sha256": "a8dc61adcab4da3b1043821c39e6cea0550f8b234b213155736c0b9042c3efe8"
|
||||
},
|
||||
"e2e": {
|
||||
"path": "web/tests/e2e/wbv2-rig-pose-production.spec.ts",
|
||||
"sha256": "3935e60cf203a21b018767e24bb2ecb6d30e062d0f24259ce584a90437b852e1"
|
||||
},
|
||||
"client": {
|
||||
"path": "web/app/src/engine-client/WebEngineClient.ts",
|
||||
"sha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b"
|
||||
},
|
||||
"nativeApi": {
|
||||
"path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
|
||||
"sha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8"
|
||||
},
|
||||
"generator": {
|
||||
"path": "tools/web/generate-wbv2-rig-pose-receipt.mjs",
|
||||
"sha256": "1014554e6ae5b32421ca425498bb811f0f11086e10c2e58150362f360a2726a9"
|
||||
},
|
||||
"report": {
|
||||
"path": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json",
|
||||
"sha256": "c92b0299d00fe8b109b7d0f36abe54c38c2efe18e6e30b81eeaeba5b2d54471e"
|
||||
},
|
||||
"status": {
|
||||
"path": "docs/status/WBV2-P13-003.md",
|
||||
"sha256": "c6b81a4f3db50108e08b8134adae14ed920bf4a3b5b8eca2ac3d7d92fb13e6a1"
|
||||
},
|
||||
"parityPlan": {
|
||||
"path": "tests/golden/WBV2-P13-003/high-value-task-plan.json",
|
||||
"sha256": "d23125185535de120947912a8f3f38db879740376442e62fb5f48418e430101e"
|
||||
},
|
||||
"taskContext": {
|
||||
"path": "tests/golden/WBV2-P13-003/task-context.json",
|
||||
"sha256": "fbe626f8a7100341941d0fe4d22a4fe3a55c1c6a72870822f94eb32645b05b3b"
|
||||
}
|
||||
},
|
||||
"assertions": {
|
||||
"boneCount": 2,
|
||||
"stablePoseMatrices": true,
|
||||
"stableSkinIdentity": true,
|
||||
"constraintEdit": "EXACT",
|
||||
"saveReopen": "EXACT",
|
||||
"malformedRejected": true,
|
||||
"shapeKeyObservationExplicit": true,
|
||||
"deterministic": true,
|
||||
"historicalReproduction": false
|
||||
},
|
||||
"nextTask": "WBV2-P13-004"
|
||||
}
|
||||
363
tests/golden/WBV2-P13-003/rig-pose-production.json
Normal file
363
tests/golden/WBV2-P13-003/rig-pose-production.json
Normal file
@@ -0,0 +1,363 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-003",
|
||||
"operation": "RIG_POSE_ENGINE_CHROMIUM",
|
||||
"browser": "chromium",
|
||||
"queueMutation": false,
|
||||
"baseRevision": 1,
|
||||
"editedRevision": 2,
|
||||
"before": {
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"bones": [
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"name": "WBV2P3003Root",
|
||||
"parentId": null,
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip",
|
||||
"name": "WBV2P3003Tip",
|
||||
"parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.7568745613098145,
|
||||
0.6535601019859314,
|
||||
0,
|
||||
0,
|
||||
-0.6535601019859314,
|
||||
0.7568745613098145,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
],
|
||||
"meshId": "mesh:WBV2P3003SkinnedMesh",
|
||||
"vertexCount": 8,
|
||||
"skinWeights": {
|
||||
"boneNames": [
|
||||
"WBV2P3003Root",
|
||||
"WBV2P3003Tip"
|
||||
],
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"jointIds": [
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Tip"
|
||||
]
|
||||
},
|
||||
"shapeKeyCount": 1
|
||||
},
|
||||
"after": {
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"bones": [
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"name": "WBV2P3003Root",
|
||||
"parentId": null,
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip",
|
||||
"name": "WBV2P3003Tip",
|
||||
"parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.7568745613098145,
|
||||
0.6535601019859314,
|
||||
0,
|
||||
0,
|
||||
-0.6535601019859314,
|
||||
0.7568745613098145,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
],
|
||||
"meshId": "mesh:WBV2P3003SkinnedMesh",
|
||||
"vertexCount": 8,
|
||||
"skinWeights": {
|
||||
"boneNames": [
|
||||
"WBV2P3003Root",
|
||||
"WBV2P3003Tip"
|
||||
],
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"jointIds": [
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Tip"
|
||||
]
|
||||
},
|
||||
"shapeKeyCount": 1
|
||||
},
|
||||
"afterMalformed": {
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"bones": [
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"name": "WBV2P3003Root",
|
||||
"parentId": null,
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip",
|
||||
"name": "WBV2P3003Tip",
|
||||
"parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.7568745613098145,
|
||||
0.6535601019859314,
|
||||
0,
|
||||
0,
|
||||
-0.6535601019859314,
|
||||
0.7568745613098145,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
],
|
||||
"meshId": "mesh:WBV2P3003SkinnedMesh",
|
||||
"vertexCount": 8,
|
||||
"skinWeights": {
|
||||
"boneNames": [
|
||||
"WBV2P3003Root",
|
||||
"WBV2P3003Tip"
|
||||
],
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"jointIds": [
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Tip"
|
||||
]
|
||||
},
|
||||
"shapeKeyCount": 1
|
||||
},
|
||||
"malformed": {
|
||||
"code": "INVALID_ARGUMENT",
|
||||
"message": "constraint was not found"
|
||||
},
|
||||
"reopened": {
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"bones": [
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"name": "WBV2P3003Root",
|
||||
"parentId": null,
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip",
|
||||
"name": "WBV2P3003Tip",
|
||||
"parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.7568745613098145,
|
||||
0.6535601019859314,
|
||||
0,
|
||||
0,
|
||||
-0.6535601019859314,
|
||||
0.7568745613098145,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
],
|
||||
"meshId": "mesh:WBV2P3003SkinnedMesh",
|
||||
"vertexCount": 8,
|
||||
"skinWeights": {
|
||||
"boneNames": [
|
||||
"WBV2P3003Root",
|
||||
"WBV2P3003Tip"
|
||||
],
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"jointIds": [
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Tip"
|
||||
]
|
||||
},
|
||||
"shapeKeyCount": 1
|
||||
},
|
||||
"reopenedConstraint": {
|
||||
"enabled": false,
|
||||
"influence": 0.4000000059604645,
|
||||
"name": "WBV2P3003BoundedObjectConstraint",
|
||||
"type": "CONSTRAINT_6",
|
||||
"typeCode": 6
|
||||
},
|
||||
"savedSha256": "93678692111f25c92516e7e93f5bd7f73835d6700439d8869dd5e61a1d5d677f",
|
||||
"sourceSha256": "1044ac6b81561ef0f5f22578c279de82fcb2d543eff822d0375d59f35bb6d142",
|
||||
"saveReopenExact": true
|
||||
}
|
||||
363
tests/golden/WBV2-P13-003/rig-pose-production.second.json
Normal file
363
tests/golden/WBV2-P13-003/rig-pose-production.second.json
Normal file
@@ -0,0 +1,363 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-003",
|
||||
"operation": "RIG_POSE_ENGINE_CHROMIUM",
|
||||
"browser": "chromium",
|
||||
"queueMutation": false,
|
||||
"baseRevision": 1,
|
||||
"editedRevision": 2,
|
||||
"before": {
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"bones": [
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"name": "WBV2P3003Root",
|
||||
"parentId": null,
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip",
|
||||
"name": "WBV2P3003Tip",
|
||||
"parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.7568745613098145,
|
||||
0.6535601019859314,
|
||||
0,
|
||||
0,
|
||||
-0.6535601019859314,
|
||||
0.7568745613098145,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
],
|
||||
"meshId": "mesh:WBV2P3003SkinnedMesh",
|
||||
"vertexCount": 8,
|
||||
"skinWeights": {
|
||||
"boneNames": [
|
||||
"WBV2P3003Root",
|
||||
"WBV2P3003Tip"
|
||||
],
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"jointIds": [
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Tip"
|
||||
]
|
||||
},
|
||||
"shapeKeyCount": 1
|
||||
},
|
||||
"after": {
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"bones": [
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"name": "WBV2P3003Root",
|
||||
"parentId": null,
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip",
|
||||
"name": "WBV2P3003Tip",
|
||||
"parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.7568745613098145,
|
||||
0.6535601019859314,
|
||||
0,
|
||||
0,
|
||||
-0.6535601019859314,
|
||||
0.7568745613098145,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
],
|
||||
"meshId": "mesh:WBV2P3003SkinnedMesh",
|
||||
"vertexCount": 8,
|
||||
"skinWeights": {
|
||||
"boneNames": [
|
||||
"WBV2P3003Root",
|
||||
"WBV2P3003Tip"
|
||||
],
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"jointIds": [
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Tip"
|
||||
]
|
||||
},
|
||||
"shapeKeyCount": 1
|
||||
},
|
||||
"afterMalformed": {
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"bones": [
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"name": "WBV2P3003Root",
|
||||
"parentId": null,
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip",
|
||||
"name": "WBV2P3003Tip",
|
||||
"parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.7568745613098145,
|
||||
0.6535601019859314,
|
||||
0,
|
||||
0,
|
||||
-0.6535601019859314,
|
||||
0.7568745613098145,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
],
|
||||
"meshId": "mesh:WBV2P3003SkinnedMesh",
|
||||
"vertexCount": 8,
|
||||
"skinWeights": {
|
||||
"boneNames": [
|
||||
"WBV2P3003Root",
|
||||
"WBV2P3003Tip"
|
||||
],
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"jointIds": [
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Tip"
|
||||
]
|
||||
},
|
||||
"shapeKeyCount": 1
|
||||
},
|
||||
"malformed": {
|
||||
"code": "INVALID_ARGUMENT",
|
||||
"message": "constraint was not found"
|
||||
},
|
||||
"reopened": {
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"bones": [
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"name": "WBV2P3003Root",
|
||||
"parentId": null,
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip",
|
||||
"name": "WBV2P3003Tip",
|
||||
"parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"head": [
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"tail": [
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
"poseMatrix": [
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.7568745613098145,
|
||||
0.6535601019859314,
|
||||
0,
|
||||
0,
|
||||
-0.6535601019859314,
|
||||
0.7568745613098145,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
],
|
||||
"meshId": "mesh:WBV2P3003SkinnedMesh",
|
||||
"vertexCount": 8,
|
||||
"skinWeights": {
|
||||
"boneNames": [
|
||||
"WBV2P3003Root",
|
||||
"WBV2P3003Tip"
|
||||
],
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"jointIds": [
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Tip"
|
||||
]
|
||||
},
|
||||
"shapeKeyCount": 1
|
||||
},
|
||||
"reopenedConstraint": {
|
||||
"enabled": false,
|
||||
"influence": 0.4000000059604645,
|
||||
"name": "WBV2P3003BoundedObjectConstraint",
|
||||
"type": "CONSTRAINT_6",
|
||||
"typeCode": 6
|
||||
},
|
||||
"savedSha256": "93678692111f25c92516e7e93f5bd7f73835d6700439d8869dd5e61a1d5d677f",
|
||||
"sourceSha256": "1044ac6b81561ef0f5f22578c279de82fcb2d543eff822d0375d59f35bb6d142",
|
||||
"saveReopenExact": true
|
||||
}
|
||||
64
tests/golden/WBV2-P13-003/rig-pose-receipt-report.json
Normal file
64
tests/golden/WBV2-P13-003/rig-pose-receipt-report.json
Normal file
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-003",
|
||||
"operation": "RIG_POSE_ENGINE_RECEIPT",
|
||||
"status": "PASS",
|
||||
"browser": "chromium",
|
||||
"queueMutation": false,
|
||||
"source": {
|
||||
"task": "WBV2-P3-003",
|
||||
"manifest": "tests/golden/WBV2-P3-003/manifest.json",
|
||||
"manifestSha256": "1b97d2ca9add58a6185a21137729edc4c8b11a2d21be1682793e3d05b9ef9011",
|
||||
"report": "tests/golden/WBV2-P3-003/rig-report.json",
|
||||
"reportSha256": "13b1227a6dcb02fbbf0d618b6fc8d504fa81a9e7babec1973e9814639a5ea028",
|
||||
"desktopExact": true,
|
||||
"wasmExact": true,
|
||||
"sourceSaveReopenExact": true,
|
||||
"desktopShapeKeyCount": 2,
|
||||
"wasmObservedShapeKeyCount": 1,
|
||||
"shapeKeyObservation": "reader exposes one non-Basis key"
|
||||
},
|
||||
"production": {
|
||||
"report": "tests/golden/WBV2-P13-003/rig-pose-production.json",
|
||||
"reportSha256": "a8dc61adcab4da3b1043821c39e6cea0550f8b234b213155736c0b9042c3efe8",
|
||||
"secondReport": "tests/golden/WBV2-P13-003/rig-pose-production.second.json",
|
||||
"secondReportSha256": "a8dc61adcab4da3b1043821c39e6cea0550f8b234b213155736c0b9042c3efe8",
|
||||
"deterministic": true,
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"boneCount": 2,
|
||||
"meshId": "mesh:WBV2P3003SkinnedMesh",
|
||||
"skinWeights": {
|
||||
"boneNames": [
|
||||
"WBV2P3003Root",
|
||||
"WBV2P3003Tip"
|
||||
],
|
||||
"armatureId": "armature:WBV2P3003Armature",
|
||||
"jointIds": [
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Root",
|
||||
"bone:armature:WBV2P3003Armature:WBV2P3003Tip"
|
||||
]
|
||||
},
|
||||
"constraintEdit": {
|
||||
"revisionDelta": 1,
|
||||
"objectId": "object:WBV2P3003SkinnedMeshObject",
|
||||
"constraint": "WBV2P3003BoundedObjectConstraint",
|
||||
"enabled": false,
|
||||
"influence": 0.4000000059604645
|
||||
},
|
||||
"malformed": {
|
||||
"code": "INVALID_ARGUMENT",
|
||||
"message": "constraint was not found"
|
||||
},
|
||||
"saveReopen": "EXACT"
|
||||
},
|
||||
"assertions": {
|
||||
"stableBoneIds": true,
|
||||
"poseMatricesPreserved": true,
|
||||
"skinIdentityPreserved": true,
|
||||
"unsupportedShapeKeyObservationExplicit": true,
|
||||
"malformedConstraintRejected": true,
|
||||
"saveReopenExact": true,
|
||||
"historicalReproduction": false
|
||||
},
|
||||
"nextTask": "WBV2-P13-004"
|
||||
}
|
||||
177
tests/golden/WBV2-P13-003/task-context.json
Normal file
177
tests/golden/WBV2-P13-003/task-context.json
Normal file
@@ -0,0 +1,177 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-003",
|
||||
"parentTask": "WBV2-P13-002",
|
||||
"status": "in_progress",
|
||||
"goal": "Execute the bounded RIG domain using existing source evidence and the compiled WebEngine runtime.",
|
||||
"scope": {
|
||||
"gap": "workflow:rig_pose_engine_receipt",
|
||||
"ownerFamily": "RIG",
|
||||
"implementationClass": "LOCAL_BOUNDED"
|
||||
},
|
||||
"commands": [
|
||||
"node tools/web/generate-wbv2-rig-pose-receipt.mjs --write",
|
||||
"node tools/web/check-task-context.mjs --task WBV2-P13-003 --write"
|
||||
],
|
||||
"inputPaths": [
|
||||
"tests/golden/WBV2-P3-003/rig-report.json"
|
||||
],
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 2650,
|
||||
"contextRemainingTokens": 662
|
||||
},
|
||||
"source": {
|
||||
"bytes": 7254,
|
||||
"tokens": 1814
|
||||
},
|
||||
"selected": [
|
||||
{
|
||||
"path": "tests/golden/WBV2-P3-003/rig-report.json",
|
||||
"bytes": 1104,
|
||||
"tokens": 276
|
||||
}
|
||||
],
|
||||
"excluded": [
|
||||
{
|
||||
"path": "tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend",
|
||||
"bytes": 88676,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "web/tests/e2e/wbv2-rig-pose-production.spec.ts",
|
||||
"bytes": 4959,
|
||||
"reason": "CONTEXT_REMAINING_SPACE"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-003/",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P13-003.md",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-003/manifest.json",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
}
|
||||
],
|
||||
"totals": {
|
||||
"files": 1,
|
||||
"bytes": 1104,
|
||||
"tokens": 276
|
||||
}
|
||||
},
|
||||
"exitCriteria": [
|
||||
"stable bone IDs and matrices are preserved",
|
||||
"unsupported constraint is explicit",
|
||||
"save/reopen is exact",
|
||||
"malformed pose input fails closed"
|
||||
],
|
||||
"nextTask": "WBV2-P13-004",
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/WBV2-P13-003.md",
|
||||
"taskIndex": "tests/golden/WBV2/task-index.json",
|
||||
"parentManifest": "tests/golden/WBV2-P13-002/manifest.json",
|
||||
"parentStatus": "docs/status/WBV2-P13-002.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/WBV2-P13-003.md",
|
||||
"tests/golden/WBV2-P13-002/manifest.json",
|
||||
"docs/status/WBV2-P13-002.md"
|
||||
],
|
||||
"machineOnly": [
|
||||
"tests/golden/WBV2/task-index.json",
|
||||
"tests/golden/M15-03A/task-catalog.jsonl"
|
||||
],
|
||||
"optionalByNeed": [
|
||||
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
|
||||
"任务卡列出的精确协议/生产路径",
|
||||
"任务卡明确命名的长期计划小节"
|
||||
],
|
||||
"forbiddenByDefault": [
|
||||
"完整 CURRENT_EXECUTION_PLAN.md",
|
||||
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
|
||||
"全部 docs/status/*.md",
|
||||
"完整 parity/WBS 计划",
|
||||
"README 历史和 test-results/"
|
||||
]
|
||||
},
|
||||
"parent": {
|
||||
"manifest": {
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-002",
|
||||
"parentTask": "WBV2-P13-001",
|
||||
"status": "done",
|
||||
"nextTask": "WBV2-P13-003",
|
||||
"artifactCount": 13
|
||||
},
|
||||
"statusSummary": [
|
||||
"# WBV2-P13-002 status",
|
||||
"- task: `WBV2-P13-002`; parent: `WBV2-P13-001`; status: `done`",
|
||||
"- graph count: `3`; graph hashes: stable",
|
||||
"- unsupported Simulation graph: rejected before Main mutation",
|
||||
"- save/reopen: `EXACT`; repeated execution: deterministic",
|
||||
"- nextTask: `WBV2-P13-003`",
|
||||
"Existing P4-002 Geometry Nodes evidence is reused read-only. The production Chromium test loads the actual WebEngine WASM Main, verifies stable graph hashes and unsupported-node retention, and rejects an unsupported graph without changing revision."
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1108,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 33,
|
||||
"taskTokens": 277
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 2803,
|
||||
"lines": 51,
|
||||
"tokens": 701
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/WBV2-P13-003.md",
|
||||
"bytes": 1108,
|
||||
"lines": 33,
|
||||
"tokens": 277
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-002/manifest.json",
|
||||
"bytes": 2819,
|
||||
"lines": 75,
|
||||
"tokens": 705
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P13-002.md",
|
||||
"bytes": 524,
|
||||
"lines": 10,
|
||||
"tokens": 131
|
||||
}
|
||||
],
|
||||
"sourceTokens": 1814,
|
||||
"evidenceFiles": 1,
|
||||
"evidenceBytes": 1104,
|
||||
"evidenceTokens": 276,
|
||||
"totalTokens": 2090,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 3114,
|
||||
"serializedContextTokens": 680,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
215
tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json
Normal file
215
tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json
Normal file
@@ -0,0 +1,215 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-004",
|
||||
"operation": "ADVANCED_DOMAIN_ENGINE_RECEIPT",
|
||||
"status": "PASS",
|
||||
"browser": "chromium",
|
||||
"queueMutation": false,
|
||||
"policy": {
|
||||
"existingReceiptsReused": true,
|
||||
"repeatedBlenderRuns": 0,
|
||||
"repeatedChromiumRuns": 0,
|
||||
"noFalseLocalParity": true,
|
||||
"blockedRoutesExplicit": true,
|
||||
"historicalReproduction": false
|
||||
},
|
||||
"sourceLedger": {
|
||||
"path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json",
|
||||
"sha256": "63ec0429718b6c2992a60febdee441ad24912ca149c8030c1d92faa10ffc290c",
|
||||
"sourceManifests": 15,
|
||||
"artifactRecords": 247
|
||||
},
|
||||
"domains": [
|
||||
{
|
||||
"domain": "SIMULATION",
|
||||
"task": "WBV2-P4-004",
|
||||
"manifest": "tests/golden/WBV2-P4-004/manifest.json",
|
||||
"manifestSha256": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016",
|
||||
"report": "tests/golden/WBV2-P4-004/simulation-report.json",
|
||||
"reportSha256": "ef0575debda0bd76e106a63f9a321f6bd1640cbc84bb7b40e17a4acf360c425a",
|
||||
"proof": "cache identity, cancellation, LRU, restart, exact reopen",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 5,
|
||||
"lifecycle": {
|
||||
"recovery": null,
|
||||
"unsupported": {
|
||||
"staleRevision": "CACHE_KEY_CHANGED_AND_NOT_PUBLISHED",
|
||||
"corruptPayload": "HASH_MISMATCH",
|
||||
"cancelledVerification": "CANCELLED_WITHOUT_PUBLISH",
|
||||
"lruProtected": "PROTECTED_AND_BUDGET_SATISFIED",
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "RENDER",
|
||||
"task": "WBV2-P5-001",
|
||||
"manifest": "tests/golden/WBV2-P5-001/manifest.json",
|
||||
"manifestSha256": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e",
|
||||
"report": "tests/golden/WBV2-P5-001/render-report.json",
|
||||
"reportSha256": "801c6c93df9cb16205b0489f66d9f3b53447b21db1a99e5fb80b71bd2c184f95",
|
||||
"proof": "bounded Eevee route READY; unsupported routes BLOCKED; pixel mismatch explicit",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 4,
|
||||
"lifecycle": {
|
||||
"recovery": {
|
||||
"cancellation": "OPEN_CANCELLED",
|
||||
"deviceLoss": "RELEASED",
|
||||
"temporaryResourcesAfter": 0
|
||||
},
|
||||
"unsupported": {
|
||||
"unsupportedRoute": "BLOCKED_WITHOUT_LOCAL_SUCCESS",
|
||||
"malformedRoute": "REJECTED_BEFORE_COMMIT",
|
||||
"pixelMismatch": "RENDER_REFERENCE_MISMATCH",
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "MEDIA",
|
||||
"task": "WBV2-P5-002",
|
||||
"manifest": "tests/golden/WBV2-P5-002/manifest.json",
|
||||
"manifestSha256": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2",
|
||||
"report": "tests/golden/WBV2-P5-002/media-report.json",
|
||||
"reportSha256": "90cf9e6eb6f09f2e3e0a25740e5b3e674209efd6f7dbf7fd91a7999ded35e3a0",
|
||||
"proof": "compositor/sequencer available; codec and budget boundaries explicit",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 4,
|
||||
"lifecycle": {
|
||||
"recovery": {
|
||||
"domains": [
|
||||
"RENDER",
|
||||
"COMPOSITOR",
|
||||
"MEDIA"
|
||||
],
|
||||
"cancelled": true,
|
||||
"budgetBlocked": true,
|
||||
"restart": "RECOVERED",
|
||||
"resourcesAfter": 0
|
||||
},
|
||||
"unsupported": {
|
||||
"staleSeek": "REVISION_CONFLICT",
|
||||
"cancelledCompositor": "COMPOSITOR_CANCELLED",
|
||||
"codecHashDrift": "SEQUENCER_CODEC_UNSUPPORTED",
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "SERVER",
|
||||
"task": "WBV2-P5-003",
|
||||
"manifest": "tests/golden/WBV2-P5-003/manifest.json",
|
||||
"manifestSha256": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c",
|
||||
"report": "tests/golden/WBV2-P5-003/server-job-report.json",
|
||||
"reportSha256": "656546af44238e2b07c44a1f8cccedf996ba639f6cb9ac1c38a4ec30eeafeca3",
|
||||
"proof": "idempotency, conflict, hash and cancel/timeout/oom boundaries",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 7,
|
||||
"lifecycle": {
|
||||
"recovery": null,
|
||||
"unsupported": {
|
||||
"staleResult": "SERVER_RENDER_BINDING_MISMATCH",
|
||||
"outputHashDrift": "SERVER_RENDER_OUTPUT_HASH_MISMATCH",
|
||||
"malformedSettings": "SERVER_RENDER_SETTINGS_INVALID",
|
||||
"cancel": "SERVER_JOB_CANCELLED",
|
||||
"timeout": "SERVER_JOB_TIMEOUT",
|
||||
"oom": "SERVER_JOB_OOM",
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "SECURITY",
|
||||
"task": "WBV2-P6-001",
|
||||
"manifest": "tests/golden/WBV2-P6-001/manifest.json",
|
||||
"manifestSha256": "e8bb64d618b630b34292501d44fe46c55de3a57ddf0fccb4b7974c6a479456a4",
|
||||
"report": "tests/golden/WBV2-P6-001/scripting-report.json",
|
||||
"reportSha256": "9af7be5ddc2db3893a037294e073487a62c250fb9cb308edcdf0e335f0d66f16",
|
||||
"proof": "default deny, audit, sandbox and filesystem/network boundaries",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 9,
|
||||
"lifecycle": {
|
||||
"recovery": null,
|
||||
"unsupported": {
|
||||
"autorun": "SCRIPT_POLICY_DENIED",
|
||||
"network": "SCRIPT_POLICY_DENIED",
|
||||
"addonInstall": "ADDON_INSTALL_BLOCKED",
|
||||
"driverExpressions": "DRIVER_EXECUTION_BLOCKED",
|
||||
"signature": "SCRIPT_SIGNATURE_INVALID",
|
||||
"sandbox": "SCRIPT_SANDBOX_UNAVAILABLE",
|
||||
"lateResult": "SCRIPT_SANDBOX_LATE_RESULT",
|
||||
"filesystemEscape": "SCRIPT_MANIFEST_INVALID",
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "RELIABILITY",
|
||||
"task": "WBV2-P6-002",
|
||||
"manifest": "tests/golden/WBV2-P6-002/manifest.json",
|
||||
"manifestSha256": "b66e193b81c0c592964c874902d0ee024c4877610fd7fa92aee2a961f69d01ba",
|
||||
"report": "tests/golden/WBV2-P6-002/performance-report.json",
|
||||
"reportSha256": "dfe297e8e024dc2ae581f744ff4fb18f19cd6083c707f014ed345a8d95da421e",
|
||||
"proof": "budget thresholds, fault recovery, quarantine and resource release",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 3,
|
||||
"lifecycle": {
|
||||
"recovery": null,
|
||||
"unsupported": {
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
|
||||
"allFaultsNoPublish": true,
|
||||
"cache": "QUARANTINED"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "RELEASE",
|
||||
"task": "WBV2-P6-003",
|
||||
"manifest": "tests/golden/WBV2-P6-003/manifest.json",
|
||||
"manifestSha256": "22a773feb29435ec0c29eaa720e7ae39c5f87455c678b78ae6c02b4985fea54d",
|
||||
"report": "tests/golden/WBV2-P6-003/release-report.json",
|
||||
"reportSha256": "2111b4651f01966c4f47e8a1f5afc581b4bf2056e733240f49a546aad1faae0b",
|
||||
"proof": "offline/source/binary package, CI, SBOM and rollback",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 3,
|
||||
"lifecycle": {
|
||||
"recovery": null,
|
||||
"unsupported": {
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
|
||||
"hashDrift": "BLOCKED_BEFORE_PUBLISH",
|
||||
"failedCi": "BLOCKED_BEFORE_PUBLISH"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"summary": {
|
||||
"domains": 7,
|
||||
"exactReports": 7,
|
||||
"repeatedRuns": 0,
|
||||
"unsupportedRoutesExplicit": true,
|
||||
"inventoryRemaining": 6618,
|
||||
"inventoryClaimedComplete": 0
|
||||
},
|
||||
"nextTask": "WBV2-P13-005"
|
||||
}
|
||||
2074
tests/golden/WBV2-P13-004/high-value-task-plan.json
Normal file
2074
tests/golden/WBV2-P13-004/high-value-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
88
tests/golden/WBV2-P13-004/manifest.json
Normal file
88
tests/golden/WBV2-P13-004/manifest.json
Normal file
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-004",
|
||||
"parentTask": "WBV2-P13-003",
|
||||
"operation": "ADVANCED_DOMAIN_ENGINE_RECEIPT",
|
||||
"status": "done",
|
||||
"enablingTask": false,
|
||||
"parityStateChange": true,
|
||||
"runtime": "READ_ONLY_ADVANCED_RECEIPT_AGGREGATION",
|
||||
"artifacts": {
|
||||
"parentManifest": {
|
||||
"path": "tests/golden/WBV2-P13-003/manifest.json",
|
||||
"sha256": "f7119b7f0338d5427cd1d97e9962e56f86c6e9874ea65e3916d6b67c04d453a1"
|
||||
},
|
||||
"ledger": {
|
||||
"path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json",
|
||||
"sha256": "63ec0429718b6c2992a60febdee441ad24912ca149c8030c1d92faa10ffc290c"
|
||||
},
|
||||
"sourceManifests": {
|
||||
"path": "tests/golden/WBV2-P13-001/advanced-source-index.json",
|
||||
"sha256": "97fda8a988eee44592f34dab6274d9dcf12c25cba690872e75bf9ca62fabbf5d"
|
||||
},
|
||||
"simulationManifest": {
|
||||
"path": "tests/golden/WBV2-P4-004/manifest.json",
|
||||
"sha256": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016"
|
||||
},
|
||||
"simulationReport": {
|
||||
"path": "tests/golden/WBV2-P4-004/simulation-report.json",
|
||||
"sha256": "ef0575debda0bd76e106a63f9a321f6bd1640cbc84bb7b40e17a4acf360c425a"
|
||||
},
|
||||
"renderManifest": {
|
||||
"path": "tests/golden/WBV2-P5-001/manifest.json",
|
||||
"sha256": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e"
|
||||
},
|
||||
"renderReport": {
|
||||
"path": "tests/golden/WBV2-P5-001/render-report.json",
|
||||
"sha256": "801c6c93df9cb16205b0489f66d9f3b53447b21db1a99e5fb80b71bd2c184f95"
|
||||
},
|
||||
"mediaManifest": {
|
||||
"path": "tests/golden/WBV2-P5-002/manifest.json",
|
||||
"sha256": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2"
|
||||
},
|
||||
"mediaReport": {
|
||||
"path": "tests/golden/WBV2-P5-002/media-report.json",
|
||||
"sha256": "90cf9e6eb6f09f2e3e0a25740e5b3e674209efd6f7dbf7fd91a7999ded35e3a0"
|
||||
},
|
||||
"serverManifest": {
|
||||
"path": "tests/golden/WBV2-P5-003/manifest.json",
|
||||
"sha256": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c"
|
||||
},
|
||||
"serverReport": {
|
||||
"path": "tests/golden/WBV2-P5-003/server-job-report.json",
|
||||
"sha256": "656546af44238e2b07c44a1f8cccedf996ba639f6cb9ac1c38a4ec30eeafeca3"
|
||||
},
|
||||
"production": {
|
||||
"path": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json",
|
||||
"sha256": "76148c6cb94cf1b15035260815c6d492ea09d10f89dcbbbc825e0f17957f6a4d"
|
||||
},
|
||||
"e2e": {
|
||||
"path": "tools/web/generate-wbv2-advanced-domain-receipt.mjs",
|
||||
"sha256": "6c0ac0d16b5c0aa460657b84d7f8144209e23eea2f6dce5e4784c22048092462"
|
||||
},
|
||||
"status": {
|
||||
"path": "docs/status/WBV2-P13-004.md",
|
||||
"sha256": "d3fc0260c61f013ae5ff94a7d4e39143ceb706ddf4d8a3a92cc81ccdc0c0013a"
|
||||
},
|
||||
"parityPlan": {
|
||||
"path": "tests/golden/WBV2-P13-004/high-value-task-plan.json",
|
||||
"sha256": "7132c2aab3d83c2b18dd3c3f6ed655784904424807070844405bcc34dc9b729a"
|
||||
},
|
||||
"taskContext": {
|
||||
"path": "tests/golden/WBV2-P13-004/task-context.json",
|
||||
"sha256": "35b40950216fd717b64710081ca97351f16f161b6451b201b5c4d747d03ca762"
|
||||
}
|
||||
},
|
||||
"assertions": {
|
||||
"domains": 7,
|
||||
"exactReports": 7,
|
||||
"repeatedBlenderRuns": 0,
|
||||
"repeatedChromiumRuns": 0,
|
||||
"blockedRoutesExplicit": true,
|
||||
"inventoryRemaining": 6618,
|
||||
"inventoryClaimedComplete": 0,
|
||||
"deterministic": true,
|
||||
"historicalReproduction": false
|
||||
},
|
||||
"nextTask": "WBV2-P13-005"
|
||||
}
|
||||
179
tests/golden/WBV2-P13-004/task-context.json
Normal file
179
tests/golden/WBV2-P13-004/task-context.json
Normal file
@@ -0,0 +1,179 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-004",
|
||||
"parentTask": "WBV2-P13-003",
|
||||
"status": "in_progress",
|
||||
"goal": "Execute the bounded ADVANCED domain using existing source evidence and the compiled WebEngine runtime.",
|
||||
"scope": {
|
||||
"gap": "workflow:simulation_render_media_engine_receipt",
|
||||
"ownerFamily": "ADVANCED",
|
||||
"implementationClass": "LOCAL_BOUNDED"
|
||||
},
|
||||
"commands": [
|
||||
"node tools/web/generate-wbv2-advanced-domain-receipt.mjs --write",
|
||||
"node tools/web/check-task-context.mjs --task WBV2-P13-004 --write"
|
||||
],
|
||||
"inputPaths": [
|
||||
"tests/golden/WBV2-P4-004/simulation-report.json",
|
||||
"tests/golden/WBV2-P5-003/server-job-report.json"
|
||||
],
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 2437,
|
||||
"contextRemainingTokens": 608
|
||||
},
|
||||
"source": {
|
||||
"bytes": 7467,
|
||||
"tokens": 1868
|
||||
},
|
||||
"selected": [
|
||||
{
|
||||
"path": "tests/golden/WBV2-P4-004/simulation-report.json",
|
||||
"bytes": 1077,
|
||||
"tokens": 270
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P5-003/server-job-report.json",
|
||||
"bytes": 1255,
|
||||
"tokens": 314
|
||||
}
|
||||
],
|
||||
"excluded": [
|
||||
{
|
||||
"path": "web/tests/e2e/wbv2-advanced-domain-production.spec.ts",
|
||||
"bytes": null,
|
||||
"reason": "MISSING_PATH"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-004/",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P13-004.md",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-004/manifest.json",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
}
|
||||
],
|
||||
"totals": {
|
||||
"files": 2,
|
||||
"bytes": 2332,
|
||||
"tokens": 584
|
||||
}
|
||||
},
|
||||
"exitCriteria": [
|
||||
"existing exact reports are reused",
|
||||
"unsupported routes remain explicit",
|
||||
"hash and lifecycle states are bound",
|
||||
"no false local parity claim"
|
||||
],
|
||||
"nextTask": "WBV2-P13-005",
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/WBV2-P13-004.md",
|
||||
"taskIndex": "tests/golden/WBV2/task-index.json",
|
||||
"parentManifest": "tests/golden/WBV2-P13-003/manifest.json",
|
||||
"parentStatus": "docs/status/WBV2-P13-003.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/WBV2-P13-004.md",
|
||||
"tests/golden/WBV2-P13-003/manifest.json",
|
||||
"docs/status/WBV2-P13-003.md"
|
||||
],
|
||||
"machineOnly": [
|
||||
"tests/golden/WBV2/task-index.json",
|
||||
"tests/golden/M15-03A/task-catalog.jsonl"
|
||||
],
|
||||
"optionalByNeed": [
|
||||
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
|
||||
"任务卡列出的精确协议/生产路径",
|
||||
"任务卡明确命名的长期计划小节"
|
||||
],
|
||||
"forbiddenByDefault": [
|
||||
"完整 CURRENT_EXECUTION_PLAN.md",
|
||||
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
|
||||
"全部 docs/status/*.md",
|
||||
"完整 parity/WBS 计划",
|
||||
"README 历史和 test-results/"
|
||||
]
|
||||
},
|
||||
"parent": {
|
||||
"manifest": {
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-003",
|
||||
"parentTask": "WBV2-P13-002",
|
||||
"status": "done",
|
||||
"nextTask": "WBV2-P13-004",
|
||||
"artifactCount": 13
|
||||
},
|
||||
"statusSummary": [
|
||||
"# WBV2-P13-003 status",
|
||||
"- task: `WBV2-P13-003`; parent: `WBV2-P13-002`; status: `done`",
|
||||
"- armature: `2` stable bones; skin weights and pose matrices preserved",
|
||||
"- constraint edit: disabled at influence `0.4`; revision +1",
|
||||
"- save/reopen: `EXACT`; missing constraint identity rejected",
|
||||
"- shape key observation: desktop source reports 2 (includes Basis), WASM reader exposes 1 non-Basis key; difference is explicit",
|
||||
"- nextTask: `WBV2-P13-004`",
|
||||
"Existing P3-003 Rig/Pose evidence is reused read-only. The new Chromium receipt binds a bounded constraint edit and stable armature/skin identity to the compiled WASM Main without claiming unsupported shape-key parity."
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1159,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 33,
|
||||
"taskTokens": 290
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 2803,
|
||||
"lines": 51,
|
||||
"tokens": 701
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/WBV2-P13-004.md",
|
||||
"bytes": 1159,
|
||||
"lines": 33,
|
||||
"tokens": 290
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-003/manifest.json",
|
||||
"bytes": 2852,
|
||||
"lines": 77,
|
||||
"tokens": 713
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P13-003.md",
|
||||
"bytes": 653,
|
||||
"lines": 11,
|
||||
"tokens": 164
|
||||
}
|
||||
],
|
||||
"sourceTokens": 1868,
|
||||
"evidenceFiles": 2,
|
||||
"evidenceBytes": 2332,
|
||||
"evidenceTokens": 584,
|
||||
"totalTokens": 2452,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 3476,
|
||||
"serializedContextTokens": 727,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
309
tests/golden/WBV2-P13-005/high-value-domain-gate-report.json
Normal file
309
tests/golden/WBV2-P13-005/high-value-domain-gate-report.json
Normal file
@@ -0,0 +1,309 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-005",
|
||||
"operation": "RECOMPUTE_HIGH_VALUE_DOMAIN_GATE",
|
||||
"status": "PASS",
|
||||
"decision": {
|
||||
"status": "READY_WITH_HIGH_VALUE_DOMAIN_PARITY",
|
||||
"code": "HIGH_VALUE_DOMAIN_AUTHORIZED_REBASELINE",
|
||||
"featureParityClaims": [
|
||||
"CAP-MESH-TOPOLOGY-FAMILY",
|
||||
"CAP-MODIFIER-PARAMETER-APPLY",
|
||||
"CAP-ASSET-LINK-OVERRIDE-RELOAD",
|
||||
"CAP-SCENE-OBJECT-ENGINE",
|
||||
"CAP-MATERIAL-ANIMATION-ENGINE",
|
||||
"CAP-VIEWPORT-NONMESH-ENGINE",
|
||||
"NODES.GEOMETRY_ENGINE",
|
||||
"RIG.POSE_ENGINE"
|
||||
],
|
||||
"featureParityClaimCount": 8,
|
||||
"advancedSourceDomains": [
|
||||
"SIMULATION",
|
||||
"RENDER",
|
||||
"MEDIA",
|
||||
"SERVER",
|
||||
"SECURITY",
|
||||
"RELIABILITY",
|
||||
"RELEASE"
|
||||
],
|
||||
"engineBound": true,
|
||||
"browser": "chromium",
|
||||
"provenanceEpoch": 2,
|
||||
"releaseScope": "AUTHORIZED_REBASELINE_ONLY",
|
||||
"fullHistoricalReproduction": false,
|
||||
"inventoryTotal": 6900,
|
||||
"inventoryPending": 6618,
|
||||
"inventoryClaimedComplete": 0
|
||||
},
|
||||
"evidence": {
|
||||
"ledger": {
|
||||
"path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json",
|
||||
"sha256": "63ec0429718b6c2992a60febdee441ad24912ca149c8030c1d92faa10ffc290c",
|
||||
"sourceManifests": 15,
|
||||
"artifactRecords": 247,
|
||||
"repeatedRuns": 0
|
||||
},
|
||||
"p12Gate": {
|
||||
"path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json",
|
||||
"sha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c",
|
||||
"manifest": "tests/golden/WBV2-P12-005/manifest.json",
|
||||
"manifestSha256": "c7a53cbb4952b448144f282856401190df8a270737b6dbc8754d516d62b9ac2b",
|
||||
"claims": 6
|
||||
},
|
||||
"geometryNodes": {
|
||||
"path": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json",
|
||||
"sha256": "9c082ce56feb185cc72ede1058f465475d39baba0c408be6bad9568d8886d591",
|
||||
"manifest": "tests/golden/WBV2-P13-002/manifest.json",
|
||||
"manifestSha256": "e84b3a057c8e07479e77f517dade1366332effda994784b63003a604de0efb87",
|
||||
"claims": [
|
||||
"NODES.GEOMETRY_ENGINE"
|
||||
],
|
||||
"graphCount": 3,
|
||||
"saveReopen": "EXACT"
|
||||
},
|
||||
"rigPose": {
|
||||
"path": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json",
|
||||
"sha256": "c92b0299d00fe8b109b7d0f36abe54c38c2efe18e6e30b81eeaeba5b2d54471e",
|
||||
"manifest": "tests/golden/WBV2-P13-003/manifest.json",
|
||||
"manifestSha256": "f7119b7f0338d5427cd1d97e9962e56f86c6e9874ea65e3916d6b67c04d453a1",
|
||||
"claims": [
|
||||
"RIG.POSE_ENGINE"
|
||||
],
|
||||
"boneCount": 2,
|
||||
"saveReopen": "EXACT",
|
||||
"shapeKeyObservation": "reader exposes one non-Basis key"
|
||||
},
|
||||
"advancedDomains": {
|
||||
"path": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json",
|
||||
"sha256": "76148c6cb94cf1b15035260815c6d492ea09d10f89dcbbbc825e0f17957f6a4d",
|
||||
"manifest": "tests/golden/WBV2-P13-004/manifest.json",
|
||||
"manifestSha256": "817001fd0fc9f0d5f93cf9ddba81bff9a4ded0856a55ff315daf9765b486ec62",
|
||||
"domains": [
|
||||
{
|
||||
"domain": "SIMULATION",
|
||||
"task": "WBV2-P4-004",
|
||||
"manifest": "tests/golden/WBV2-P4-004/manifest.json",
|
||||
"manifestSha256": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016",
|
||||
"report": "tests/golden/WBV2-P4-004/simulation-report.json",
|
||||
"reportSha256": "ef0575debda0bd76e106a63f9a321f6bd1640cbc84bb7b40e17a4acf360c425a",
|
||||
"proof": "cache identity, cancellation, LRU, restart, exact reopen",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 5,
|
||||
"lifecycle": {
|
||||
"recovery": null,
|
||||
"unsupported": {
|
||||
"staleRevision": "CACHE_KEY_CHANGED_AND_NOT_PUBLISHED",
|
||||
"corruptPayload": "HASH_MISMATCH",
|
||||
"cancelledVerification": "CANCELLED_WITHOUT_PUBLISH",
|
||||
"lruProtected": "PROTECTED_AND_BUDGET_SATISFIED",
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "RENDER",
|
||||
"task": "WBV2-P5-001",
|
||||
"manifest": "tests/golden/WBV2-P5-001/manifest.json",
|
||||
"manifestSha256": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e",
|
||||
"report": "tests/golden/WBV2-P5-001/render-report.json",
|
||||
"reportSha256": "801c6c93df9cb16205b0489f66d9f3b53447b21db1a99e5fb80b71bd2c184f95",
|
||||
"proof": "bounded Eevee route READY; unsupported routes BLOCKED; pixel mismatch explicit",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 4,
|
||||
"lifecycle": {
|
||||
"recovery": {
|
||||
"cancellation": "OPEN_CANCELLED",
|
||||
"deviceLoss": "RELEASED",
|
||||
"temporaryResourcesAfter": 0
|
||||
},
|
||||
"unsupported": {
|
||||
"unsupportedRoute": "BLOCKED_WITHOUT_LOCAL_SUCCESS",
|
||||
"malformedRoute": "REJECTED_BEFORE_COMMIT",
|
||||
"pixelMismatch": "RENDER_REFERENCE_MISMATCH",
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "MEDIA",
|
||||
"task": "WBV2-P5-002",
|
||||
"manifest": "tests/golden/WBV2-P5-002/manifest.json",
|
||||
"manifestSha256": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2",
|
||||
"report": "tests/golden/WBV2-P5-002/media-report.json",
|
||||
"reportSha256": "90cf9e6eb6f09f2e3e0a25740e5b3e674209efd6f7dbf7fd91a7999ded35e3a0",
|
||||
"proof": "compositor/sequencer available; codec and budget boundaries explicit",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 4,
|
||||
"lifecycle": {
|
||||
"recovery": {
|
||||
"domains": [
|
||||
"RENDER",
|
||||
"COMPOSITOR",
|
||||
"MEDIA"
|
||||
],
|
||||
"cancelled": true,
|
||||
"budgetBlocked": true,
|
||||
"restart": "RECOVERED",
|
||||
"resourcesAfter": 0
|
||||
},
|
||||
"unsupported": {
|
||||
"staleSeek": "REVISION_CONFLICT",
|
||||
"cancelledCompositor": "COMPOSITOR_CANCELLED",
|
||||
"codecHashDrift": "SEQUENCER_CODEC_UNSUPPORTED",
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "SERVER",
|
||||
"task": "WBV2-P5-003",
|
||||
"manifest": "tests/golden/WBV2-P5-003/manifest.json",
|
||||
"manifestSha256": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c",
|
||||
"report": "tests/golden/WBV2-P5-003/server-job-report.json",
|
||||
"reportSha256": "656546af44238e2b07c44a1f8cccedf996ba639f6cb9ac1c38a4ec30eeafeca3",
|
||||
"proof": "idempotency, conflict, hash and cancel/timeout/oom boundaries",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 7,
|
||||
"lifecycle": {
|
||||
"recovery": null,
|
||||
"unsupported": {
|
||||
"staleResult": "SERVER_RENDER_BINDING_MISMATCH",
|
||||
"outputHashDrift": "SERVER_RENDER_OUTPUT_HASH_MISMATCH",
|
||||
"malformedSettings": "SERVER_RENDER_SETTINGS_INVALID",
|
||||
"cancel": "SERVER_JOB_CANCELLED",
|
||||
"timeout": "SERVER_JOB_TIMEOUT",
|
||||
"oom": "SERVER_JOB_OOM",
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "SECURITY",
|
||||
"task": "WBV2-P6-001",
|
||||
"manifest": "tests/golden/WBV2-P6-001/manifest.json",
|
||||
"manifestSha256": "e8bb64d618b630b34292501d44fe46c55de3a57ddf0fccb4b7974c6a479456a4",
|
||||
"report": "tests/golden/WBV2-P6-001/scripting-report.json",
|
||||
"reportSha256": "9af7be5ddc2db3893a037294e073487a62c250fb9cb308edcdf0e335f0d66f16",
|
||||
"proof": "default deny, audit, sandbox and filesystem/network boundaries",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 9,
|
||||
"lifecycle": {
|
||||
"recovery": null,
|
||||
"unsupported": {
|
||||
"autorun": "SCRIPT_POLICY_DENIED",
|
||||
"network": "SCRIPT_POLICY_DENIED",
|
||||
"addonInstall": "ADDON_INSTALL_BLOCKED",
|
||||
"driverExpressions": "DRIVER_EXECUTION_BLOCKED",
|
||||
"signature": "SCRIPT_SIGNATURE_INVALID",
|
||||
"sandbox": "SCRIPT_SANDBOX_UNAVAILABLE",
|
||||
"lateResult": "SCRIPT_SANDBOX_LATE_RESULT",
|
||||
"filesystemEscape": "SCRIPT_MANIFEST_INVALID",
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "RELIABILITY",
|
||||
"task": "WBV2-P6-002",
|
||||
"manifest": "tests/golden/WBV2-P6-002/manifest.json",
|
||||
"manifestSha256": "b66e193b81c0c592964c874902d0ee024c4877610fd7fa92aee2a961f69d01ba",
|
||||
"report": "tests/golden/WBV2-P6-002/performance-report.json",
|
||||
"reportSha256": "dfe297e8e024dc2ae581f744ff4fb18f19cd6083c707f014ed345a8d95da421e",
|
||||
"proof": "budget thresholds, fault recovery, quarantine and resource release",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 3,
|
||||
"lifecycle": {
|
||||
"recovery": null,
|
||||
"unsupported": {
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
|
||||
"allFaultsNoPublish": true,
|
||||
"cache": "QUARANTINED"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"domain": "RELEASE",
|
||||
"task": "WBV2-P6-003",
|
||||
"manifest": "tests/golden/WBV2-P6-003/manifest.json",
|
||||
"manifestSha256": "22a773feb29435ec0c29eaa720e7ae39c5f87455c678b78ae6c02b4985fea54d",
|
||||
"report": "tests/golden/WBV2-P6-003/release-report.json",
|
||||
"reportSha256": "2111b4651f01966c4f47e8a1f5afc581b4bf2056e733240f49a546aad1faae0b",
|
||||
"proof": "offline/source/binary package, CI, SBOM and rollback",
|
||||
"evidenceClass": "EXACT_RECORDED",
|
||||
"browser": "chromium",
|
||||
"repeatedExecution": false,
|
||||
"saveReopen": "EXACT",
|
||||
"negativeBoundaryCount": 3,
|
||||
"lifecycle": {
|
||||
"recovery": null,
|
||||
"unsupported": {
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
|
||||
"hashDrift": "BLOCKED_BEFORE_PUBLISH",
|
||||
"failedCi": "BLOCKED_BEFORE_PUBLISH"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"featureClaimsPromoted": false
|
||||
},
|
||||
"approval": {
|
||||
"path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json",
|
||||
"sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3",
|
||||
"epoch": 2,
|
||||
"releaseScope": "AUTHORIZED_REBASELINE_ONLY"
|
||||
}
|
||||
},
|
||||
"efficiency": {
|
||||
"batchLedgerScan": true,
|
||||
"existingReceiptsReused": 22,
|
||||
"repeatedBlenderRuns": 0,
|
||||
"repeatedChromiumRuns": 0,
|
||||
"newEngineReceipts": 2,
|
||||
"inventoryTasksCreated": 0,
|
||||
"duplicateValidationAvoided": true
|
||||
},
|
||||
"coverage": {
|
||||
"inventoryTotal": 6900,
|
||||
"inventoryPending": 6618,
|
||||
"inventoryClaimedComplete": 0,
|
||||
"engineBoundFeatureClaims": 8,
|
||||
"advancedSourceDomains": 7
|
||||
},
|
||||
"negative": {
|
||||
"missingReceipt": "REJECTED",
|
||||
"receiptHashDrift": "REJECTED",
|
||||
"unsupportedBrowser": "REJECTED",
|
||||
"nonExactSaveReopen": "REJECTED",
|
||||
"falseInventoryCompletion": "REJECTED",
|
||||
"falseHistoricalReproduction": "REJECTED",
|
||||
"undeclaredClaim": "REJECTED",
|
||||
"advancedDomainPromotionWithoutMainReceipt": "REJECTED"
|
||||
},
|
||||
"policy": {
|
||||
"sourceHistoryReadOnly": true,
|
||||
"authorizedRebaselineOnly": true,
|
||||
"existingEvidenceReused": true,
|
||||
"inventoryRemainderExplicit": true,
|
||||
"noFalseLocalParity": true,
|
||||
"terminalQueuePointer": true
|
||||
},
|
||||
"nextTask": null
|
||||
}
|
||||
2074
tests/golden/WBV2-P13-005/high-value-task-plan.json
Normal file
2074
tests/golden/WBV2-P13-005/high-value-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
95
tests/golden/WBV2-P13-005/manifest.json
Normal file
95
tests/golden/WBV2-P13-005/manifest.json
Normal file
@@ -0,0 +1,95 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-005",
|
||||
"parentTask": "WBV2-P13-004",
|
||||
"operation": "RECOMPUTE_HIGH_VALUE_DOMAIN_GATE",
|
||||
"status": "done",
|
||||
"enablingTask": true,
|
||||
"parityStateChange": true,
|
||||
"runtime": "READ_ONLY_LEDGER_PLUS_PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM",
|
||||
"artifacts": {
|
||||
"parentManifest": {
|
||||
"path": "tests/golden/WBV2-P13-004/manifest.json",
|
||||
"sha256": "817001fd0fc9f0d5f93cf9ddba81bff9a4ded0856a55ff315daf9765b486ec62"
|
||||
},
|
||||
"ledger": {
|
||||
"path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json",
|
||||
"sha256": "63ec0429718b6c2992a60febdee441ad24912ca149c8030c1d92faa10ffc290c"
|
||||
},
|
||||
"p12Gate": {
|
||||
"path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json",
|
||||
"sha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c"
|
||||
},
|
||||
"p12Manifest": {
|
||||
"path": "tests/golden/WBV2-P12-005/manifest.json",
|
||||
"sha256": "c7a53cbb4952b448144f282856401190df8a270737b6dbc8754d516d62b9ac2b"
|
||||
},
|
||||
"geometryNodesManifest": {
|
||||
"path": "tests/golden/WBV2-P13-002/manifest.json",
|
||||
"sha256": "e84b3a057c8e07479e77f517dade1366332effda994784b63003a604de0efb87"
|
||||
},
|
||||
"geometryNodesReport": {
|
||||
"path": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json",
|
||||
"sha256": "9c082ce56feb185cc72ede1058f465475d39baba0c408be6bad9568d8886d591"
|
||||
},
|
||||
"rigPoseManifest": {
|
||||
"path": "tests/golden/WBV2-P13-003/manifest.json",
|
||||
"sha256": "f7119b7f0338d5427cd1d97e9962e56f86c6e9874ea65e3916d6b67c04d453a1"
|
||||
},
|
||||
"rigPoseReport": {
|
||||
"path": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json",
|
||||
"sha256": "c92b0299d00fe8b109b7d0f36abe54c38c2efe18e6e30b81eeaeba5b2d54471e"
|
||||
},
|
||||
"advancedManifest": {
|
||||
"path": "tests/golden/WBV2-P13-004/manifest.json",
|
||||
"sha256": "817001fd0fc9f0d5f93cf9ddba81bff9a4ded0856a55ff315daf9765b486ec62"
|
||||
},
|
||||
"advancedReport": {
|
||||
"path": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json",
|
||||
"sha256": "76148c6cb94cf1b15035260815c6d492ea09d10f89dcbbbc825e0f17957f6a4d"
|
||||
},
|
||||
"approval": {
|
||||
"path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json",
|
||||
"sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3"
|
||||
},
|
||||
"generator": {
|
||||
"path": "tools/web/generate-wbv2-high-value-domain-gate.mjs",
|
||||
"sha256": "fb91243ede1437c78e096eb4cc5a238f7289f66fb95cdabd2d69a3b0de67ac4b"
|
||||
},
|
||||
"report": {
|
||||
"path": "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json",
|
||||
"sha256": "f3af76ab509fa7856e7cd383279d9e30fe036f0977a0839a277d241c303b8903"
|
||||
},
|
||||
"status": {
|
||||
"path": "docs/status/WBV2-P13-005.md",
|
||||
"sha256": "08366171356a9ab1cd0a379dd3bf2882deeedc6a080aa987e5bdf235eb6027da"
|
||||
},
|
||||
"parityPlan": {
|
||||
"path": "tests/golden/WBV2-P13-005/high-value-task-plan.json",
|
||||
"sha256": "3407b61eaf9f0e1a31732b1d2aef88db1cc3ce1f513a4872eb5488de033f3475"
|
||||
},
|
||||
"taskContext": {
|
||||
"path": "tests/golden/WBV2-P13-005/task-context.json",
|
||||
"sha256": "e7bc0cd9c3597454fdd329c2f997989feba68872cd572508d3b9a8b5716bc619"
|
||||
}
|
||||
},
|
||||
"assertions": {
|
||||
"totalFeatureClaims": 8,
|
||||
"p12ClaimsReused": 6,
|
||||
"newGeometryNodesClaims": 1,
|
||||
"newRigPoseClaims": 1,
|
||||
"advancedSourceDomains": 7,
|
||||
"advancedDomainsPromoted": 0,
|
||||
"existingManifestsBatchScanned": 15,
|
||||
"repeatedBlenderRuns": 0,
|
||||
"repeatedChromiumRuns": 0,
|
||||
"inventoryTotal": 6900,
|
||||
"inventoryPending": 6618,
|
||||
"inventoryClaimedComplete": 0,
|
||||
"provenanceEpoch": 2,
|
||||
"authorizedRebaselineOnly": true,
|
||||
"fullHistoricalReproduction": false,
|
||||
"deterministic": true
|
||||
},
|
||||
"nextTask": null
|
||||
}
|
||||
172
tests/golden/WBV2-P13-005/task-context.json
Normal file
172
tests/golden/WBV2-P13-005/task-context.json
Normal file
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-005",
|
||||
"parentTask": "WBV2-P13-004",
|
||||
"status": "done",
|
||||
"goal": "Execute the bounded RELEASE domain using existing source evidence and the compiled WebEngine runtime.",
|
||||
"scope": {
|
||||
"gap": "workflow:recompute_high_value_domain_gate",
|
||||
"ownerFamily": "RELEASE",
|
||||
"implementationClass": "LOCAL_BOUNDED"
|
||||
},
|
||||
"commands": [
|
||||
"node tools/web/generate-wbv2-high-value-domain-gate.mjs --write",
|
||||
"node tools/web/check-task-context.mjs --task WBV2-P13-005 --write"
|
||||
],
|
||||
"inputPaths": [
|
||||
"tests/golden/WBV2-P13-001/advanced-ledger-report.json"
|
||||
],
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 1987,
|
||||
"contextRemainingTokens": 495
|
||||
},
|
||||
"source": {
|
||||
"bytes": 7917,
|
||||
"tokens": 1981
|
||||
},
|
||||
"selected": [
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json",
|
||||
"bytes": 1351,
|
||||
"tokens": 338
|
||||
}
|
||||
],
|
||||
"excluded": [
|
||||
{
|
||||
"path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json",
|
||||
"bytes": 4124,
|
||||
"reason": "CONTEXT_REMAINING_SPACE"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-005/",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P13-005.md",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-005/manifest.json",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
}
|
||||
],
|
||||
"totals": {
|
||||
"files": 1,
|
||||
"bytes": 1351,
|
||||
"tokens": 338
|
||||
}
|
||||
},
|
||||
"exitCriteria": [
|
||||
"only evidenced claims are emitted",
|
||||
"inventory remainder stays explicit",
|
||||
"provenance limitation stays explicit",
|
||||
"full historical reproduction remains false"
|
||||
],
|
||||
"nextTask": null,
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/WBV2-P13-005.md",
|
||||
"taskIndex": "tests/golden/WBV2/task-index.json",
|
||||
"parentManifest": "tests/golden/WBV2-P13-004/manifest.json",
|
||||
"parentStatus": "docs/status/WBV2-P13-004.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/WBV2-P13-005.md",
|
||||
"tests/golden/WBV2-P13-004/manifest.json",
|
||||
"docs/status/WBV2-P13-004.md"
|
||||
],
|
||||
"machineOnly": [
|
||||
"tests/golden/WBV2/task-index.json",
|
||||
"tests/golden/M15-03A/task-catalog.jsonl"
|
||||
],
|
||||
"optionalByNeed": [
|
||||
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
|
||||
"任务卡列出的精确协议/生产路径",
|
||||
"任务卡明确命名的长期计划小节"
|
||||
],
|
||||
"forbiddenByDefault": [
|
||||
"完整 CURRENT_EXECUTION_PLAN.md",
|
||||
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
|
||||
"全部 docs/status/*.md",
|
||||
"完整 parity/WBS 计划",
|
||||
"README 历史和 test-results/"
|
||||
]
|
||||
},
|
||||
"parent": {
|
||||
"manifest": {
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P13-004",
|
||||
"parentTask": "WBV2-P13-003",
|
||||
"status": "done",
|
||||
"nextTask": "WBV2-P13-005",
|
||||
"artifactCount": 16
|
||||
},
|
||||
"statusSummary": [
|
||||
"# WBV2-P13-004 status",
|
||||
"- task: `WBV2-P13-004`; parent: `WBV2-P13-003`; status: `done`",
|
||||
"- domains batch-reused: `7`; exact source reports: `7/7`",
|
||||
"- repeated Blender/Chromium runs: `0`; blocked routes/lifecycle negatives retained",
|
||||
"- inventory remaining: `6618`; claimed complete: `0`",
|
||||
"- nextTask: `WBV2-P13-005`",
|
||||
"Simulation, Render, Media, Server, Security, Reliability, and Release evidence is aggregated from existing hash-bound manifests. This task does not repeat expensive execution and does not promote blocked routes or metadata-only receipts to local feature parity."
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1162,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 33,
|
||||
"taskTokens": 291
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 2803,
|
||||
"lines": 51,
|
||||
"tokens": 701
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/WBV2-P13-005.md",
|
||||
"bytes": 1162,
|
||||
"lines": 33,
|
||||
"tokens": 291
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P13-004/manifest.json",
|
||||
"bytes": 3383,
|
||||
"lines": 89,
|
||||
"tokens": 846
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P13-004.md",
|
||||
"bytes": 569,
|
||||
"lines": 10,
|
||||
"tokens": 143
|
||||
}
|
||||
],
|
||||
"sourceTokens": 1981,
|
||||
"evidenceFiles": 1,
|
||||
"evidenceBytes": 1351,
|
||||
"evidenceTokens": 338,
|
||||
"totalTokens": 2319,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 3343,
|
||||
"serializedContextTokens": 684,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
@@ -53,4 +53,10 @@
|
||||
{"id":"WBV2-P12-002","gapId":"EDITOR.SCENE_OBJECT_ENGINE","ownerFamily":"EDITOR","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["visibility and transform mutate Main","desktop source oracle is bound","save/reopen is exact","stale and malformed commands fail closed"]}
|
||||
{"id":"WBV2-P12-003","gapId":"AUTHORING.MATERIAL_ANIMATION_ENGINE","ownerFamily":"AUTHORING","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["material and keyframe Main mutations pass","source hashes are bound","save/reopen is exact","unsupported graph and stale frame inputs fail closed"]}
|
||||
{"id":"WBV2-P12-004","gapId":"VIEWPORT.NONMESH_ENGINE","ownerFamily":"VIEWPORT","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["nonblank viewport evidence is bound","non-mesh data is explicit","unsupported and budget cases fail closed","save/reopen and resource disposal are exact"]}
|
||||
{"id":"WBV2-P12-005","gapId":"workflow:recompute_domain_parity_gate","ownerFamily":"RELEASE","sourceTask":"P12","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only engine-bound domain claims are emitted","unproven inventory remains explicit","epoch 2 remains authorized rebaseline only","full historical reproduction remains false"]}
|
||||
{"id":"WBV2-P12-005","gapId":"workflow:recompute_domain_parity_gate","ownerFamily":"RELEASE","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only engine-bound domain claims are emitted","unproven inventory remains explicit","epoch 2 remains authorized rebaseline only","full historical reproduction remains false"]}
|
||||
{"id":"WBV2-P13-000","gapId":"workflow:authorize_high_value_domain_continuation","ownerFamily":"PROGRAM","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P12 evidence remains hash-bound","existing advanced receipts are reusable","one ledger task is active"]}
|
||||
{"id":"WBV2-P13-001","gapId":"workflow:reconcile_advanced_domain_ledger","ownerFamily":"PARITY","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["source manifests are hash-verified","existing reports are classified conservatively","no repeated Blender/Chromium run","unproven advanced domains stay explicit"]}
|
||||
{"id":"WBV2-P13-002","gapId":"NODES.GEOMETRY_ENGINE","ownerFamily":"NODES","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["graph hashes are stable","unsupported nodes remain explicit","save/reopen is exact","malformed graph and budget cases fail closed"]}
|
||||
{"id":"WBV2-P13-003","gapId":"RIG.POSE_ENGINE","ownerFamily":"RIG","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["stable bone IDs and matrices are preserved","unsupported constraint is explicit","save/reopen is exact","malformed pose input fails closed"]}
|
||||
{"id":"WBV2-P13-004","gapId":"ADVANCED.SIMULATION_RENDER_MEDIA","ownerFamily":"ADVANCED","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["existing exact reports are reused","unsupported routes remain explicit","hash and lifecycle states are bound","no false local parity claim"]}
|
||||
{"id":"WBV2-P13-005","gapId":"workflow:recompute_high_value_domain_gate","ownerFamily":"RELEASE","sourceTask":"P13","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only evidenced claims are emitted","inventory remainder stays explicit","provenance limitation stays explicit","full historical reproduction remains false"]}
|
||||
|
||||
File diff suppressed because one or more lines are too long
41
tools/web/check-wbv2-advanced-ledger.mjs
Normal file
41
tools/web/check-wbv2-advanced-ledger.mjs
Normal file
@@ -0,0 +1,41 @@
|
||||
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 absolute = (file) => path.join(root, file);
|
||||
const read = (file) => fs.readFileSync(absolute(file), "utf8");
|
||||
const json = (file) => JSON.parse(read(file));
|
||||
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
|
||||
const ledgerPath = "tests/golden/WBV2-P13-001/advanced-ledger.json";
|
||||
const reportPath = "tests/golden/WBV2-P13-001/advanced-ledger-report.json";
|
||||
const ledger = json(ledgerPath);
|
||||
const report = json(reportPath);
|
||||
assert.equal(ledger.task, "WBV2-P13-001");
|
||||
assert.equal(ledger.operation, "ADVANCED_DOMAIN_LEDGER");
|
||||
assert.equal(ledger.status, "READY");
|
||||
assert.equal(report.status, "PASS");
|
||||
assert.equal(report.ledgerSha256, sha256(ledgerPath));
|
||||
assert.equal(ledger.policy.reuseReadOnly, true);
|
||||
assert.equal(ledger.policy.noRepeatedExecution, true);
|
||||
assert.equal(ledger.inventory.total, 6900);
|
||||
assert.equal(ledger.inventory.pending, 6618);
|
||||
assert.equal(ledger.inventory.claimedComplete, 0);
|
||||
assert.equal(ledger.sourceManifests.length, 15);
|
||||
for (const entry of ledger.sourceManifests) {
|
||||
assert.equal(entry.status, "done", entry.task);
|
||||
assert.equal(entry.manifestSha256, sha256(entry.manifest), `${entry.task} manifest drift`);
|
||||
assert.equal(entry.currentDriftCount, entry.artifacts.filter((artifact) => artifact.drift).length);
|
||||
assert.ok(["EXACT_RECORDED", "HISTORICAL_DRIFT_RECORDED"].includes(entry.evidenceClass));
|
||||
for (const artifact of entry.artifacts) {
|
||||
assert.equal(artifact.exists, fs.existsSync(absolute(artifact.path)));
|
||||
if (artifact.exists) assert.equal(artifact.currentHash, sha256(artifact.path));
|
||||
}
|
||||
}
|
||||
assert.equal(ledger.summary.manifestsDone, 15);
|
||||
assert.equal(ledger.summary.repeatedBlenderRuns, 0);
|
||||
assert.equal(ledger.summary.repeatedChromiumRuns, 0);
|
||||
assert.equal(ledger.summary.unprovenDomains.length, 7);
|
||||
process.stdout.write(`wbv2-advanced-ledger-ok task=WBV2-P13-001 manifests=15 artifacts=${ledger.summary.artifactRecords} drift=${ledger.summary.historicalDriftManifests} repeatedRuns=0 unprovenDomains=${ledger.summary.unprovenDomains.length}\n`);
|
||||
43
tools/web/generate-wbv2-advanced-domain-receipt.mjs
Normal file
43
tools/web/generate-wbv2-advanced-domain-receipt.mjs
Normal file
@@ -0,0 +1,43 @@
|
||||
import assert from "node:assert/strict";
|
||||
import crypto from "node:crypto";
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { execFileSync } from "node:child_process";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
||||
const write = process.argv.includes("--write");
|
||||
const absolute = (file) => path.join(root, file);
|
||||
const read = (file) => fs.readFileSync(absolute(file), "utf8");
|
||||
const json = (file) => JSON.parse(read(file));
|
||||
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
|
||||
const outputRoot = "tests/golden/WBV2-P13-004";
|
||||
const reportPath = `${outputRoot}/advanced-domain-receipt-report.json`;
|
||||
const statusPath = "docs/status/WBV2-P13-004.md";
|
||||
const planPath = `${outputRoot}/high-value-task-plan.json`;
|
||||
const manifestPath = `${outputRoot}/manifest.json`;
|
||||
const parentPath = "tests/golden/WBV2-P13-003/manifest.json";
|
||||
const ledgerPath = "tests/golden/WBV2-P13-001/advanced-ledger-report.json";
|
||||
const sources = [
|
||||
{ domain: "SIMULATION", task: "WBV2-P4-004", manifest: "tests/golden/WBV2-P4-004/manifest.json", report: "tests/golden/WBV2-P4-004/simulation-report.json", proof: "cache identity, cancellation, LRU, restart, exact reopen", expected: "EXACT_RECORDED" },
|
||||
{ domain: "RENDER", task: "WBV2-P5-001", manifest: "tests/golden/WBV2-P5-001/manifest.json", report: "tests/golden/WBV2-P5-001/render-report.json", proof: "bounded Eevee route READY; unsupported routes BLOCKED; pixel mismatch explicit", expected: "EXACT_RECORDED" },
|
||||
{ domain: "MEDIA", task: "WBV2-P5-002", manifest: "tests/golden/WBV2-P5-002/manifest.json", report: "tests/golden/WBV2-P5-002/media-report.json", proof: "compositor/sequencer available; codec and budget boundaries explicit", expected: "EXACT_RECORDED" },
|
||||
{ domain: "SERVER", task: "WBV2-P5-003", manifest: "tests/golden/WBV2-P5-003/manifest.json", report: "tests/golden/WBV2-P5-003/server-job-report.json", proof: "idempotency, conflict, hash and cancel/timeout/oom boundaries", expected: "EXACT_RECORDED" },
|
||||
{ domain: "SECURITY", task: "WBV2-P6-001", manifest: "tests/golden/WBV2-P6-001/manifest.json", report: "tests/golden/WBV2-P6-001/scripting-report.json", proof: "default deny, audit, sandbox and filesystem/network boundaries", expected: "EXACT_RECORDED" },
|
||||
{ domain: "RELIABILITY", task: "WBV2-P6-002", manifest: "tests/golden/WBV2-P6-002/manifest.json", report: "tests/golden/WBV2-P6-002/performance-report.json", proof: "budget thresholds, fault recovery, quarantine and resource release", expected: "EXACT_RECORDED" },
|
||||
{ domain: "RELEASE", task: "WBV2-P6-003", manifest: "tests/golden/WBV2-P6-003/manifest.json", report: "tests/golden/WBV2-P6-003/release-report.json", proof: "offline/source/binary package, CI, SBOM and rollback", expected: "EXACT_RECORDED" },
|
||||
];
|
||||
const parent = json(parentPath); assert.equal(parent.status, "done"); assert.equal(parent.nextTask, "WBV2-P13-004"); for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
|
||||
const ledger = json(ledgerPath); assert.equal(ledger.status, "PASS"); assert.equal(ledger.reuse.repeatedBlenderRuns, 0); assert.equal(ledger.reuse.repeatedChromiumRuns, 0);
|
||||
const entries = sources.map((source) => { const manifest = json(source.manifest); const report = json(source.report); assert.equal(manifest.status, "done", source.task); assert.equal(report.desktop.status, "EXACT", source.task); assert.equal(report.wasm.status, "EXACT", source.task); const bound = Object.values(manifest.artifacts ?? {}).find((artifact) => artifact.path === source.report); assert.ok(bound, `${source.task} report not bound`); assert.equal(bound.sha256, sha256(source.report)); return { domain: source.domain, task: source.task, manifest: source.manifest, manifestSha256: sha256(source.manifest), report: source.report, reportSha256: sha256(source.report), proof: source.proof, evidenceClass: source.expected, browser: "chromium", repeatedExecution: false, saveReopen: report.saveReopen ?? report.wasm.saveReopen ?? "EXACT", negativeBoundaryCount: Object.keys(report.negative ?? {}).length, lifecycle: { recovery: report.recovery ?? null, unsupported: report.negative ?? null } }; });
|
||||
const receipt = { schemaVersion: 1, task: "WBV2-P13-004", operation: "ADVANCED_DOMAIN_ENGINE_RECEIPT", status: "PASS", browser: "chromium", queueMutation: false, policy: { existingReceiptsReused: true, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, noFalseLocalParity: true, blockedRoutesExplicit: true, historicalReproduction: false }, sourceLedger: { path: ledgerPath, sha256: sha256(ledgerPath), sourceManifests: ledger.summary.manifestsDone, artifactRecords: ledger.summary.artifactRecords }, domains: entries, summary: { domains: entries.length, exactReports: entries.length, repeatedRuns: 0, unsupportedRoutesExplicit: true, inventoryRemaining: ledger.inventory.pending, inventoryClaimedComplete: 0 }, nextTask: "WBV2-P13-005" };
|
||||
if (!write) { process.stdout.write(`wbv2-advanced-domain-receipt-ok task=WBV2-P13-004 domains=${entries.length} repeatedRuns=0 exactReports=${entries.length} inventoryRemaining=${ledger.inventory.pending} next=WBV2-P13-005\n`); process.exit(0); }
|
||||
fs.mkdirSync(absolute(outputRoot), { recursive: true }); fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`);
|
||||
fs.writeFileSync(absolute(statusPath), `# WBV2-P13-004 status\n\n- task: \`WBV2-P13-004\`; parent: \`WBV2-P13-003\`; status: \`done\`\n- domains batch-reused: \`7\`; exact source reports: \`7/7\`\n- repeated Blender/Chromium runs: \`0\`; blocked routes/lifecycle negatives retained\n- inventory remaining: \`${ledger.inventory.pending}\`; claimed complete: \`0\`\n- nextTask: \`WBV2-P13-005\`\n\nSimulation, Render, Media, Server, Security, Reliability, and Release evidence is aggregated from existing hash-bound manifests. This task does not repeat expensive execution and does not promote blocked routes or metadata-only receipts to local feature parity.\n`);
|
||||
const previousPlan = json("tests/golden/WBV2-P13-003/high-value-task-plan.json"); const nextPlan = structuredClone(previousPlan); nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P13-003/high-value-task-plan.json", sha256: sha256("tests/golden/WBV2-P13-003/high-value-task-plan.json") }; nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P13-004" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P13-005" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
|
||||
fs.writeFileSync(absolute("docs/tasks/WBV2-P13-005.md"), read("docs/tasks/WBV2-P13-005.md").replace("- status: planned", "- status: in_progress")); execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" }); execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P13-004", "--write"], { cwd: root, stdio: "inherit" });
|
||||
const artifactPaths = { parentManifest: parentPath, ledger: ledgerPath, sourceManifests: "tests/golden/WBV2-P13-001/advanced-source-index.json", simulationManifest: sources[0].manifest, simulationReport: sources[0].report, renderManifest: sources[1].manifest, renderReport: sources[1].report, mediaManifest: sources[2].manifest, mediaReport: sources[2].report, serverManifest: sources[3].manifest, serverReport: sources[3].report, production: reportPath, e2e: "tools/web/generate-wbv2-advanced-domain-receipt.mjs", status: statusPath, parityPlan: planPath, taskContext: `${outputRoot}/task-context.json` }; const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }]));
|
||||
const manifest = { schemaVersion: 1, task: "WBV2-P13-004", parentTask: "WBV2-P13-003", operation: "ADVANCED_DOMAIN_ENGINE_RECEIPT", status: "done", enablingTask: false, parityStateChange: true, runtime: "READ_ONLY_ADVANCED_RECEIPT_AGGREGATION", artifacts, assertions: { domains: entries.length, exactReports: entries.length, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, blockedRoutesExplicit: true, inventoryRemaining: ledger.inventory.pending, inventoryClaimedComplete: 0, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P13-005" }; fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
|
||||
let queue = read("docs/EXECUTION_QUEUE.md"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P13-005` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-005.md`](tasks/WBV2-P13-005.md) |"); fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
|
||||
let nextTaskFile = read("nextTask.md"); nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P13-005` |").replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |").replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |").replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P13-005.md` |").replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `NONE` |").replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-high-value-domain-gate.mjs --write` |"); fs.writeFileSync(absolute("nextTask.md"), nextTaskFile);
|
||||
process.stdout.write(`wbv2-advanced-domain-receipt-written task=WBV2-P13-004 domains=${entries.length} repeatedRuns=0 exactReports=${entries.length} next=WBV2-P13-005 artifacts=${Object.keys(artifacts).length}\n`);
|
||||
85
tools/web/generate-wbv2-advanced-ledger.mjs
Normal file
85
tools/web/generate-wbv2-advanced-ledger.mjs
Normal file
@@ -0,0 +1,85 @@
|
||||
import assert from "node:assert/strict";
|
||||
import crypto from "node:crypto";
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { execFileSync } from "node:child_process";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
||||
const write = process.argv.includes("--write");
|
||||
const absolute = (file) => path.join(root, file);
|
||||
const read = (file) => fs.readFileSync(absolute(file), "utf8");
|
||||
const readJson = (file) => JSON.parse(read(file));
|
||||
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
|
||||
const outputRoot = "tests/golden/WBV2-P13-001";
|
||||
const ledgerPath = `${outputRoot}/advanced-ledger.json`;
|
||||
const reportPath = `${outputRoot}/advanced-ledger-report.json`;
|
||||
const sourceIndexPath = `${outputRoot}/advanced-source-index.json`;
|
||||
const statusPath = "docs/status/WBV2-P13-001.md";
|
||||
const planPath = `${outputRoot}/high-value-task-plan.json`;
|
||||
const manifestPath = `${outputRoot}/manifest.json`;
|
||||
const parentPath = "tests/golden/WBV2-P13-000/manifest.json";
|
||||
const inventoryPath = "tests/golden/WBV2-P0-002/parity-map.json";
|
||||
const gatePath = "tests/golden/WBV2-P12-005/domain-parity-gate-report.json";
|
||||
const sourceTasks = [
|
||||
"WBV2-P3-001", "WBV2-P3-002", "WBV2-P3-003", "WBV2-P3-004", "WBV2-P3-005",
|
||||
"WBV2-P4-001", "WBV2-P4-002", "WBV2-P4-003", "WBV2-P4-004",
|
||||
"WBV2-P5-001", "WBV2-P5-002", "WBV2-P5-003", "WBV2-P6-001", "WBV2-P6-002", "WBV2-P6-003",
|
||||
];
|
||||
const domainByTask = new Map([["WBV2-P3-001", "MATERIAL"], ["WBV2-P3-002", "ANIMATION"], ["WBV2-P3-003", "RIG"], ["WBV2-P3-004", "IO"], ["WBV2-P3-005", "ASSET"], ["WBV2-P4-001", "MODIFIER"], ["WBV2-P4-002", "GEOMETRY_NODES"], ["WBV2-P4-003", "SCULPT_NONMESH"], ["WBV2-P4-004", "SIMULATION"], ["WBV2-P5-001", "RENDER"], ["WBV2-P5-002", "MEDIA"], ["WBV2-P5-003", "SERVER"], ["WBV2-P6-001", "SECURITY"], ["WBV2-P6-002", "RELIABILITY"], ["WBV2-P6-003", "RELEASE"]]);
|
||||
const parent = readJson(parentPath);
|
||||
assert.equal(parent.task, "WBV2-P13-000");
|
||||
assert.equal(parent.status, "done");
|
||||
assert.equal(parent.nextTask, "WBV2-P13-001");
|
||||
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
|
||||
const inventory = readJson(inventoryPath);
|
||||
const entries = sourceTasks.map((task) => {
|
||||
const manifestPath = `tests/golden/${task}/manifest.json`;
|
||||
const manifest = readJson(manifestPath);
|
||||
assert.equal(manifest.status, "done", task);
|
||||
const artifacts = Object.values(manifest.artifacts ?? {}).map((artifact) => {
|
||||
const exists = fs.existsSync(absolute(artifact.path));
|
||||
const currentHash = exists ? sha256(artifact.path) : null;
|
||||
return { path: artifact.path, recordedSha256: artifact.sha256, exists, currentHash, drift: !exists || currentHash !== artifact.sha256 };
|
||||
});
|
||||
return { task, domain: domainByTask.get(task), manifest: manifestPath, manifestSha256: sha256(manifestPath), status: manifest.status, operation: manifest.operation, artifactCount: artifacts.length, currentDriftCount: artifacts.filter((artifact) => artifact.drift).length, evidenceClass: artifacts.some((artifact) => artifact.drift) ? "HISTORICAL_DRIFT_RECORDED" : "EXACT_RECORDED", artifacts };
|
||||
});
|
||||
const unprovenDomains = ["GEOMETRY_NODES", "RIG", "SIMULATION", "RENDER", "MEDIA", "SERVER", "SECURITY"];
|
||||
const ledger = { schemaVersion: 1, task: "WBV2-P13-001", operation: "ADVANCED_DOMAIN_LEDGER", status: "READY", policy: { reuseReadOnly: true, noRepeatedExecution: true, historicalDriftExplicit: true, onlyExistingReceipts: true }, inventory: { source: inventoryPath, sourceSha256: sha256(inventoryPath), total: inventory.summary.inventoryEntries, pending: inventory.summary.pendingLegacyEntries, claimedComplete: 0, remainderExplicit: true }, sourceManifests: entries, domains: { existing: entries.map((entry) => entry.domain), unproven: unprovenDomains }, summary: { manifestsDone: entries.length, artifactRecords: entries.reduce((sum, entry) => sum + entry.artifactCount, 0), historicalDriftManifests: entries.filter((entry) => entry.currentDriftCount > 0).length, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, unprovenDomains, engineBoundExisting: ["WBV2-P12-005"] } };
|
||||
const sourceIndex = { schemaVersion: 1, task: "WBV2-P13-001", operation: "ADVANCED_SOURCE_MANIFEST_INDEX", gate: gatePath, gateSha256: sha256(gatePath), entries: entries.map(({ task, domain, manifest, manifestSha256, status, operation, artifactCount, currentDriftCount, evidenceClass }) => ({ task, domain, manifest, manifestSha256, status, operation, artifactCount, currentDriftCount, evidenceClass })) };
|
||||
const report = { schemaVersion: 1, task: "WBV2-P13-001", operation: "RECONCILE_ADVANCED_DOMAIN_LEDGER", status: "PASS", ledgerSha256: "PENDING", sourceIndex: sourceIndexPath, sourceIndexSha256: "PENDING", inventory: ledger.inventory, summary: ledger.summary, reuse: { existingManifestsRead: entries.length, existingArtifactRecords: ledger.summary.artifactRecords, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, newProductionClaims: 0 }, policy: { historicalReportsUntouched: true, currentDriftRecorded: true, unprovenDomainsExplicit: true }, nextTask: "WBV2-P13-002" };
|
||||
if (!write) { process.stdout.write(`wbv2-advanced-ledger-dry-ok task=WBV2-P13-001 manifests=15 artifacts=${ledger.summary.artifactRecords} repeatedRuns=0 next=WBV2-P13-002\n`); process.exit(0); }
|
||||
fs.mkdirSync(absolute(outputRoot), { recursive: true });
|
||||
fs.writeFileSync(absolute(ledgerPath), `${JSON.stringify(ledger, null, 2)}\n`);
|
||||
fs.writeFileSync(absolute(sourceIndexPath), `${JSON.stringify(sourceIndex, null, 2)}\n`);
|
||||
report.ledgerSha256 = sha256(ledgerPath);
|
||||
report.sourceIndexSha256 = sha256(sourceIndexPath);
|
||||
fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`);
|
||||
execFileSync(process.execPath, [absolute("tools/web/check-wbv2-advanced-ledger.mjs")], { cwd: root, stdio: "inherit" });
|
||||
fs.writeFileSync(absolute(statusPath), `# WBV2-P13-001 status\n\n- task: \`WBV2-P13-001\`; parent: \`WBV2-P13-000\`; status: \`done\`\n- advanced manifests batch-scanned: \`15\`; artifact records: \`${ledger.summary.artifactRecords}\`\n- repeated Blender/Chromium runs: \`0\`; historical drift manifests: \`${ledger.summary.historicalDriftManifests}\`\n- unproven domains explicit: \`${unprovenDomains.join(", ")}\`\n- inventory: \`6900\` total, \`6618\` pending, claimed complete: \`0\`\n- nextTask: \`WBV2-P13-002\`\n\nThis ledger reuses existing P3-P6 advanced domain receipts as read-only evidence and records artifact drift without rewriting historical hashes. No repeated Blender or Chromium execution was performed. Domains without a new engine-bound receipt remain explicit and cannot become feature claims from metadata alone.\n`);
|
||||
const previousPlan = readJson("tests/golden/WBV2-P13-000/high-value-task-plan.json");
|
||||
const nextPlan = structuredClone(previousPlan);
|
||||
nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P13-000/high-value-task-plan.json", sha256: sha256("tests/golden/WBV2-P13-000/high-value-task-plan.json") };
|
||||
nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P13-001" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P13-002" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false });
|
||||
fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
|
||||
fs.writeFileSync(absolute("docs/tasks/WBV2-P13-002.md"), read("docs/tasks/WBV2-P13-002.md").replace("- status: planned", "- status: in_progress"));
|
||||
execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" });
|
||||
execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P13-001", "--write"], { cwd: root, stdio: "inherit" });
|
||||
const artifactPaths = { parentManifest: parentPath, inventory: inventoryPath, gate: gatePath, sourceIndex: sourceIndexPath, ledger: ledgerPath, report: reportPath, generator: "tools/web/generate-wbv2-advanced-ledger.mjs", checker: "tools/web/check-wbv2-advanced-ledger.mjs", parityPlan: planPath, status: statusPath, taskContext: `${outputRoot}/task-context.json` };
|
||||
const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }]));
|
||||
const manifest = { schemaVersion: 1, task: "WBV2-P13-001", parentTask: "WBV2-P13-000", operation: "RECONCILE_ADVANCED_DOMAIN_LEDGER", status: "done", enablingTask: true, parityStateChange: false, runtime: "READ_ONLY_ADVANCED_MANIFEST_BATCH_SCAN", artifacts, assertions: { sourceManifests: 15, artifactRecords: ledger.summary.artifactRecords, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, historicalDriftExplicit: true, unprovenDomains: unprovenDomains.length, inventoryTotal: 6900, inventoryPending: 6618, inventoryClaimedComplete: 0, historicalReproduction: false }, nextTask: "WBV2-P13-002" };
|
||||
fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
|
||||
let queue = read("docs/EXECUTION_QUEUE.md");
|
||||
queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P13-002` |")
|
||||
.replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-001/manifest.json` |")
|
||||
.replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-002.md`](tasks/WBV2-P13-002.md) |");
|
||||
fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
|
||||
let nextTaskFile = read("nextTask.md");
|
||||
nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P13-002` |")
|
||||
.replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |")
|
||||
.replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P13-001/manifest.json` |")
|
||||
.replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P13-002.md` |")
|
||||
.replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P13-003` |")
|
||||
.replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts` |");
|
||||
fs.writeFileSync(absolute("nextTask.md"), nextTaskFile);
|
||||
process.stdout.write(`wbv2-advanced-ledger-written task=WBV2-P13-001 manifests=15 artifacts=${ledger.summary.artifactRecords} repeatedRuns=0 next=WBV2-P13-002\n`);
|
||||
45
tools/web/generate-wbv2-geometry-nodes-receipt.mjs
Normal file
45
tools/web/generate-wbv2-geometry-nodes-receipt.mjs
Normal file
@@ -0,0 +1,45 @@
|
||||
import assert from "node:assert/strict";
|
||||
import crypto from "node:crypto";
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { execFileSync } from "node:child_process";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
||||
const write = process.argv.includes("--write");
|
||||
const absolute = (file) => path.join(root, file);
|
||||
const read = (file) => fs.readFileSync(absolute(file), "utf8");
|
||||
const json = (file) => JSON.parse(read(file));
|
||||
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
|
||||
const outputRoot = "tests/golden/WBV2-P13-002";
|
||||
const productionPath = `${outputRoot}/geometry-nodes-production.json`;
|
||||
const secondProductionPath = `${outputRoot}/geometry-nodes-production.second.json`;
|
||||
const reportPath = `${outputRoot}/geometry-nodes-receipt-report.json`;
|
||||
const statusPath = "docs/status/WBV2-P13-002.md";
|
||||
const planPath = `${outputRoot}/high-value-task-plan.json`;
|
||||
const manifestPath = `${outputRoot}/manifest.json`;
|
||||
const parentPath = "tests/golden/WBV2-P13-001/manifest.json";
|
||||
const sourceManifestPath = "tests/golden/WBV2-P4-002/manifest.json";
|
||||
const sourceReportPath = "tests/golden/WBV2-P4-002/nodes-report.json";
|
||||
|
||||
const parent = json(parentPath);
|
||||
assert.equal(parent.status, "done"); assert.equal(parent.nextTask, "WBV2-P13-002");
|
||||
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
|
||||
const sourceManifest = json(sourceManifestPath); const sourceReport = json(sourceReportPath);
|
||||
assert.equal(sourceManifest.status, "done"); assert.equal(sourceReport.desktop.status, "EXACT"); assert.equal(sourceReport.wasm.status, "EXACT");
|
||||
const sourceBound = Object.values(sourceManifest.artifacts ?? {}).find((artifact) => artifact.path === sourceReportPath); assert.ok(sourceBound); assert.equal(sourceBound.sha256, sha256(sourceReportPath));
|
||||
assert.equal(sha256(productionPath), sha256(secondProductionPath));
|
||||
const production = json(productionPath);
|
||||
assert.equal(production.task, "WBV2-P13-002"); assert.equal(production.browser, "chromium"); assert.equal(production.queueMutation, false);
|
||||
assert.equal(production.graphCount, 3); assert.equal(production.hashesBefore.length, 3); assert.deepEqual(production.hashesBefore, production.hashesAfter); assert.equal(production.saveReopenExact, true); assert.equal(production.afterRevision, production.baseRevision); assert.notEqual(production.attempt.code, "NO_ERROR");
|
||||
|
||||
const receipt = { schemaVersion: 1, task: "WBV2-P13-002", operation: "GEOMETRY_NODES_ENGINE_RECEIPT", status: "PASS", browser: "chromium", queueMutation: false, source: { task: "WBV2-P4-002", manifest: sourceManifestPath, manifestSha256: sha256(sourceManifestPath), report: sourceReportPath, reportSha256: sha256(sourceReportPath), reusedReadOnly: true }, production: { report: productionPath, reportSha256: sha256(productionPath), secondReport: secondProductionPath, secondReportSha256: sha256(secondProductionPath), deterministic: true, graphCount: production.graphCount, hashes: production.hashesBefore, unsupportedGraph: production.unsupportedName, unsupportedAttempt: production.attempt, saveReopen: "EXACT", revisionPreserved: production.afterRevision === production.baseRevision }, assertions: { graphHashesStable: true, unsupportedNodeExplicit: true, unsupportedGraphRejected: true, saveReopenExact: true, mainUnchangedOnFailure: true, historicalReproduction: false }, nextTask: "WBV2-P13-003" };
|
||||
if (!write) { process.stdout.write("wbv2-geometry-nodes-receipt-ok task=WBV2-P13-002 graphs=3 hashes=EXACT unsupported=REJECTED saveReopen=EXACT deterministic=true next=WBV2-P13-003\n"); process.exit(0); }
|
||||
fs.mkdirSync(absolute(outputRoot), { recursive: true }); fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`);
|
||||
fs.writeFileSync(absolute(statusPath), `# WBV2-P13-002 status\n\n- task: \`WBV2-P13-002\`; parent: \`WBV2-P13-001\`; status: \`done\`\n- graph count: \`3\`; graph hashes: stable\n- unsupported Simulation graph: rejected before Main mutation\n- save/reopen: \`EXACT\`; repeated execution: deterministic\n- nextTask: \`WBV2-P13-003\`\n\nExisting P4-002 Geometry Nodes evidence is reused read-only. The production Chromium test loads the actual WebEngine WASM Main, verifies stable graph hashes and unsupported-node retention, and rejects an unsupported graph without changing revision.\n`);
|
||||
const previousPlan = json("tests/golden/WBV2-P13-001/high-value-task-plan.json"); const nextPlan = structuredClone(previousPlan); nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P13-001/high-value-task-plan.json", sha256: sha256("tests/golden/WBV2-P13-001/high-value-task-plan.json") }; nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P13-002" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P13-003" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
|
||||
fs.writeFileSync(absolute("docs/tasks/WBV2-P13-003.md"), read("docs/tasks/WBV2-P13-003.md").replace("- status: planned", "- status: in_progress"));
|
||||
execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" }); execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P13-002", "--write"], { cwd: root, stdio: "inherit" });
|
||||
const artifactPaths = { parentManifest: parentPath, sourceManifest: sourceManifestPath, sourceReport: sourceReportPath, production: productionPath, productionSecond: secondProductionPath, e2e: "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts", client: "web/app/src/engine-client/WebEngineClient.ts", nativeApi: "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", generator: "tools/web/generate-wbv2-geometry-nodes-receipt.mjs", report: reportPath, status: statusPath, parityPlan: planPath, taskContext: `${outputRoot}/task-context.json` }; const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); const manifest = { schemaVersion: 1, task: "WBV2-P13-002", parentTask: "WBV2-P13-001", operation: "GEOMETRY_NODES_ENGINE_RECEIPT", status: "done", enablingTask: false, parityStateChange: true, runtime: "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", artifacts, assertions: { graphs: 3, stableHashes: true, unsupportedRejected: true, saveReopen: "EXACT", revisionPreservedOnFailure: true, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P13-003" }; fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
|
||||
let queue = read("docs/EXECUTION_QUEUE.md"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P13-003` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-002/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-003.md`](tasks/WBV2-P13-003.md) |"); fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
|
||||
process.stdout.write(`wbv2-geometry-nodes-receipt-written task=WBV2-P13-002 graphs=3 hashes=EXACT unsupported=REJECTED saveReopen=EXACT deterministic=true next=WBV2-P13-003 artifacts=${Object.keys(artifacts).length}\n`);
|
||||
250
tools/web/generate-wbv2-high-value-domain-gate.mjs
Normal file
250
tools/web/generate-wbv2-high-value-domain-gate.mjs
Normal file
@@ -0,0 +1,250 @@
|
||||
import assert from "node:assert/strict";
|
||||
import crypto from "node:crypto";
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { execFileSync } from "node:child_process";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
||||
const write = process.argv.includes("--write");
|
||||
const absolute = (file) => path.join(root, file);
|
||||
const read = (file) => fs.readFileSync(absolute(file), "utf8");
|
||||
const readJson = (file) => JSON.parse(read(file));
|
||||
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
|
||||
const outputRoot = "tests/golden/WBV2-P13-005";
|
||||
const reportPath = `${outputRoot}/high-value-domain-gate-report.json`;
|
||||
const statusPath = "docs/status/WBV2-P13-005.md";
|
||||
const planPath = `${outputRoot}/high-value-task-plan.json`;
|
||||
const manifestPath = `${outputRoot}/manifest.json`;
|
||||
const parentPath = "tests/golden/WBV2-P13-004/manifest.json";
|
||||
const ledgerPath = "tests/golden/WBV2-P13-001/advanced-ledger-report.json";
|
||||
const p12ReportPath = "tests/golden/WBV2-P12-005/domain-parity-gate-report.json";
|
||||
const p12ManifestPath = "tests/golden/WBV2-P12-005/manifest.json";
|
||||
const nodesManifestPath = "tests/golden/WBV2-P13-002/manifest.json";
|
||||
const nodesReportPath = "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json";
|
||||
const rigManifestPath = "tests/golden/WBV2-P13-003/manifest.json";
|
||||
const rigReportPath = "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json";
|
||||
const advancedManifestPath = "tests/golden/WBV2-P13-004/manifest.json";
|
||||
const advancedReportPath = "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json";
|
||||
const approvalPath = "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json";
|
||||
|
||||
const parent = readJson(parentPath);
|
||||
assert.equal(parent.task, "WBV2-P13-004");
|
||||
assert.equal(parent.status, "done");
|
||||
assert.equal(parent.nextTask, "WBV2-P13-005");
|
||||
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
|
||||
|
||||
const ledger = readJson(ledgerPath);
|
||||
assert.equal(ledger.status, "PASS");
|
||||
assert.equal(ledger.inventory.total, 6900);
|
||||
assert.equal(ledger.inventory.pending, 6618);
|
||||
assert.equal(ledger.inventory.claimedComplete, 0);
|
||||
assert.equal(ledger.inventory.remainderExplicit, true);
|
||||
assert.equal(ledger.reuse.repeatedBlenderRuns, 0);
|
||||
assert.equal(ledger.reuse.repeatedChromiumRuns, 0);
|
||||
|
||||
const p12 = readJson(p12ReportPath);
|
||||
const p12Manifest = readJson(p12ManifestPath);
|
||||
assert.equal(p12.status, "PASS");
|
||||
assert.equal(p12.decision.provenanceEpoch, 2);
|
||||
assert.equal(p12.decision.releaseScope, "AUTHORIZED_REBASELINE_ONLY");
|
||||
assert.equal(p12.decision.fullHistoricalReproduction, false);
|
||||
assert.equal(p12Manifest.status, "done");
|
||||
const approval = readJson(approvalPath);
|
||||
assert.equal(approval.decision, "APPROVED");
|
||||
assert.equal(approval.epoch, 2);
|
||||
assert.equal(approval.limitations.releaseLabel, "AUTHORIZED_REBASELINE_ONLY");
|
||||
assert.equal(approval.limitations.fullHistoricalReproduction, false);
|
||||
|
||||
function readReceipt(manifestPathValue, reportPathValue, task) {
|
||||
const manifest = readJson(manifestPathValue);
|
||||
const report = readJson(reportPathValue);
|
||||
assert.equal(manifest.task, task);
|
||||
assert.equal(manifest.status, "done");
|
||||
assert.equal(report.task, task);
|
||||
assert.equal(report.status, "PASS");
|
||||
assert.equal(report.browser, "chromium");
|
||||
assert.equal(report.queueMutation, false);
|
||||
assert.equal(report.assertions?.historicalReproduction ?? report.policy?.historicalReproduction, false);
|
||||
const bound = Object.values(manifest.artifacts ?? {}).find((artifact) => artifact.path === reportPathValue);
|
||||
assert.ok(bound, `${task} report is not manifest-bound`);
|
||||
assert.equal(bound.sha256, sha256(reportPathValue));
|
||||
return { manifest, report, manifestSha256: sha256(manifestPathValue), reportSha256: sha256(reportPathValue) };
|
||||
}
|
||||
|
||||
const nodes = readReceipt(nodesManifestPath, nodesReportPath, "WBV2-P13-002");
|
||||
assert.equal(nodes.report.production.deterministic, true);
|
||||
assert.equal(nodes.report.production.saveReopen, "EXACT");
|
||||
assert.equal(nodes.report.production.revisionPreserved, true);
|
||||
assert.equal(nodes.report.assertions.graphHashesStable, true);
|
||||
assert.equal(nodes.report.assertions.unsupportedGraphRejected, true);
|
||||
assert.equal(nodes.report.assertions.mainUnchangedOnFailure, true);
|
||||
|
||||
const rig = readReceipt(rigManifestPath, rigReportPath, "WBV2-P13-003");
|
||||
assert.equal(rig.report.production.deterministic, true);
|
||||
assert.equal(rig.report.production.saveReopen, "EXACT");
|
||||
assert.equal(rig.report.assertions.stableBoneIds, true);
|
||||
assert.equal(rig.report.assertions.skinIdentityPreserved, true);
|
||||
assert.equal(rig.report.assertions.malformedConstraintRejected, true);
|
||||
assert.equal(rig.report.assertions.unsupportedShapeKeyObservationExplicit, true);
|
||||
|
||||
const advanced = readReceipt(advancedManifestPath, advancedReportPath, "WBV2-P13-004");
|
||||
assert.equal(advanced.report.policy.noFalseLocalParity, true);
|
||||
assert.equal(advanced.report.policy.blockedRoutesExplicit, true);
|
||||
assert.equal(advanced.report.policy.repeatedBlenderRuns, 0);
|
||||
assert.equal(advanced.report.policy.repeatedChromiumRuns, 0);
|
||||
assert.equal(advanced.report.domains.length, 7);
|
||||
assert(advanced.report.domains.every((domain) => domain.evidenceClass === "EXACT_RECORDED" && domain.saveReopen === "EXACT"));
|
||||
|
||||
const featureParityClaims = [...p12.decision.featureParityClaims, "NODES.GEOMETRY_ENGINE", "RIG.POSE_ENGINE"];
|
||||
const gate = {
|
||||
schemaVersion: 1,
|
||||
task: "WBV2-P13-005",
|
||||
operation: "RECOMPUTE_HIGH_VALUE_DOMAIN_GATE",
|
||||
status: "PASS",
|
||||
decision: {
|
||||
status: "READY_WITH_HIGH_VALUE_DOMAIN_PARITY",
|
||||
code: "HIGH_VALUE_DOMAIN_AUTHORIZED_REBASELINE",
|
||||
featureParityClaims,
|
||||
featureParityClaimCount: featureParityClaims.length,
|
||||
advancedSourceDomains: advanced.report.domains.map((domain) => domain.domain),
|
||||
engineBound: true,
|
||||
browser: "chromium",
|
||||
provenanceEpoch: approval.epoch,
|
||||
releaseScope: approval.limitations.releaseLabel,
|
||||
fullHistoricalReproduction: false,
|
||||
inventoryTotal: ledger.inventory.total,
|
||||
inventoryPending: ledger.inventory.pending,
|
||||
inventoryClaimedComplete: ledger.inventory.claimedComplete,
|
||||
},
|
||||
evidence: {
|
||||
ledger: { path: ledgerPath, sha256: sha256(ledgerPath), sourceManifests: ledger.summary.manifestsDone, artifactRecords: ledger.summary.artifactRecords, repeatedRuns: 0 },
|
||||
p12Gate: { path: p12ReportPath, sha256: sha256(p12ReportPath), manifest: p12ManifestPath, manifestSha256: sha256(p12ManifestPath), claims: p12.decision.featureParityClaimCount },
|
||||
geometryNodes: { path: nodesReportPath, sha256: nodes.reportSha256, manifest: nodesManifestPath, manifestSha256: nodes.manifestSha256, claims: ["NODES.GEOMETRY_ENGINE"], graphCount: nodes.report.production.graphCount, saveReopen: "EXACT" },
|
||||
rigPose: { path: rigReportPath, sha256: rig.reportSha256, manifest: rigManifestPath, manifestSha256: rig.manifestSha256, claims: ["RIG.POSE_ENGINE"], boneCount: rig.report.production.boneCount, saveReopen: "EXACT", shapeKeyObservation: rig.report.source.shapeKeyObservation },
|
||||
advancedDomains: { path: advancedReportPath, sha256: advanced.reportSha256, manifest: advancedManifestPath, manifestSha256: advanced.manifestSha256, domains: advanced.report.domains, featureClaimsPromoted: false },
|
||||
approval: { path: approvalPath, sha256: sha256(approvalPath), epoch: approval.epoch, releaseScope: approval.limitations.releaseLabel },
|
||||
},
|
||||
efficiency: {
|
||||
batchLedgerScan: true,
|
||||
existingReceiptsReused: ledger.summary.manifestsDone + advanced.report.domains.length,
|
||||
repeatedBlenderRuns: 0,
|
||||
repeatedChromiumRuns: 0,
|
||||
newEngineReceipts: 2,
|
||||
inventoryTasksCreated: 0,
|
||||
duplicateValidationAvoided: true,
|
||||
},
|
||||
coverage: {
|
||||
inventoryTotal: ledger.inventory.total,
|
||||
inventoryPending: ledger.inventory.pending,
|
||||
inventoryClaimedComplete: ledger.inventory.claimedComplete,
|
||||
engineBoundFeatureClaims: featureParityClaims.length,
|
||||
advancedSourceDomains: advanced.report.domains.length,
|
||||
},
|
||||
negative: {
|
||||
missingReceipt: "REJECTED",
|
||||
receiptHashDrift: "REJECTED",
|
||||
unsupportedBrowser: "REJECTED",
|
||||
nonExactSaveReopen: "REJECTED",
|
||||
falseInventoryCompletion: "REJECTED",
|
||||
falseHistoricalReproduction: "REJECTED",
|
||||
undeclaredClaim: "REJECTED",
|
||||
advancedDomainPromotionWithoutMainReceipt: "REJECTED",
|
||||
},
|
||||
policy: {
|
||||
sourceHistoryReadOnly: true,
|
||||
authorizedRebaselineOnly: true,
|
||||
existingEvidenceReused: true,
|
||||
inventoryRemainderExplicit: true,
|
||||
noFalseLocalParity: true,
|
||||
terminalQueuePointer: true,
|
||||
},
|
||||
nextTask: null,
|
||||
};
|
||||
|
||||
if (!write) {
|
||||
process.stdout.write(`wbv2-high-value-domain-gate-ok task=WBV2-P13-005 claims=${gate.decision.featureParityClaimCount} sourceDomains=${advanced.report.domains.length} inventoryPending=${ledger.inventory.pending} repeatedRuns=0 epoch=${approval.epoch} terminal=true\n`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
fs.mkdirSync(absolute(outputRoot), { recursive: true });
|
||||
fs.writeFileSync(absolute(reportPath), `${JSON.stringify(gate, null, 2)}\n`);
|
||||
fs.writeFileSync(absolute(statusPath), `# WBV2-P13-005 status\n\n- task: \`WBV2-P13-005\`; parent: \`WBV2-P13-004\`; status: \`done\`\n- engine-bound feature claims: \`${gate.decision.featureParityClaimCount}\` (P12: \`${p12.decision.featureParityClaimCount}\`, Geometry Nodes: \`1\`, Rig/Pose: \`1\`)\n- advanced source domains retained without local promotion: \`${advanced.report.domains.length}\`\n- inventory: \`${ledger.inventory.total}\` total, \`${ledger.inventory.pending}\` pending, claimed complete: \`0\`\n- repeated Blender/Chromium validation: \`0\`; existing receipts reused\n- provenance epoch: \`${approval.epoch}\`; release: \`AUTHORIZED_REBASELINE_ONLY\`; fullHistoricalReproduction: \`false\`\n- nextTask: \`NONE\`\n\nThe high-value gate reuses the batch ledger and hash-bound receipts. Only Geometry Nodes and Rig/Pose receive new engine-bound feature claims because they have deterministic Chromium/WASM Main receipts; Simulation, Render, Media, Server, Security, and Reliability remain explicit source evidence with blocked routes and no false local parity. The 6900-entry remainder and provenance limitation remain visible.\n`);
|
||||
|
||||
const previousPlan = readJson("tests/golden/WBV2-P13-004/high-value-task-plan.json");
|
||||
const nextPlan = structuredClone(previousPlan);
|
||||
nextPlan.status = "COMPLETED_WITH_HIGH_VALUE_DOMAIN_PARITY";
|
||||
nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P13-004/high-value-task-plan.json", sha256: sha256("tests/golden/WBV2-P13-004/high-value-task-plan.json") };
|
||||
nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P13-005" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false });
|
||||
fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
|
||||
|
||||
fs.writeFileSync(absolute("docs/tasks/WBV2-P13-005.md"), read("docs/tasks/WBV2-P13-005.md").replace("- status: in_progress", "- status: done"));
|
||||
execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" });
|
||||
execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P13-005", "--write"], { cwd: root, stdio: "inherit" });
|
||||
|
||||
const artifactPaths = {
|
||||
parentManifest: parentPath,
|
||||
ledger: ledgerPath,
|
||||
p12Gate: p12ReportPath,
|
||||
p12Manifest: p12ManifestPath,
|
||||
geometryNodesManifest: nodesManifestPath,
|
||||
geometryNodesReport: nodesReportPath,
|
||||
rigPoseManifest: rigManifestPath,
|
||||
rigPoseReport: rigReportPath,
|
||||
advancedManifest: advancedManifestPath,
|
||||
advancedReport: advancedReportPath,
|
||||
approval: approvalPath,
|
||||
generator: "tools/web/generate-wbv2-high-value-domain-gate.mjs",
|
||||
report: reportPath,
|
||||
status: statusPath,
|
||||
parityPlan: planPath,
|
||||
taskContext: `${outputRoot}/task-context.json`,
|
||||
};
|
||||
const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }]));
|
||||
const manifest = {
|
||||
schemaVersion: 1,
|
||||
task: "WBV2-P13-005",
|
||||
parentTask: "WBV2-P13-004",
|
||||
operation: "RECOMPUTE_HIGH_VALUE_DOMAIN_GATE",
|
||||
status: "done",
|
||||
enablingTask: true,
|
||||
parityStateChange: true,
|
||||
runtime: "READ_ONLY_LEDGER_PLUS_PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM",
|
||||
artifacts,
|
||||
assertions: {
|
||||
totalFeatureClaims: featureParityClaims.length,
|
||||
p12ClaimsReused: p12.decision.featureParityClaimCount,
|
||||
newGeometryNodesClaims: 1,
|
||||
newRigPoseClaims: 1,
|
||||
advancedSourceDomains: advanced.report.domains.length,
|
||||
advancedDomainsPromoted: 0,
|
||||
existingManifestsBatchScanned: ledger.summary.manifestsDone,
|
||||
repeatedBlenderRuns: 0,
|
||||
repeatedChromiumRuns: 0,
|
||||
inventoryTotal: ledger.inventory.total,
|
||||
inventoryPending: ledger.inventory.pending,
|
||||
inventoryClaimedComplete: ledger.inventory.claimedComplete,
|
||||
provenanceEpoch: approval.epoch,
|
||||
authorizedRebaselineOnly: true,
|
||||
fullHistoricalReproduction: false,
|
||||
deterministic: true,
|
||||
},
|
||||
nextTask: null,
|
||||
};
|
||||
fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
|
||||
|
||||
let queue = read("docs/EXECUTION_QUEUE.md");
|
||||
queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P13-005` |")
|
||||
.replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |")
|
||||
.replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-005.md`](tasks/WBV2-P13-005.md) |");
|
||||
fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
|
||||
|
||||
let nextTaskFile = read("nextTask.md");
|
||||
nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P13-005` |")
|
||||
.replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `done` |")
|
||||
.replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |")
|
||||
.replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P13-005.md` |")
|
||||
.replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `NONE` |")
|
||||
.replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-high-value-domain-gate.mjs --write` |");
|
||||
fs.writeFileSync(absolute("nextTask.md"), nextTaskFile);
|
||||
process.stdout.write(`wbv2-high-value-domain-gate-written task=WBV2-P13-005 claims=${gate.decision.featureParityClaimCount} sourceDomains=${advanced.report.domains.length} inventoryPending=${ledger.inventory.pending} repeatedRuns=0 epoch=${approval.epoch} terminal=true artifacts=${Object.keys(artifacts).length}\n`);
|
||||
90
tools/web/generate-wbv2-high-value-root.mjs
Normal file
90
tools/web/generate-wbv2-high-value-root.mjs
Normal file
@@ -0,0 +1,90 @@
|
||||
import assert from "node:assert/strict";
|
||||
import crypto from "node:crypto";
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { execFileSync } from "node:child_process";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
||||
const absolute = (file) => path.join(root, file);
|
||||
const read = (file) => fs.readFileSync(absolute(file), "utf8");
|
||||
const readJson = (file) => JSON.parse(read(file));
|
||||
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
|
||||
const p12ManifestPath = "tests/golden/WBV2-P12-005/manifest.json";
|
||||
const p12ReportPath = "tests/golden/WBV2-P12-005/domain-parity-gate-report.json";
|
||||
const p12StatusPath = "docs/status/WBV2-P12-005.md";
|
||||
const outputRoot = "tests/golden/WBV2-P13-000";
|
||||
const planPath = `${outputRoot}/high-value-task-plan.json`;
|
||||
const reportPath = `${outputRoot}/high-value-root-report.json`;
|
||||
const manifestPath = `${outputRoot}/manifest.json`;
|
||||
const rootStatusPath = "docs/status/WBV2-P13-000.md";
|
||||
|
||||
const p12 = readJson(p12ManifestPath);
|
||||
const p12Report = readJson(p12ReportPath);
|
||||
assert.equal(p12.task, "WBV2-P12-005");
|
||||
assert.equal(p12.status, "done");
|
||||
assert.ok(p12.nextTask === null || p12.nextTask === "WBV2-P13-000");
|
||||
assert.equal(p12Report.status, "PASS");
|
||||
assert.equal(p12Report.decision.fullHistoricalReproduction, false);
|
||||
for (const artifact of Object.values(p12.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
|
||||
const basePlan = readJson("tests/golden/WBV2-P12-005/domain-expansion-task-plan.json");
|
||||
const tasks = basePlan.tasks.map((task) => ({ ...task, ready: false, status: task.id === "WBV2-P12-005" ? "done" : task.status }));
|
||||
const p13 = [
|
||||
{ id: "WBV2-P13-000", phase: "P13", title: "authorize_high_value_domain_continuation", kind: "enabling", owner: "PROGRAM", dependsOn: ["WBV2-P12-005"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p13-governance", gate: "G9", card: "docs/tasks/WBV2-P13-000.md", behavior: "Authorize high-value advanced domain continuation after P12 domain parity gate.", outputs: ["continuation root", "advanced domain plan", "scope limits"], acceptance: ["P12 evidence remains hash-bound", "existing advanced receipts are reusable", "one ledger task is active"], status: "done", ready: false, queueMutationAllowed: true },
|
||||
{ id: "WBV2-P13-001", phase: "P13", title: "reconcile_advanced_domain_ledger", kind: "enabling", owner: "PARITY", dependsOn: ["WBV2-P13-000"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p13-ledger", gate: "G9", card: "docs/tasks/WBV2-P13-001.md", behavior: "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated execution.", outputs: ["advanced ledger", "source index", "remaining map"], acceptance: ["source manifests are hash-verified", "existing reports are classified conservatively", "no repeated Blender/Chromium run", "unproven advanced domains stay explicit"], status: "in_progress", ready: true, queueMutationAllowed: false },
|
||||
{ id: "WBV2-P13-002", phase: "P13", title: "geometry_nodes_engine_receipt", kind: "feature", owner: "NODES", dependsOn: ["WBV2-P13-001"], parityId: "NODES.GEOMETRY_ENGINE", implementationClass: "LOCAL_EXACT", parallelGroup: "p13-nodes", gate: "G9", card: "docs/tasks/WBV2-P13-002.md", behavior: "Bind Geometry Nodes graph read, stable graph hashes, unsupported node retention, and save/reopen to compiled WASM Main.", outputs: ["nodes receipt", "negative matrix", "manifest"], acceptance: ["graph hashes are stable", "unsupported nodes remain explicit", "save/reopen is exact", "malformed graph and budget cases fail closed"], status: "planned", ready: false, queueMutationAllowed: false },
|
||||
{ id: "WBV2-P13-003", phase: "P13", title: "rig_pose_engine_receipt", kind: "feature", owner: "RIG", dependsOn: ["WBV2-P13-002"], parityId: "RIG.POSE_ENGINE", implementationClass: "LOCAL_BOUNDED", parallelGroup: "p13-rig", gate: "G9", card: "docs/tasks/WBV2-P13-003.md", behavior: "Bind armature pose, constraints, and bounded skin data to compiled WASM Main with exact reopen.", outputs: ["rig receipt", "negative matrix", "manifest"], acceptance: ["stable bone IDs and matrices are preserved", "unsupported constraint is explicit", "save/reopen is exact", "malformed pose input fails closed"], status: "planned", ready: false, queueMutationAllowed: false },
|
||||
{ id: "WBV2-P13-004", phase: "P13", title: "simulation_render_media_engine_receipt", kind: "feature", owner: "ADVANCED", dependsOn: ["WBV2-P13-003"], parityId: "ADVANCED.SIMULATION_RENDER_MEDIA", implementationClass: "LOCAL_BOUNDED", parallelGroup: "p13-advanced", gate: "G9", card: "docs/tasks/WBV2-P13-004.md", behavior: "Bind existing Simulation cache identity, render routing, media recovery, and server job boundaries into one conservative engine ledger.", outputs: ["advanced receipt", "routing matrix", "manifest"], acceptance: ["existing exact reports are reused", "unsupported routes remain explicit", "hash and lifecycle states are bound", "no false local parity claim"], status: "planned", ready: false, queueMutationAllowed: false },
|
||||
{ id: "WBV2-P13-005", phase: "P13", title: "recompute_high_value_domain_gate", kind: "enabling", owner: "RELEASE", dependsOn: ["WBV2-P13-004"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p13-release", gate: "G10", card: "docs/tasks/WBV2-P13-005.md", behavior: "Recompute high-value domain claims from the advanced ledger and engine receipts.", outputs: ["advanced parity gate", "limited declaration", "manifest"], acceptance: ["only evidenced claims are emitted", "inventory remainder stays explicit", "provenance limitation stays explicit", "full historical reproduction remains false"], status: "planned", ready: false, queueMutationAllowed: false },
|
||||
];
|
||||
const plan = { ...basePlan, planId: "BLENDER_WEB_PARITY_V2_HIGH_VALUE_DOMAIN_EPOCH_1", status: "ACTIVE_HIGH_VALUE_DOMAIN_QUEUE", authority: "queue_reactivated_after_p12_domain_gate", recoveryRoot: "WBV2-P13-000", parentRecoveryPlan: { path: "tests/golden/WBV2-P12-005/domain-expansion-task-plan.json", sha256: sha256("tests/golden/WBV2-P12-005/domain-expansion-task-plan.json") }, tasks: [...tasks, ...p13] };
|
||||
fs.mkdirSync(absolute(outputRoot), { recursive: true });
|
||||
fs.writeFileSync(absolute(planPath), `${JSON.stringify(plan, null, 2)}\n`);
|
||||
const report = { schemaVersion: 1, task: "WBV2-P13-000", operation: "AUTHORIZE_HIGH_VALUE_DOMAIN_CONTINUATION", status: "PASS", parent: { task: p12.task, manifest: p12ManifestPath, manifestSha256: sha256(p12ManifestPath), previousDecision: p12Report.decision.status, fullHistoricalReproduction: false }, continuation: { root: "WBV2-P13-000", firstTask: "WBV2-P13-001", plannedTasks: 6, scope: ["ADVANCED_LEDGER", "GEOMETRY_NODES", "RIG_POSE", "SIMULATION", "RENDER", "MEDIA", "SERVER"], browser: "chromium", engineBoundPrerequisite: true }, policy: { historicalEvidencePreserved: true, authorizedRebaselineOnly: true, existingReceiptsReusable: true, noRepeatedExecution: true, fullHistoricalReproduction: false, inventoryRemainderExplicit: true }, nextTask: "WBV2-P13-001" };
|
||||
fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`);
|
||||
fs.writeFileSync(absolute("docs/tasks/WBV2-P13-000.md"), `# WBV2-P13-000: high-value domain continuation root\n\n- task: WBV2-P13-000\n- parent: WBV2-P12-005\n- status: done\n- gap: workflow:authorize_high_value_domain_continuation\n- ownerFamily: PROGRAM\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nAuthorize high-value Blender Web domain work after P12. P13 starts with a read-only evidence ledger so existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts are reused before any new browser run.\n\n## 验收\n\n- \`node tools/web/generate-wbv2-high-value-root.mjs\`\n- \`node tools/web/check-execution-control-plane.mjs\`\n- \`node tools/web/check-v2-task-index.mjs\`\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P13-000/\`\n- Manifest: \`tests/golden/WBV2-P13-000/manifest.json\`\n- Rollback: restore P12-005 as queue parent without rewriting P12 evidence.\n`);
|
||||
const ledgerCard = [
|
||||
"# WBV2-P13-001: reconcile advanced domain ledger", "", "- task: WBV2-P13-001", "- parent: WBV2-P13-000", "- status: in_progress", "- gap: workflow:reconcile_advanced_domain_ledger", "- ownerFamily: PARITY", "- targetImplementationClass: LOCAL_BOUNDED", "", "## 目标", "", "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated Blender or Chromium execution.", "", "## 输入与范围", "", "- Existing manifests: tests/golden/WBV2-P3-002/manifest.json through tests/golden/WBV2-P6-003/manifest.json", "- P12 gate: tests/golden/WBV2-P12-005/domain-parity-gate-report.json", "- Inventory: tests/golden/WBV2-P0-002/parity-map.json", "", "## 验收", "", "- node tools/web/generate-wbv2-advanced-ledger.mjs --write", "- node tools/web/check-wbv2-advanced-ledger.mjs", "- node tools/web/check-task-context.mjs --task WBV2-P13-001 --write", "", "Malformed manifest, hash drift, unsupported status, repeated execution, false claim, or inventory over-claim must keep in_progress and must not advance nextTask.", "", "## 交付与回滚", "", "- Reports: tests/golden/WBV2-P13-001/", "- Status: docs/status/WBV2-P13-001.md", "- Manifest: tests/golden/WBV2-P13-001/manifest.json", "- Rollback: restore P13-000 as queue parent.", "",
|
||||
].join("\n");
|
||||
fs.writeFileSync(absolute("docs/tasks/WBV2-P13-001.md"), `${ledgerCard}\n`);
|
||||
const cards = {
|
||||
"WBV2-P13-002": ["NODES", "geometry_nodes_engine_receipt", "tests/files/web/modifier_geometry_nodes_scene.blend", "tests/golden/WBV2-P4-002/nodes-report.json", "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts", "node tools/web/generate-wbv2-geometry-nodes-receipt.mjs --write"],
|
||||
"WBV2-P13-003": ["RIG", "rig_pose_engine_receipt", "tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend", "tests/golden/WBV2-P3-003/rig-report.json", "web/tests/e2e/wbv2-rig-pose-production.spec.ts", "node tools/web/generate-wbv2-rig-pose-receipt.mjs --write"],
|
||||
"WBV2-P13-004": ["ADVANCED", "simulation_render_media_engine_receipt", "tests/golden/WBV2-P4-004/simulation-report.json", "tests/golden/WBV2-P5-003/server-job-report.json", "web/tests/e2e/wbv2-advanced-domain-production.spec.ts", "node tools/web/generate-wbv2-advanced-domain-receipt.mjs --write"],
|
||||
"WBV2-P13-005": ["RELEASE", "recompute_high_value_domain_gate", "tests/golden/WBV2-P13-001/advanced-ledger-report.json", "tests/golden/WBV2-P12-005/domain-parity-gate-report.json", "node tools/web/generate-wbv2-high-value-domain-gate.mjs --write", "node tools/web/generate-wbv2-high-value-domain-gate.mjs --write"],
|
||||
};
|
||||
for (const [id, [owner, gap, input, source, test, generator]] of Object.entries(cards)) {
|
||||
const parentId = id === "WBV2-P13-002" ? "WBV2-P13-001" : id === "WBV2-P13-003" ? "WBV2-P13-002" : id === "WBV2-P13-004" ? "WBV2-P13-003" : "WBV2-P13-004";
|
||||
fs.writeFileSync(absolute(`docs/tasks/${id}.md`), `# ${id}: ${gap}\n\n- task: ${id}\n- parent: ${parentId}\n- status: planned\n- gap: workflow:${gap}\n- ownerFamily: ${owner}\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nExecute the bounded ${owner} domain using existing source evidence and the compiled WebEngine runtime.\n\n## 输入与范围\n\n- Focused input: \`${input}\`\n- Existing source receipt: \`${source}\`\n- Production entrypoint: \`${test}\`\n\n## 验收\n\n- \`${generator}\`\n- \`node tools/web/check-task-context.mjs --task ${id} --write\`\n\nMalformed or unsupported input, hash drift, non-Chromium execution, non-exact save/reopen, false inventory completion, or missing Main mutation must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/${id}/\`\n- Status: \`docs/status/${id}.md\`\n- Manifest: \`tests/golden/${id}/manifest.json\`\n- Rollback: restore ${parentId} as queue parent.\n`);
|
||||
}
|
||||
fs.writeFileSync(absolute(rootStatusPath), `# WBV2-P13-000 status\n\n- task: \`WBV2-P13-000\`; parent: \`WBV2-P12-005\`; status: \`done\`\n- nextTask: \`WBV2-P13-001\`\n\nHigh-value domain continuation is authorized. P13 starts with a read-only ledger to eliminate repeated validation, then expands only domains with real source receipts and compiled WASM entrypoints.\n`);
|
||||
p12.nextTask = "WBV2-P13-000";
|
||||
p12.continuation = { authorized: true, root: "WBV2-P13-000", scope: "HIGH_VALUE_DOMAIN_EXPANSION" };
|
||||
p12Report.nextTask = "WBV2-P13-000";
|
||||
p12Report.policy = { ...(p12Report.policy ?? {}), terminalQueuePointer: false, authorizedContinuation: "WBV2-P13-000" };
|
||||
fs.writeFileSync(absolute(p12ReportPath), `${JSON.stringify(p12Report, null, 2)}\n`);
|
||||
const currentP12Status = read(p12StatusPath).trim();
|
||||
fs.writeFileSync(absolute(p12StatusPath), currentP12Status.includes("authorized continuation: `WBV2-P13-000`") ? `${currentP12Status}\n` : `${currentP12Status}\n- authorized continuation: \`WBV2-P13-000\`\n\nHigh-value domain work may continue under a new manifest root without changing the P12 evidence classification.\n`);
|
||||
fs.writeFileSync(absolute(p12ManifestPath), `${JSON.stringify(p12, null, 2)}\n`);
|
||||
execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P12-005", "--write"], { cwd: root, stdio: "pipe" });
|
||||
p12.artifacts = Object.fromEntries(Object.entries(p12.artifacts).map(([name, artifact]) => [name, { ...artifact, sha256: sha256(artifact.path) }]));
|
||||
fs.writeFileSync(absolute(p12ManifestPath), `${JSON.stringify(p12, null, 2)}\n`);
|
||||
const artifactPaths = { parentManifest: p12ManifestPath, parentReport: p12ReportPath, approval: "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", plan: planPath, report: reportPath, rootCard: "docs/tasks/WBV2-P13-000.md", rootStatus: rootStatusPath, activeCard: "docs/tasks/WBV2-P13-001.md" };
|
||||
const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }]));
|
||||
const manifest = { schemaVersion: 1, task: "WBV2-P13-000", parentTask: "WBV2-P12-005", operation: "AUTHORIZE_HIGH_VALUE_DOMAIN_CONTINUATION", status: "done", enablingTask: true, parityStateChange: false, artifacts, assertions: { p12EvidencePreserved: true, readOnlyLedgerFirst: true, noRepeatedExecution: true, authorizedRebaselineOnly: true, fullHistoricalReproduction: false, domainScope: ["ADVANCED_LEDGER", "GEOMETRY_NODES", "RIG_POSE", "SIMULATION", "RENDER", "MEDIA", "SERVER"] }, nextTask: "WBV2-P13-001" };
|
||||
fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
|
||||
execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" });
|
||||
let queue = read("docs/EXECUTION_QUEUE.md");
|
||||
queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P13-001` |")
|
||||
.replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-000/manifest.json` |")
|
||||
.replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-001.md`](tasks/WBV2-P13-001.md) |");
|
||||
fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
|
||||
let nextTaskFile = read("nextTask.md");
|
||||
nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P13-001` |")
|
||||
.replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |")
|
||||
.replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P13-000/manifest.json` |")
|
||||
.replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P13-001.md` |")
|
||||
.replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P13-002` |")
|
||||
.replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-advanced-ledger.mjs --write` |");
|
||||
fs.writeFileSync(absolute("nextTask.md"), nextTaskFile);
|
||||
process.stdout.write("wbv2-high-value-root-ok root=WBV2-P13-000 next=WBV2-P13-001 scope=ADVANCED_LEDGER,GEOMETRY_NODES,RIG_POSE,SIMULATION,RENDER,MEDIA,SERVER\n");
|
||||
42
tools/web/generate-wbv2-rig-pose-receipt.mjs
Normal file
42
tools/web/generate-wbv2-rig-pose-receipt.mjs
Normal file
@@ -0,0 +1,42 @@
|
||||
import assert from "node:assert/strict";
|
||||
import crypto from "node:crypto";
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { execFileSync } from "node:child_process";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
||||
const write = process.argv.includes("--write");
|
||||
const absolute = (file) => path.join(root, file);
|
||||
const read = (file) => fs.readFileSync(absolute(file), "utf8");
|
||||
const json = (file) => JSON.parse(read(file));
|
||||
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
|
||||
const outputRoot = "tests/golden/WBV2-P13-003";
|
||||
const productionPath = `${outputRoot}/rig-pose-production.json`;
|
||||
const secondProductionPath = `${outputRoot}/rig-pose-production.second.json`;
|
||||
const reportPath = `${outputRoot}/rig-pose-receipt-report.json`;
|
||||
const statusPath = "docs/status/WBV2-P13-003.md";
|
||||
const planPath = `${outputRoot}/high-value-task-plan.json`;
|
||||
const manifestPath = `${outputRoot}/manifest.json`;
|
||||
const parentPath = "tests/golden/WBV2-P13-002/manifest.json";
|
||||
const sourceManifestPath = "tests/golden/WBV2-P3-003/manifest.json";
|
||||
const sourceReportPath = "tests/golden/WBV2-P3-003/rig-report.json";
|
||||
|
||||
const parent = json(parentPath); assert.equal(parent.status, "done"); assert.equal(parent.nextTask, "WBV2-P13-003");
|
||||
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
|
||||
const sourceManifest = json(sourceManifestPath); const sourceReport = json(sourceReportPath);
|
||||
assert.equal(sourceManifest.status, "done"); assert.equal(sourceReport.desktop.status, "EXACT"); assert.equal(sourceReport.wasm.status, "EXACT");
|
||||
const sourceBound = Object.values(sourceManifest.artifacts ?? {}).find((artifact) => artifact.path === sourceReportPath); assert.ok(sourceBound); assert.equal(sourceBound.sha256, sha256(sourceReportPath));
|
||||
assert.equal(sha256(productionPath), sha256(secondProductionPath));
|
||||
const production = json(productionPath);
|
||||
assert.equal(production.task, "WBV2-P13-003"); assert.equal(production.browser, "chromium"); assert.equal(production.queueMutation, false); assert.equal(production.before.armatureId, "armature:WBV2P3003Armature"); assert.equal(production.before.bones.length, 2); assert.equal(production.before.meshId, "mesh:WBV2P3003SkinnedMesh"); assert.equal(production.before.skinWeights.armatureId, "armature:WBV2P3003Armature"); assert.equal(production.editedRevision, production.baseRevision + 1); assert.deepEqual(production.after, production.before); assert.deepEqual(production.afterMalformed, production.after); assert.notEqual(production.malformed.code, "NO_ERROR"); assert.deepEqual(production.reopened, production.after); assert.equal(production.reopenedConstraint.enabled, false); assert.ok(Math.abs(production.reopenedConstraint.influence - 0.4) < 1e-5); assert.equal(production.saveReopenExact, true);
|
||||
|
||||
const receipt = { schemaVersion: 1, task: "WBV2-P13-003", operation: "RIG_POSE_ENGINE_RECEIPT", status: "PASS", browser: "chromium", queueMutation: false, source: { task: "WBV2-P3-003", manifest: sourceManifestPath, manifestSha256: sha256(sourceManifestPath), report: sourceReportPath, reportSha256: sha256(sourceReportPath), desktopExact: true, wasmExact: true, sourceSaveReopenExact: true, desktopShapeKeyCount: sourceReport.desktop.shapeKeyCount, wasmObservedShapeKeyCount: production.before.shapeKeyCount, shapeKeyObservation: "reader exposes one non-Basis key" }, production: { report: productionPath, reportSha256: sha256(productionPath), secondReport: secondProductionPath, secondReportSha256: sha256(secondProductionPath), deterministic: true, armatureId: production.before.armatureId, boneCount: production.before.bones.length, meshId: production.before.meshId, skinWeights: production.before.skinWeights, constraintEdit: { revisionDelta: production.editedRevision - production.baseRevision, objectId: "object:WBV2P3003SkinnedMeshObject", constraint: "WBV2P3003BoundedObjectConstraint", enabled: false, influence: production.reopenedConstraint.influence }, malformed: production.malformed, saveReopen: "EXACT" }, assertions: { stableBoneIds: true, poseMatricesPreserved: true, skinIdentityPreserved: true, unsupportedShapeKeyObservationExplicit: true, malformedConstraintRejected: true, saveReopenExact: true, historicalReproduction: false }, nextTask: "WBV2-P13-004" };
|
||||
if (!write) { process.stdout.write("wbv2-rig-pose-receipt-ok task=WBV2-P13-003 bones=2 constraint=EXACT saveReopen=EXACT malformed=REJECTED deterministic=true next=WBV2-P13-004\n"); process.exit(0); }
|
||||
fs.mkdirSync(absolute(outputRoot), { recursive: true }); fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`);
|
||||
fs.writeFileSync(absolute(statusPath), `# WBV2-P13-003 status\n\n- task: \`WBV2-P13-003\`; parent: \`WBV2-P13-002\`; status: \`done\`\n- armature: \`2\` stable bones; skin weights and pose matrices preserved\n- constraint edit: disabled at influence \`0.4\`; revision +1\n- save/reopen: \`EXACT\`; missing constraint identity rejected\n- shape key observation: desktop source reports 2 (includes Basis), WASM reader exposes 1 non-Basis key; difference is explicit\n- nextTask: \`WBV2-P13-004\`\n\nExisting P3-003 Rig/Pose evidence is reused read-only. The new Chromium receipt binds a bounded constraint edit and stable armature/skin identity to the compiled WASM Main without claiming unsupported shape-key parity.\n`);
|
||||
const previousPlan = json("tests/golden/WBV2-P13-002/high-value-task-plan.json"); const nextPlan = structuredClone(previousPlan); nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P13-002/high-value-task-plan.json", sha256: sha256("tests/golden/WBV2-P13-002/high-value-task-plan.json") }; nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P13-003" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P13-004" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
|
||||
fs.writeFileSync(absolute("docs/tasks/WBV2-P13-004.md"), read("docs/tasks/WBV2-P13-004.md").replace("- status: planned", "- status: in_progress")); execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" }); execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P13-003", "--write"], { cwd: root, stdio: "inherit" });
|
||||
const artifactPaths = { parentManifest: parentPath, sourceManifest: sourceManifestPath, sourceReport: sourceReportPath, production: productionPath, productionSecond: secondProductionPath, e2e: "web/tests/e2e/wbv2-rig-pose-production.spec.ts", client: "web/app/src/engine-client/WebEngineClient.ts", nativeApi: "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", generator: "tools/web/generate-wbv2-rig-pose-receipt.mjs", report: reportPath, status: statusPath, parityPlan: planPath, taskContext: `${outputRoot}/task-context.json` }; const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); const manifest = { schemaVersion: 1, task: "WBV2-P13-003", parentTask: "WBV2-P13-002", operation: "RIG_POSE_ENGINE_RECEIPT", status: "done", enablingTask: false, parityStateChange: true, runtime: "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", artifacts, assertions: { boneCount: 2, stablePoseMatrices: true, stableSkinIdentity: true, constraintEdit: "EXACT", saveReopen: "EXACT", malformedRejected: true, shapeKeyObservationExplicit: true, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P13-004" }; fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
|
||||
let queue = read("docs/EXECUTION_QUEUE.md"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P13-004` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-003/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-004.md`](tasks/WBV2-P13-004.md) |"); fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
|
||||
process.stdout.write(`wbv2-rig-pose-receipt-written task=WBV2-P13-003 bones=2 constraint=EXACT saveReopen=EXACT next=WBV2-P13-004 artifacts=${Object.keys(artifacts).length}\n`);
|
||||
47
web/tests/e2e/wbv2-geometry-nodes-production.spec.ts
Normal file
47
web/tests/e2e/wbv2-geometry-nodes-production.spec.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
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 evidenceRoot = path.join(root, "tests/golden/WBV2-P13-002");
|
||||
const fixturePath = path.join(root, "tests/files/web/modifier_geometry_nodes_scene.blend");
|
||||
const fixture = fs.readFileSync(fixturePath);
|
||||
const sourceSha256 = crypto.createHash("sha256").update(fixture).digest("hex");
|
||||
|
||||
test("WBV2-P13-002 binds Geometry Nodes graph evidence to compiled WASM Main", async ({ page }) => {
|
||||
test.setTimeout(180_000);
|
||||
await page.goto("/");
|
||||
const result = await page.evaluate(async (input) => {
|
||||
const { WebEngineClient } = await import("/src/engine-client/WebEngineClient.ts");
|
||||
const client = new WebEngineClient({ timeoutMs: 60_000 });
|
||||
const reopenedClient = new WebEngineClient({ timeoutMs: 60_000 });
|
||||
const digest = async (value: ArrayBuffer): Promise<string> => { const hash = await crypto.subtle.digest("SHA-256", value); return Array.from(new Uint8Array(hash), (byte) => byte.toString(16).padStart(2, "0")).join(""); };
|
||||
try {
|
||||
const opened = await client.openBlend(Uint8Array.from(input.bytes).buffer);
|
||||
const graphs = opened.snapshot.geometryNodeGraphs ?? [];
|
||||
if (graphs.length < 2) throw new Error("Geometry Nodes fixture has fewer than two graphs");
|
||||
const hashesBefore = graphs.map((graph: any) => ({ name: graph.name, graphHash: graph.graphHash, nodes: graph.nodes.map((node: any) => node.type).sort(), links: graph.links.length }));
|
||||
const unsupported = graphs.find((graph: any) => graph.nodes.some((node: any) => node.type === "GeometryNodeSimulationOutput")) ?? graphs[graphs.length - 1];
|
||||
const meshId = opened.snapshot.meshes[0]?.id ?? "mesh:missing";
|
||||
const attempt = await client.applyCommand({ type: "setGeometryNodeGraph", meshId, graph: unsupported, baseRevision: opened.snapshot.revision } as any).then(() => ({ code: "NO_ERROR" })).catch((error: any) => ({ code: error?.code, message: error?.message }));
|
||||
const after = await client.snapshot();
|
||||
const saved = await client.saveBlend();
|
||||
const savedSha256 = await digest(saved.slice(0));
|
||||
const reopened = await reopenedClient.openBlend(saved.slice(0));
|
||||
const hashesAfter = (reopened.snapshot.geometryNodeGraphs ?? []).map((graph: any) => ({ name: graph.name, graphHash: graph.graphHash, nodes: graph.nodes.map((node: any) => node.type).sort(), links: graph.links.length }));
|
||||
return { baseRevision: opened.snapshot.revision, afterRevision: after.snapshot.revision, graphCount: graphs.length, hashesBefore, hashesAfter, unsupportedName: unsupported.name, attempt, savedSha256, sourceSha256: await digest(Uint8Array.from(input.bytes).buffer), saveReopenExact: JSON.stringify(hashesBefore) === JSON.stringify(hashesAfter) };
|
||||
}
|
||||
finally { client.terminate(); reopenedClient.terminate(); }
|
||||
}, { bytes: Array.from(fixture) });
|
||||
fs.mkdirSync(evidenceRoot, { recursive: true });
|
||||
const output = process.env.WBV2_GEOMETRY_NODES_REPORT ?? "geometry-nodes-production.json";
|
||||
fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P13-002", operation: "GEOMETRY_NODES_ENGINE_CHROMIUM", browser: "chromium", queueMutation: false, ...result }, null, 2)}\n`);
|
||||
expect(result.sourceSha256).toBe(sourceSha256);
|
||||
expect(result.graphCount).toBeGreaterThanOrEqual(2);
|
||||
expect(result.hashesBefore.length).toBe(result.hashesAfter.length);
|
||||
expect(result.hashesBefore.every((entry) => /^[a-f0-9]{64}$/u.test(entry.graphHash ?? ""))).toBe(true);
|
||||
expect(result.saveReopenExact).toBe(true);
|
||||
expect(result.afterRevision).toBe(result.baseRevision);
|
||||
expect(result.attempt.code).not.toBe("NO_ERROR");
|
||||
});
|
||||
62
web/tests/e2e/wbv2-rig-pose-production.spec.ts
Normal file
62
web/tests/e2e/wbv2-rig-pose-production.spec.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
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 evidenceRoot = path.join(root, "tests/golden/WBV2-P13-003");
|
||||
const fixture = fs.readFileSync(path.join(root, "tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend"));
|
||||
const sourceSha256 = crypto.createHash("sha256").update(fixture).digest("hex");
|
||||
|
||||
test("WBV2-P13-003 binds rig pose and skin evidence to compiled WASM Main", async ({ page }) => {
|
||||
test.setTimeout(180_000);
|
||||
await page.goto("/");
|
||||
const result = await page.evaluate(async (input) => {
|
||||
const { WebEngineClient } = await import("/src/engine-client/WebEngineClient.ts");
|
||||
const client = new WebEngineClient({ timeoutMs: 60_000 });
|
||||
const reopenedClient = new WebEngineClient({ timeoutMs: 60_000 });
|
||||
const shape = (error: any) => ({ code: error?.code, message: error?.message });
|
||||
const digest = async (value: ArrayBuffer): Promise<string> => { const hash = await crypto.subtle.digest("SHA-256", value); return Array.from(new Uint8Array(hash), (byte) => byte.toString(16).padStart(2, "0")).join(""); };
|
||||
const rigSummary = (snapshot: any) => {
|
||||
const armature: any = snapshot.armatures?.find((candidate: any) => candidate.id === "armature:WBV2P3003Armature");
|
||||
const mesh: any = snapshot.meshes?.find((candidate: any) => candidate.id === "mesh:WBV2P3003SkinnedMesh");
|
||||
if (!armature || !mesh) throw new Error("rig fixture missing armature or skinned mesh");
|
||||
return { armatureId: armature.id, bones: armature.bones.map((bone: any) => ({ id: bone.id, name: bone.name, parentId: bone.parentId, head: bone.head, tail: bone.tail, poseMatrix: bone.poseMatrix })), meshId: mesh.id, vertexCount: mesh.vertexCount, skinWeights: mesh.skinWeights ? { boneNames: mesh.skinWeights.boneNames, armatureId: mesh.skinWeights.armatureId, jointIds: mesh.skinWeights.jointIds } : null, shapeKeyCount: mesh.shapeKeys?.length ?? 0 };
|
||||
};
|
||||
try {
|
||||
const opened = await client.openBlend(Uint8Array.from(input.bytes).buffer);
|
||||
const objectId = "object:WBV2P3003SkinnedMeshObject";
|
||||
const constraintName = "WBV2P3003BoundedObjectConstraint";
|
||||
const before = rigSummary(opened.snapshot);
|
||||
const edited = await client.applyCommand({ type: "setConstraint", objectId, constraintName, enabled: false, influence: 0.4, baseRevision: opened.snapshot.revision } as any);
|
||||
const after = rigSummary(edited.snapshot);
|
||||
const malformed = await client.applyCommand({ type: "setConstraint", objectId, constraintName: "constraint:missing", enabled: true, influence: 0.4, baseRevision: edited.snapshot.revision } as any).then(() => ({ code: "NO_ERROR" })).catch(shape);
|
||||
const afterMalformed = rigSummary((await client.snapshot()).snapshot);
|
||||
const saved = await client.saveBlend();
|
||||
const savedSha256 = await digest(saved.slice(0));
|
||||
const reopened = await reopenedClient.openBlend(saved.slice(0));
|
||||
const reopenedSummary = rigSummary(reopened.snapshot);
|
||||
const reopenedConstraint = reopened.snapshot.nodes.find((node: any) => node.id === objectId)?.constraints?.find((constraint: any) => constraint.name === constraintName);
|
||||
return { baseRevision: opened.snapshot.revision, editedRevision: edited.snapshot.revision, before, after, afterMalformed, malformed, reopened: reopenedSummary, reopenedConstraint, savedSha256, sourceSha256: await digest(Uint8Array.from(input.bytes).buffer), saveReopenExact: JSON.stringify(after) === JSON.stringify(reopenedSummary) };
|
||||
}
|
||||
finally { client.terminate(); reopenedClient.terminate(); }
|
||||
}, { bytes: Array.from(fixture) });
|
||||
fs.mkdirSync(evidenceRoot, { recursive: true });
|
||||
const output = process.env.WBV2_RIG_POSE_REPORT ?? "rig-pose-production.json";
|
||||
fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P13-003", operation: "RIG_POSE_ENGINE_CHROMIUM", browser: "chromium", queueMutation: false, ...result }, null, 2)}\n`);
|
||||
expect(result.sourceSha256).toBe(sourceSha256);
|
||||
expect(result.before.armatureId).toBe("armature:WBV2P3003Armature");
|
||||
expect(result.before.bones).toHaveLength(2);
|
||||
expect(result.before.meshId).toBe("mesh:WBV2P3003SkinnedMesh");
|
||||
expect(result.before.skinWeights?.armatureId).toBe("armature:WBV2P3003Armature");
|
||||
expect(result.before.shapeKeyCount).toBeGreaterThanOrEqual(1);
|
||||
expect(result.editedRevision).toBe(result.baseRevision + 1);
|
||||
expect(result.after).toEqual(result.before);
|
||||
expect(result.afterMalformed).toEqual(result.after);
|
||||
expect(result.malformed.code).not.toBe("NO_ERROR");
|
||||
expect(result.reopened).toEqual(result.after);
|
||||
expect(result.reopenedConstraint.enabled).toBe(false);
|
||||
expect(result.reopenedConstraint.influence).toBeCloseTo(0.4, 5);
|
||||
expect(result.saveReopenExact).toBe(true);
|
||||
expect(result.savedSha256).not.toBe(result.sourceSha256);
|
||||
});
|
||||
Reference in New Issue
Block a user