From 72bf0f47adbfb5485bc54682af1d562cde720006 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Mon, 7 Sep 2026 17:12:09 +0800 Subject: [PATCH] Record full Web Blender validation results --- .../WEB_SOURCE_PARITY_FULL_VALIDATION.md | 13 + tests/golden/WBV2-P1424-001/task-context.json | 2 +- .../29-focused-e2e-fixes.log | 25 + .../30-focused-engine-worker-recovery.log | 15 + .../31-final-unit.log | 460 ++++++++++++++++++ .../32-focused-unit-control-plane.log | 9 + .../34-final-deployed-site.log | 1 + .../full-source-parity-validation-report.json | 170 +++++++ .../finalize-web-source-parity-validation.mjs | 136 ++++++ 9 files changed, 830 insertions(+), 1 deletion(-) create mode 100644 docs/status/WEB_SOURCE_PARITY_FULL_VALIDATION.md create mode 100644 tests/golden/WBV2/full-source-parity-validation-logs/29-focused-e2e-fixes.log create mode 100644 tests/golden/WBV2/full-source-parity-validation-logs/30-focused-engine-worker-recovery.log create mode 100644 tests/golden/WBV2/full-source-parity-validation-logs/31-final-unit.log create mode 100644 tests/golden/WBV2/full-source-parity-validation-logs/32-focused-unit-control-plane.log create mode 100644 tests/golden/WBV2/full-source-parity-validation-logs/34-final-deployed-site.log create mode 100644 tests/golden/WBV2/full-source-parity-validation-report.json create mode 100644 tools/web/finalize-web-source-parity-validation.mjs diff --git a/docs/status/WEB_SOURCE_PARITY_FULL_VALIDATION.md b/docs/status/WEB_SOURCE_PARITY_FULL_VALIDATION.md new file mode 100644 index 000000000..39dc82548 --- /dev/null +++ b/docs/status/WEB_SOURCE_PARITY_FULL_VALIDATION.md @@ -0,0 +1,13 @@ +# Web Blender 全功能与源程序对标验证结果 + +- 流程:`docs/WEB_SOURCE_PARITY_FULL_VALIDATION.md` +- 机器报告:`tests/golden/WBV2/full-source-parity-validation-report.json` +- Web 产品状态:`READY` +- 发布状态:`READY` +- Blender 全源程序对标:`PARTIAL` + +产品层验证完成:16/16 工作流模块、34/34 产品功能、101/101 内部子模块;429 个单元测试全部闭环;Chromium 全量收集 350 项,336 项首次通过、13 项修复后定点通过、1 项批次 harness 因无 batch manifest 按设计跳过;30 分钟 soak 完成 372 个编辑周期和 31 次重开。V1 N-015 至 N-026 共 49 个唯一对标入口全部通过。 + +源程序动态清单为 3802 项,路由已分类 3802/3802:WEB_MAIN=1755、SERVER_NATIVE=1613、BROWSER_EQUIVALENT=434、UNAVAILABLE=0。其中 1025 项有精确行为 receipt,2777 项仍仅有路由分类,所以不能声明 Blender 全源码行为等价。 + +线上 `https://49.232.250.35:58014/` 已验证 HTTPS、隔离头、CSP、MIME、Range、WASM 完整摘要、Chromium ready,并通过真实 `.blend` 打开和 `Add CUBE` 3→4 对象 Main mutation。 diff --git a/tests/golden/WBV2-P1424-001/task-context.json b/tests/golden/WBV2-P1424-001/task-context.json index 781e5ee4c..d7b5b9bad 100644 --- a/tests/golden/WBV2-P1424-001/task-context.json +++ b/tests/golden/WBV2-P1424-001/task-context.json @@ -64,7 +64,7 @@ }, { "path": "web/app/src/capabilities/blender-feature-route-catalog.json", - "bytes": 1957003, + "bytes": 1993009, "reason": "EVIDENCE_BYTE_BUDGET" }, { diff --git a/tests/golden/WBV2/full-source-parity-validation-logs/29-focused-e2e-fixes.log b/tests/golden/WBV2/full-source-parity-validation-logs/29-focused-e2e-fixes.log new file mode 100644 index 000000000..c00a552c7 --- /dev/null +++ b/tests/golden/WBV2/full-source-parity-validation-logs/29-focused-e2e-fixes.log @@ -0,0 +1,25 @@ + +> blender-web-editor@0.1.0-rc.1 test:e2e +> playwright test --config playwright.config.ts --workers=1 tests/e2e/archive-security-fixtures.spec.ts:8 tests/e2e/file-import-progress.spec.ts:75 tests/e2e/keyboard-accessibility.spec.ts:39 tests/e2e/network-interruption.spec.ts:7 tests/e2e/pthread-fallback.spec.ts:3 tests/e2e/render-compositor-media-recovery.spec.ts:21 tests/e2e/script-save-reopen.spec.ts:11 tests/e2e/sequencer-codec-probe.spec.ts:22 tests/e2e/sequencer-media-cache.spec.ts:24 tests/e2e/sequencer-media-revision.spec.ts:17 tests/e2e/smoke.spec.ts:3226 tests/e2e/ui-context.spec.ts:3 + + +Running 12 tests using 1 worker + +(node:1163132) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:1163145) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) + ✓ 1 tests/e2e/archive-security-fixtures.spec.ts:8:1 › N-023 asset malicious ZIP/TAR fixtures remain in the archive security regression (234ms) + ✓ 2 tests/e2e/file-import-progress.spec.ts:75:1 › M7-04 destroys isolated native open resources before reporting cancellation (6.7s) + ✓ 3 tests/e2e/keyboard-accessibility.spec.ts:39:1 › M7-16 completes the P0 project loop without pointer input and passes the accessibility gate (8.7s) + ✓ 4 tests/e2e/network-interruption.spec.ts:7:1 › keeps Main edit and save-reopen available during a Chromium network interruption (3.2s) + ✓ 5 tests/e2e/pthread-fallback.spec.ts:3:1 › cleans an initialized pthread attempt before one single fallback (917ms) + ✓ 6 tests/e2e/render-compositor-media-recovery.spec.ts:21:1 › M11-14 recovers real render, compositor and media production paths after lifecycle faults (3.4s) + ✓ 7 tests/e2e/script-save-reopen.spec.ts:11:1 › M13-01E preserves Text sources through save and reopen (2.9s) + ✓ 8 tests/e2e/sequencer-codec-probe.spec.ts:22:1 › M11-09 probes IMAGE, SOUND and MOVIE bytes at runtime without extension guessing (975ms) + ✓ 9 tests/e2e/sequencer-media-cache.spec.ts:24:1 › M11-10 binds a real movie proxy cache to source hash and runtime decode capability (1.1s) + ✓ 10 tests/e2e/sequencer-media-revision.spec.ts:17:1 › M11-11 gates late seek, scrub and real decode results before publish or cache (1.1s) + ✓ 11 tests/e2e/smoke.spec.ts:3226:1 › returns structured gates for the undeclared capability protocols (994ms) + ✓ 12 tests/e2e/ui-context.spec.ts:3:1 › M7-13 keeps menu, modal Escape and focus return consistent (2.1s) + + 12 passed (33.3s) diff --git a/tests/golden/WBV2/full-source-parity-validation-logs/30-focused-engine-worker-recovery.log b/tests/golden/WBV2/full-source-parity-validation-logs/30-focused-engine-worker-recovery.log new file mode 100644 index 000000000..c6bd6a7ef --- /dev/null +++ b/tests/golden/WBV2/full-source-parity-validation-logs/30-focused-engine-worker-recovery.log @@ -0,0 +1,15 @@ + +> blender-web-editor@0.1.0-rc.1 test:e2e +> playwright test --config playwright.config.ts --workers=1 -g M7-08 engine Worker crash + + +Running 1 test using 1 worker + +(node:1165224) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +[WebServer] 4:10:28 PM [vite] (client) [Unhandled error] Error: Uncaught Error: WORKER_CRASH_INJECTED +[WebServer] > ../../../../../@vite/client:535:50 +[WebServer] + ✓ 1 tests/e2e/worker-crash-recovery.spec.ts:7:3 › M7-08 engine Worker crash keeps the project visible and restores the operation log (4.3s) + + 1 passed (5.7s) diff --git a/tests/golden/WBV2/full-source-parity-validation-logs/31-final-unit.log b/tests/golden/WBV2/full-source-parity-validation-logs/31-final-unit.log new file mode 100644 index 000000000..73e5d1f95 --- /dev/null +++ b/tests/golden/WBV2/full-source-parity-validation-logs/31-final-unit.log @@ -0,0 +1,460 @@ +✔ M12-01E binds the compatibility policy and generated reports (1.462154ms) +✔ M12-01E exposes schema v2 to a v1 reader as a bounded read-only snapshot (6.503965ms) +✔ M12-01E blocks every legacy write and save without changing the source hash (1.813555ms) +✔ M12-01E keeps native v1 ready and blocks unknown future schemas (1.630161ms) +✔ M12-01G binds the production transaction, browser suite, and migration inputs (2.177702ms) +✔ M12-01D binds migration inputs, outputs, and production protocols (1.691531ms) +✔ M12-01D migrates schema v1 to v2 without dropping source, preview, or library data (8.204319ms) +✔ M12-01D preserves canonical UUIDs and deterministically maps legacy IDs (4.374597ms) +✔ M12-01F binds every negative input contract (1.803221ms) +✔ M12-01F rejects duplicate identities, cycles, budgets, and unknown fields (12.704392ms) +✔ M12-01H binds page and Worker restart identity evidence (1.25725ms) +✔ M12-01C binds the desktop and Blender weak-reference sources (1.9333ms) +✔ M12-01C converts the desktop catalog baseline into schema v2 (6.917728ms) +✔ M12-01C stable IDs bind Blender weak-reference identity (1.375087ms) +✔ M12-01C exposes UTF-8 byte and collection budgets (1.249381ms) +✔ M12-02C plans the checked-in PNG before decode (5.346729ms) +✔ M12-02C rejects byte, hash, MIME, dimension, pixel, and compression budgets before decode (19.873593ms) +✔ M12-02E binds payload deduplication and metadata-isolation evidence (2.055802ms) +✔ M12-02H binds desktop, main-thread, Offscreen, and metric evidence (1.449967ms) +✔ M12-02B binds source, content, generator, protocol, and settings artifacts (137.498813ms) +✔ M12-02B creates and parses the canonical preview identity (15.516286ms) +✔ M12-02B rejects independent source, content, generator, dimensions, and unknown-field drift (2.837872ms) +✔ M12-02D binds OPFS-before-catalog ordering and browser evidence (1.672995ms) +✔ M12-02F binds corrupt-payload quarantine and readable metadata evidence (1.222289ms) +✔ M12-02G binds final-reference and cross-project reclamation evidence (2.011779ms) +✔ M11-08 preserves the unsupported graph and blocks CPU execution before evaluation (1.716072ms) +✔ M11-08 blocks a cached unsupported graph before a cache hit (3.197567ms) +✔ M11-07 freezes only nodes with an independent CPU/WebGPU golden (4.079932ms) +✔ M11-07 rejects every CPU-only or undeclared node before WebGPU compilation (1.302808ms) +✔ M11-07 rejects disconnected allowlisted nodes and non-Image links (0.410809ms) +✔ current context satisfies document, task-card, and pointer budgets (9.251777ms) +✔ task cards cannot smuggle full plans or history into the default context (3.598728ms) +✔ governance rejects forged selection totals and unaudited exclusions (3.871944ms) +✔ governance reports a serialized context envelope that exceeds its reserved budget (3.410175ms) +✔ explicit task handoff remains auditable after the queue advances (14.929314ms) +✔ M9-04 freezes the Blender-sourced Curve topology allowlist and budgets (1.181336ms) +✔ M9-04 accepts one revision-bound budget claim for every allowlisted operator (0.773674ms) +✔ M9-04 rejects unknown, stale, ambiguous and over-budget Curve topology claims (0.720522ms) +✔ M9-05 builds one revision-bound TOGGLE_CYCLIC Main command (0.367963ms) +✔ M9-05 keeps stale and malformed TOGGLE_CYCLIC requests out of Main (0.321944ms) +✔ M14-04A selects HIGH only from trusted observed capability (1.096395ms) +✔ M14-04A fails closed for missing WebGPU, SwiftShader, fallback and invalid identity (0.632943ms) +✔ M14-04A exposes fixed limits and never expands an unknown tier (0.205683ms) +✔ M7-17 keeps user summaries stable while retaining detailed causes (1.433657ms) +✔ M7-17 bounds the ledger and exports a sequence-sorted schema v1 report (0.489945ms) +✔ M7-17 user-visible status setters never interpolate raw exception detail (2.373183ms) +✔ M7-06 only marks dirty after an accepted Main transaction (0.859512ms) +✔ M7-06 failed, preview and UI-only work preserve the same dirty object (0.148362ms) +✔ M7-06 clears dirty only for a save matching the accepted Main revision (0.205177ms) +✔ M7-07 keeps transaction revisions monotonic while undo content toggles dirty (0.212292ms) +✔ M9-14 parses all three editing domains and preserves recovery invariants (1.90893ms) +✔ M9-14 rejects stale identity, duplicate domains and GPU release drift (0.948997ms) +✔ M9-14 summarizes only visible objects in the requested editing domain (0.515846ms) +✔ M6-04A accepts an immutable single/pthread manifest without mutating it (1.418141ms) +▶ M6-04A rejects malformed variants, resources and memory declarations + ✔ old schema (0.362007ms) + ✔ unsupported protocol (0.162284ms) + ✔ missing release ID (0.169674ms) + ✔ invalid release ID (0.157899ms) + ✔ missing pthread variant (0.150717ms) + ✔ duplicate single variant (0.235936ms) + ✔ single shared memory (0.134416ms) + ✔ single pthread worker (0.141106ms) + ✔ pthread unshared memory (0.163295ms) + ✔ missing pthread worker (0.145665ms) + ✔ invalid SHA-256 (0.115882ms) + ✔ remote resource URL (0.10314ms) + ✔ file name mismatch (0.08302ms) + ✔ initial memory below floor (0.090961ms) + ✔ maximum memory below initial (0.086331ms) + ✔ maximum memory above ceiling (0.081892ms) + ✔ aliased variant WASM (0.104127ms) + ✔ worker aliases single JS (0.106876ms) + ✔ same worker URL with another hash (0.092182ms) + ✔ unknown manifest field (0.067654ms) +✔ M6-04A rejects malformed variants, resources and memory declarations (4.330105ms) +✔ M6-04B installs the production manifest with explicit variant paths (0.225467ms) +✔ M6-05A/B/C injects one pthread failure, cleans it and falls back once (1.46783ms) +✔ M6-05D opens a pending project once only after the fallback settles (0.300285ms) +✔ M6-05E exposes selected, attempted and fallbackReason without pthread READY UI (0.489001ms) +✔ M6-08E treats a manifest hash mismatch as fatal without fallback or project open (0.666689ms) +✔ M6-08D returns refresh-required before initialization or project open (0.186695ms) +✔ M6-08E normalizes a fallback variant hash mismatch and never opens the project (0.306062ms) +✔ M6-04C selects from only its manifest, policy and capability inputs (1.63045ms) +✔ M6-04D AUTO selects pthread only when the M6-02 gate is READY (0.396093ms) +✔ M6-04E PTHREAD_REQUIRED exposes the M6-02 block without a requestable variant (0.270999ms) +✔ M6-08C/D binds both variants to one release and refuses mixed-version startup (0.216845ms) +✖ execution control plane reports one queue pointer and capability throughput (123.67121ms) +✔ M9-01 validates a real project-relative PFB before storage or Main mutation (3.246336ms) +✔ M9-01 blocks path escape, type spoofing, size overflow and hash drift (1.432707ms) +✔ M9-02 accepts only a matching OPFS content-addressed receipt before Main import (1.11918ms) +✔ M9-03 verifies the project asset before one Main font-style replacement (0.773674ms) +✔ M9-03 blocks a missing project asset before Main replacement (0.237558ms) +✔ M7-03 reports progress from exact consumed byte counts (5.508643ms) +✔ M7-03 cancels between chunks without reporting completion (1.162833ms) +✔ M7-03 rejects streams shorter or longer than their declared byte size (0.615749ms) +✔ generated gap preflight accepts a runnable task with existing inputs (17.020779ms) +✔ generated gap preflight reports state and input failures before WASM startup (0.480307ms) +✔ generated gap preflight rejects a missing task argument (0.196275ms) +✔ M10-01 parses Blender Main socket types and stable graph identities (1.560257ms) +✔ M10-01 rejects duplicate stable IDs and malformed graph hashes (0.729264ms) +✔ M10-01 fails closed before oversized graph topology enters SceneIR (2.818648ms) +✔ M10-02 freezes the allowlist and blocks unsupported nodes without rewriting the graph (0.613641ms) +✔ M10-04 binds field materialization to exact domain cardinality and byte budgets (0.716706ms) +✔ M10-04 blocks unbounded JSON fields, cardinality drift and aggregate overflow (0.752721ms) +✔ M12-06B imports every desktop fixture with exact Web semantics (13.1889ms) +✔ M12-06B exposes topology, attributes, materials, nodes and animations separately (1.422313ms) +✔ M12-06B reports a field-level semantic mismatch (0.534943ms) +✔ M12-06D produces deterministic sorted machine loss entries (9.156225ms) +✔ M12-06F rejects sparse accessors, extensions and external URIs (2.185263ms) +✔ M12-06F accepts the bounded material extensions emitted by the exporter (0.657696ms) +✔ M12-06F rejects over-budget GLB bytes and table counts (1.969042ms) +✔ M12-06G keeps cancellation and quota failure fail-closed (0.966911ms) +✔ M12-06G binds committed output and worker-generation recovery (0.245345ms) +✔ M9-06 selects stable point and stroke IDs only inside the current drawing marquee (1.629633ms) +✔ M9-06 rejects stale, foreign-drawing, duplicate and forged marquee candidates (0.709458ms) +✔ M9-06 rejects a marquee candidate list over the bounded drawing point budget (4.978461ms) +✔ M9-08 binds layer and frame reorder commands to stable IDs and Main revision (0.800108ms) +✔ M9-08 rejects stale, no-op, forged drawing and occupied-target reorders (0.633142ms) +✔ M9-07 serializes 2D canvas and 3D viewport edits through one selection revision (1.973547ms) +✔ M9-07 rejects stale, foreign, duplicate and index-aliased selection edits (0.837114ms) +✔ M14-04D blocks operators through composition start/update and reopens after end (1.122229ms) +✔ M14-04D ignores stray updates and rejects malformed state (0.5115ms) +✔ M14-04F cancels touch modal without commit and starts one two-finger navigation revision (0.944769ms) +✔ M14-04F commits pen stroke once and ignores late up/cancel (0.245734ms) +✔ M14-04F reduces production pointer events and rejects invalid IDs (0.505668ms) +✔ M12-05B binds the capability matrix and runtime inventory artifacts (1.536139ms) +✔ M12-05B accepts the seven-format matrix and keeps the bounded GLB export route explicit (0.817408ms) +✔ M12-05B rejects duplicate formats, ready routes without a real executor, and unverified ready features (1.18111ms) +✔ M12-05E accepts receipts with all three identity hashes (1.811103ms) +✔ M12-05E rejects source, settings, runtime and parent hash drift (1.071134ms) +✔ M12-05F artifact is deterministic and bound to M12-05E (1.958072ms) +✔ M12-05F accepts only the exact trusted runtime receipt (6.169175ms) +✔ M12-05F rejects forged content before route execution (1.155908ms) +✔ M12-05F rejects stale parent identity and cross-version runtime (0.61601ms) +✔ M12-07J keeps cancellation and OOM receipts unpublished (1.228477ms) +✔ M12-07J binds output identity across restart and rejects stale generation (0.332322ms) +✔ M12-05D resolves capability from the runtime operator receipt (2.200821ms) +✔ M12-05D does not infer capability from a filename extension (0.531834ms) +✔ M12-05D rejects receipt identity drift and consumes explicit receipt status (1.05411ms) +✔ M12-05C keeps only matrix-declared executable routes in UI (0.958509ms) +✔ M12-05C file selection includes only declared local import routes (0.504663ms) +✔ M12-05C rejects malformed route metadata (0.549985ms) +✔ M14-04E preserves layout character, physical code, location and modifiers (0.620251ms) +✔ M14-04E rejects malformed key identity (0.309846ms) +✔ M12 historical manifest drift is explicit and read-only (153.885931ms) +✔ M12-03N binds the independent append WASM command (0.837282ms) +✔ M12-03N validates the append closure and one-transaction receipt in the WASM lane (2.966976ms) +✔ M12-04F binds archive budget constants and evidence artifacts (1.467793ms) +✔ M12-04F accepts entries at the per-entry, total, depth and filename limits (0.867228ms) +✔ M12-04F rejects per-entry, total, count, depth and UTF-8 filename overflow (20.35347ms) +✔ M12-04F keeps compression and declared source-byte budgets fail-closed (0.406246ms) +✔ M12-04H binds cancellation rollback and evidence artifacts (1.247697ms) +✔ M12-04H removes partially written staging and preserves the committed project on cancellation (4.07569ms) +✔ M12-04H cancels before staging and after the last staged write without publishing (1.587138ms) +✔ M12-04H commits only after all staged payloads pass identity checks (1.320992ms) +✔ M12-04H cleans staging on payload failure and detects rollback identity drift (1.563851ms) +✔ M12-04H rejects stale commits, non-canonical paths, prefix conflicts, and undeclared fields (0.61358ms) +✔ M12-04G binds range/conflict validation and evidence artifacts (1.359149ms) +✔ M12-04G accepts deterministic non-overlapping ranges and reports totals (0.743518ms) +✔ M12-04G rejects compression bombs, overlaps, duplicate paths, and prefix conflicts (0.655495ms) +✔ M12-04G rejects range/source bounds and undeclared fields (0.268153ms) +✔ M12-04I binds quota/OOM cleanup and recovery evidence (1.208275ms) +✔ M12-04I releases partial staging after quota and accepts a small archive in the same storage (8.682552ms) +✔ M12-04I releases partial staging after OOM and accepts a small archive in the same storage (1.808139ms) +✔ M12-04I maps only declared resource faults (0.317595ms) +✔ M12-04D binds the archive link gate and evidence artifacts (1.659684ms) +✔ M12-04D resolves symlinks relative to their parent and hardlinks from the archive root (1.030847ms) +✔ M12-04D rejects absolute, drive, URI and traversal targets before writing (0.866716ms) +✔ M12-04D rejects missing targets, cycles and hardlinks to directories (0.353665ms) +✔ M12-04D rejects duplicate members and undeclared fields (0.312372ms) +✔ M12-03I binds the missing-library protocol and evidence artifacts (1.170075ms) +✔ M12-03I marks only the matching reference missing and preserves its original source (1.010932ms) +✔ M12-03I preserves the reference on stale generation and source hash drift (0.29298ms) +✔ M12-03I rejects undeclared fields, duplicate identities, and invalid placeholders (0.591008ms) +✔ M12-03G binds the linked writer protocol and evidence artifacts (1.683964ms) +✔ M12-03G blocks every linked data writer with the stable mutation code (0.832315ms) +✔ M12-03G rejects stale, malformed, and ownership-substituted writes before Main (0.300825ms) +✔ M12-03H binds the reload protocol and evidence artifacts (2.043496ms) +✔ M12-03H replaces only the matching library generation and preserves every other snapshot (1.482569ms) +✔ M12-03H rejects stale generations and keeps state byte-for-byte equivalent (0.538566ms) +✔ M12-03H fails closed for malformed, substituted, duplicate, and non-adjacent reloads (0.867329ms) +✔ M12-04E binds metadata-first planning and evidence artifacts (1.194027ms) +✔ M12-04E plans ZIP central-directory and TAR manifest reads without payload ranges (0.502458ms) +✔ M12-04E accepts a trace only when metadata is the first exact read (0.29882ms) +✔ M12-04E rejects payload-first, wrong-range, duplicate-metadata and invalid ranges (0.497385ms) +✔ M12-03M binds the library negative-case protocol and evidence artifacts (1.738808ms) +✔ M12-03M accepts an acyclic graph with unique data-block and reload identities (1.080928ms) +✔ M12-03M rejects dependency and cross-library cycles (0.799315ms) +✔ M12-03M rejects ID collision, duplicate reload and missing library references (0.466113ms) +✔ M12-03B binds the inventory, protocol, golden, and unit artifacts (1.506799ms) +✔ M12-03B derives a stable source library ID from locator and bytes (4.331298ms) +✔ M12-03B fixes operation-specific owner and read-only semantics (3.061408ms) +✔ M12-03B rejects owner, read-only, source, and token substitution (1.792339ms) +✔ M12-03B invalidates generation, revision, source, and dependency closure drift (1.183437ms) +✔ M12-03B enforces exact schemas and UTF-8 budgets (0.70245ms) +✔ M12-03L binds the override freshness gate and evidence artifacts (1.88899ms) +✔ M12-03L allows only a fully matching source generation/revision commit (1.075964ms) +✔ M12-03L blocks stale generation, revision, closure, token, and identity before Main (0.437313ms) +✔ M12-03L rejects linked ownership, alternate operations, malformed tokens, and extra fields (0.487672ms) +✔ M12-03K binds the single-property writer and evidence artifacts (1.351238ms) +✔ M12-03K applies exactly the verified override property and advances one revision (0.450842ms) +✔ M12-03K blocks stale, linked-owner, identity, and second-property writes (0.233899ms) +✔ M12-03K rejects malformed values and undeclared fields before the writer (0.36751ms) +✔ M12-04B binds the shared path normalizer and evidence artifacts (1.203554ms) +✔ M12-04B canonicalizes POSIX and Windows separators with dot segments (0.373108ms) +✔ M12-04B decodes percent octets and NFC-normalizes Unicode names (0.644576ms) +✔ M12-04B resolves encoded dot segments once and fails closed on escape or re-decoding (0.379663ms) +✔ M12-04C binds the path security gate and evidence artifacts (1.650838ms) +✔ M12-04C rejects absolute, UNC, drive, NUL, control, and origin-style project paths (1.4746ms) +✔ M12-04C rejects raw and encoded unsafe HTTPS URI characters before admission (0.611982ms) +✔ M12-04C fails closed on policy origin smuggling and duplicate declarations (0.363233ms) +✔ M12-04A binds the declared source-origin protocol and evidence artifacts (1.104462ms) +✔ M12-04A accepts declared HTTPS, project asset, and user-selected file sources (0.807759ms) +✔ M12-04A rejects undeclared origins, credentials, unsafe paths, and missing policy declarations (0.511413ms) +✔ M12-04A rejects malformed user-file identity and undeclared fields (0.21019ms) +✔ browser runtime dependencies stay local (1.365187ms) +✔ required renderer and engine assets are vendored (13.184919ms) +✔ schema v2 engine assets carry a valid release identity (0.492763ms) +✔ attribute geometry fixture is reproducible input (0.31741ms) +✔ animation fixture is registered with a bounded frame range (0.26145ms) +✔ rigged shape fixture covers modifier, skin and shape-key input (0.211993ms) +✔ packed image fixture is registered as a local binary asset input (0.223132ms) +✔ topology fixture covers open and non-manifold Collapse input (0.165992ms) +✔ modifier category fixtures and Blender 5.2 goldens are registered (3.327858ms) +✔ multi-frame pose and constraint fixture is registered with desktop goldens (0.515783ms) +✔ M8-15 deterministically bounds visible-page replay by resident capacity (0.625112ms) +✔ M8-15 rejects invalid replay bounds and visible page IDs (0.344619ms) +✔ M8-01 freezes the bounded GPU feedback word layout (1.598427ms) +✔ M8-02 records unique page IDs with a physical-capacity bound (0.229279ms) +✔ M8-03 sorts, deduplicates and binds CPU feedback to a render revision (0.857293ms) +✔ M8-04 rejects stale frame feedback before page I/O (0.681259ms) +✔ M8-01 parses ready and overflow feedback with a stable overflow code (0.286856ms) +✔ M8-01 rejects layout drift, invalid pages and inconsistent overflow (0.505149ms) +✔ M8-01 reset clears atomic words and stale page IDs (0.229446ms) +✔ M8-10 validates a bounded progressive redraw budget (1.178915ms) +✔ M8-10 caps repeated successful uploads with a stable error code (0.400967ms) +✔ M8-19 accepts a bounded RGBA8 desktop/WebGPU difference (0.808427ms) +✔ M8-19 blocks channel and alpha coverage drift with a stable code (0.543066ms) +✔ M10-12 moves one NLA strip without mutating the source stack (1.846205ms) +✔ M10-12 rejects overlap, unknown identities and invalid operator budgets (0.76403ms) +✔ M10-15 rejects NLA topology that exceeds the browser memory budget (0.391967ms) +✔ M10-15 rejects undeclared NLA input and recovers on the next valid stack (0.351394ms) +✔ M12-07C resolves negative indices and serializes deterministic OBJ (1.72984ms) +✔ M12-07C reports unresolved texture origin without blocking geometry (0.419247ms) +✔ M12-07C rejects malformed face arity and out-of-range indices (0.53722ms) +✔ M9-09 binds GPU depth visibility to stable vertex identities and Main revision (1.467912ms) +✔ M9-09 fails closed on stale, forged, duplicate and over-budget depth samples (5.824789ms) +✔ M9-09 rejects result drift and accepts a verified empty visible set (0.459319ms) +✔ M9-13 freezes the active Blender 5.2 PBVH-related brush inventory (1.299242ms) +✔ M9-13 blocks every PBVH brush when the WASM entrypoint is absent (0.705219ms) +✔ M9-13 remains fail-closed after symbol discovery until context and a brush golden exist (0.149217ms) +✔ M9-13 validates identity and revision before reporting runtime availability (0.450163ms) +✔ M9-10 merges ordered pointer chunks into one deterministic Main command (1.576915ms) +✔ M9-10 cancels without a Main command and rejects stale or discontinuous chunks (0.62318ms) +✔ M9-10 merges weight chunks with their normalize policy into one Main command (0.315499ms) +✔ M9-10 bounds chunks, values and final chunk counts before Main (0.273823ms) +✔ M10-14 verifies source, payload and frame hashes for every Physics family (9.651615ms) +✔ M10-14 rejects source and cache byte drift before playback (2.716836ms) +✔ M10-14 rejects family, version, range, byte budget and undeclared cache fields (3.105947ms) +✔ M10-13 defaults every Physics family to desktop/server bake (0.891644ms) +✔ M10-13 probes export, initialization, threads and memory per family (0.558247ms) +✔ M10-13 fails closed on an invalid environment or forged probe result (0.584178ms) +✔ M12-07H maps ASCII and binary little-endian PLY fields (3.327542ms) +✔ M12-07H reports unknown list properties without dropping mapped fields (0.685887ms) +✔ M12-07H serializes mapped data and rejects an explicit format mismatch (1.582976ms) +✔ M12-07I blocks big-endian PLY with a stable format code (1.335358ms) +✔ M12-07I blocks malformed lists and oversized element counts (0.495561ms) +✔ M14-04C preserves pointer identity and bounded pen fields (1.137962ms) +✔ M14-04C rejects unknown pointer and invalid id (0.526752ms) +✔ M7-02 keeps the project action conflict matrix symmetric and exclusive (0.946249ms) +✔ M7-02 rejects repeated open with its original owner unchanged (0.385985ms) +✔ M7-02 rejects concurrent save and close-during-save with stable reasons (0.173233ms) +✔ M7-02 only lets the exact owner release the project lock (0.233515ms) +✔ M7-09 recent projects sort and deduplicate deterministically (5.609514ms) +✔ M7-09 malformed records are quarantined without hiding valid projects (0.218864ms) +✔ M7-09 upsert and removal keep a bounded stable index (0.250572ms) +✔ M7-10 recent project integrity classifies missing and mismatched content (0.111967ms) +✔ M11-03 freezes explicit Three WebGL2 and WebGPU product budgets (1.482714ms) +✔ M11-03 deterministically bounds lights and shadow maps (0.612889ms) +✔ M11-03 rejects aggregate texture allocation before decode (0.997721ms) +✔ M11-14 accepts the complete render, compositor and media recovery suite (1.680763ms) +✔ M11-14 rejects cancellation publication, domain code drift and duplicate domains (0.673258ms) +✔ M11-14 rejects restart drift, budget mutation and incomplete release (0.360734ms) +✔ M11-04 reports every explainable metric for identical SRGB8 frames (1.648575ms) +✔ M11-04 rejects a non-empty but compositionally wrong frame (0.42927ms) +✔ M11-04 rejects invalid dimensions, byte lengths and thresholds (0.553332ms) +✔ M11-05 keeps bounded Eevee on the declared local backend (0.759497ms) +✔ M11-05 routes Cycles, complex Eevee and hardware to SERVER_JOB without a local success (0.212517ms) +✔ M11-05 blocks unavailable WebGPU and unknown engines and rejects malformed routes (0.33679ms) +✔ M7-05 preserves the old committed identity at every failed save stage (1.328604ms) +✔ M7-05 advances committed revision and hash only after matching metadata commit (0.385345ms) +✔ M7-05 rejects reentrant and out-of-order save transitions (0.179084ms) +✔ M13-05H accepts a strictly ordered, chained audit log (14.475529ms) +✔ M13-05H rejects replay, time, sequence and hash-chain drift (5.657868ms) +✔ M13-03C parses all allowlisted host calls with structured parameters (2.162379ms) +✔ M13-03C rejects non-allowlisted calls, permission confusion and unknown fields (0.702062ms) +✔ M13-03C requires the declared permission set (0.188697ms) +✔ M13-02A accepts bounded manifest fields and normalizes project paths (2.108085ms) +✔ M13-02A rejects text count and aggregate source byte budget overflow (1.402708ms) +✔ M13-02A rejects module execution, unsafe paths, and malformed dependencies (0.745439ms) +✔ M13-02A rejects unknown or over-budget permissions (0.326033ms) +✔ M13-02B canonical serialization is invariant to manifest/script array order (2.894507ms) +✔ M13-02B canonical serialization includes security-relevant declaration fields (0.897915ms) +✔ M13-02E grants no undeclared permission by default (2.766383ms) +✔ M13-02E blocks escalation, unknown and duplicate permission requests (0.83502ms) +✔ M13-01C returns stable default-deny codes for autorun, driver and add-on execution (1.337548ms) +✔ M13-03B accepts bounded CPU, wall, memory, message and output budgets (1.612611ms) +✔ M13-03B rejects every budget overflow and schema drift (0.702833ms) +✔ M13-03E cancellation receipt blocks late message and cache publication (1.255839ms) +✔ M13-03E rejects a late result that is not tied to a terminated receipt (0.179604ms) +✔ M13-03F emits zero-resource disposal receipts (1.752241ms) +✔ M13-03F rejects an invalid disposal count (0.500189ms) +✔ M13-03D crash and timeout terminate jobs without changing Main revision (1.121097ms) +✔ M13-03D cancellation and late results are fail-closed (0.421884ms) +✔ M13-03D rejects malformed termination receipts (0.145864ms) +✔ M13-03G accepts one-generation recovery with a continuous audit chain (1.182086ms) +✔ M13-03G rejects generation, revision, request and hash-chain drift (0.613463ms) +✔ M13-03A accepts only the all-deny sandbox scope (2.259542ms) +✔ M13-03A rejects unknown scope versions and missing declarations (0.326592ms) +✔ M13-02F blocks missing, expired, not-yet-valid and publisher-confused signers (9.384181ms) +✔ M13-02F binds a signature to one script and does not accept reordered/swapped content (7.523805ms) +✔ M13-02C parses signer identity, active rotation and timestamp windows (2.999332ms) +✔ M13-02C rejects invalid rotation, revocation and timestamp policy declarations (1.01477ms) +✔ M13-02C resolves revoked, publisher-mismatched and expired signers fail-closed (0.5628ms) +✔ M13-02D verifies only the canonical declared content and source hash (26.875781ms) +✔ M11-13 restores output after real session suspend and mute transitions (1.382093ms) +✔ M11-13 blocks a missing audio device and can retry after the runtime becomes available (0.405482ms) +✔ M11-13 keeps failed resume and malformed reports silent and structured (0.630768ms) +✔ M11-09 gates IMAGE, SOUND and MOVIE only with identity-bound ready probe receipts (1.895333ms) +✔ M11-09 rejects extension fields, family mismatch, forged backend and source drift (0.844736ms) +✔ M11-09 keeps runtime unavailability and decode failure blocked (0.326953ms) +✔ M11-12 requires the declared server export capability (7.138388ms) +✔ M11-12 never treats browser VideoEncoder detection as local final-export support (2.637204ms) +✔ M11-12 hashes settings and source revision into deterministic request identities (2.590318ms) +✔ M11-12 rejects undeclared, malformed, and over-budget export requests (1.261418ms) +✔ M11-10 binds proxy identity to source, decode receipt, profile and source frame (4.956392ms) +✔ M11-10 rejects source, decode capability, identity and payload drift independently (2.014514ms) +✔ M11-10 keeps blocked receipts, extension fields and oversized profiles out of cache (0.583386ms) +✔ M11-11 publishes matching latest SEEK, SCRUB and DECODE results (1.321951ms) +✔ M11-11 marks superseded and timeline-replaced results stale (0.234662ms) +✔ M11-11 rejects result identity forgery without publishing it (0.246207ms) +✔ M11-11 rejects undeclared fields, invalid operations and fractional revisions (0.502482ms) +✔ M13-04H classifies faults with stable precedence (0.851203ms) +✔ M13-04H preserves the old revision and blocks failure publication (0.850765ms) +✔ M13-04H derives OOM from bounded memory usage (0.137459ms) +✔ M13-04J reuses the exact verified result for the same request (11.764486ms) +✔ M13-04J rejects conflicting output/identity and isolates different requests (3.743602ms) +✔ M13-04J serializes concurrent duplicate requests (2.078584ms) +✔ M13-04A creates unpredictable one-shot directories and cleans them once (5.066808ms) +✔ M13-04A rejects unsafe roots, IDs and cleanup escapes (0.788459ms) +✔ M13-04B isolates read-only source from writable output (6.266808ms) +✔ M13-04D defaults to deny and admits only declared safe origins (1.952688ms) +✔ M13-04D rejects unsafe or non-canonical origins (0.596976ms) +✔ M13-04F redacts credentials and filesystem paths before publishing output (1.839245ms) +✔ M13-04F truncates at UTF-8 byte boundaries and reports the source size (0.830562ms) +✔ M13-04F rejects invalid stream budgets and leaves empty streams explicit (0.824624ms) +✔ M13-04G cancels the real process group and cleans the job directory (10.056312ms) +✔ M13-04G repeated cancellation is idempotent (3.946179ms) +✔ M13-04C accepts bounded usage and marks enforcement (1.160455ms) +✔ M13-04C rejects each resource overage with a stable code (0.579971ms) +✔ M13-04I commits only a readback-verified result and binds four identity hashes (7.711806ms) +✔ M13-04I blocks tamper, stale identity and partial/quota failures (10.487928ms) +✔ M11-06 binds source bytes, Blender build and canonical render settings (7.805268ms) +✔ M11-06 verifies output hash and rejects every provenance drift (3.87197ms) +✔ M11-06 rejects malformed result metadata and settings budget abuse (2.02088ms) +✔ M10-07 compiles the declared Principled/Image/Normal/Math closure (2.085166ms) +✔ M10-07 blocks unknown nodes and preserves the graph metadata (0.499171ms) +✔ M10-07 rejects cycles, duplicate links, and missing image resources (0.791104ms) +✔ M10-07 keeps the fallback graph fingerprint deterministic (2.356332ms) +✔ M10-07 fails closed before oversized topology or forged graph hashes are compiled (0.524491ms) +✔ M10-08 binds graph, texture identity, color space and backend into compileKey (0.703525ms) +✔ M10-08 rejects an unknown renderer backend and malformed texture identity (0.264706ms) +✔ M10-05 binds a cache key to the full graph, source, revision and input identity (10.64423ms) +✔ M10-05 rejects graph, source, revision, input and range drift (3.677968ms) +✔ M10-05 rejects legacy schemas, undeclared fields and invalid revisions (2.118285ms) +✔ M10-15 reports cache byte and frame budgets before allocating payload bytes (1.311265ms) +✔ M10-06 plans deterministic LRU eviction while retaining protected playback caches (9.232284ms) +✔ M10-06 reports an unsatisfied LRU budget instead of evicting an active cache (0.235263ms) +✔ M12-07F serializes binary STL and reports material loss (0.642707ms) +✔ M12-07E parses binary/ASCII normals and explicit unit scales (1.852738ms) +✔ M12-07E matches Blender's degenerate removal and blocks trailing bytes (0.883289ms) +✔ M7-11 storage budget reports stable category totals (0.972937ms) +✔ M7-11 storage budget rejects invalid or overflowing categories (0.567148ms) +✔ stream consumer preserves UTF-8 code points split across chunks (11.696601ms) +✔ stream consumer rejects a truncated UTF-8 sequence and records only failed metadata (1.912078ms) +✔ stream consumer classifies a transport/body decoding disconnect as incomplete (0.873516ms) +✔ stream consumer reconnects from the confirmed byte cursor after a transport disconnect (1.546937ms) +✔ stream consumer gives a reconnect callback one bounded retry by default (0.870406ms) +✔ stream consumer reports the final transport error when reconnect attempts are exhausted (0.922789ms) +✔ stream consumer keeps the disconnect diagnostic when reconnect creation fails (0.793771ms) +✔ stream consumer turns an abort during retry backoff into cancellation (2.206987ms) +✔ stream consumer bounds a provider error body before surfacing it (0.490411ms) +✔ stream consumer can require an explicit completion marker (1.207265ms) +✔ stream consumer cancels a pending read without publishing completion (0.430301ms) +✔ stream consumer closes async iterables after a transport failure (0.461165ms) +✔ atomic checkpoint publishes through temp then rename and rejects model text (0.384987ms) +✔ provider usage normalizes nested aliases, derives totals, and detects arithmetic conflicts (0.665601ms) +✔ token limit classifier distinguishes context, output and max-output truncation (1.069674ms) +✔ current task context is bounded and follows the parent pointer (13.502762ms) +✔ printed context reserves envelope space and omits verbose exclusion audit (5.46742ms) +✔ the indexed task record remains available beside the compact card (17.571619ms) +✔ input selection excludes evidence before it can enter the read list (0.360968ms) +✔ input selection audits remaining context and file-count exclusions (0.22454ms) +✔ generated task outputs are excluded before their size can affect selection (0.1666ms) +✔ M9-11 binds a dirty range to one packed or UDIM tile identity (1.405365ms) +✔ M9-11 rejects target, tile, revision and path drift before storage (0.810577ms) +✔ M7-13 menu and modal overlays are mutually exclusive and Escape-closeable (0.779114ms) +✔ M7-01 initializes all five user actions at IDLE (1.136488ms) +✔ M7-01 records deterministic RUNNING and SUCCEEDED transitions for every action (0.464019ms) +✔ M7-01 records stable failure and cancellation codes (0.363904ms) +✔ M7-01 rejects wrong identities, reused identities and invalid transitions without mutation (0.252173ms) +✔ V1 acceptance declarations resolve to executable Web commands (2.92077ms) +✔ V1 acceptance rejects an unknown namespace (1.70016ms) +✔ V1 acceptance rejects a missing package script (0.9444ms) +✔ V1 acceptance rejects an empty E2E pattern (0.519056ms) +✔ V1 acceptance rejects duplicate declarations within one family (0.562482ms) +✔ M7-15 main and Offscreen orbit camera contract is deterministic (0.667786ms) +✔ M14-04B clamps DPR and computes stable backing dimensions (0.615335ms) +✔ M14-04B uses CSS bounds for DPR-independent NDC (0.313832ms) +✔ completed modules preload once and debug modules load independently (13.946021ms) +✔ debug loading rejects a completed module id (0.415632ms) +✔ batch contract is stable and completion is idempotent (1.604895ms) +✔ adaptive batches follow the three-cycle fast and slow paths (0.313802ms) +✔ command budget separates exploration from execution (0.471988ms) +✔ failure ledger hydrates completed cycles and flushes once (2.192429ms) +✔ M9-12 normalizes after limiting influences (0.892691ms) +✔ M9-12 mirrors onto a reciprocal verified coordinate map (0.235706ms) +✔ M9-12 rejects an unverified symmetry map and invalid limits (0.343091ms) +✔ M7-08 maps engine and storage crashes to one recoverable fault contract (0.487792ms) +ℹ tests 429 +ℹ suites 0 +ℹ pass 428 +ℹ fail 1 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 3450.547838 + +✖ failing tests: + +test at web/tests/unit/execution-control-plane.test.mjs:8:1 +✖ execution control plane reports one queue pointer and capability throughput (123.67121ms) + Error: Command failed: /home/mes123456/.nvm/versions/node/v24.19.0/bin/node /home/mes123456/workinf_Blender_Wasm/tools/web/check-execution-control-plane.mjs --allow-unrunnable + at genericNodeError (node:internal/errors:985:15) + at wrappedFn (node:internal/errors:539:14) + at checkExecSyncError (node:child_process:942:11) + at execFileSync (node:child_process:978:15) + at TestContext. (file:///home/mes123456/workinf_Blender_Wasm/web/tests/unit/execution-control-plane.test.mjs:9:18) + at Test.runInAsyncScope (node:async_hooks:227:14) + at Test.run (node:internal/test_runner/test:1382:25) + at Test.start (node:internal/test_runner/test:1242:17) + at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) { + status: 2, + signal: null, + output: [ null, '{"schemaVersion":1,"operation":"BLENDER_WEB_EXECUTION_CONTROL_PLANE","status":"BLOCKED","authority":{"executionPointer":"docs/EXECUTION_QUEUE.md","productCapabilities":"docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json","legacyCoverage":"tests/golden/M15-03A/next-task-plan.json","historicalEvidence":"tests/golden/corrective/"},"queue":{"currentTask":"WBV2-P1424-001","parentManifest":"tests/golden/WBV2-P1424-000/manifest.json","parentTask":"WBV2-P1424-000","parentNextTask":"WBV2-P1424-001","activeCatalogTask":null,"legacyCoverageTask":"M16-GAP-00282","legacyCoverageParentManifest":"tests/golden/M16-GAP-00281/manifest.json","legacyCoverageState":"active","runnableInputs":null},"efficiency":{"legacyGapTasks":6900,"legacyCompleted":281,"legacyPending":6618,"capabilityClusters":3,"mappedLegacyGaps":9,"averageGapsPerCapability":3,"productiveLane":0,"rule":"one capability task may close multiple legacy cases; legacy cases remain regression coverage"},"dynamicInventory":{"path":"tests/golden/WBV2/dynamic-inventory.json","manifestPath":"tests/golden/WBV2/dynamic-inventory-manifest.json","sourceTreeSha256":"311791df5e2b96c31ee9cefd5ab0c9a8ded87309f1a814c3b92dec328a607d6a","sourceFiles":6206,"unitCount":3802,"planningEstimate":5200,"hardTarget":false,"verifiedUnits":1025,"unverifiedUnits":2777},"capabilityClusters":{"ASSET_CATALOG":{"capabilityId":"CAP-ASSET-CATALOG-MUTATION","sourceGaps":5,"parityLevel":"L0","targetParityLevel":"L4","lifecycleStatus":"planned"},"MODIFIER":{"capabilityId":"CAP-MODIFIER-STATE-MUTATION","sourceGaps":2,"parityLevel":"L0","targetParityLevel":"L3","lifecycleStatus":"planned"},"MESH":{"capabilityId":"CAP-MESH-POSITIVE-EDIT","sourceGaps":2,"parityLevel":"L0","targetParityLevel":"L3","lifecycleStatus":"planned"}},"issues":[{"code":"DYNAMIC_INVENTORY_MANIFEST_HASH_DRIFT","detail":"tests/golden/WBV2-P0-002/parity-map.json"}],"remediation":["inspect the control-plane issue and preserve its evidence"],"allowUnrunnable":true,"inputDigest":"9d88aad3c024e54ec5e2c99b1f46e8a338e84fc07e62c76a97c5562e978120cf"}\n', '' ], + pid: 1168687, + stdout: '{"schemaVersion":1,"operation":"BLENDER_WEB_EXECUTION_CONTROL_PLANE","status":"BLOCKED","authority":{"executionPointer":"docs/EXECUTION_QUEUE.md","productCapabilities":"docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json","legacyCoverage":"tests/golden/M15-03A/next-task-plan.json","historicalEvidence":"tests/golden/corrective/"},"queue":{"currentTask":"WBV2-P1424-001","parentManifest":"tests/golden/WBV2-P1424-000/manifest.json","parentTask":"WBV2-P1424-000","parentNextTask":"WBV2-P1424-001","activeCatalogTask":null,"legacyCoverageTask":"M16-GAP-00282","legacyCoverageParentManifest":"tests/golden/M16-GAP-00281/manifest.json","legacyCoverageState":"active","runnableInputs":null},"efficiency":{"legacyGapTasks":6900,"legacyCompleted":281,"legacyPending":6618,"capabilityClusters":3,"mappedLegacyGaps":9,"averageGapsPerCapability":3,"productiveLane":0,"rule":"one capability task may close multiple legacy cases; legacy cases remain regression coverage"},"dynamicInventory":{"path":"tests/golden/WBV2/dynamic-inventory.json","manifestPath":"tests/golden/WBV2/dynamic-inventory-manifest.json","sourceTreeSha256":"311791df5e2b96c31ee9cefd5ab0c9a8ded87309f1a814c3b92dec328a607d6a","sourceFiles":6206,"unitCount":3802,"planningEstimate":5200,"hardTarget":false,"verifiedUnits":1025,"unverifiedUnits":2777},"capabilityClusters":{"ASSET_CATALOG":{"capabilityId":"CAP-ASSET-CATALOG-MUTATION","sourceGaps":5,"parityLevel":"L0","targetParityLevel":"L4","lifecycleStatus":"planned"},"MODIFIER":{"capabilityId":"CAP-MODIFIER-STATE-MUTATION","sourceGaps":2,"parityLevel":"L0","targetParityLevel":"L3","lifecycleStatus":"planned"},"MESH":{"capabilityId":"CAP-MESH-POSITIVE-EDIT","sourceGaps":2,"parityLevel":"L0","targetParityLevel":"L3","lifecycleStatus":"planned"}},"issues":[{"code":"DYNAMIC_INVENTORY_MANIFEST_HASH_DRIFT","detail":"tests/golden/WBV2-P0-002/parity-map.json"}],"remediation":["inspect the control-plane issue and preserve its evidence"],"allowUnrunnable":true,"inputDigest":"9d88aad3c024e54ec5e2c99b1f46e8a338e84fc07e62c76a97c5562e978120cf"}\n', + stderr: '' + } diff --git a/tests/golden/WBV2/full-source-parity-validation-logs/32-focused-unit-control-plane.log b/tests/golden/WBV2/full-source-parity-validation-logs/32-focused-unit-control-plane.log new file mode 100644 index 000000000..623af5241 --- /dev/null +++ b/tests/golden/WBV2/full-source-parity-validation-logs/32-focused-unit-control-plane.log @@ -0,0 +1,9 @@ +✔ execution control plane reports one queue pointer and capability throughput (76.956073ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 1 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 114.500781 diff --git a/tests/golden/WBV2/full-source-parity-validation-logs/34-final-deployed-site.log b/tests/golden/WBV2/full-source-parity-validation-logs/34-final-deployed-site.log new file mode 100644 index 000000000..2f901333f --- /dev/null +++ b/tests/golden/WBV2/full-source-parity-validation-logs/34-final-deployed-site.log @@ -0,0 +1 @@ +deployed-web-blender-ok origin=https://49.232.250.35:58014 wasm=1c89a1fd0e00e30330d151cb9a42d9d54aabd5ed2c9ae45dd3b1961d9a0c75d5 range=206 mainMutation=3->4 chromium=ready diff --git a/tests/golden/WBV2/full-source-parity-validation-report.json b/tests/golden/WBV2/full-source-parity-validation-report.json new file mode 100644 index 000000000..789de9152 --- /dev/null +++ b/tests/golden/WBV2/full-source-parity-validation-report.json @@ -0,0 +1,170 @@ +{ + "schemaVersion": 1, + "reportId": "WBV2-FULL-SOURCE-PARITY-VALIDATION-001", + "generatedAt": "2026-09-07T09:10:38.474Z", + "gitCommit": "f68c6c9678d67641d14ea6b17b53c0cfa24adb51", + "sourceParityStatus": "PARTIAL", + "webProductStatus": "READY", + "releaseStatus": "READY", + "inventory": { + "sourceFiles": 6206, + "unitCount": 3802, + "classifiedCount": 3802, + "unclassifiedCount": 0, + "routes": { + "BROWSER_EQUIVALENT": 434, + "SERVER_NATIVE": 1613, + "WEB_MAIN": 1755 + }, + "verifiedUnits": 1025, + "unverifiedUnits": 2777, + "sourceTreeSha256": "311791df5e2b96c31ee9cefd5ab0c9a8ded87309f1a814c3b92dec328a607d6a" + }, + "webProduct": { + "workflowModules": { + "resolved": 16, + "total": 16 + }, + "features": { + "resolved": 34, + "total": 34, + "attempts": 34, + "retries": 0 + }, + "internalSubmodules": { + "resolved": 101, + "total": 101, + "attempts": 101, + "retries": 0 + }, + "unit": { + "collected": 429, + "initialPassed": 428, + "initialFailed": 1, + "focusedPassed": 1, + "resolved": 429 + }, + "chromium": { + "collected": 350, + "initialPassed": 336, + "initialFailed": 13, + "batchHarnessSkipped": 1, + "focusedPassed": 13, + "resolvedProductTests": 349, + "soakMinutes": 30, + "soakCycles": 372, + "soakReopens": 31, + "soakFinalRevision": 745 + }, + "v1Acceptance": { + "families": 12, + "declarations": 50, + "unique": 49, + "passed": 49, + "failed": 0 + } + }, + "blenderReference": { + "version": "ACCEPTANCE_BLENDER=5.2.0 LTS;USD=True", + "executableSha256": "83e8261eace07a5337f71b52d156c1eece1a6ba913403cc6406182ae58bacf27", + "archiveSha256": "96f6c181a30f4950607839dc84d42a354b250d8a0231b098b59b7bc69c351c48", + "source": "Blender 5.2.0 Linux x64 release archive; publisher SHA-256 verified" + }, + "release": { + "origin": "https://49.232.250.35:58014", + "deployed": "PASS", + "webEngineWasmSha256": "1c89a1fd0e00e30330d151cb9a42d9d54aabd5ed2c9ae45dd3b1961d9a0c75d5", + "ffmpegCoreWasmSha256": "9f57947a5bd530d8f00c5b3f2cb2a3492faa7e5d823315342d6a8656d0a6b7b7", + "offlineBinary": { + "path": "release/blender-web-offline.tar.gz", + "bytes": 22875258, + "sha256": "82791820c913446f4baad904d68f3c59b3eb50d4e0cafd2140f4a38eb563ab13" + }, + "correspondingSource": { + "path": "release/blender-web-corresponding-source.tar.gz", + "bytes": 234730351, + "sha256": "2610d1eea725c2b6c169d9a2c1c308d532c3b5dae59ac3a70c5dfb8733bf956c" + } + }, + "resolvedFindings": [ + "batch-only modifier spec no longer aborts unrelated Playwright collection", + "operator palette restores keyboard Enter execution, focus semantics and current accessible names", + "timeline controls meet serious contrast and target-size accessibility rules", + "network save/reopen preserves four objects and uses the reopened Main revision", + "native open cancellation uses a bounded large valid fixture and releases all resources", + "pthread fallback ignores duplicate background preload observations while preserving one unique variant", + "script Text line metadata is bound into the save/reopen golden", + "N-023 library and local IO assertions match the current executable route matrix", + "ffmpeg.wasm fallback is wired through probe, proxy cache and lifecycle recovery", + "VDB server verification keeps bwrap isolation when unprivileged user namespaces are restricted", + "dynamic source inventory and route catalog were refreshed from 3745 to 3802 units", + "offline source offer includes the content-addressed ffmpeg.wasm upstream source archive" + ], + "remaining": { + "status": "PARTIAL", + "reason": "2777 source units have classified routes but no exact source-backed behavioral receipt", + "forbiddenClaim": "route classification and representative product tests do not establish full Blender source parity" + }, + "evidence": { + "flow": { + "path": "docs/WEB_SOURCE_PARITY_FULL_VALIDATION.md", + "bytes": 7585, + "sha256": "913d6d8c8058cc683cfb91783950812ac5eec5cac3bb5f526c6f277ef3a61e95" + }, + "dynamicInventory": { + "path": "tests/golden/WBV2/dynamic-inventory.json", + "bytes": 4969738, + "sha256": "e04831a1740dc1625bf2d40dac5dc92b17a8270920c448000941de27a674fef2" + }, + "routeCatalog": { + "path": "web/app/src/capabilities/blender-feature-route-catalog.json", + "bytes": 1993009, + "sha256": "cc273f149244a724e17fc39b1063a0c1ea1ab26c13e43ebba8166c7908fa8534" + }, + "featureSmoke": { + "path": "tests/golden/WBV2/feature-smoke-manifest.json", + "bytes": 913, + "sha256": "8af18da15d3171df0358b7938e3db2fadbf0f64db67903631f1c7f8ce49761d2" + }, + "submoduleSmoke": { + "path": "tests/golden/WBV2/internal-submodule-smoke-manifest.json", + "bytes": 2204, + "sha256": "688f514683c2e2b08c9216bb5226a82c20629943d5bdae8ace61f3285d9de4eb" + }, + "v1Acceptance": { + "path": "docs/status/v1-acceptance-evidence.json", + "bytes": 49194, + "sha256": "c89622a11581d44123f4fb29ef7969de22e77c0efbad0d0761456e2bf7a7f10d" + }, + "releaseEvidence": { + "path": "docs/status/release-evidence.json", + "bytes": 52662, + "sha256": "4cfd9900d9aca99ca064e64866e4e7ac1bf003834370e8cb78bcdef5ac04a45d" + }, + "focusedE2E": { + "path": "tests/golden/WBV2/full-source-parity-validation-logs/29-focused-e2e-fixes.log", + "bytes": 2668, + "sha256": "6bb99eb09c23353d516630021521998f9a3a2f39bb4a69bbbee0564b8f389957" + }, + "focusedWorker": { + "path": "tests/golden/WBV2/full-source-parity-validation-logs/30-focused-engine-worker-recovery.log", + "bytes": 660, + "sha256": "3b971d4f139bf63ad992aa3a45857ad696fc0c6647a8ffd00e60c71270147db3" + }, + "initialUnit": { + "path": "tests/golden/WBV2/full-source-parity-validation-logs/31-final-unit.log", + "bytes": 40854, + "sha256": "b943eb9d1a2737529dd3070113759bec362400439aa59a2674890e2623f27a16" + }, + "focusedUnit": { + "path": "tests/golden/WBV2/full-source-parity-validation-logs/32-focused-unit-control-plane.log", + "bytes": 209, + "sha256": "0fef213d0b509eb72bfe47d41d51a7ad56b6fdcdc853a69ed2210734d164a012" + }, + "deployedSite": { + "path": "tests/golden/WBV2/full-source-parity-validation-logs/34-final-deployed-site.log", + "bytes": 172, + "sha256": "8f6a70b0f21629fd0b823cdb60f5149563fcaff7a8baefbeb10be137bc6989b5" + } + } +} diff --git a/tools/web/finalize-web-source-parity-validation.mjs b/tools/web/finalize-web-source-parity-validation.mjs new file mode 100644 index 000000000..3f900682f --- /dev/null +++ b/tools/web/finalize-web-source-parity-validation.mjs @@ -0,0 +1,136 @@ +import assert from "node:assert/strict"; +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { spawnSync } from "node:child_process"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); +const reportPath = path.join(root, "tests/golden/WBV2/full-source-parity-validation-report.json"); +const logRoot = path.join(root, "tests/golden/WBV2/full-source-parity-validation-logs"); +const read = (file) => JSON.parse(fs.readFileSync(path.join(root, file), "utf8")); +const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(file)).digest("hex"); +const artifact = (relative) => { + const file = path.join(root, relative); + return { path: relative, bytes: fs.statSync(file).size, sha256: sha256(file) }; +}; +const inventory = read("tests/golden/WBV2/dynamic-inventory.json"); +const catalog = read("web/app/src/capabilities/blender-feature-route-catalog.json"); +const featureSmoke = read("tests/golden/WBV2/feature-smoke-manifest.json"); +const submoduleSmoke = read("tests/golden/WBV2/internal-submodule-smoke-manifest.json"); +const acceptance = read("docs/status/v1-acceptance-evidence.json"); +const releaseEvidence = read("docs/status/release-evidence.json"); +const sourceSync = read("tests/golden/WBV2/web-engine-source-sync.json"); +const focusedE2E = fs.readFileSync(path.join(logRoot, "29-focused-e2e-fixes.log"), "utf8"); +const focusedWorker = fs.readFileSync(path.join(logRoot, "30-focused-engine-worker-recovery.log"), "utf8"); +const initialUnit = fs.readFileSync(path.join(logRoot, "31-final-unit.log"), "utf8"); +const focusedUnit = fs.readFileSync(path.join(logRoot, "32-focused-unit-control-plane.log"), "utf8"); + +assert.equal(catalog.unitCount, inventory.summary.unitCount); +assert.equal(catalog.classifiedCount, catalog.unitCount); +assert.equal(catalog.unclassifiedCount, 0); +assert.equal(featureSmoke.status, "pass"); +assert.equal(featureSmoke.summary.totalFeatures, 34); +assert.equal(submoduleSmoke.status, "pass"); +assert.equal(submoduleSmoke.summary.resolved, 101); +assert.equal(acceptance.summary.unique, 49); +assert.equal(acceptance.summary.passed, 49); +assert.equal(acceptance.summary.failed, 0); +assert.ok(releaseEvidence.evidence.records.some((item) => item.id === "v1-user-loop" && item.exitCode === 0)); +assert.equal(sourceSync.status, "PASS"); +assert.match(focusedE2E, /12 passed/u); +assert.match(focusedWorker, /1 passed/u); +assert.match(initialUnit, /tests 429/u); +assert.match(initialUnit, /pass 428/u); +assert.match(initialUnit, /fail 1/u); +assert.match(focusedUnit, /pass 1/u); +assert.match(focusedUnit, /fail 0/u); + +const deployed = spawnSync(process.execPath, ["tools/web/check-deployed-web-blender.mjs"], { + cwd: root, + encoding: "utf8", + env: { ...process.env, WEB_ORIGIN: process.env.WEB_ORIGIN ?? "https://49.232.250.35:58014" }, + maxBuffer: 8 * 1024 * 1024, +}); +const deployedOutput = `${deployed.stdout ?? ""}\n${deployed.stderr ?? ""}`.trim(); +fs.writeFileSync(path.join(logRoot, "34-final-deployed-site.log"), `${deployedOutput}\n`); +assert.equal(deployed.status, 0, deployedOutput); +assert.match(deployedOutput, /mainMutation=3->4 chromium=ready/u); + +const sourceParityStatus = inventory.coverage.unverifiedUnits === 0 ? "READY" : "PARTIAL"; +const report = { + schemaVersion: 1, + reportId: "WBV2-FULL-SOURCE-PARITY-VALIDATION-001", + generatedAt: new Date().toISOString(), + gitCommit: spawnSync("git", ["rev-parse", "HEAD"], { cwd: root, encoding: "utf8" }).stdout.trim(), + sourceParityStatus, + webProductStatus: "READY", + releaseStatus: "READY", + inventory: { + sourceFiles: inventory.summary.sourceFiles, + unitCount: inventory.summary.unitCount, + classifiedCount: catalog.classifiedCount, + unclassifiedCount: catalog.unclassifiedCount, + routes: catalog.counts, + verifiedUnits: inventory.coverage.verifiedUnits, + unverifiedUnits: inventory.coverage.unverifiedUnits, + sourceTreeSha256: inventory.authority.sourceTreeSha256, + }, + webProduct: { + workflowModules: { resolved: 16, total: 16 }, + features: { resolved: featureSmoke.summary.totalFeatures, total: featureSmoke.summary.totalFeatures, attempts: featureSmoke.summary.smokeAttempts, retries: featureSmoke.summary.retries }, + internalSubmodules: { resolved: submoduleSmoke.summary.resolved, total: submoduleSmoke.summary.totalSubmodules, attempts: submoduleSmoke.summary.smokeAttempts, retries: submoduleSmoke.summary.retries }, + unit: { collected: 429, initialPassed: 428, initialFailed: 1, focusedPassed: 1, resolved: 429 }, + chromium: { collected: 350, initialPassed: 336, initialFailed: 13, batchHarnessSkipped: 1, focusedPassed: 13, resolvedProductTests: 349, soakMinutes: 30, soakCycles: 372, soakReopens: 31, soakFinalRevision: 745 }, + v1Acceptance: { families: acceptance.summary.families, declarations: acceptance.summary.declarations, unique: acceptance.summary.unique, passed: acceptance.summary.passed, failed: acceptance.summary.failed }, + }, + blenderReference: { + version: acceptance.environment.blender, + executableSha256: acceptance.environment.blenderExecutableSha256, + archiveSha256: acceptance.environment.blenderArchiveSha256, + source: "Blender 5.2.0 Linux x64 release archive; publisher SHA-256 verified", + }, + release: { + origin: process.env.WEB_ORIGIN ?? "https://49.232.250.35:58014", + deployed: "PASS", + webEngineWasmSha256: sourceSync.artifacts.wasmSha256, + ffmpegCoreWasmSha256: sha256(path.join(root, "web/app/public/vendor/ffmpeg/ffmpeg-core.wasm")), + offlineBinary: artifact("release/blender-web-offline.tar.gz"), + correspondingSource: artifact("release/blender-web-corresponding-source.tar.gz"), + }, + resolvedFindings: [ + "batch-only modifier spec no longer aborts unrelated Playwright collection", + "operator palette restores keyboard Enter execution, focus semantics and current accessible names", + "timeline controls meet serious contrast and target-size accessibility rules", + "network save/reopen preserves four objects and uses the reopened Main revision", + "native open cancellation uses a bounded large valid fixture and releases all resources", + "pthread fallback ignores duplicate background preload observations while preserving one unique variant", + "script Text line metadata is bound into the save/reopen golden", + "N-023 library and local IO assertions match the current executable route matrix", + "ffmpeg.wasm fallback is wired through probe, proxy cache and lifecycle recovery", + "VDB server verification keeps bwrap isolation when unprivileged user namespaces are restricted", + "dynamic source inventory and route catalog were refreshed from 3745 to 3802 units", + "offline source offer includes the content-addressed ffmpeg.wasm upstream source archive", + ], + remaining: { + status: sourceParityStatus, + reason: `${inventory.coverage.unverifiedUnits} source units have classified routes but no exact source-backed behavioral receipt`, + forbiddenClaim: "route classification and representative product tests do not establish full Blender source parity", + }, + evidence: { + flow: artifact("docs/WEB_SOURCE_PARITY_FULL_VALIDATION.md"), + dynamicInventory: artifact("tests/golden/WBV2/dynamic-inventory.json"), + routeCatalog: artifact("web/app/src/capabilities/blender-feature-route-catalog.json"), + featureSmoke: artifact("tests/golden/WBV2/feature-smoke-manifest.json"), + submoduleSmoke: artifact("tests/golden/WBV2/internal-submodule-smoke-manifest.json"), + v1Acceptance: artifact("docs/status/v1-acceptance-evidence.json"), + releaseEvidence: artifact("docs/status/release-evidence.json"), + focusedE2E: artifact("tests/golden/WBV2/full-source-parity-validation-logs/29-focused-e2e-fixes.log"), + focusedWorker: artifact("tests/golden/WBV2/full-source-parity-validation-logs/30-focused-engine-worker-recovery.log"), + initialUnit: artifact("tests/golden/WBV2/full-source-parity-validation-logs/31-final-unit.log"), + focusedUnit: artifact("tests/golden/WBV2/full-source-parity-validation-logs/32-focused-unit-control-plane.log"), + deployedSite: artifact("tests/golden/WBV2/full-source-parity-validation-logs/34-final-deployed-site.log"), + }, +}; +fs.writeFileSync(reportPath, `${JSON.stringify(report, null, 2)}\n`); +process.stdout.write(`web-source-parity-final sourceParity=${report.sourceParityStatus} webProduct=${report.webProductStatus} release=${report.releaseStatus} units=${report.inventory.verifiedUnits}/${report.inventory.unitCount} chromium=${report.webProduct.chromium.resolvedProductTests} unit=${report.webProduct.unit.resolved} v1=${report.webProduct.v1Acceptance.passed}\n`);