Advance M8-M11 parity workflows
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

This commit is contained in:
mes123456
2026-08-17 04:37:07 -04:00
parent 7c16b279ae
commit 0fe8d2bb56
324 changed files with 31920 additions and 863 deletions

51
docs/status/M10-01.md Normal file
View File

@@ -0,0 +1,51 @@
# M10-01 Status
status: done
task: 从 Blender Main 读取 Geometry Nodes 图拓扑、socket 默认值、link 和稳定 node ID
updated: 2026-08-16 America/New_York
## Scope
The WebEngine authoritative Main reader publishes a bounded `GeometryNodeGraphIR`
snapshot for every `GeometryNodeTree`. It preserves unsupported nodes as metadata,
uses Blender node identifiers and socket identifiers rather than display names, and
does not evaluate Geometry Nodes. The existing `web/protocol/schema-version` remains
`1`: `geometryNodeGraphs` is an additive optional SceneIR field and no existing field
meaning or persisted storage schema changed.
## Evidence
- Fixture: `tests/files/web/modifier_geometry_nodes_scene.blend`.
- Fixture SHA-256: `f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9`.
- Desktop reference: `tests/golden/W-075/modifier_geometry_nodes_scene.json`.
- Desktop reference SHA-256: `93c21e5158daefce10f2d4df674e636bf3f6ed3dd43e1576c45a02a8592f5886`.
- Golden manifest: `tests/golden/M10-01/geometry-node-main-reader.json`.
- Protocol/unit check: `node --test web/tests/unit/geometry-nodes.test.mjs` (3/3).
- Native/WASM reader check: `node tools/web/check-geometry-node-main-reader.mjs`;
3 graphs, 10 nodes, 7 links, 9 defaults, stable IDs, graph hashes, desktop
comparison, save/reopen and unsupported Simulation-node preservation all passed.
- Chromium Worker check: `WEB_TEST_PORT=5440 npm --prefix web run test:geometry-node-main-reader`
(unit 3/3, reader 1/1, Chromium 1/1).
- `source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8`:
passed (`ninja: no work to do`).
- `npm --prefix web run typecheck`, `npm --prefix web run lint`,
`npm --prefix web run build`, and `git diff --check`: passed.
## Contract
- Per-graph budgets are fixed at 4,096 graphs, 4,096 nodes, 16,384 links,
65,536 node sockets, and 4,096 interface sockets.
- Graphs, nodes, links, and socket arrays are deterministically ordered before the
graph SHA-256 is emitted.
- Socket data types and finite defaults are read from Blender's native `bNodeSocket`
storage; ID-valued defaults are serialized as stable typed IDs.
- `__extend__` sockets are omitted because they are UI extension sockets, not graph
data. Missing/duplicate identifiers, invalid links, and budget overflow fail closed.
- Unsupported node types remain in the graph and are available to the later M10-02
allowlist gate; this task does not claim Geometry Nodes evaluation.
## Rollback
Remove the M10-01 reader, protocol field, golden, unit/E2E checks, package script and
this status file together. Existing SceneIR consumers continue to accept snapshots
without the optional `geometryNodeGraphs` field.

56
docs/status/M10-02.md Normal file
View File

@@ -0,0 +1,56 @@
# M10-02 Status
status: done
task: Geometry Nodes allowlist 与未支持节点无损阻断
updated: 2026-08-16 America/New_York
## Scope
`GEOMETRY_NODE_ALLOWLIST_SCHEMA` and `GEOMETRY_NODE_ALLOWLIST` freeze the only node
types that may proceed past the Geometry Nodes protocol gate. The gate validates the
complete graph before any Main writer call. A node outside the list returns
`GN_NODE_UNSUPPORTED`; a structurally valid allowlisted graph still returns
`CAPABILITY_MISSING` from the production Worker until its evaluator and desktop/WASM
golden are completed by M10-03. Neither failure mutates Main or replaces the graph
read by M10-01.
## Allowlist
Schema 1 contains 16 node types: Group Input/Output, Transform Geometry, Set
Position, Join/Separate Geometry, Realize Instances, Store Named Attribute, integer/
vector input, Value, Compare, Math, and Object/Collection/Image Info. External resource
nodes remain subject to stable-ID, missing-resource, linked-resource and owner-cycle
checks.
## Evidence
- Golden: `tests/golden/M10-02/geometry-node-allowlist.json`.
- Fixture: `tests/files/web/modifier_geometry_nodes_scene.blend`, SHA-256
`f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9`.
- `WEB_TEST_PORT=5441 npm --prefix web run test:geometry-node-allowlist`: unit 4/4
and Chromium 1/1 passed.
- The real Main graph `WebGeometryNodesSimulation` preserved
`GeometryNodeSimulationInput` and `GeometryNodeSimulationOutput`; an attempted
graph transaction returned `GN_NODE_UNSUPPORTED` and retained the graph JSON,
graph SHA-256 and Main revision.
- The allowlisted `WebGeometryNodes` graph returned `CAPABILITY_MISSING` while the
evaluator is still closed; it also retained graph identity and Main revision.
- M10-01 regression: `WEB_TEST_PORT=5442 npm --prefix web run
test:geometry-node-main-reader` passed (unit 4/4, reader 1/1, Chromium 1/1).
- Full unit suite: 131/131 passed.
- `npm --prefix web run typecheck`, `npm --prefix web run lint`,
`npm --prefix web run build` (73 modules), and `git diff --check`: passed.
## Implementation Hashes
- Protocol: `23c2289ec2acbdce0beba47c0b6539bc3f14f5a71ce29927df86cf6c705d6ec3`.
- Unit: `e60933ed0f946bdaa96f5322ba8d80b26c8425c623dd6e87da33016a1592c299`.
- Chromium: `ff2c838b5c16d86eff13699586a0cd1121ee1a86d5ea52d7b89c01d35632bb77`.
- Golden: `471fec9c5382ab7522b6c18ab580a6926eaa59eb5a8b72d23968670b9b9ab37a`.
- Production Worker: `4a65547e6b1fea16a120b4e72eb37d4d9f7c7ced4342f535796535262ff65fcc`.
## Rollback
Remove the exported allowlist schema/list, M10-02 unit/E2E assertions, golden,
package script and this status file together. The older private allowlist behavior is
otherwise unchanged; no persisted schema migration is required.

73
docs/status/M10-03.md Normal file
View File

@@ -0,0 +1,73 @@
# M10-03 Status
status: done
task: Geometry Nodes allowlist 逐节点 Blender 5.2 desktop/WASM golden
updated: 2026-08-16 America/New_York
## Scope
The headless Web modifier evaluates the saved Blender Main graph only through the
16-node schema-1 allowlist. Eleven minimal Blender 5.2 fixtures make every allowlisted
node affect a measured output. The same fixture is evaluated by the full-Main WASM in
Node and by the production Chromium Worker before and after save/reopen.
This is a bounded constant-scalar, topology, attribute, and same-file resource closure.
It does not claim arbitrary Blender field/domain conversion, complete lazy-function
semantics, Geometry Nodes graph writing, linked resources, or Simulation Zones.
## Coverage
- Graph boundary: Group Input and Group Output.
- Geometry: Transform, Set Position, Join/Separate Geometry, Realize Instances, and
Store Named Attribute with a constant Float point-domain value.
- Scalar/vector: Integer, Vector, Value, Compare, and Math nodes on the bounded
operations accepted by the native evaluator.
- Same-file resources: Object Info, Collection Info with separate children, and Image
Info dimensions. Missing, recursive, linked, or otherwise unverified resources stay
behind the M10-02 resource gate.
## Evidence
- Fixture: `tests/files/web/geometry_node_allowlist_evaluator.blend`.
- Golden: `tests/golden/M10-03/geometry-node-evaluator.json`.
- Desktop generator: `tools/web/generate-geometry-node-evaluator-golden.py`; Blender
5.2.0 LTS emitted 11 cases, and a clean temporary regeneration matched every semantic
golden field after excluding output-path-dependent fixture path/hash fields.
- Node full-Main WASM: `node tools/web/check-geometry-node-evaluator-golden.mjs`;
16 nodes, 11 cases, maximum position error 0, RMS position error 0, and attributes
passed.
- Chromium: `WEB_TEST_PORT=5443 npm --prefix web run
test:geometry-node-evaluator-golden`; unit 4/4, Node golden 1/1, and Worker
open/evaluate/save/reopen 1/1 passed.
- Tolerances: maximum position `1e-5`, RMS position `1e-6`, Float point attribute
`1e-6`, and bounds `1e-5`.
- M10-01 regression on port 5444 and M10-02 regression on port 5445 passed.
- Full unit suite 131/131, typecheck, lint, production build (73 modules), local
dependency checks, and `git diff --check` passed.
## Implementation Hashes
- Native evaluator: `b896c5c52a611e7a309f80ca4bf8323ccded458584f65ab8f6841df24d70cc42`.
- Desktop generator: `f42ba309e4935a4534eabcb8ab1978abc08d863e2d18d80a70607f31dd3a3066`.
- WASM checker: `76a02d4aae70a597f0c26c12de3104d56e3f1cc9fded1d4824a05d7ddc59c1b5`.
- Fixture: `0cb3e33df570b436e32d783eef0a6c2daad04ca5bb4ccb4f0286b3d723ff7978`.
- Golden: `363ae47cfb50b8c95d0a55116e8663e41d27c7aa332cffe9b702bbe9b8cbfe1c`.
- Chromium spec: `83b1c96518eb64bef2c8830c778a84eb13d8da0ea62c2488471ed5fefea975c8`.
- Full-Main WASM: `432c5c9efb03b23a506c1b8f57f0d06ee683274bbdfe415f894f0d3c29db0b77`.
## Contract
- Evaluation is demand-driven from the active Group Output and is capped at 4,096
node-output evaluations. Unsupported nodes, sockets, operations, cycles, or resource
states return `GEOMETRY_NODES_EVALUATOR_UNSUPPORTED` without claiming evaluation.
- The evaluator uses Blender `GeometrySet`, geometry join/realize/transform helpers,
evaluated dependency graph resources, and Blender mesh attributes. Three.js does not
execute or approximate Geometry Nodes semantics.
- The fixture and golden inventory must cover every schema-1 allowlist entry before the
check starts; missing coverage fails before numeric comparison.
## Rollback
Remove the bounded evaluator expansion, M10-03 generator/fixture/golden/checker,
Chromium spec, package script, and this status file together. Revert the M10 count to
2/15 and restore the previous Transform/Set Position-only modifier evaluator.

75
docs/status/M10-04.md Normal file
View File

@@ -0,0 +1,75 @@
# M10-04 Status
status: done
task: Geometry Nodes field/domain materialization budgets
updated: 2026-08-16 America/New_York
## Scope
Field materialization schema 1 binds every request to a graph ID/hash, Main revision,
source and target domain, data type, transport, and an exact seven-domain cardinality
snapshot. The parser derives element, scalar, and byte counts rather than accepting
caller-provided counts. JSON never carries field values in this contract; the current
native Depsgraph path only publishes a small verified point-Float payload.
This task establishes budgets and transport boundaries. It does not claim actual
evaluation for arbitrary POINT/EDGE/FACE/CORNER/CURVE/INSTANCE/LAYER conversions,
complete Blender lazy-function semantics, graph writing, or Simulation Zones.
## Budgets
- Domain maxima: POINT 1,000,000; EDGE/FACE 2,000,000 each; CORNER 4,000,000;
CURVE/INSTANCE 100,000 each; LAYER 4,096.
- Batch maxima: 64 fields, 32 real domain conversions, 4,000,000 target elements,
and 64 MiB of materialized data.
- Per-field JSON maximum: 65,536 scalar values. Larger fields must stay binary or
return `GN_FIELD_JSON_BUDGET_EXCEEDED`.
- Supported bounded layouts are Boolean, Int, Float, Vector, and Color. Element,
component, and byte multiplication is checked before a receipt is returned.
## Native Contract
The full-Main Depsgraph reports exact POINT/EDGE/FACE/CORNER cardinality from the
evaluated Blender Mesh and zeroes the non-Mesh domains for the current fixture. The
observable `m10_value` point-Float attribute carries schema version, element/scalar
counts, materialized byte length, and transport. The TypeScript parser cross-checks
the receipt against mesh vertex count, domain cardinality, the Float32 byte layout,
and the actual attribute payload. Unknown receipt fields and hidden JSON arrays are
rejected.
## Evidence
- `WEB_TEST_PORT=5448 npm --prefix web run test:geometry-node-field-budget`:
unit 6/6 and real Chromium Worker 1/1 passed.
- The real `M10GN_StoreAttribute` evaluated mesh reported cardinality
POINT/EDGE/FACE/CORNER `8/12/6/24`, schema 1, eight Float scalars, 32 bytes, and
eight values equal to `0.375`.
- Chromium negative checks rejected POINT cardinality drift, byte-length drift, and
a hidden `values` array in the receipt.
- M10-01/02/03 regressions passed on ports 5449/5450/5451. M10-03 still covers all
16 allowlisted nodes across 11 desktop/full-Main WASM/Chromium cases with zero
maximum and RMS position error.
- Full unit suite 133/133, typecheck, lint, production build (73 modules), local
dependency checks, `git diff --check`, and the three-fixture 100-iteration
Depsgraph regression passed.
The first Chromium rerun on port 5447 was not accepted as evidence: the negative
check used a browser-relative dynamic import that resolved to a nonexistent
`/protocol/depsgraph.ts`. The check was moved to Playwright's Node-side static import,
then the complete task command was rerun on port 5448.
## Implementation Hashes
- Geometry Nodes protocol: `8d04291c29e9ce30e3f2f6d4141bc4101d49529bf7f7edf109d67d059efa58b1`.
- Depsgraph protocol: `df7e0e29422f5b605f20fd5ab939d170d35048020968d2f6aea86603d0633cd6`.
- Native Depsgraph: `5bcc17416fd4d45985bc1529288127b9eeed4a30b47836e687dc5321182c0b11`.
- Unit test: `1aa4df021731d7ba4c4191d56f88c663b223443f78c9fdc1b88c2a43423239c7`.
- Chromium spec: `95d8380d6a17a5b85df695a3cb850dffa8705f574ae0b9c97422bb802899eb8e`.
- Full-Main WASM: `1bb4a947da4332471f3d7bab8f3f628c83d1703244093a554a188668ddafafd7`.
## Rollback
Remove the field materialization schema/parser, native Depsgraph cardinality and
receipt fields, M10-04 unit/Chromium checks, package script, and this status file
together. Revert the M10 count to 3/15; do not leave the native attribute JSON path
without its receipt and cardinality validation.

68
docs/status/M10-05.md Normal file
View File

@@ -0,0 +1,68 @@
# M10-05 Status
status: done
task: Simulation cache graph/source/revision identity binding
updated: 2026-08-16 America/New_York
## Scope
Simulation cache manifest schema 2 binds every cache to the Geometry Nodes graph ID/hash,
the committed source `.blend` hash and revision, input hash, Blender 5.2 build, and the
declared frame range. A deterministic `revisionHash` is calculated from those fields and
the storage key is `sim2-` plus the complete 64-character digest. The payload hash and
per-frame hashes remain separate integrity checks.
This task closes identity and stale-source safety. It does not implement Simulation Zone
evaluation, browser bake, cancel, LRU, corruption quarantine, or playback capability.
## Protocol
- Schema 1 manifests and undeclared manifest/frame fields are rejected.
- `sourceRevision` is a bounded committed revision; frame values are bounded to +/-1,000,000.
- `revisionHash` uses a JSON-array canonical encoding with an explicit v2 domain marker,
avoiding ambiguous delimiter collisions.
- Graph/source/input/revision/frame-range drift returns
`SIMULATION_CACHE_REVISION_MISMATCH`; payload or source bytes still use their dedicated
hash mismatch codes.
## Storage Contract
`putSimulationCache`, full read, frame read, and list run through the per-project transaction
lock. Put checks revision and source hash before hashing/storing the payload. Full/frame reads
re-verify the manifest identity and current project; listing validates all manifests and filters
valid but stale revisions out of the current project view. Old rows are not silently reused.
## Evidence
- `WEB_TEST_PORT=5455 npm --prefix web run test:simulation-cache-identity`: unit 3/3 and
Chromium 1/1 passed. Revision 7 cache recovered after Worker restart; after save to revision
8, the old key was rejected and omitted from the list, while a new key was accepted.
- Negative checks covered forged graph hash, forged source hash, stale read/put, changed input,
changed source revision, changed frame range, legacy schema, undeclared fields, and frame
payload drift.
- `WEB_TEST_PORT=5456 npm --prefix web run test:simulation-cache`: identity and existing
Worker-restart smoke 2/2 passed.
- `WEB_TEST_PORT=5457 npm --prefix web run test:simulation-cache-performance`: 600/600 frames,
OPFS backend, playback completed, 600 published frames, 0 pending requests after terminate,
5,072 ms total, below the 30,000 ms gate.
- Full unit suite 136/136; typecheck, lint, production build (73 modules), local dependency
check, and `git diff --check` passed. The first full static pass had one unused import lint
failure after the read-path refactor; removing it and rerunning produced the results above.
## Implementation Hashes
- Simulation protocol: `974b006f1ad4cd1d3d294122fc777c89c3a7da04fdaa7aebedea12b545bc65e5`.
- Storage Worker: `a7b31eeb601e9e71c74eaceda95704f1d120653e9ade6bfbee6d262a42edaa74`.
- Unit test: `591582a4ce77b699a4462e30d587eb89034f29ec0a22a94c81f8ab7306f2524f`.
- Identity Chromium spec: `2446060a9c3955ef466adb479966bf424fd9e9c351b65cd8525e90a1a1032e4d`.
- Existing smoke: `0c8c001290c8c6b3482eeebc105b2f217c55b2eded0c62b4fee4595ec277a11d`.
- Performance spec: `f6c465b7afa012030dd8516d676e2663f4dd8298aa156defb905b3fa0229a84b`.
- Package: `f9e28fb23af28720f56f97b249cb636599ebd92955ab2ff6d234b821e6d5ea44`.
- Error registry: `4c6045b1cab8348f0acf180a1e618a0d691ddc5092822ca288f974904e5e13a5`.
## Rollback
Remove schema 2 identity fields and hash helper, restore the prefix-truncated key, revert
Storage Worker project-lock checks and stale filtering, remove the identity unit/E2E/package
entries and this status file, then restore the M10 count to 4/15. Do not retain schema 2
manifests with schema 1 readers.

84
docs/status/M10-06.md Normal file
View File

@@ -0,0 +1,84 @@
# M10-06 Status
status: done
task: Simulation cache cancellation, playback gate, LRU, restart and corruption isolation
updated: 2026-08-16 America/New_York
## Scope
Simulation cache playback is now a lifecycle-gated operation. A cache may be read by
frame only after the current Storage Worker has completed a full manifest, payload and
per-frame hash verification. This closes cache lifecycle safety; it does not implement
Simulation Zone evaluation, browser bake generation, or GN modifier seek semantics.
## Protocol and Client
- `SIMULATION_CACHE_NOT_READY`, `SIMULATION_CACHE_CANCELLED` and
`SIMULATION_CACHE_BUDGET_EXCEEDED` are stable error codes.
- `verifySimulationCacheCancellable` checks cancellation between total and per-frame
SHA-256 work. `StorageClient` accepts `AbortSignal`, removes an aborted request from
`pending`, and sends a `cancelRequest` to the Worker so late responses cannot publish.
- `planSimulationCacheLRU` sorts removable entries by `lastAccessAt`, `createdAt`, and
`cacheKey`; active playback keys are protected. If protected entries alone exceed the
requested budget, the result reports `budgetSatisfied: false` instead of evicting them.
## Storage Contract
- IndexedDB schema 7 adds `simulation_quarantine`; the M10-06 Chromium test creates a
temporary schema 6 database and verifies the real v6 to v7 migration and store.
- `prepareSimulationCachePlayback` performs full verification in the current Worker and
activates the key. `readSimulationCacheFrame` rejects unprepared keys, while `release`
removes readiness and LRU protection. A successful full read also establishes verified
readiness for compatibility with existing callers.
- `pruneSimulationCaches` removes deterministic LRU manifests and deletes their
unreferenced simulation assets. Active playback is automatically protected.
- Invalid manifests and missing, truncated, or hash-mismatched payloads are moved from
`simulation_manifest` to `simulation_quarantine`. Quarantine preserves the bad row for
diagnostics while valid cache listing and playback continue.
## Evidence
- `WEB_TEST_PORT=5464 npm --prefix web run test:simulation-cache-lifecycle`: unit 5/5 and
real Chromium 1/1. It covers v6 to v7 migration, post-restart `NOT_READY`, full
verification, StorageClient cancellation, BrowserTransform playback cancellation with
zero published frames and zero pending requests, active-cache LRU protection, release,
cancelled write cleanup, OPFS byte tamper, and quarantine listing.
- `WEB_TEST_PORT=5460 npm --prefix web run test:simulation-cache-identity`: unit 5/5 and
Chromium 1/1. Existing graph/source/revision stale filtering remains green.
- `WEB_TEST_PORT=5461 npm --prefix web run test:simulation-cache`: identity and existing
Worker-restart smoke 2/2.
- `WEB_TEST_PORT=5462 npm --prefix web run test:simulation-cache-performance`: 600/600
frames, OPFS backend, 6,639 ms total, 0 pending requests after terminate, and restart
recovery passed the 30,000 ms gate.
- Targeted schema/snapshot smoke 2/2 and recent-project recovery 4/4 passed after the
schema version update. Full unit suite passed 138/138; typecheck, lint, production
build (73 modules), local-dependency check, and `git diff --check` passed.
The first lifecycle run was not accepted as evidence because the test helper returned the
numeric legacy `DOMException.code` value `20` instead of the `AbortError` name. The helper
was corrected and the complete command was rerun on port 5459, then rerun again on port
5464 after adding playback cancellation and migration assertions.
## Implementation Hashes
- Simulation protocol: `3025db84bd4e0151b8894a457c51da630d628afb1760e2f0caeec003f0efce3f`.
- Storage protocol: `2711dbab0c52a566679b83d5e4d793ec0ffd3f991e744dce765b6bdc54d25c13`.
- Error registry: `7ebff554dd6346b539215a6545c67806bca2ead33953700b79c0910fd0cfb408`.
- Storage Worker: `e31d7dcf93c5dcefb7e6c4cfd7874c748f972849ee7d93adb6294f82aafcf236`.
- Storage client: `aaa3a03e3b91452e90a661566407c261c7a16b1671ed55ec948de7626d49bfa4`.
- Storage migration: `8de1fcbbda9d7a4e7496995306c4e9fc83224211a516cf7241496b6a145953b5`.
- OPFS helper: `2e8ef9d72194bf803a7e823fb2b7de30b9f10ae6dd4b031b81b97ff82eee9cc6`.
- Unit test: `4ece0f5051667b04fab78c81a847def7a0c77d9267bd9e4fa2bbe4b9308125bf`.
- Lifecycle Chromium spec: `861d370f72896987cef65d2e4d78ab3edcc1d4828d4a0fa0b5301b72a4a2932a`.
- Identity regression: `aa305871e8651018342b123112beab10a43dab3313e2c9765e450dc91c08b6e1`.
- Performance regression: `d7083c24789fc5877a7841bf611aee0ff471cc191621de1b30720d637635b44c`.
- Smoke/recovery version updates: `2d15e5bf54a1dcdec1686ee937a510a7521ad44b152c895289a152ea711fadf4` /
`a4d6279f05b6215f2e34cd5f1d76ebb6d5ed2cc765859c2ae0af975623f93b2c`.
- Package: `fe90c0bd741a7840f6184726737a1a93c606841b8408dd7fd6dec823a8352cf6`.
## Rollback
Remove the schema 7 migration and `simulation_quarantine` store, restore frame reads to
the schema 6 identity-only contract, remove cancellation/LRU/playback commands and the
M10-06 tests/status entry, then restore the M10 count to 5/15. Do not retain schema 7
databases with a schema 6 reader.

59
docs/status/M10-07.md Normal file
View File

@@ -0,0 +1,59 @@
# M10-07 Status
status: done
task: Bounded WebGL2/Three physical compiler for the declared Shader node subset
updated: 2026-08-16 America/New_York
## Scope
The browser material path now compiles only the declared RGB, Value, Math,
Image Texture, Normal Map, Principled, and Material Output closure. The compiler
produces a schema-versioned `WEBGL2_THREE_PHYSICAL` report before a Shader Main
transaction is sent to Blender. Unknown nodes, cycles, duplicate inputs, missing
or blocked images, oversized graphs, and invalid constants fail closed without
mutating the source graph.
This task does not claim arbitrary Shader Node support, WebGPU compilation,
complete color management/sampler parity, compile-key invalidation, or pipeline
rollback; those remain later M10 tasks.
## Protocol and Runtime
- `web/protocol/shader-compiler.ts` defines the M10-07 allowlist, fixed node/link/
depth/texture/identifier budgets, deterministic graph fingerprint fallback,
scalar Math evaluation, and bounded `ShaderCompileReport`.
- The Engine Worker compiles `setShaderGraph` before the native Main transaction,
rejects a blocked report, and returns the report with the committed delta.
- Main-thread and Offscreen viewport material creation share `createPBRMaterial`;
compiled constants and declared base-color/normal texture bindings are stored in
material `userData` for the texture adapter.
## Evidence
- `WEB_TEST_PORT=5521 npm --prefix web run test:shader-compile`: unit 5/5 and
Chromium 3/3 passed. The suite covers the real Main graph transaction, Math
result and topological order, Image/Normal bindings through the shared viewport
path, missing resources, cycles, duplicate inputs, oversized graphs, forged
fingerprints, and source graph immutability on blocked input.
- `tests/golden/M10-07/shader-compile.json` fixes the fixture digest, backend,
allowlist, six Math operations, and compiler budgets.
- The first attempt on the default port was rejected before browser startup because
an existing process owned `127.0.0.1:5173`; it is not counted as a feature failure.
## Implementation Hashes
- Compiler: `50b29c99d73c886a41bb8e10ccd2309068a1c09b23196655659b2f530d31f856`.
- Engine Worker: `376efe09de20150fc32803745da7e7e55bb41d178302e45b1fd90a2fe7778b2e`.
- PBR adapter: `f9c2e5ede635d11673f971c985288821af24ed81ecaadc95efefd958637672fd`.
- Texture adapter: `d5e379e25e0ab8294523690c4d4c79203b6f1610b4d6a608b33a7118f51efa57`.
- Unit test: `1e5d44b4f73f4ee4e4c9329f73628980df9337632dc48a3d50689f051a89b6e7`.
- Chromium spec: `c59b9f349bd6ce329ffc89f64eba3fec3e1e02a528978bdc1c3793d921faabc3`.
- Golden: `6bb8c07f014a0f2c1fd0e9ec16b08b99a524d8d3161bc556767acaf510c6c961`.
- Package: `ea0fef34497d51448d5478f4a761bef3c4ca816c408fd8a0807eaa0b093d0df8`.
## Rollback
Remove the compiler, Worker gate, shared material/texture adapter integration,
M10-07 tests, golden and this status file together. Restore the M10 count to
6/15 and leave Shader Main's existing capability gate and writeback contract in
place; do not retain a compiler report that is not enforced before Main mutation.

59
docs/status/M10-08.md Normal file
View File

@@ -0,0 +1,59 @@
# M10-08 Status
status: done
task: Shader compile key binding for graph, textures, color space and backend
updated: 2026-08-16 America/New_York
## Scope
Every bounded Shader compile report now carries a deterministic 64-character
`compileKey`. The key is SHA-256 over the task-local report schema, graph hash,
renderer backend, and sorted texture identities: image ID, usage, asset ID,
asset SHA-256, and resolved SRGB/LINEAR/NON_COLOR color space.
Texture identities are optional for legacy SceneIR rows; missing metadata is
represented explicitly as `null`, while usage-based color-space defaults remain
deterministic. An unknown renderer backend or malformed texture digest blocks
compilation. The global `web/protocol/schema-version` remains 1 because this is
an additive field in the task-local Shader report, whose schema is still 1.
## Runtime
- `ImageIR.colorSpace` is optional and validated; render asset requests use it
when present and otherwise retain the existing usage-derived color space.
- The Engine Worker passes snapshot image asset/hash/color-space identity into the
compiler. The PBR adapter accepts the same context for main-thread and Offscreen
material creation.
## Evidence
- `WEB_TEST_PORT=5523 npm --prefix web run test:shader-compile-key`: unit 7/7 and
Chromium 1/1 passed. The browser test proves key changes for texture SHA-256 and
color-space changes through the application PBR entry point.
- `WEB_TEST_PORT=5524 npm --prefix web run test:shader-compile`: M10-07 regression
unit 7/7 and Chromium 3/3 passed.
- `npm --prefix web run typecheck`, `npm --prefix web run lint`,
`npm --prefix web run build`, `npm --prefix web run test:status-consistency`,
and `git diff --check` passed.
The first browser attempt on port 5522 used a repository-root dynamic import that
Vite does not expose and was rejected before exercising the compiler. The test was
moved through the application PBR entry point and rerun in full on port 5523.
## Implementation Hashes
- Compiler: `acd5f8deb2912f6823533df12baba8049c5e64d440c17a6dc3f90741f71774b2`.
- SceneIR: `a65ef3b4be5303b1b86b3ee6829c795870dcc2490ba58d3a66b8bed8172d6442`.
- Render assets: `840c09a6c2ec56cc75a9ca72bcbdde6957612a7c61b19ab83be47c571eca8b67`.
- Engine Worker: `668728f7e5b6edf9e1cee3e6152238d16ac19f43f030e94e77bfe24e7ff50489`.
- PBR adapter: `8a9cb52c8e7b1481096017cc659d93541c21724c1203d22755e37e1e3c365250`.
- Unit test: `9ae9bb4c778d9e31a607d0c7d678ecf3448ed4e5b57c88ab4ba767a2f0850cc7`.
- Chromium spec: `a09ebfa451e76c33f421bc8402fac4c77faedee88020431a505602f317b4eb65`.
- Golden: `187666d9dfb9d9cdd5bd6195cc2f7ee57bb78fa0d05d6020762c06a4ab015984`.
## Rollback
Remove `compileKey`, texture identity context, ImageIR color-space metadata,
M10-08 tests/golden and the Worker/adapter wiring together. Restore the M10
count to 7/15 and retain graphHash-only reports with the original usage-derived
render asset color-space behavior.

40
docs/status/M10-09.md Normal file
View File

@@ -0,0 +1,40 @@
# M10-09 Status
status: done
task: Preserve the previous usable material pipeline on compile failure
updated: 2026-08-16 America/New_York
## Scope
`PBRMaterialPipeline` makes material replacement transactional. A successfully
compiled candidate becomes current only after compilation; the previous material
is disposed exactly once after replacement. A blocked candidate is disposed and
the current material remains usable, with the failed report stored as
`shaderCompileFailure` for diagnostics. This does not claim arbitrary Shader Node
support or a WebGPU pipeline.
The Engine Worker independently rejects blocked `setShaderGraph` requests before
the Blender Main transaction, so a failed graph cannot publish a new SceneIR
snapshot in addition to the viewport-side rollback.
## Evidence
- `WEB_TEST_PORT=5525 npm --prefix web run test:shader-pipeline`: Chromium 1/1.
The test confirms the failed candidate reports `SHADER_NODE_UNSUPPORTED`, keeps
object identity and the previous compiled report, and that a later successful
compile replaces the material.
- `npm --prefix web run typecheck` and `npm --prefix web run lint` passed after the
pipeline helper was added.
- `tests/golden/M10-09/shader-pipeline.json` fixes the rollback invariants.
## Implementation Hashes
- PBR adapter: `8a9cb52c8e7b1481096017cc659d93541c21724c1203d22755e37e1e3c365250`.
- Chromium spec: `e6771f672e885250db199cbf97a0a3866084ab9bb3f2ad25d17f5c53edaa99af`.
- Golden: `5dbb916e512935a76dacde37242b123707897f54ab10d7b99e246f57afbc94ac`.
## Rollback
Remove `PBRMaterialPipeline`, its Chromium test/golden and this status file. Keep
the M10-08 compile key and Engine Worker pre-transaction gate, and restore the M10
count to 8/15.

39
docs/status/M10-10.md Normal file
View File

@@ -0,0 +1,39 @@
# M10-10 Status
status: done
task: Stable capability block for unsupported Shader nodes
updated: 2026-08-16 America/New_York
## Scope
The Shader capability query now accepts arbitrary node type strings and returns a
stable `PBR-012/ARBITRARY_SHADER` block for every type outside the declared bounded
compiler set. Unsupported node names are de-duplicated and sorted, so the same
graph receives the same error regardless of input order. The block uses
`SHADER_NODE_UNSUPPORTED`, remains recoverable, and does not silently report READY.
The existing ShaderGraph validator and Engine Worker gate continue to preserve the
source graph and reject blocked `setShaderGraph` commands before any Main mutation.
This task does not expand the compiler allowlist.
## Evidence
- `WEB_TEST_PORT=5526 npm --prefix web run test:shader-capability`: Chromium 1/1.
`VORONOI` and `CUSTOM_OSL` both return the expected stable block; reversed input
order produces the identical task/capability/status/code/message result.
- `npm --prefix web run typecheck` and `npm --prefix web run lint` passed.
- `tests/golden/M10-10/shader-capability-block.json` fixes the status, error code,
recoverability and graph-preservation policy.
## Implementation Hashes
- Render capability gate: `322929e9c7b627a9e79b8a6f11d5e9b0c7c05a5754f82d41c45c1134bbaaf385`.
- Chromium spec: `6337801f10b9115ba7b53a43152ae69a324b5baa61c8e455cc61505437228cbf`.
- Golden: `b7182bb57e10d0b302b4c7dc9bc43160721a2c9414b056c86173c3b5c2501739`.
- Package: `d6d4dcaf4f5c852f884ba2064da96a8c30519c661bf4a16c59e115742aa37e8a`.
## Rollback
Restore the enum-only `ARBITRARY_SHADER` request, remove deterministic sorting,
the M10-10 Chromium test/golden and this status file, and restore the M10 count to
9/15. Keep the existing M10-07 compiler fail-closed behavior.

44
docs/status/M10-11.md Normal file
View File

@@ -0,0 +1,44 @@
# M10-11 Status
status: done
task: NLA track/strip/action/time mapping read-only exact evaluation
updated: 2026-08-16 America/New_York
## Scope
A Blender 5.2 desktop-authored fixture contains one object, one NLA Track and two
Action Clip strips. The first maps Action frames 1..11 to scene frames 20..40 with
scale 2. The second maps the same Action range to frames 45..65 with reverse playback
and repeat 2. Both use `NOTHING` extrapolation so samples outside their ranges expose
boundary behavior rather than hold behavior.
The Main reader must preserve Track, Strip, Action and time-mapping fields. Blender's
native Depsgraph evaluates 12 boundary/interior/cycle frames; Node WASM and the
production Chromium Worker compare every world matrix with the desktop golden. The
test asserts that evaluation does not change NLA or Action JSON. It does not call
`setNLAStack` and does not claim the M10-12 operator transaction.
## Evidence
- Fixture: `tests/files/web/nla_time_mapping_scene.blend`, SHA-256
`b32f783debe213a1345ec4528e5ed27f0f4de00d7896b626df39756289119855`.
- Golden: `tests/golden/M10-11/nla-evaluation.json`; Blender 5.2.0 LTS, 1 Track,
2 Clip strips and 12 frames.
- `WEB_TEST_PORT=5527 npm --prefix web run test:nla-evaluation-golden`: Node/WASM
checker and Chromium 1/1 passed; maximum matrix error 0 and read-only identity passed.
- `npm --prefix web run typecheck`, `npm --prefix web run lint`, and
`npm --prefix web run check:local-deps`: passed.
## Implementation Hashes
- Fixture generator: `a941ecb850ddd165ede117f6411615c6daed4d6bdaffaeac8228a308b7fbe745`.
- Golden generator: `941a63cc9edbaa0d8dd25025872e3fc44bf64df54d5a9232ad4128e6ac0cd5c5`.
- Node/WASM checker: `2ce9db0fcbceaf30e398e8feb5c002a60395ac34e61382d9414e980e51e6fdd5`.
- Golden: `2d148ac0cbc2ac9281d430da20dba8373ad1bb0de6ec5fa578adf36296455fbe`.
- Chromium spec: `c12f105d206a03dae5b73b076cc3b0a758d597cea7532b6720f4653568df0245`.
## Rollback
Remove the fixture/golden generators, fixture, M10-11 golden/checker/Chromium spec,
package command and this status file together. Restore the M10 count to 10/15. Keep
the existing N-014 bounded Main writer and reverse/repeat regression unchanged.

45
docs/status/M10-12.md Normal file
View File

@@ -0,0 +1,45 @@
# M10-12 Status
status: done
task: One NLA edit operator with Main transaction, undo/redo and save/reopen
updated: 2026-08-16 America/New_York
## Scope
The bounded `moveNLAStrip` command moves one existing Action Clip while preserving
its duration and time mapping. It requires the current `baseRevision`; stale commands
return `REVISION_CONFLICT` before Main mutation. The Worker derives a candidate stack
through the pure protocol helper, validates Action/path/range/overlap gates, and commits
it through one authoritative Main `setNLAStack` transaction. The native history entry
therefore covers the exact pre-edit `.blend` bytes.
This task intentionally opens only the move operator. Create/remove/resize/active,
multi-track blending, Transition/Meta/Sound, NLA UI and export remain blocked or planned.
## Evidence
- Pure contract: `web/protocol/nla.ts` and `web/tests/unit/nla.test.mjs`, 2/2 tests.
The source stack is not mutated; overlap, unknown identity and frame budget errors
are deterministic.
- `WEB_TEST_PORT=5528 npm --prefix web run test:nla-operator`: unit 2/2 and Chromium
1/1 passed. The browser path proves stale revision rejection, Main move 20..40 ->
5..25, monotonic revision/delta, undo to 20..40, redo to 5..25, save/reopen at
5..25, and native frame-10 evaluation at X=2.5.
- `npm --prefix web run typecheck`, `npm --prefix web run lint`, and `git diff --check`:
passed.
## Rollback
Remove `moveNLAStrip` from `web/protocol/nla.ts` and `web/protocol/web-engine.ts`,
remove the Worker conversion, unit/E2E tests and package command, and delete this
status file. Restore the M10 count to 11/15. Keep M10-11 read-only evaluation and
the pre-existing whole-stack `setNLAStack` authoring path.
## Implementation Hashes
- `web/protocol/nla.ts`: `03d5abce5cb2f0a3a38e42eedbced7f4de6e2052d18e53a3dcde3b3ca1e6020d`
- `web/protocol/web-engine.ts`: `48f2290ead27aeda1f17b279f01ae278776b50b4cb4de065d94b0e1d44717dbb`
- `web/app/src/workers/web-engine.worker.ts`: `4ccad87c1619db8e39d2855ebca9918883484ce3e5dfc8a325ccee9a8220397c`
- `web/tests/unit/nla.test.mjs`: `d8bac2dd3e4ec1a1342de7c7401a51beb9879ea5ba2b34df7d615ae0449081a7`
- `web/tests/e2e/nla-operator.spec.ts`: `1658d52eb0b8cf329f73be552e9b2649ed6dc96b21edb48ade9dd4a725a37ae0`
- `web/package.json`: `e9d5c6e4f7132921faac8ecbee40215098497fe374d56309f2c76fab152c33d6`

48
docs/status/M10-13.md Normal file
View File

@@ -0,0 +1,48 @@
# M10-13 Status
status: done
task: Probe local Physics solvers per family and keep unsupported families bake-only
updated: 2026-08-16 America/New_York
## Scope
The Physics protocol now probes all seven declared families independently. A local
solver becomes `READY` only after its runtime export exists, initialization succeeds,
its thread requirement is met and its required memory fits the active WASM limit.
Missing exports, initialization errors, insufficient threads or memory, and malformed
probe results remain `BLOCKED` and route to `DESKTOP_SERVER_BAKE`.
The production inventory has no installed solver runtime adapter, so Rigid Body,
Soft Body, Cloth, Fluid, Dynamic Paint, Particle and Hair all remain bake-only.
The synthetic positive probe verifies the gate and does not declare an actual solver.
Desktop family decoding, cache playback, browser bake and server job submission remain
blocked for later tasks.
## Evidence
- `node --test web/tests/unit/physics-solver-probe.test.mjs`: 3/3. It covers the
default seven-family fallback, family isolation across all four gates, and invalid
environment/result fail-closed behavior.
- `WEB_TEST_PORT=5530 npm --prefix web run test:physics-solver-probe`: unit 3/3 and
Chromium Worker 1/1. The browser result matches the M10-13 golden and keeps every
failed family on `DESKTOP_SERVER_BAKE`.
- `WEB_TEST_PORT=5531 npm --prefix web run test:e2e -- --grep "N-018 physics"` and
`npm --prefix web run test:physics-main-reader`: passed without changing existing
metadata/cache gates or claiming a solver.
- `npm --prefix web run typecheck`, `npm --prefix web run lint`, production build
(74 modules), and `git diff --check`: passed.
## Implementation Hashes
- `web/protocol/physics-simulation.ts`: `adc57a12c7f57c6b1d5f99590d3c36cefa83636aca86c780c2520f3f41148981`
- `web/tests/unit/physics-solver-probe.test.mjs`: `e499d55770d2024c75803ce1acc1c234814c027279f2b40f42195fd480977653`
- `web/app/src/workers/physics-solver-probe-test.worker.ts`: `fbad383de186a659440da42dcad988310ca2e483db27e30d74342c8f57a0f49a`
- `web/tests/e2e/physics-solver-probe.spec.ts`: `1419b98d68da9b0ab0bf41b37843442741593655e2693159d84e069f1dec3f09`
- `tests/golden/M10-13/physics-solver-probe.json`: `bcc8f9094e2b0d8f41ef01fda0daa2a29693d188e602447d6d06358aaa751df4`
- `web/package.json`: `875162709315e2a8116c5d28023576a4b95fb076b79453de8b21acdbff2df9dc`
## Rollback
Remove the solver probe types/functions, unit/Worker/E2E/golden/package command and
this status file, then restore the M10 count to 12/15. Keep the existing N-018
metadata, Main reader, Simulation cache and BTF1 playback primitive unchanged.

47
docs/status/M10-14.md Normal file
View File

@@ -0,0 +1,47 @@
# M10-14 Status
status: done
task: Validate source hash, frame range, byte budget and version for every Physics cache family
updated: 2026-08-16 America/New_York
## Scope
Every Physics family cache now uses cache schema 1 and binds its family, desktop or
server bake origin, Blender 5.2 version, source blend/settings/input/cache SHA-256,
frame range, total byte length and per-frame byte offset/length/SHA-256. `COMPLETE`
caches require every frame; `PARTIAL` caches may omit frames but remain strictly
ordered and byte-contiguous. Per-frame and total cache budgets match the existing
bounded Simulation cache policy.
`verifyPhysicsCachePayload` hashes the actual current blend, full cache payload and
every frame before consumption. Family/source/version/range/budget drift fails closed.
This task validates cache identity and bytes; it does not implement a Blender family
decoder or change the existing cache playback capability block.
## Evidence
- `node --test web/tests/unit/physics-cache-family.test.mjs`: 3/3. All seven families
and both desktop/server sources pass; source/payload drift and family/schema/version/
range/budget/undeclared-field failures return stable codes.
- `WEB_TEST_PORT=5533 npm --prefix web run test:physics-cache-family`: unit 3/3 and
Chromium Worker 1/1, matching the M10-14 golden.
- M10-13 probe Chromium 1/1, Physics Main reader, M10-05 Simulation cache identity
unit 5/5 + Chromium 1/1, typecheck, lint, production build (74 modules), and
`git diff --check`: passed.
## Implementation Hashes
- `web/protocol/error.ts`: `6972a144bdc61c2a4270c88df2d86c75640bb5f24b5ac3b7f9a02d69d3c500fd`
- `web/protocol/physics-simulation.ts`: `b02b820503d79cd26b0323a4d2033e79d0eeb3032befd26fafe5eab55634584c`
- `web/app/src/workers/physics-simulation-test.worker.ts`: `453c6e9e683b9da0ef7ce4bd0e4e430b97102d80ddb9b14cc9d075319b37d818`
- `web/tests/unit/physics-cache-family.test.mjs`: `e1c6f07ec58ce4c4c987bd8a36f270497ae3a0f521d6ed27d7f199debeeaccb2`
- `web/app/src/workers/physics-cache-family-test.worker.ts`: `8af676506cc0ff1501816431d92d82ca15316b40095d617ecb664b9608e209e0`
- `web/tests/e2e/physics-cache-family.spec.ts`: `6a2788587f6692bf5bf19d76400810fa277a6985d1a6ecc1b8d1adb85c609249`
- `tests/golden/M10-14/physics-cache-family.json`: `b220d1fd73f307213078ce3cbd6212544f97ade84a45d54847f107cef69d302d`
- `web/package.json`: `9baeb319d8c740f67f3e7615942c78f920e7a56b0d654a5a8f47d68de7243eb4`
## Rollback
Restore the former Physics cache binding, remove the two new cache hash error codes,
unit/Worker/E2E/golden/package command and this status file, then restore M10 to
13/15. Keep M10-13 solver probing and the existing GN Simulation cache schema 2.

51
docs/status/M10-15.md Normal file
View File

@@ -0,0 +1,51 @@
# M10-15 Status
status: done
task: Browser performance, OOM-prevention and malicious-input gates for GN, Shader, NLA and Simulation
updated: 2026-08-16 America/New_York
## Scope
GN, Shader, NLA and Simulation now run in four isolated Chromium Worker sessions.
Each session executes a representative bounded workload, rejects an over-budget input
before evaluator/payload allocation, rejects a domain-specific malicious graph or
manifest, and then proves that a small valid input still succeeds in the same Worker.
NLA gains explicit track/strip/string budgets and exact declared-field checks.
Simulation cache total/frame/range overages now return the dedicated
`SIMULATION_CACHE_BUDGET_EXCEEDED` code. This is a deterministic OOM-prevention gate;
it does not claim that arbitrary browser heap exhaustion is recoverable inside a
domain evaluator.
## Evidence
- `WEB_TEST_PORT=5536 npm --prefix web run test:m10-domain-gates`: Node 23/23 and
Chromium 1/1. Measured Worker times were GN 54 ms (10 x 512 nodes), Shader 17 ms
(100 compiles), NLA 62 ms (20 x 256 strips), and Simulation 2 ms (64 frame hashes),
all below their 5/5/5/10 second gates.
- Stable OOM/malicious codes: GN `GN_GRAPH_BUDGET_EXCEEDED`/
`GN_DEPENDENCY_CYCLE`; Shader `SHADER_NODE_UNSUPPORTED`/`SHADER_GRAPH_CYCLE`;
NLA `NLA_BUDGET_EXCEEDED`/`NLA_INVALID_STACK`; Simulation
`SIMULATION_CACHE_BUDGET_EXCEEDED`/`SIMULATION_CACHE_INVALID`.
- Existing GN field budget (unit 6/6 + Chromium 1/1), Shader compiler (7/7 + 3/3),
NLA operator (4/4 + 1/1), and Simulation lifecycle (6/6 + 1/1) all passed.
- Typecheck, lint, production build (74 modules), status consistency and
`git diff --check`: passed.
## Implementation Hashes
- `web/protocol/error.ts`: `88119782307cb9a61e131f2d5e2e25127256c1e68a333fc7fc3206158b8a1019`
- `web/protocol/nla.ts`: `96ae7cf9ca3fadbaf98ca15a38937329f203b0bc4a9c39ef685987e7f55353dd`
- `web/protocol/simulation-cache.ts`: `a1302e42129420a96416e363cbc857d082d4646655685520c9e81f877ce3d9b8`
- `web/tests/unit/nla.test.mjs`: `e11aa1f395970613cee5d37a9eb21c3fac3422f0080c75c78eb8777effb77adc`
- `web/tests/unit/simulation-cache.test.mjs`: `2be82cdda991b47fbf8955cfbf2f92cb1fdc7b7c0debb0c8102d4f35e8fce8e3`
- `web/app/src/workers/m10-domain-gate-test.worker.ts`: `bc508e1c81ca6efefd67b5c572f93c27dd71bd602319ae887c50e27f8a309a31`
- `web/tests/e2e/m10-domain-browser-gates.spec.ts`: `2973a596df8613a9cfdb0bd4d300d95b71a8e818e615278a39fb777db6c5cf03`
- `tests/golden/M10-15/domain-browser-gates.json`: `580051434ec6673251bac755cc189939de1f887aad088497e16a7657f3a83963`
- `web/package.json`: `092931cebf9cb14814951703af26e2d0e4c5e0295c1ba4cb748bfe4ee49448c2`
## Rollback
Remove the NLA stack budgets/exact-field checks, restore the former Simulation cache
budget error mapping, remove the domain Worker/E2E/golden/package command and this
status file, then restore M10 to 14/15. Keep all M10-01 through M10-14 behavior.

42
docs/status/M11-01.md Normal file
View File

@@ -0,0 +1,42 @@
# M11-01 Status
status: done
task: Camera, Light, World and Scene color-management field parity table
updated: 2026-08-16 America/New_York
## Scope
`tests/golden/M11-01/lighting-field-parity.json` is the machine-readable field table
for all CameraIR, LightIR and WorldIR leaves plus Scene render engine and color
management. Each field independently records reader, writer, main viewport and
Offscreen viewport status as VERIFIED, PARTIAL, METADATA_ONLY, BLOCKED or
NOT_APPLICABLE, with an aggregate parity status.
The table contains 60 fields: 24 COMPLETE, 17 PARTIAL and 19 BLOCKED. It explicitly
keeps true Orthographic/Panoramic/Custom projection, camera DOF rendering, light
radius/area spread/sun angle, World environment rotation and visual Mist, display/
view/look/gamma/white-balance rendering and Scene writer behavior outside COMPLETE.
## Evidence
- `npm --prefix web run test:lighting-field-parity`: AST table checker and the real
Main lighting roundtrip passed. The checker proves exact type coverage, unique fields,
valid states, existing evidence paths and required blocked claims.
- The Main roundtrip covers Camera/DOF, Light exposure/temperature/shadow, World/Mist,
validation rejection, undo/redo, save/reopen and the white-balance integrity gate.
- `WEB_TEST_PORT=5541 npm --prefix web run test:e2e -- --grep "N-019"`: Chromium 2/2,
covering Scene-over-World exposure, shadow metadata and renderer-bound World/Scene
delta preservation.
- Typecheck, lint, production build (74 modules), status consistency and
`git diff --check`: passed.
## Implementation Hashes
- Parity table: `b7fee80b4f2469cf119902c939f9091e640a6f0e1307e97ba29f0afa8942c4ed`
- AST checker: `cf910a087f9af72e0782d62e67341f90fd4af1c6c8eddf54169ee6275e24bd9c`
- Package: `cd7174b04b19e61a280e03e6c61e2ffd20fd507c0716c820b8faa31ea2438ebf`
## Rollback
Remove the M11-01 table/checker/package command and this status file, restore M11 to
0/14, and keep the existing N-019 reader/writer/viewport implementation unchanged.

48
docs/status/M11-02.md Normal file
View File

@@ -0,0 +1,48 @@
# M11-02 Status
status: done
task: Supported Camera, Light and World fields through Main, history, persistence and viewport mapping
updated: 2026-08-16 America/New_York
## Scope
The bounded `setCameraProperties`, `setLightProperties` and `setWorldProperties`
commands now have one task-level acceptance path through Blender Main, monotonically
revisioned undo/redo, in-memory `.blend` save, a fresh Worker reopen and the shared
main-thread/Offscreen PBR mapping functions.
The golden covers Camera lens, both sensor dimensions and fit modes, shift, clip,
ortho scale and DOF fields; Light color, energy/exposure, temperature, shadow, spot
and area fields; and World color/exposure/Mist fields. Viewport assertions cover both
horizontal and vertical sensor fit, clip and film offset, temperature-adjusted linear
RGB, intensity, shadow, spot angle/blend, area dimensions and World background color.
Fields kept PARTIAL or BLOCKED by M11-01 remain outside visual parity claims.
## Evidence
- `WEB_TEST_PORT=5545 npm --prefix web run test:lighting-field-roundtrip`: native
Main roundtrip passed and Chromium 1/1 passed.
- Camera, Light and World edits each advanced revision; task-level Chromium coverage
undid and redid every domain, saved, opened the bytes in a fresh Worker and compared
the reopened values with float32-aware `1e-5` tolerance.
- The native rejection path kept an invalid `near >= far` edit out of Main. Existing
white-balance integrity protection remained blocked after Blender serialization
rather than publishing invalid Scene color-management values.
- `npm --prefix web test`: 156/156 passed. Typecheck, lint, production build
(74 modules) and `git diff --check` passed.
## Implementation Hashes
- Golden: `ac6d84c0099b12cf6c96df2dbbb4281e3308c36f0bda49c92d7548e58ccc286e`
- Chromium spec: `9f75c7b88c70ab42c6c418b0056dcffcab3b8851003258891902db9615fcfe67`
- Native roundtrip checker: `023e3e43bc37fb38c3063d33c20e59043308013874fce20bc3a49d508b850e6c`
- Web command protocol: `48f2290ead27aeda1f17b279f01ae278776b50b4cb4de065d94b0e1d44717dbb`
- Blender Main writer: `510b4017c540fc4d1ac135c1ce7251cc5d7143f31d8604e1d545de36716da9a2`
- Shared PBR adapter: `78352e46c62d0c8d9bf25408ea1d725a843a42068ea3eb304bb3d78f8d612e0b`
- Package: `8074d80265a1378fb3f284206c343ff1e388a5ea43e57946a1d4092076d72ea8`
## Rollback
Remove the M11-02 golden/spec/package command and this status file, restore M11 to
1/14, and keep the underlying N-019 bounded writers and viewport mappings at their
previous independently tested status.

55
docs/status/M11-03.md Normal file
View File

@@ -0,0 +1,55 @@
# M11-03 Status
status: done
task: Explicit Three WebGL2 and WebGPU light, shadow-map and texture budgets
updated: 2026-08-16 America/New_York
## Scope
Schema 1 `PBRRenderBudget` freezes separate `THREE_WEBGL2` and `THREE_WEBGPU`
product ceilings. WebGL2 reserves two built-in lights and one built-in shadow map
inside totals of 16 lights and four 1024-square shadow maps. The WebGPU contract uses
64 lights and eight 2048-square maps. Runtime device limits may only lower these
ceilings.
The shared planner deterministically retains light nodes in SceneIR order, retains a
bounded shadow-capable prefix and reports every dropped identity with stable
`GPU_LIGHT_BUDGET_EXCEEDED`/`GPU_SHADOW_BUDGET_EXCEEDED` issues. Main-thread and
Offscreen production viewports publish the same report on the canvas.
Texture planning covers asset count, maximum dimension, aggregate compressed payload
and decoded RGBA GPU bytes before hash/decode/allocation. An over-budget batch leaves
the previous texture set alive. This task defines the WebGPU budget contract but does
not claim that the still-unbundled Three WebGPU renderer is available.
## Evidence
- `WEB_TEST_PORT=5548 npm --prefix web run test:render-resource-budget`: unit 3/3 and
Chromium 3/3. Both production viewports requested 20 lights, rendered 14, dropped
six, rendered three of 14 requested scene shadow maps and blocked 11; with reserved
resources, the main Three scene contained exactly 16 lights and four shadow maps.
- A 257-asset batch was rejected before decode in both viewports. A separate browser
case first decoded a valid PNG, rejected a 257-asset follow-up (258 including the
retained asset), and proved the original texture object/hash remained installed.
- M11-02 field roundtrip remained 1/1. Real 4K (64 MiB decoded) and 8K (256 MiB
decoded) texture performance cases passed; packed raster main/Offscreen passed 2/2.
- Full unit was 159/159. Typecheck, lint, production build (75 modules), local runtime
dependency checks and `git diff --check` passed.
## Implementation Hashes
- Budget protocol: `d7784690358e38b71c6ad3ccc5baf82869d897714d5257f219bbd00dc7e7b0f7`
- PBR adapter: `934874434afa6778eaf783c78650ad221a428352741f3ff7173cb3c17a0c3c14`
- Texture store: `0f18f3bcf04c5c99175d4cac8bbf1bc028fc54d635701fb6a92791e06c335fb6`
- Main viewport: `dcb502ca892fd5431cbf1a13823aec5d83a2aa0a1b40487cb66fa630c6e461b3`
- Offscreen Worker: `c95bce10f0bd73591f002c21415bfbc6f709ecbe61e97a3b5b05bcec2b0e0bef`
- Unit: `4bde90788bbf9a94317d83bd398acd321bbcf4e53e26bf40165a889bacff03a2`
- Chromium spec: `90834dfff09e61a2d32732d3a8f0db4b9c71414ac4991412d93d322119ef2de7`
- Golden: `c312bf5ed8415ad51e5cccb3a2653f65cd9fee46488be2f860e6a5a8d5a7901d`
- Package: `c718983c3f3a552f4c68d9390376777e45a3f23e6999afd5cb4ddc786a12a278`
## Rollback
Remove the render-budget protocol, planner integration, canvas reports, unit/E2E/
golden/package command and this status file; restore the former fixed 1024 shadow
configuration and per-asset-only texture checks, then restore M11 to 2/14.

56
docs/status/M11-04.md Normal file
View File

@@ -0,0 +1,56 @@
# M11-04 Status
status: done
task: Explainable image-error metrics between the Web realtime viewport and a Blender 5.2 reference
updated: 2026-08-17 America/New_York
## Scope
Schema 1 `RenderImageComparisonIR` compares equal-size display-referred `SRGB8`/
`STRAIGHT` RGBA frames. The report records mean absolute error, root mean squared
error, P95 channel error, maximum channel error, bad-pixel ratio, reference-background
foreground intersection-over-union and alpha coverage delta. Each release check keeps
its measured value, threshold, direction and pass state; a mismatch returns the stable
`RENDER_REFERENCE_MISMATCH` code. Dimensions, byte lengths, threshold ranges and a
4,194,304-pixel bound are validated before comparison.
The reference is generated by Blender 5.2 Eevee from
`tests/files/web/m11_render_reference.blend` with a fixed camera, black rough material,
World color, one-sample TAA and zero dither. The source fixture, generator and PNG are
SHA-256 bound in `tests/golden/M11-04/manifest.json`. Re-render verification compares
decoded Blender pixels exactly because PNG container bytes may differ while pixels do
not.
## Evidence
- `WEB_TEST_PORT=5552 npm --prefix web run test:render-reference`: unit 3/3,
Blender reference re-render verification passed, Chromium 3/3. Main-thread and
Offscreen reports were identical: MAE `2.0433349609375`, RMS `5.448994264342599`,
P95 `4`, maximum channel error `110`, bad-pixel ratio `0.0047760009765625`,
foreground IoU `0.9853400565736072`, alpha coverage delta `0`.
- Thresholds are MAE `4`, RMS `12`, P95 `12`, bad-pixel ratio `0.02`, foreground
IoU `0.97` and alpha coverage delta `0`. A non-empty red block with the wrong
composition is rejected as `RENDER_REFERENCE_MISMATCH`.
- `npm --prefix web run typecheck`, `npm --prefix web run lint`, production build
(75 modules), `npm --prefix web run test:status-consistency` and `git diff --check`
passed.
## Implementation Hashes
- `web/protocol/render-image-comparison.ts`: `4345cc0d02b4482201de34292cbf5198009bf615e69c80cc00bc3e76116efec2`
- `web/app/src/three-adapter/render-image-comparison.ts`: `ad97fd594d0d964e05d4da2bffc84a64ef737fef700045c252b5222250f1ffc7`
- `web/protocol/error.ts`: `e8ea483466b16debaf803ff1640ade07a858a802781e3040d3547028ecb5d19f`
- `tools/web/generate-m11-render-reference.py`: `118c98c77d98922e72660898bfb65842e11743fc77f4124c9f5088a76cb6a94a`
- `tools/web/check-render-reference.mjs`: `ead3500f054e98c2db4cd6596c983586a622e929bc8a587e9fbd38d94a7df7d1`
- `web/tests/unit/render-image-comparison.test.mjs`: `f9800745760b85700e80abc5e389f44d7f7ea3b9e41e1002f4e5449bcb620f67`
- `web/tests/e2e/render-reference.spec.ts`: `349c7da0dfd60baec80139cced52079312bd5e892a42f000ba0b4f55c6a4a61d`
- `tests/files/web/m11_render_reference.blend`: `d2bea55fe4de0b00e73a9241b4d1b0c802c2eb0e6159c0cd48e007b97b9d3963`
- `tests/golden/M11-04/blender-eevee-reference.png`: `f5c22636a232bcbb0ed0f772418cb12fced18ff72f4999804197e42caa61480a`
- `tests/golden/M11-04/manifest.json`: `e9551f86f0b9704d7be35c03f07321bec5d2481ffee4208ae766156d9c9a0135`
- `web/package.json`: `38ba6a722a2e0bc2c91d6edbd2b7df5e3609342e3b7ef2ec9646b9c6ce0d25a6`
## Rollback
Remove the M11-04 protocol, reference fixture/golden, generator/checker, unit/E2E
specs and package command; restore M11 to 3/14 and remove the bounded reference slice
from N-019. Keep M11-01 through M11-03 resource and lighting behavior unchanged.

47
docs/status/M11-05.md Normal file
View File

@@ -0,0 +1,47 @@
# M11-05 Status
status: done
task: Server-only routing for Cycles, complex Eevee and hardware render backends
updated: 2026-08-17 America/New_York
## Scope
Schema 1 `RenderRoutingRequestIR` separates execution target from endpoint
availability. Only bounded Eevee on WebGL2, or WebGPU after both browser and bundled
renderer capability checks, may return `WEB_LOCAL_BOUNDED/READY`. Cycles, complex
Eevee, Workbench final rendering and CUDA/OptiX/HIP/Metal/oneAPI requests always
target `SERVER_JOB`; the default unconfigured endpoint returns
`SERVER_JOB_UNAVAILABLE` without a local approximation. Unknown, syntactically valid
SceneIR engine identities fail closed as `PLATFORM_CAPABILITY_UNAVAILABLE`.
Setting `serverRenderAvailable:true` can make a server route `READY`, but only proves
the routing decision. It does not submit a job or claim the source/build/settings/
output hash contract reserved for M11-06.
## Evidence
- `WEB_TEST_PORT=5556 npm --prefix web run test:render-routing`: unit 3/3 and
Chromium 1/1. The browser reads `BLENDER_EEVEE` from the real M11 reference `.blend`
through the production WebEngine Worker before checking the local/server matrix.
- Cycles, complex Eevee and OptiX all remained `SERVER_JOB/BLOCKED` with
`SERVER_JOB_UNAVAILABLE` under the production default. A synthetic configured
server context returned `SERVER_JOB/READY`, never a Web target.
- Unbundled WebGPU remained `WEB_LOCAL_BOUNDED/BLOCKED` with
`WEBGPU_RENDERER_UNAVAILABLE`; an unknown engine remained server-targeted and
blocked with `PLATFORM_CAPABILITY_UNAVAILABLE`.
- Typecheck, lint, production build (75 modules) and `git diff --check` passed.
## Implementation Hashes
- `web/protocol/render-routing.ts`: `2d41d48609635c810572aaae95979df2fe9e49bbd130c60d70f64042c5d0f097`
- `web/app/src/three-adapter/render-routing.ts`: `f360c05fa62aa830a486c5be4747488fcbb5ba9b68d82b4f7187e1267da46fa6`
- `web/tests/unit/render-routing.test.mjs`: `4ac2e7a6c2265f948d971f72effb4ff9ad1c51839ab6c06d496fc2b0768c4fa8`
- `web/tests/e2e/render-routing.spec.ts`: `e5572d9ad9426f1dcc1856fe426261910093fa2f5460117e4ffdcfc7b23b10a1`
- `tests/golden/M11-05/render-routing.json`: `53c5d3a2e51f251d14953594567081597be4250be5b1236832370e74805bd35d`
- `web/package.json`: `716a5331990618892bca97f48c7eef589a5af6c5131b8cf3ae52a1b9d923644c`
## Rollback
Remove the M11-05 routing protocol/wrapper, unit/E2E/golden/package command, restore
M11 to 4/14 and remove the N-019 server-routing completed slice. Keep M11-04 realtime
reference metrics and all earlier lighting/resource behavior unchanged.

48
docs/status/M11-06.md Normal file
View File

@@ -0,0 +1,48 @@
# M11-06 Status
status: done
task: server render job provenance binding
updated: 2026-08-17 America/New_York
## Scope
`web/protocol/server-render-job.ts` defines schema 1 for a server render request and
result. A request is accepted only when the uploaded `.blend` bytes match its declared
source SHA-256 and byte length, the Blender build is a declared 5.2 build with a
content hash, and canonical bounded render settings match `settingsSha256`. The
request itself is bound by `requestSha256`.
A successful result carries the same source/revision/build/settings identity and adds
output MIME, byte length, and output SHA-256, plus `resultSha256`. Consumers recalculate
the output hash before accepting pixels. The contract does not claim a remote queue,
progress, cancellation, denoise, or Freestyle implementation; those remain later
M11 tasks.
## Evidence
- `npm --prefix web run test:server-render-job`: unit 3/3 and a real loopback server
check passed.
- The check used Blender 5.2.0 headless to open
`tests/files/web/m11_render_reference.blend` and render a PNG from the submitted
source bytes. It verified source/build/settings/output hashes and rejected source,
build, settings, and output tampering.
- Result: `server-render-job-ok blender=5.2.0 source=d2bea55fe4de0b00e73a9241b4d1b0c802c2eb0e6159c0cd48e007b97b9d3963 settings=97bb832618bd27e8763722afa0d250ef74383fb355f0ff38763930f57ba1590b output=564b95cd501da2636085aeada88814c4a3b7af7b1f0188543a1863fe34dd091e bytes=3915 source-hash=1 build-hash=1 settings-hash=1 output-hash=1 tamper=4`.
- Full regression passed: typecheck, lint, Node `168/168`, status consistency
(`12` parity blocked, `0` release blocked), release evidence (`17` records,
`0` missing), production build (`75` modules), and `git diff --check`.
## Implementation Hashes
- `web/protocol/server-render-job.ts`: `e2b5b95032b0dbcb346aa35d1a10a3b55d6c006603f16b9e72c3de45763906c5`
- `web/protocol/error.ts`: `747ea52fd96b3ec7ede9ce72c15f56fdc454836ba5bf924cc60198096d4986de`
- `web/tests/unit/server-render-job.test.mjs`: `c84f86365006360f146601839d7e1394f3f7bc7fa71dcbf62d8d4e4321cdd16d`
- `tools/web/check-server-render-job.mjs`: `6dd49fbd1be202a88fa714b2fb81305018da6df5f9d73c95e048e3697742764e`
- `tools/web/render-server-job.py`: `48950b0884a52a40ae234f8bbe590a0cb89e58c4d2a2de40ea638f491d111aff`
- `tests/golden/M11-06/server-render-job.json`: `36f083f8da7585f850e748e6ac78fc57cd6e8d59bce03d77eee3acd2fa042ae7`
- `web/package.json`: `628191a76c7614393a74969bd000faa8a6302d887265d13a1ad49dcfc401c2fc`
## Rollback
Remove the server-render-job protocol, error codes, unit/check commands, and this status
record; restore M11 to 5/14 and remove the M11-06 completed slice. Keep M11-05 routing,
M11-04 reference metrics, and all earlier lighting/resource behavior unchanged.

36
docs/status/M11-07.md Normal file
View File

@@ -0,0 +1,36 @@
# M11-07 Status
status: done
task: compositor allowlist CPU/WebGPU node goldens
updated: 2026-08-17 America/New_York
## Scope
The schema 1 WebGPU compositor allowlist contains only `CONSTANT_COLOR`, `EXPOSURE`,
`INVERT`, and `COMPOSITE`. A Blender 5.2 fixture supplies an independent constant,
exposure, invert, and integrated-chain scene through the production Main/WASM reader.
The production CPU executor and a real Chromium WebGPU compute pipeline must produce
identical `LINEAR_SRGB` Float32 RGBA bytes for every case.
Resource inputs, branching graphs, Viewer, Transform, Alpha Over, Blur, Mix, and
undeclared Blender nodes remain outside the allowlist and fail before shader
compilation. This task does not claim the M11-08 graph-preservation pipeline, HDR/color
management parity, a production compositor scheduler, or server compositor execution.
## Evidence
- `WEB_TEST_PORT=5562 npm --prefix web run test:compositor-node-golden`: Node 3/3,
Blender 5.2 Main/WASM fixture check, and Chromium WebGPU 1/1 passed.
- The four CPU and WebGPU Float32 SHA-256 values match the committed golden exactly;
maximum absolute error is `0`.
- The first run without an isolated port passed Node/native checks but did not start
Chromium because port 5173 was already occupied. It was not counted as evidence;
the complete command was rerun on port 5562.
- Full regression passed: typecheck, lint, Node 171/171, production build, status
consistency, release evidence validation, and `git diff --check`.
## Rollback
Remove the WebGPU compositor plan/executor, M11-07 fixture/goldens/tests, and this
status record; restore M11 to 6/14 and remove the N-020 WebGPU golden completed slice.
Keep the existing bounded CPU compositor and Main graph reader unchanged.

37
docs/status/M11-08.md Normal file
View File

@@ -0,0 +1,37 @@
# M11-08 Status
status: done
task: preserve unsupported compositor graphs and block execution
updated: 2026-08-17 America/New_York
## Scope
The CPU compositor and cached execution entry points now preflight the complete parsed
graph before evaluation or cache lookup. Any `UNSUPPORTED` node blocks with
`COMPOSITOR_NODE_UNSUPPORTED`, including a disconnected node that does not contribute
to the Composite output. Unsupported Blender type names are sorted and deduplicated so
the failure is deterministic.
The gate is pure: it does not remove nodes, rewrite links, advance Main revision, run a
cancellation callback, allocate an output, or accept a previously cached result. The
existing Blender 5.2 fixture preserves its Glare node name, `UNSUPPORTED` IR type, and
`CompositorNodeGlare` source type before and after the failed attempt.
## Evidence
- `WEB_TEST_PORT=5565 npm --prefix web run test:compositor-unsupported-gate`: unit 2/2,
native Main reader, and Chromium 1/1 passed.
- `WEB_TEST_PORT=5566 npm --prefix web run test:e2e -- --grep "N-020"`: 2/2 passed;
the supported synthetic CPU graph still executes, while the real graph containing a
disconnected Glare node now fails closed.
- The first new unit run was 172/173 because an async rejection used `assert.throws`.
It was corrected to `await assert.rejects`; no implementation failure was counted as
evidence. The complete Node suite then passed 173/173.
- Full regression passed: typecheck, lint, production build, status consistency,
release evidence validation, and `git diff --check`.
## Rollback
Remove the complete-graph preflight from CPU/cached execution and the M11-08 tests and
golden, restore the old N-020 smoke expectation, restore M11 to 7/14, and remove the
N-020 completed slice. Keep M11-07 CPU/WebGPU goldens unchanged.

43
docs/status/M11-09.md Normal file
View File

@@ -0,0 +1,43 @@
# M11-09 Status
status: done
task: runtime codec probes for IMAGE, SOUND, and MOVIE strips
updated: 2026-08-17 America/New_York
## Scope
Schema 1 codec probe requests and receipts bind the Sequencer strip family, canonical
MIME type, source byte length, and source SHA-256. File names and source paths are not
accepted by the probe contract, so extensions cannot grant capability. A READY receipt
must also use the family-specific backend and carry validated decoded dimensions or
audio frame metadata.
The production browser probe hashes the supplied bytes and performs a real decode:
`createImageBitmap` for IMAGE, a fixed 48 kHz `OfflineAudioContext` for SOUND, and a
muted `HTMLMediaElement` load/seek/canvas readback for MOVIE. The committed movie is a
deterministic 16x16, two-frame H.264 MP4 generated locally by FFmpeg. This task does not
claim frame-accurate WebCodecs seeking, waveform/proxy generation, A/V synchronization,
arbitrary codec support, or final encoding.
## Evidence
- `WEB_TEST_PORT=5570 npm --prefix web run test:sequencer-codec-probe`: unit 3/3 and
Chromium 1/1 passed. PNG, WAV, and H.264 MP4 returned READY with their expected
runtime backend and decoded metadata.
- Deliberately wrong file extensions had no effect. Corrupt bytes, source identity
drift, PNG bytes declared as MOVIE, a forged backend, and a forged receipt all stayed
BLOCKED with `SEQUENCER_CODEC_UNSUPPORTED` at the gate.
- The first Chromium attempt failed before business execution because `/protocol` is
not exposed by Vite; the test now imports the existing app adapter. The second decoded
all media but exposed device-rate Web Audio resampling; the production probe now uses
a fixed 48 kHz OfflineAudioContext. The complete command was then rerun successfully.
- Sequencer Main reader, N-021 browser regression, and the one-million-frame long media
performance/restart test passed. Full regression passed: typecheck, lint, Node suite,
production build, status consistency, release evidence validation, and
`git diff --check`.
## Rollback
Remove the codec probe protocol/runtime/tests/movie fixture, restore the MIME-set gate,
restore M11 to 8/14, and remove the new N-021 completed slice. Keep the V1 long-media
IMAGE/SOUND index/cache behavior and all M11-08 compositor behavior unchanged.

57
docs/status/M11-10.md Normal file
View File

@@ -0,0 +1,57 @@
# M11-10 Status
status: done
task: bind long-media proxy/cache entries to source hash and runtime decode capability
updated: 2026-08-17 America/New_York
## Scope
Schema 1 proxy-cache manifests bind the complete movie source identity, the source-bound
M11-09 READY decode receipt, an explicit SRGB8/STRAIGHT RGBA8 profile, and the source
frame into one deterministic SHA-256 cache identity. The proxy payload has an independent
byte length and SHA-256. Source drift, decode-capability drift, identity tampering, and
payload tampering therefore fail with separate stable codes.
The production browser adapter verifies the movie bytes before decode, captures only the
initial decoded HTMLMedia frame, and stores verified copies in a 64 MiB-bounded LRU. The
Chromium gate persists the RGBA8 payload and its manifest through the content-addressed
Storage Worker path, creates a new Storage Worker, and verifies the reopened bytes against
the current runtime receipt. This task does not claim frame-accurate proxy generation,
seek/scrub publication, waveform generation, A/V synchronization, or final encoding.
## Evidence
- `WEB_TEST_PORT=5573 npm --prefix web run test:sequencer-media-cache`: unit 3/3 and
Chromium 1/1 passed. The real 16x16 H.264 fixture produced one 8x8/256-byte RGBA8
proxy; its cache identity is
`68a3af14865841e81f69bd75f2605461de4819fe025d158ac3723fa0cdf31525`.
- A one-frame cache budget admitted frame 0, returned a copied hit, then evicted it when
frame 1 was inserted. `clear()` released exactly 256 bytes and left zero entries.
- Source hash drift, READY receipt metadata drift, payload mutation, and bad source bytes
returned `SEQUENCER_CACHE_SOURCE_MISMATCH`,
`SEQUENCER_CACHE_CAPABILITY_MISMATCH`, or `SEQUENCER_CACHE_HASH_MISMATCH` as
appropriate. Blocked receipts, undeclared profile fields, oversized RGBA8 profiles, and
upscaled profiles were rejected before cache insertion.
- The first unit run was 2/3 because the test incorrectly treated exactly 64 MiB as over
budget; the corrected 64 MiB plus one-row case passed. The first Chromium run completed
all business operations but sampled `statsBeforeClear` after `clear()`; the sampling
order was fixed and the full command rerun on ports 5572 and 5573.
- Regression passed: M11-09 unit 3/3 plus Chromium 1/1, one-million-frame long-media 1/1,
Sequencer Main reader, full Node 179/179, typecheck, lint, and production build (75
modules).
## Artifact Hashes
- protocol: `1dd5ee8cade2642723bac6f0c8e34d09cf178d000beba6eb63626284ee35fd5e`
- browser adapter: `57070b1a42129afdfb8121ec11a48b0792b3de9d84f7e8a78017c7d6e12343aa`
- app protocol exports: `8ca82257c758580f5fe91a3a5cd21f8ae9e9ce10f9fa71fcd7cf1f30e0b6367b`
- unit: `f4cc1171dd6875bf079e242beed846409a1d1f53b9497882aa475bd2773b43c7`
- Chromium spec: `6d9d26e3639a74b173f77ec5d67e53e5ec42b88dd6e34bda54c8168b8251423e`
- golden: `39a71f8d97f0045da6ec913b6a0231ac3363f67a420eea5ab3fabaa8f1d47c33`
- package: `2c7fb9f8657155088e4a080443b8a0ba9c13aae9f46f1807ff3b8820640c44c4`
## Rollback
Remove the proxy-cache protocol/runtime/tests/golden and package command, restore M11 to
9/14, and remove the new N-021 completed slice. Keep M11-09 runtime codec probes and the
V1 long-media index/cache evidence unchanged.

52
docs/status/M11-11.md Normal file
View File

@@ -0,0 +1,52 @@
# M11-11 Status
status: done
task: revision-gate late seek, scrub, and decode results before publication
updated: 2026-08-17 America/New_York
## Scope
Schema 1 uses one request identity for SEEK, SCRUB, and DECODE. Every request binds a
timeline ID, timeline revision, monotonically increasing request revision, operation,
and frame. A completed result must echo that identity and add a bounded source frame and
payload SHA-256. Publication is allowed only when both the timeline revision and latest
request revision still match the controller state.
The production controller advances one shared request revision across all three operation
types. Replacing a timeline invalidates every pending request before a new request begins,
and same-timeline revisions must advance monotonically. The publish callback is invoked
only after the pure gate returns PUBLISH, so stale results cannot update the visible frame
or write a decoded payload into cache. This task does not claim frame-accurate WebCodecs
seeking or the M11-14 cancellation/restart resource lifecycle.
## Evidence
- `WEB_TEST_PORT=5576 npm --prefix web run test:sequencer-media-revision`: unit 4/4
and Chromium 1/1 passed on the first complete run.
- Chromium scheduled SEEK revision 1 behind SCRUB revision 2. SCRUB published first and
the late SEEK returned `STALE/REVISION_CONFLICT`. A real H.264 runtime decode started at
timeline revision 7, completed after replacement with revision 8, and was rejected
before publish/cache. The revision-8 DECODE published; a forged result identity stayed
stale.
- The machine sequence is frozen in
`tests/golden/M11-11/sequencer-media-revision.json`: only `SCRUB@2` and `DECODE@5`
publish, and only `DECODE@5` reaches the cache-write callback.
- Regression passed: M11-10 unit 3/3 plus Chromium 1/1, M11-09 unit 3/3 plus Chromium
1/1, one-million-frame long-media 1/1, full Node 183/183, typecheck, lint, and production
build (75 modules).
## Artifact Hashes
- protocol: `326f1525f50af3b2c4132ff58508ed6174ba3aa4a5075b2a6660e549c280826a`
- production controller: `29a44404bb28e46d67439eec0622a69ce4cd7264ce45da77a3f320c8687b7006`
- app protocol exports: `be2eca8482a60e437878b99f69d3178f47fee61618886d141760320e3a3ed1e1`
- unit: `2099f738120897dfbb8662741831774b5f9150d51924dfa7832907177de5e7`
- Chromium spec: `e47f105360ce0e2d4d561d3cf790ceec9f41dd6bac7361965914ada307db843c`
- golden: `672b4fde6e27f8b15cd51d839cacb5efb128c0d0f4c7f6aa4e184c713f9b45e5`
- package: `5d17b17d67ee587191552c3dfe226cd8f2e5a872791224d8e6c22aafa1177ebe`
## Rollback
Remove the media revision protocol/controller/tests/golden and package command, restore
M11 to 10/14, and remove the N-021 revision-gate slice. Keep M11-09 runtime probes,
M11-10 proxy-cache identity, and the V1 long-media generation behavior unchanged.

58
docs/status/M11-12.md Normal file
View File

@@ -0,0 +1,58 @@
# M11-12 Status
status: done
task: keep final video encoding on an explicit server-export capability route
updated: 2026-08-17 America/New_York
## Scope
Schema 1 final-export requests bind the Main timeline ID/revision, source `.blend`
SHA-256, bounded frame range and rational frame rate, output dimensions, and one declared
container/video/audio codec combination. The canonical encoding settings and the complete
source identity receive separate SHA-256 hashes, so source revision drift and settings
drift produce different request identities.
The only route is `SERVER_EXPORT`. A missing endpoint fails closed with
`SEQUENCER_EXPORT_SERVER_UNAVAILABLE`; a configured endpoint returns
`SERVER_EXPORT_REQUIRED`, not local success. Browser `VideoEncoder` availability is
recorded for diagnostics only and cannot change the route or the invariant
`localEncoding=BLOCKED`. This task does not claim a server encoder implementation,
upload/progress/cancellation, audio mixing, or encoded-output verification.
## Evidence
- `WEB_TEST_PORT=5579 npm --prefix web run test:sequencer-final-export`: unit 4/4 and
Chromium 1/1 passed on the first complete run.
- Chromium opened the real Blender 5.2 `sequencer_scene.blend` through WebEngine Main and
bound timeline `sequencer:scene:SequencerScene`, revision 1, frames 1..250, 24000/1001
FPS, and source SHA-256
`5f5212487bb6b5df62b5ca915c75133f1ca45678614712ea4c7d902d823cd90c`.
- The fixed settings hash is
`01e39d1fdd88c75aecad7bc48a2b756bbcd645929963528b42ceb180b51e5566`;
the source/timeline/settings request hash is
`20d3a9e333804e014a993a9892a557842293fc44902229dd6eb65661f0691cfc`.
- No-server, server-without-encoder, server-with-injected-encoder, and actual Chromium
runtime cases all retained the server route and blocked local encoding. Undeclared
fields, invalid codec combinations, over-budget ranges, and environment drift returned
`SEQUENCER_EXPORT_REQUEST_INVALID`.
- Regression passed: M11-09 unit 3/3 plus Chromium 1/1, M11-10 unit 3/3 plus Chromium
1/1, M11-11 unit 4/4 plus Chromium 1/1, one-million-frame long-media 1/1, Sequencer Main
reader, full Node 187/187, typecheck, lint, and production build (75 modules).
## Artifact Hashes
- protocol: `559516163ce9a9c60917033455c71a1ae6be2f34666371f12723a056ddfdb3dd`
- browser adapter: `f9f193eb71afa48a23b4eb618cd98b5c0064c59943b3652fb6a601b545ac175c`
- app protocol exports: `d30783528fabaaefe8835998e11d75da357d265ee06db67713e57e4b85b58d7d`
- error contract: `747894b216db59c753b24ce85eb946925e64340f63684311e5d9628c9a6a9c8e`
- unit: `6f5030852e89160fd898b2aff4dc9911963342bd6c2301a2c0e8a3d518ddbcbd`
- Chromium spec: `d8cba79c9a330c1e5c777c8f0ed08362b29f50702c31d8229fd65f4304bce363`
- golden: `c0061f82ef156e53ad4dfc6aedf7c6a8f53e616d8d9fa1435fd9491ba3d07e01`
- package: `83ee5bfa50a0e5b742048d4563ae815171232a121cf3df4a1e813f21313a6509`
## Rollback
Remove the final-export protocol/browser adapter/tests/golden and package command, remove
the two export error codes and SequencerTimeline exports, restore M11 to 11/14, and remove
the N-021 final-export completed slice. Keep M11-09/10/11 decode, proxy, and revision
gates and the existing `sequencerRuntimeCapabilities().localEncoding=BLOCKED` contract.

58
docs/status/M11-13.md Normal file
View File

@@ -0,0 +1,58 @@
# M11-13 Status
status: done
task: verify AudioContext suspend, resume, missing-device, and mute recovery
updated: 2026-08-17 America/New_York
## Scope
Schema 1 audio-session reports separate context state
(`UNAVAILABLE/SUSPENDED/RUNNING/CLOSED`) from output state
(`BLOCKED/SILENT/ENABLED`). Every initialize, resume, suspend, mute, device-recovery, and
close operation advances a monotonic revision. Reports bind the mute flag, effective gain,
and a stable issue code, and reject contradictory states such as enabled output from a
suspended or muted context.
The production `SequencerAudioSession` owns one `AudioContext` and master `GainNode`.
Mute schedules gain zero; unmute restores the configured nominal gain. Suspend and resume
must reach the corresponding real context state before output can be enabled. Missing API,
constructor failure, and resume/suspend failure remain silent with structured errors.
Closing first zeros and disconnects the gain node, closes the context, drops all references,
and reports `CLOSED/SILENT`. This task does not claim waveform generation, A/V sync,
multi-strip mixing, output-device selection, or encoded audio export.
## Evidence
- `WEB_TEST_PORT=5586 npm --prefix web run test:sequencer-audio-recovery`: unit 3/3 and
Chromium 1/1 passed on the first complete run.
- The Chromium case creates a real `AudioContext` inside a trusted click handler, then
verifies suspend, mute, resume-while-muted, unmute, second suspend/resume, and close.
Muted output remains `RUNNING/SILENT` at gain 0; unmute restores
`RUNNING/ENABLED` at gain 0.75; close reports `CLOSED/SILENT` at gain 0.
- A scope without `AudioContext` returns
`UNAVAILABLE/BLOCKED/SEQUENCER_AUDIO_DEVICE_UNAVAILABLE`. The deterministic unit path
then makes a constructor available and verifies `recoverDevice()` plus resume. Constructor
and resume failures stay silent; malformed state reports return
`SEQUENCER_AUDIO_CONTEXT_INVALID`.
- Regression passed: M11-09 unit 3/3 plus Chromium 1/1, M11-10 unit 3/3 plus Chromium
1/1, M11-11 unit 4/4 plus Chromium 1/1, M11-12 unit 4/4 plus Chromium 1/1,
one-million-frame long-media 1/1, Sequencer Main reader, full Node 190/190, typecheck,
lint, and production build (75 modules).
## Artifact Hashes
- protocol: `0b1b75c7630b599723914bbced9ee0a107bd8c0ac4382ced1f1c5114dac8fd01`
- production controller: `c09914d2581ee454e042ed6a9ef5b8c0f6f7b0688eadb1deff45163263742109`
- app protocol exports: `e630f647ddd3680a04e07ce7388cf03f54268d4e2d839aa5991cb9ceb6a53bda`
- error contract: `6589f712058a39a2177cb174cc355c01777a549d254c4b9eac2301a344c619f2`
- unit: `1a888d1b19a3d12091e6edd05287a5bcc19912415cf7f2ed73a028d12846a298`
- Chromium spec: `1b94ea07ab5fafb0b06fbd73742c77d6b69d745a546fc60def85857844afc719`
- golden: `584aea46687fd5cec8d89e8fac51314acc9a8d05af2a8d762e8d6a74483e0940`
- package: `8d87390f9b1b7382bf9c0ba189f7a9d95daa3ee15d1d422a8d856fa4eb6d3cca`
## Rollback
Remove the audio-session protocol/controller/tests/golden and package command, remove the
four audio error codes and SequencerTimeline exports, restore M11 to 12/14, and remove the
N-021 audio-recovery completed slice. Keep M11-09 offline audio decoding and M11-12 final
export routing unchanged.

57
docs/status/M9-14.md Normal file
View File

@@ -0,0 +1,57 @@
# M9-14 Status
status: done
task: Curve、Grease Pencil、Paint 三编辑域故障恢复闭环
updated: 2026-08-16 America/New_York
## Scope
`web/protocol/editing-domain-recovery.ts` freezes one schema-v1 evidence shape for
the three domains. Each report must prove Main identity, Worker generation, OOM
fault mapping/cleanup, WebGL2 resource release/reinitialization, and a visible
small-scene recovery. Save/reopen may reset the logical Main revision; the
content identity SHA-256 remains the authoritative recovery check.
## Evidence
- Curve fixture: `tests/files/web/nonmesh_scene.blend`, SHA-256
`ae8ef85d606aa120ce6b7611fc03407fd80bb60311e94a6ef73f6384d0b6c8b4`.
- Grease Pencil fixture: `tests/files/web/modifier_grease_pencil_scene.blend`, SHA-256
`3a8525077807f9178dac3a5ba84b524e5f8e80874b15c54e2a6658ecb80315a3`.
- Paint fixture: `tests/files/web/attribute_scene.blend`, SHA-256
`12fa75bb79f8c38e660d3d2a8fc9cc16dd3df4fc9208b0e2ad94fb1f8aa68f71`.
- `WEB_TEST_PORT=5435 npm --prefix web run test:editing-domain-recovery`: unit 3/3 and
Chromium 1/1. All three reports returned `RECOVERED` for Worker restart, OOM,
GPU release and small-scene stages.
- Full unit suite: 127/127 tests passed.
- `npm --prefix web run typecheck`: passed.
- `npm --prefix web run lint`: passed.
- `npm --prefix web run build`: passed, Vite production bundle transformed 73 modules.
- `git diff --check`: passed.
## Implementation hashes
- Protocol: `42ab53dde3161ec31ca7de420046a2c06f58408b3ac4919c9904e02d875af258`.
- Browser runner: `2bb9805795fc2104e5443207a08951ac7684e67913064d6795c9d165b0c54c7e`.
- Unit test: `ca565149e7769b40f59e865e42d2dfb0f4ecb2a4655371004678c14536ec9ef6`.
- Chromium test: `7ab3421d1b44eb78d13525f67a26f1f6ed20816ae9b43c010c9ed3ebdf32c09a`.
- Golden manifest: `f548052f39f6259f30b0569528160512aad955e61e8e8559e0d553c30d5619f9`.
## Recovery boundaries
- Worker restart uses a fresh `WebEngineClient`/Worker and reopens the saved bytes;
stable domain identity is required, while revision reset on a newly serialized
`.blend` is accepted and recorded.
- OOM uses the token-isolated `GPU_GEOMETRY_UPLOAD` fault point. A tracked texture
lease is released before close; the matching error is
`GPU_GEOMETRY_BUDGET_EXCEEDED`, with zero live temporary resources.
- GPU release disposes geometry, material and renderer once, then creates a fresh
WebGL2 renderer and requires non-zero pixels for the same domain probe.
- Small-scene recovery requires the reopened data IDs, identity hash, object count
and visible pixels to match the committed baseline.
## Rollback
Remove the M9-14 protocol/runner/tests/golden and package script together. Existing
Curve, Grease Pencil and Paint writers remain unchanged; no persisted schema or
release metadata migration is required.

View File

@@ -7,14 +7,46 @@
本轮已交付版本化 `GeometryNodeGraphIR`、node/socket/link/domain 校验、支持节点白名单、
循环依赖和自递归 group 检测。Object/Collection/Image Info 资源现在按 SceneIR stable ID、
资源类型、owner cycle 和 linked/missing/corrupt 沙箱校验。合法图仍只通过协议门native
lazy-function evaluator 未启用时返回 `CAPABILITY_MISSING`
资源类型、owner cycle 和 linked/missing/corrupt 沙箱校验。保存于 Blender Main 的 allowlist
图已启用有界 native evaluator;任意图写回仍返回 `CAPABILITY_MISSING`
`SimulationCacheManifestIR` 已绑定 graph/source blend/input hash、Blender 5.2、完整帧范围、
连续 byte range、总 payload 和逐帧 SHA-256。StorageWorker schema 6 使用 OPFS 内容寻址资产
`simulation_manifest` 索引,写入前核对当前 committed blendWorker 重启后重新逐帧验证;
缺失、版本不符和损坏均结构化阻断。
M10-01 已把真实 Blender Main 图拓扑、socket 默认值、link 和稳定 node/socket ID 发布到
SceneIRM10-02 将 16 项 allowlist 固定为 schema 1。M10-03 用 11 个 Blender 5.2 desktop
fixture 覆盖全部 16 项节点,并在 Node full-Main WASM 与 Chromium Worker 打开、求值、保存、
重开路径逐项比较 topology、position、bounds 和 point float attribute。当前误差为 0门限为
position max `1e-5`/RMS `1e-6`、attribute `1e-6`、bounds `1e-5`。真实 Simulation Zone 节点
仍返回 `GN_NODE_UNSUPPORTED` 并保留原图、graph hash 和 Main revision。
仍未声明:浏览器生成 bake、WASM Simulation Zone 求值、cache frame seek 接入 GN modifier、
任意 lazy-function/field/instance graph。验收`npm --prefix web run test:simulation-cache`
`npm --prefix web run test:capability-gates`
M10-04 已冻结 field materialization schema 1POINT/EDGE/FACE/CORNER/CURVE/INSTANCE/LAYER
分别具有元素上限,单批最多 64 fields、32 次 domain conversion、4,000,000 个目标元素和
64 MiB单 field 超过 65,536 scalar 时禁止 JSON transport。Depsgraph 的真实 point Float
attribute 回执携带 schema、domain cardinality、元素/scalar/byte 数并与 payload 交叉校验;
基数漂移、字节漂移、隐藏 JSON 数组和未知 domain 均 fail-closed。
M10-05 将 `SimulationCacheManifestIR` 升为 schema 2加入 committed `sourceRevision` 和可由
graph ID/hash、source blend hash、source revision、input hash、Blender 版本及 frame range
复算的完整 `revisionHash`。cache key 不再截取 hash 前缀,而是 `sim2-` 加完整 revision hash
Storage Worker 的 put/read/frame/list 均在 project lock 内核对当前 committed revision/hash
revision 只保留在存储中、不进入当前列表且显式读取返回 `SIMULATION_CACHE_REVISION_MISMATCH`
manifest/frame 未声明字段、legacy schema、graph/source/input/range 漂移均 fail-closed。
`SimulationCacheManifestIR` 已绑定 graph/source blend/input/revision hash、Blender 5.2、完整帧范围、
连续 byte range、总 payload 和逐帧 SHA-256。StorageWorker schema 7 使用 OPFS 内容寻址资产、
`simulation_manifest` 索引和 `simulation_quarantine` 隔离 store写入前核对当前 committed blend。
每个 Worker 生命周期必须先完整复验 cache 才允许逐帧播放;播放/写入支持 AbortSignal取消不发布
manifestLRU 按 `lastAccessAt/createdAt/cacheKey` 确定性淘汰并保护 active playbackWorker 重启
重新验证manifest 或 payload 损坏会从可播放索引移入 quarantine列表仍返回其他有效 cache。
M10-15 为 GN 和 Simulation 分别增加隔离 Chromium Worker 门GN 以 10 次 512-node
parse/validate、超 node budget 和 dependency cycle 覆盖性能/OOM-prevention/恶意输入Simulation
以 64 帧逐帧 hash、16 GiB+1 manifest 和未声明字段覆盖同三类门。两域均在失败后由同 Worker
完成小输入恢复。
仍未声明:任意 field/domain 实际求值、完整 lazy-function runtime、图写回、浏览器生成 bake、
WASM Simulation Zone 求值、cache frame seek 接入 GN modifier 和任意实例图。验收:
`npm --prefix web run test:geometry-node-evaluator-golden`
`npm --prefix web run test:geometry-node-field-budget``npm --prefix web run
test:simulation-cache-identity``npm --prefix web run test:simulation-cache`
`npm --prefix web run test:simulation-cache-performance``npm --prefix web run
test:simulation-cache-lifecycle``npm --prefix web run test:capability-gates`
`npm --prefix web run test:m10-domain-gates`

View File

@@ -1,6 +1,6 @@
# N-013 Shader Node 图
状态:`in_progress七节点 Main + 常量 PBR 映射子集)`
状态:`in_progress七节点 Main + 有界 WebGL2 compiler 子集)`
详细分解、ShaderIR、typed socket 校验、Main 写回、Web 编译、GLB 映射和验收命令见
[`docs/UNDECLARED_CAPABILITIES_EXECUTION_PLAN.md`](../UNDECLARED_CAPABILITIES_EXECUTION_PLAN.md)。
@@ -16,6 +16,19 @@ operation 保存重开其他运算继续结构化阻断。RGB/Value 到 Princ
Roughness、Metallic 的有限常量链接现可确定性映射为 glTF PBR factor缺值、越界、
重复输入和未知链接继续返回 `SHADER_GRAPH_UNMAPPABLE`。Mix、Mapping、Texture
Coordinate、Bump 及任意节点仍返回 `SHADER_NODE_UNSUPPORTED`。node properties 仅开放
Math operation;受限 Web 编译、完整色彩管理、完整 GLB 图映射和桌面渲染 golden 仍为 planned。
验收:`npm --prefix web run test:authoring-roundtrip``npm --prefix web run test:capability-gates`
Math operation。M10-07 新增 schema 1 有界 compiler只把 RGB/Value 常量、六项 Math、Image
Texture、Normal Map、Principled 和 Output 编译为 `WEBGL2_THREE_PHYSICAL` reportNative reader
发布 graph SHA-256Worker 在 Main transaction 前编译并失败关闭,主线程和 Offscreen 复用同一
`createPBRMaterial` 入口。M10-08 为 report 增加 graph/texture/color-space/backend 绑定的
`compileKey`M10-09 由 `PBRMaterialPipeline` 保留上一份可用材质并记录失败报告。节点/链接/
深度/纹理/标识预算固定M10-10 将任意未知节点名称归一化排序后返回稳定
`PBR-012/ARBITRARY_SHADER` capability block未知节点不被删除或静默降级。
M10-15 在独立 Chromium Worker 中连续完成 100 次有界 compile、129-node 超预算阻断、恶意
cycle 阻断和同会话小图恢复performance/OOM-prevention/malicious-input 三门均使用现有 compiler
不以 mock 成功替代材质编译。
完整色彩管理、sampler/alpha/tangent、WebGPU、完整 GLB 图映射和桌面渲染 golden 仍为 planned。验收
`npm --prefix web run test:shader-compile``npm --prefix web run test:authoring-roundtrip`
`npm --prefix web run test:capability-gates``npm --prefix web run test:m10-domain-gates`
以及 Shader GLB mapping E2E。

View File

@@ -13,8 +13,21 @@ Blender `NLASTRIP_FLAG_REVERSE`reader 可恢复该标志;反向正例得到
`[0.555556, 1.111111, 1.666667]`
同一正例已扩为 `repeat=2`frame 5 与第二周期 frame 14 的 native Depsgraph 矩阵一致。
M10-11 另以桌面 Blender 5.2 生成只读 fixture同一 Track 包含 scale=2 的正向 Clip 和
reverse + repeat=2 的 Clip。桌面、Node WASM 与生产 Chromium Worker 在 12 个边界/周期帧上
逐矩阵比较,最大误差为 0每帧求值前后的 Track/Strip/Action JSON 完全一致。本切片不调用
`setNLAStack`,不提前关闭细粒度 operator 工作。
当前只支持单对象 Action Clip、正 scale、Replace/Add/Multiply/Combine 和有限外插。
Transition/Meta/Sound、Animated Time、Drivers、细粒度拖动/resize 命令、NLA UI、
M10-12 仅新增 `moveNLAStrip`,以 revision gate 和单次 Main transaction 保留时长移动现有 Clip
并已通过 undo/redo 与保存重开。Transition/Meta/Sound、Animated Time、Drivers、其余
create/remove/resize/active 命令、NLA UI、
骨骼/约束混合矩阵及 GLB 展开仍为 planned/结构化阻断。
验收:`npm --prefix web run test:authoring-roundtrip``npm --prefix web run test:capability-gates`
M10-15 冻结 4,096 tracks、每 track 16,384 strips、总 65,536 strips 及 ID/name/reason 字节预算,
拒绝未声明字段。隔离 Chromium Worker 对 20 次 256-strip stack、超 track budget、恶意字段和
同会话小 stack 恢复分别建立 performance/OOM-prevention/malicious-input 门。
验收:`npm --prefix web run test:nla-evaluation-golden``npm --prefix web run test:nla-operator`
`npm --prefix web run test:authoring-roundtrip`
`npm --prefix web run test:capability-gates``npm --prefix web run test:m10-domain-gates`

View File

@@ -1,9 +1,9 @@
# N-015 非 Mesh 几何数据块
状态:`BLOCKED / in_progress`VDB core 已覆盖 server、OPFS、Float32 WebGPU、显式 GPU 分页、
有限 grid 材质与 Main 属性重开;自动 demand paging 缺页重绘、联合重开和发布 golden 仍阻断)
状态:`BLOCKED / in_progress`M8 自动 demand paging、联合重开、64 MiB sparse 门和三轴 density
golden 已完成;深度合成、完整 Volume 材质/GLB/USD 与 512 MiB/1 GiB 联合故障矩阵仍阻断)
更新时间2026-08-14
更新时间2026-08-16
## 当前声明
@@ -14,9 +14,10 @@ topology editor。
Volume 采用“桌面/服务端 OpenVDB 转 NanoVDB浏览器分块读取并以 WebGPU 渲染”的固定架构。
浏览器不直接解码 OpenVDB当前已完成真实资源 catalog、独立 OpenVDB 13 -> NanoVDB 32 desktop
converter、受控 server job、转换/清单/分块协议、OPFS 绑定/重开、Float32 CPU/WGSL 树遍历、
有界体积积分、主线程/Offscreen 生产视口、显式 hash 校验 GPU 分页/LRU、有限 grid 材质
Volume Main 属性保存重开自动缺页重绘、联合重开和发布 golden 尚未完成,因此 N-015 整体保持
`BLOCKED`
有界体积积分、主线程/Offscreen 生产视口、显式 hash 校验 GPU 分页/LRU、有限 grid 材质
Volume Main/asset binding 联合重开自动缺页重绘、64 MiB sparse 门和 OpenVDB/WebGPU 三轴
density golden。深度合成、完整 Volume 材质/GLB/USD 与更大真实 bundle 联合故障矩阵尚未完成,
因此 N-015 整体保持 `BLOCKED`
| 数据族 | Reader | Web 预览 | 当前门 |
| --- | --- | --- | --- |
@@ -26,7 +27,7 @@ Volume Main 属性保存重开。自动缺页重绘、联合重开和发布 gold
| Metaball | 元素类型、位置、半径、尺度 | bounded sphere proxydepsgraph implicit mesh | `READY` |
| PointCloud | position/radius/POINT 属性 | WNM 分块 Points | `READY`(空数据为 `summary-only` |
| Curves/Hair | position/radius/curve/POINT 属性 | WNM 分块 Points/curve line | `READY`(缺数据阻断) |
| Volume | path/grid metadata + VDB/NanoVDB 转换契约 | WebGPU 可渲染真实 density/color/temperature/emission双生产视口已接入 | `BLOCKED`(自动缺页/联合恢复/golden |
| Volume | path/grid metadata + VDB/NanoVDB 转换契约 | WebGPU 可渲染真实 density/color/temperature/emission自动分页、联合重开与三轴 density golden 已接入 | `BLOCKED`(深度合成/完整材质与 IO/更大联合故障矩阵 |
## 已实现任务
@@ -104,6 +105,16 @@ Volume Main 属性保存重开。自动缺页重绘、联合重开和发布 gold
20. GPU grid 支持初始空驻留、经 manifest chunk hash 校验的显式单页加载、页表间接寻址、确定性
LRU 替换和设备重建后按需页重放;多材质 grid 按同一 manifest `maxResidentBytes` 分配页槽,
Chromium 以 GPU 数据读取验证被触碰页保留、旧页淘汰和恢复后内容一致。
21. GPU feedback buffer、revision gate、manifest range/hash page request、同页请求合并、frame pin
LRU、渐进重绘预算、网络精确 offset 续传、Worker restart 和 device-loss 可见页回放已形成自动
demand paging 最小闭环hash 失败、stale feedback、取消和 OOM 均不污染 resident/page table。
22. 64 MiB sparse HTTP bundle 以 4 MiB page 实际 range 读取,首 page、总耗时、峰值工作集和取消
延迟均有 Chromium 证据;取消后 coordinator/consumer 归零,未将逻辑 64 MiB fixture 写入仓库。
23. 同一保存 hash 下Volume Main 属性、OPFS project revision、NanoVDB binding 和 bundle/grid bytes
在 Worker 清空后联合重开;主线程和 Offscreen 两个生产视口都从恢复 asset 输出非空像素。
24. OpenVDB 13 native `density` reader 按 `volume-wgsl-v1` 有界积分生成 X/Y/Z 三轴 64x64 RGBA8
desktop/Chromium 发布 golden主线程与 Offscreen WebGPU 对 49,152 bytes 的最大通道误差、MAE、RMS 和 alpha 覆盖
差均为 0。门限仍固定为 2/0.1/0.5/0.002,漂移返回 `NANOVDB_GOLDEN_MISMATCH`
## 后续分解
@@ -117,9 +128,9 @@ Volume Main 属性保存重开。自动缺页重绘、联合重开和发布 gold
raycast、多 handle preview、handle-local gizmo 与单次 Main 写回已完成。
4. N-015-D2evaluated preview 与源控制笼分层显示、WebGPU 等价。
5. N-015-B3/D2/E1Volume真实资源、desktop/server converter、可续传 HTTP range、OPFS、
有界网络/Worker/quota/tamper/device-loss 故障门、Float32 WGSL core、有限 grid 材质、显式 GPU
分页/LRU、resident/page-table OOM 恢复和 Main Volume 属性重开已完成继续执行自动缺页重绘、联合恢复、GLB/USD loss、大 bundle 和
desktop/Chromium golden未完成项保持阻断
有界网络/Worker/quota/tamper/device-loss 故障门、Float32 WGSL core、自动 GPU paging/LRU、
resident/page-table OOM、Main/binding/双视口联合重开、64 MiB sparse 和三轴 density golden 已完成;
继续执行场景深度合成、完整 Principled Volume/GLB/USD loss 与 512 MiB/1 GiB 联合故障矩阵
6. N-015-E2100k/1M WASM/GPU 内存、Worker restart 和 Chromium OPFS quotaChromium
64 KiB 真实 quota、失败后旧 revision 保持、Worker restart 恢复已通过。后续浏览器验收
仅以 Chromium 为基线,不配置 Firefox/WebKit。
@@ -131,7 +142,8 @@ Volume Main 属性保存重开。自动缺页重绘、联合重开和发布 gold
- Metaball sphere proxy 不得用于导出或保存为求值曲面。
- Volume/VDB 不得生成占位几何;协议 fixture 不得作为真实 decoder/renderer 证据。
- 浏览器构建不得通过开启 `WITH_OPENVDB` 绕过 desktop/server 转换边界。
- 自动缺页重绘、联合恢复、完整故障门和发布 golden 未齐前VDB 与 N-015 保持 `BLOCKED`
- 场景深度合成、完整 Volume 材质/IO 和更大真实 bundle 联合故障矩阵未齐前VDB 与 N-015 保持
`BLOCKED`M8 完成不能自动把 N-015 全域标为 `COMPLETE`
- Metaball sphere proxy 不得进入 GLBGLB 只能消费 depsgraph evaluated mesh。
- 任意新增 Main authoring 命令在 save/reopen 与 undo/redo 完成前不得开放 UI。
@@ -161,6 +173,10 @@ npm --prefix web run test:vdb-opfs
npm --prefix web run test:vdb-webgpu
npm --prefix web run test:vdb-viewport
npm --prefix web run test:vdb-faults
npm --prefix web run test:nanovdb-sparse-performance
npm --prefix web run test:nanovdb-volume-roundtrip
npm --prefix web run test:nanovdb-render-golden
node tools/vdb/generate-volume-golden.mjs --check
WEB_TEST_PORT=5349 npm --prefix web run test:e2e -- -g "real OPFS quota|reports quota exhaustion"
WEB_TEST_PORT=5201 npm --prefix web run test:e2e -- -g "N-015|non-mesh"
```

View File

@@ -1,7 +1,8 @@
# N-016 Grease Pencil
状态:`BLOCKED`(协议、有限 reader/Main transaction、当前帧及相邻帧 onion preview 已落地;
完整 2D canvas/Dope 编辑、modifier 语义和桌面 golden 仍阻断)
状态:`BLOCKED`(协议、有限 reader/Main transaction、当前帧及相邻帧 onion preview
current-drawing marquee 和有限 2D point canvas 已落地;完整 2D stroke/segment/Dope 编辑、
modifier 语义和桌面 golden 仍阻断)
## 已验证切片
@@ -22,8 +23,8 @@
drawing渲染真实 3D stroke/闭环Chromium 主线程与 OffscreenCanvas 均通过非空像素门。
6. N-016-Deditor 部分editor context schema 绑定 data/layer/frame、onion 开关、stroke/
point selection 和 revision拒绝 stale/重复/超 1M selectionProperties 面板已连接真实 Main
layer create/remove、当前 frame insert/remove 和整帧 clear transaction。完整 2D stroke/point
画布选择和 dope sheet integration 仍阻断。
layer create/remove、当前 frame insert/remove 和整帧 clear transaction。完整 2D stroke/segment
lasso 和 dope sheet integration 仍阻断。
7. N-016-D点编辑部分Properties 面板可在当前 layer/frame 选择实际 stroke/point执行
有界 X 轴平移;协议先校验 point identity、revision、有限坐标和 1M 点预算,再保留 radius、
opacity、vertex color、cyclic、material index 并合并为一个 `setGreasePencilStrokes` Main
@@ -40,11 +41,29 @@
11. N-016-D重启部分真实 Grease Pencil fixture 经首个 WebEngine Worker 点编辑和 `.blend`
保存后,终止 Worker 并由全新 Worker 重开data/layer/drawing identity、位置、radius、opacity
均重新解析验证。
12. N-016-DM9-06 marqueeMain reader 为 drawing、stroke 和 point 发布稳定 ID并发布 Blender
active layer旧文件未记录 active layer 时只读快照确定性选择首个实际 layer不修改 Main。
纯 marquee 合同绑定 Main revision、当前 data/layer/frame/drawing、归一化矩形和 1M candidate
预算,跨 drawing、重复/伪造 ID、stale revision 和超预算均稳定失败关闭。生产 UI 只在活动、
可见且未锁定 drawing 开放框选,主线程与 OffscreenCanvas 共用同一合同;真实 `.blend` 均选中
4 个稳定 point ID 和 1 个 stroke ID选择不递增 Main revision。
13. N-016-DM9-07 shared selection`grease-pencil-selection` schema 将当前 drawing、稳定
point ID、来源和独立 selection revision 绑定为唯一状态2D point canvas、主线程 3D viewport
和 OffscreenCanvas Worker 的 point/marquee 事件都携带 base selection revision迟到结果返回
`REVISION_CONFLICT`,不修改 Main。真实 fixture 从 2D 选择 1 点后由 3D 框选 4 点revision
`0 -> 1 -> 2`两条生产后端回执与画布高亮一致Main revision 保持不变。
14. N-016-DM9-08 layer/frame reorder`grease-pencil-reorder` schema 将 layer 方向移动和
drawing frame 移动绑定到稳定 data/layer/drawing ID 与 Main base revisionstale revision、
边界 no-op、伪造 drawing、已占用 target frame 和正负 1,000,000 之外帧号均在 Main 前失败关闭。
生产 Properties UI 的 layer 上下移动与 frame target 移动各只提交一次 Main transaction真实
fixture 经 undo/redo、OPFS save、close/recover 后保持 Blender 5.2 desktop golden 的 layer 顺序、
frame 12 和原 drawing identity。完整 group hierarchy、frame duplicate 与 Dope Sheet 拖拽仍阻断。
## 仍然阻断
- N-016-Cmaterial datablock 事务、onion fade/range 完整语义和完整 Grease Pencil modifier reader。
- N-016-D完整 2D canvas/marquee 和完整 timeline/dope 编辑3D current-frame 点 raycast、
- N-016-D完整 2D canvas 的 stroke/segment 选择、套索和完整 timeline/dope 编辑仍阻断;有限
2D point canvas 与 3D 共享 selection revision、3D current-drawing point marquee、点 raycast、
多点高亮、连续 preview、单次 gizmo commit、有界 drawing frame 导航和 worker restart 已完成。
- N-016-Edesktop drawing hash、Chromium 像素 golden、GLB/USD loss report 和 OPFS。
@@ -54,6 +73,9 @@
npm --prefix web run typecheck
npm --prefix web run lint
npm --prefix web run test:grease-pencil
WEB_TEST_PORT=5404 npm --prefix web run test:grease-pencil-marquee
WEB_TEST_PORT=5411 npm --prefix web run test:grease-pencil-selection
WEB_TEST_PORT=5416 npm --prefix web run test:grease-pencil-reorder
WEB_TEST_PORT=5205 npm --prefix web run test:grease-pencil-editor
WEB_TEST_PORT=5202 npm --prefix web run test:e2e -- --grep "N-016 Grease Pencil"
```

View File

@@ -1,7 +1,9 @@
# N-017 Paint 与权重
状态:`BLOCKED`stroke/patch schema、真实 Three raycast 命中、选择/遮罩门和 Main 顶点色/权重
transaction 已落地PBVH brush、texture paint 和 GPU/image 生命周期未实现)
状态:`BLOCKED`stroke/patch schema、真实 Three raycast 命中、GPU depth 可见性、选择/遮罩门、
单 undo 分块 pointer session、Main 顶点色/权重、浏览器 packed/UDIM 原子资产绑定和
PBVH WASM 入口显式能力门已落地;
PBVH brush、Blender Main image tile 写回、完整色彩转换和 GPU/image 生命周期仍未实现)
## 已验证切片
@@ -12,9 +14,11 @@ transaction 已落地PBVH brush、texture paint 和 GPU/image 生命周期未
tile 256 MiB非法 barycentric、pressure、color、weight 和非有限数会结构化拒绝。
4. N-017-B部分`setVertexColors` 在单用户 Mesh 上创建/转换 `POINT``CORNER`
`FLOAT_COLOR` 属性,并更新 active color`setVertexWeights` 在真实 Object/Mesh 上创建顶点组、
写入/移除 `MDeformWeight`,支持逐顶点 normalize
5. 顶点色和权重都已通过 Main undo/redo 与 `.blend` save/reopen`mirror:true` 在没有已验证
对称拓扑映射时返回 `CAPABILITY_MISSING`,不会伪造镜像结果。
写入/移除 `MDeformWeight`,支持逐顶点 normalize、最多 32 个 influence 的 limit以及
基于局部坐标 reciprocal map 的 mirror。
5. 顶点色和权重都已通过 Main undo/redo 与 `.blend` save/reopen镜像在没有已验证对称映射时
返回 `CAPABILITY_MISSING`不会伪造结果。limit/normalize/mirror 的组合已与 Blender 5.2
desktop golden 逐顶点比较。
6. `paintHitFromIntersection` 消费真实 Three `Raycaster` intersection按 indexed/non-indexed
triangle 解析顶点,输出对象/data stable ID、source face、局部 barycentric、世界法线、
插值 UV 与 pressure测试使用真实 BufferGeometry 射线,不注入伪命中。
@@ -24,7 +28,7 @@ transaction 已落地PBVH brush、texture paint 和 GPU/image 生命周期未
8. N-017-A/C协议边界有界 CPU brush 对候选顶点执行 smoothstep falloff、遮挡标记过滤和
front-face 法线门;它不宣称 PBVH 加速或桌面 brush 等价。`UdimTilePatchIR` 约束 1001-1999
tile、RGBA8、色彩空间、尺寸/256 MiB 预算、revision、base/result SHA-256并在内存中验证
原子 range patch;尚未绑定 Blender packed image/UDIM Main 写回与保存
原子 range patch。
9. N-017-A空间查询部分uniform-grid spatial index 在 1M vertex/1M cell 预算内按 brush AABB
粗筛候选再执行球半径、front-face、falloff 精筛depth-gated 查询必须显式提供已验证可见
vertex ID 集合,缺失或重复会拒绝。该结构减少全量扫描,但不是 Blender PBVH。
@@ -34,14 +38,35 @@ transaction 已落地PBVH brush、texture paint 和 GPU/image 生命周期未
11. Properties paint 面板可对当前真实 VERT selection 执行 selection-masked `Blend Color`
`Blend Weight`,每次仅提交一个 Main transaction。Blender 5.2 reader 从 Mesh
`vertex_group_names` 恢复顶点组摘要及 skin weight 名称;新增组经 undo/redo、保存重开后保持。
12. M9-09主线程和 Offscreen Worker 使用同一 WebGL2 RGBA depth pass/readback
以 Main revision 和稳定顶点索引返回真实可见集;遮挡 fixture 的两后端结果一致。
13. M9-10WebEngine Worker 可序列化接收有界 color/weight chunks一次 pointer
session 仅在 commit 时对 Main 发一个合并命令;真实 Main 历史只产生一个 undo step。
14. M9-11Storage Worker 将 packed/UDIM PNG 解码为 RGBA8复验 dirty range 的
base/result pixel hash新 PNG 经 OPFS content-addressed 临时写、回读验证后,
才以 IndexedDB 单事务切换 tile binding。中途故障保持旧 binding/旧资产可读,
packed 与 UDIM 均已通过 Worker restart 回读。
15. M9-12`WeightPaintOptionsIR` 固定 normalize、limit、mirror axis/tolerance 和 1M
patch budgetWorker 拒绝重复/越界/非法组合native 在 Main 内先写入 patch再做
mirror、limit、normalize。镜像 map 使用 mesh 局部坐标,要求每个顶点都有 reciprocal
counterpart且大于 100k 顶点时结构化预算阻断。`rigged_shape_scene.blend` 的四步
goldeninitial/normalize/limit-normalize/mirror与 WASM snapshot、save/reopen 逐项一致。
16. M9-13按 Blender 5.2 `DNA_brush_enums.h` 冻结 32 个 Sculpt、4 个 Vertex Color、
4 个 Weight 和 6 个 Texture 活跃 brush。生产 WebEngine Worker 探测
`_web_engine_apply_pbvh_stroke`;当前 stable/single/pthread 均无该 WASM 入口,因此 46 项
全部返回 `N-017/BLOCKED/PAINT_PBVH_UNAVAILABLE`。即使未来出现入口session context 和
逐 brush desktop/WASM golden 未就绪时仍分别失败关闭;查询不会修改 Main revision、handle
或 WASM allocated bytes畸形字段返回完整标准 `ErrorReport`
## 仍然阻断
- N-017-A真实 PBVH、由 viewport 深度缓冲生成可见 vertex 集合,以及 brush falloff 桌面
golden基础 Mesh/UV hit、uniform-grid 候选查询可见性硬门已完成。
- N-017-Blimit/clean、已验证拓扑映射上的 mirror、桌面 brush/falloff 对照
- N-017-CBlender packed/UDIM tile Main transaction、dirty tile、色彩转换和原子保存当前
只有内容哈希绑定的浏览器内存 patch 边界
- N-017-A真实 PBVH 与 brush falloff 桌面 golden基础 Mesh/UV hit、uniform-grid 候选
查询可见性硬门和双后端 GPU depth 可见集已完成。当前不存在 PBVH WASM writer完整
brush inventory 由 `PAINT_PBVH_UNAVAILABLE` 明确阻断,不会把 bounded helper 当作成功
- N-017-Bclean/高级 Blender weight-paint operator、真实 PBVH brush/falloff 与更大拓扑的
桌面对照;当前 bounded limit/normalize/verified mirror 已完成
- N-017-CBlender packed/UDIM tile Main transaction、完整色彩转换和 `.blend` 内 image
tile 保存仍阻断;浏览器 dirty tile 的 OPFS 原子 asset/binding 边界已完成。
- N-017-D/Earmature golden、seam bleed、face mask、GPU dispose、quota、坏图和桌面 UI 对照;
vertex selection 与数值 mask 门已完成,不等同于完整 Paint 面/纹理遮罩系统。
@@ -50,7 +75,9 @@ transaction 已落地PBVH brush、texture paint 和 GPU/image 生命周期未
```bash
WEB_TEST_PORT=5203 npm --prefix web run test:e2e -- --grep "N-017 paint"
npm --prefix web run test:paint-roundtrip
WEB_TEST_PORT=5422 npm --prefix web run test:texture-paint-asset
WEB_TEST_PORT=5427 npm --prefix web run test:paint-pbvh-capability
```
`test:paint-roundtrip` 覆盖 CORNER color、vertex group patch、normalize、mirror 错误门、
undo/redo 与 save/reopen。
`test:paint-roundtrip` 覆盖 CORNER color、vertex group patch、normalize、limit、verified
mirror、undo/redo 与 save/reopen`test:weight-paint-golden` 对比 Blender 5.2 desktop golden

View File

@@ -1,7 +1,7 @@
# N-018 Physics 与 Simulation
状态:`BLOCKED`family capability、settings/dependency/cache manifest、错误帧门浏览器自有
BTF1 播放会话已落地desktop bake playback、WASM solver 和 bake job 未实现)
状态:`BLOCKED`family capability、settings/dependency/cache manifest、错误帧门浏览器自有
BTF1 播放会话及逐 family solver probe 已落地desktop bake playback、WASM solver 和 bake job 未实现)
## 已验证切片
@@ -34,13 +34,19 @@ BTF1 播放会话已落地desktop bake playback、WASM solver 和 bake job
10. N-018-C持久缓存集成两帧真实 BTF1 经过 content-addressed Simulation cache 写入,终止
Storage Worker 后由新 Worker 精确 range 读取第二帧并应用到 SceneIR帧 hash、magic、offset
和最终 object translation 均验证。
11. N-018-DM10-13 probe 门):七个 family 分别检查 runtime export、初始化、线程和内存只有
四门全过才允许 `LOCAL_SOLVER`。当前生产 inventory 没有 solver adapter全部明确路由到
`DESKTOP_SERVER_BAKE`。合成正例只验证门逻辑,不声明真实 WASM solver 或 cache decoder。
12. N-018-C/DM10-14 cache 门):七类 desktop/server bake cache 均绑定 cache schema、family、
Blender 5.2、source/settings/input/cache hash、frame range、总/逐帧 byte range/hash消费前对
实际 source、payload 和逐帧 bytes 复算 SHA-256。decoder/playback capability 仍不开放。
## 仍然阻断
- N-018-A/B从真实 Main 提取完整 family settings、collection/effector/collision 依赖。
- N-018-Cdesktop bake payload 的逐 family decoder、正式 viewport UI 播放控制和 100 帧
golden浏览器自有 transform frame decoder/SceneIR 播放会话已完成但不替代 Blender bake。
- N-018-D逐 family WASM solver 初始化、线程、内存和确定性验证
- N-018-D逐 family 真实 WASM solver adapter、初始化实现和确定性 golden探测/路由门已完成
- N-018-Ebake start/cancel/commit、服务端 job、故障恢复、进度与 UI。
## 验收
@@ -49,8 +55,10 @@ BTF1 播放会话已落地desktop bake playback、WASM solver 和 bake job
WEB_TEST_PORT=5204 npm --prefix web run test:e2e -- --grep "N-018 physics"
npm --prefix web run test:simulation-cache
npm --prefix web run test:physics-main-reader
npm --prefix web run test:physics-solver-probe
npm --prefix web run test:physics-cache-family
```
本轮在 Chromium 隔离端口复验 content-addressed cache 的 Worker restart、目标帧 range read、
帧 SHA-256、BTF1 seek/play/cancel迟到结果抑制通过;没有 desktop bake family decoder 或
solver因此 desktop playback/solver/bake 状态不变,继续为 `BLOCKED`
帧 SHA-256、BTF1 seek/play/cancel迟到结果抑制和逐 family solver probe 通过;没有 desktop
bake family decoder 或真实 solver因此 desktop playback/solver/bake 状态不变,继续为 `BLOCKED`

View File

@@ -1,7 +1,8 @@
# N-019 灯光与渲染
状态:`BLOCKED`Camera/Light/World/Scene metadata、Camera/Light/World 有界 Main 写回
Three exposure/shadow 映射已落地Scene 颜色管理 writer 和渲染等价未实现)
状态:`BLOCKED`Camera/Light/World/Scene metadata、Camera/Light/World 有界 Main 写回
Three exposure/shadow 映射和一条有界 Blender reference 图像指标闭环已落地Scene 颜色管理
writer、全域渲染等价和高级后端仍未实现
## 已验证切片
@@ -24,6 +25,30 @@ Three exposure/shadow 映射已落地Scene 颜色管理 writer 和渲染等
7. N-019-B色温部分`useTemperature:true` 时,共享 PBR 适配器把 80020000 K 的有界
黑体近似归一到 6500 K 中性白并转换为线性 RGB再乘入 Light color关闭色温时原始颜色
保持不变。主线程与 Offscreen Worker 共用该实现,数值门和原生 temperature 保存重开通过。
8. M11-01 字段表CameraIR、LightIR、WorldIR 及 Scene render/color-management 共 60 个叶字段
已逐项标注 reader/writer/main viewport/Offscreen viewport 状态AST checker 保证零漏项、零重复。
当前 24 COMPLETE、17 PARTIAL、19 BLOCKED未把 metadata-only 或近似映射提升为视觉 parity。
9. M11-02 字段闭环:支持的 Camera/Light/World writer 已在同一 Chromium 任务中完成 Main edit、
revision 单调的 undo/redo、保存、全新 Worker 重开和共享 PBR 映射;水平/垂直 sensor fit、
temperature linear RGB、shadow、spot/area 参数及 World 背景均有字段级断言。
10. M11-03 资源预算:主线程与 Offscreen 共用 schema 1 light/shadow/texture plannerWebGL2
总预算为 16 lights、4 x 1024 shadow maps均包含内置保留槽纹理同时限制数量、单边、
aggregate payload 与 decoded RGBA bytes。WebGPU 只冻结 64/8 x 2048 及 device-limit 下调合同,
未把未安装的 WebGPU renderer 标为可用。
11. M11-04 有界实时 referenceBlender 5.2 Eevee 256×256 fixture 绑定 source/generator/image
SHA-256SRGB8/STRAIGHT RGBA 比较输出 MAE、RMS、P95 channel、坏像素比例、前景 IoU 和
alpha 覆盖率。主线程与 Offscreen 生产 viewport 均为同一报告MAE 2.0433、RMS 5.4490、
P95 4、坏像素 0.004776、IoU 0.98534);非空但错误构图负例稳定返回
`RENDER_REFERENCE_MISMATCH`
12. M11-05 最终渲染路由schema 1 只让 bounded Eevee 的 WebGL2以及 capability 全通过的
WebGPU进入 `WEB_LOCAL_BOUNDED`Cycles、complex Eevee、Workbench 与 CUDA/OptiX/HIP/
Metal/oneAPI 固定为 `SERVER_JOB`。默认 endpoint 未配置时返回 `SERVER_JOB_UNAVAILABLE`
未知 SceneIR render engine 返回 `PLATFORM_CAPABILITY_UNAVAILABLE`,均不产生本地等价成功。
13. M11-06 server render jobschema 1 请求绑定 source `.blend` SHA-256/byte length/revision、
Blender 5.2 build SHA-256、规范化 render settings SHA-256 和 request SHA-256成功结果
绑定同一 provenance 并公开 output MIME/byte length/output SHA-256/result SHA-256。真实
loopback server 由 Blender 5.2 headless 打开 fixture 并输出 PNGsource、settings、build
和 output 篡改均在提交或消费前结构化拒绝。
## 仍然阻断
@@ -31,8 +56,11 @@ Three exposure/shadow 映射已落地Scene 颜色管理 writer 和渲染等
Blender/RNA 颜色管理 API 后才能开放。Camera writer 已完成。
- N-019-B/CAgX/Standard/Raw 的视觉等价、Area spread、Mist、DOF、
transparent sorting、probe 和高级 shadow 参数。
- N-019-DCycles/Freestyle/denoise 服务端 job 协议与结果 hash。
- N-019-Edesktop/Chromium 像素 golden、设备丢失和 1M triangles。
- N-019-DM11-05 已冻结 Cycles/复杂 Eevee/硬件后端的 server-only 路由M11-06 已完成
有界 server-style submit 和 source/settings/build/output hash provenance真实远程队列、
进度、取消、Freestyle 和 denoise job 仍未完成。
- N-019-E完整 desktop/Chromium 像素 parity、设备丢失和 1M trianglesM11-04 仅关闭固定
fixture 的有界 reference 指标门,不代表全场景或全色彩管理等价。
- N-019-B/C/EVolumeFloat32 NanoVDB WGSL 树遍历、有界积分、有限
temperature/color/emission grid 语义和显式 GPU resident LRU 已有真实 Chromium 数值/图像专项门;
自动缺页重绘、生产视口深度合成和 desktop/Chromium 三视角 golden 仍阻断,不能据此声明发布级体渲染。
@@ -41,5 +69,11 @@ Three exposure/shadow 映射已落地Scene 颜色管理 writer 和渲染等
```bash
npm --prefix web run test:lighting-roundtrip
npm --prefix web run test:lighting-field-parity
WEB_TEST_PORT=5545 npm --prefix web run test:lighting-field-roundtrip
WEB_TEST_PORT=5548 npm --prefix web run test:render-resource-budget
WEB_TEST_PORT=5552 npm --prefix web run test:render-reference
WEB_TEST_PORT=5556 npm --prefix web run test:render-routing
WEB_TEST_PORT=5560 npm --prefix web run test:server-render-job
WEB_TEST_PORT=5319 npm --prefix web run test:e2e -- --grep "N-019 Scene exposure"
```

View File

@@ -1,7 +1,7 @@
# N-020 Compositor
状态:`BLOCKED`GraphIR、有界 CPU executor真实 Main graph 结构 reader 已落地;完整节点
参数映射、WebGPU、HDR golden 和服务端执行未实现)
状态:`BLOCKED`GraphIR、有界 CPU executor真实 Main graph reader、四节点 WebGPU golden
与 Unsupported 全图执行门已落地;完整节点参数映射、通用 WebGPU、HDR golden 和服务端执行未实现)
## 已验证切片
@@ -27,14 +27,23 @@
Output 的动态 `Socket_0` 规范化为 GraphIR `Image`。桌面生成 fixture 经 WASM/Worker 后直接由
CPU executor 求值 Constant→Exposure→Invert→CompositeRGBA 结果通过;未连接的 Glare 仍保留
Unsupported 并使完整图 capability gate 保持阻断。
8. N-020-B/EM11-07 有界 WebGPU golden显式 allowlist 只包含 Constant Color、Exposure、
Invert、Composite。Blender 5.2 生成的四场景 fixture 经真实 WASM Main reader 后,生产 CPU
executor 与 Chromium WebGPU compute 对 2×2 `LINEAR_SRGB` Float32 RGBA 输出逐字节 SHA-256
相同CPU-only、资源输入、未声明节点、断链和错误 socket 在 shader 编译前结构化阻断。
9. N-020-DM11-08 全图执行门CPU 与 frame-cache 入口在求值、取消回调和 cache hit 前扫描
完整 graph即使 Unsupported 节点未连接到 Composite也返回
`COMPOSITOR_NODE_UNSUPPORTED`。真实 Blender 5.2 Main fixture 的 Glare node name/type/
`blenderType`、graph JSON 与 revision 在失败前后完全不变;预置 cache 不能绕过该门。
## 仍然阻断
- N-020-AMain graph 写回,以及 Transform、非默认 Invert、Alpha Over、Blur、Mix、Image/Render
Layer 的逐节点参数与 resource/pass reader基础真实图结构、常量色、Exposure、默认 Invert、
Viewer/Composite 已完成。
- N-020-B/CWebGPU executor、tile scheduler、OPFS 持久 frame cache、增量 invalidation 和 GPU
disposeCPU 周期取消和内容寻址内存 LRU 已完成。
- N-020-B/CM11-07 只实现四节点、无资源、单输入链的有界 WebGPU compute通用 WebGPU
executor、tile scheduler、OPFS 持久 frame cache、增量 invalidation 和生产 GPU 调度仍阻断;
CPU 周期取消和内容寻址内存 LRU 已完成。
- N-020-D服务端 Blender job、source hash 和结果提交。
- N-020-Edesktop HDR/alpha/color-space golden、OOM/fault/device-loss。
@@ -43,4 +52,6 @@
```bash
WEB_TEST_PORT=5320 npm --prefix web run test:e2e -- --grep "N-020 CPU compositor"
npm --prefix web run test:compositor-main-reader
WEB_TEST_PORT=5562 npm --prefix web run test:compositor-node-golden
WEB_TEST_PORT=5565 npm --prefix web run test:compositor-unsupported-gate
```

View File

@@ -1,7 +1,9 @@
# N-021 Sequencer 与音频
状态:`BLOCKED`strip schema、真实 Main reader、确定性时间编辑、长媒体有界索引/seek/cache
和 codec 能力门已落地Main 写回、完整媒体解码/渲染、音频波形和服务端编码仍未实现)
状态:`BLOCKED`strip schema、真实 Main reader、确定性时间编辑、长媒体有界索引/seek/cache
三类实际 runtime codec probe、source/decode-bound 首帧 proxy cache、三类迟到结果 revision
gate、最终编码 server-export 路由和实时 AudioContext 恢复门已落地Main 写回、完整媒体
解码/渲染、音频波形、A/V sync、实际混音和真正服务端编码 job 仍未实现)
## 已验证切片
@@ -14,8 +16,8 @@
映射,避免左右片段复用越界源帧。
4. N-021-B/C部分`resolveSequencerFrame` 在切分边界解析当前顶层 strip、source frame
与依赖META 覆盖的子 strip 和 inactive dependency 不会泄漏到渲染帧。
5. N-021-C/D运行时只报告 WebCodecs/HTMLMedia 需要精确 probecodec 必须
出现在已验证 MIME 集合中才可放行,本地编码固定为 `BLOCKED`
5. N-021-C/D运行时 inventory 只报告 WebCodecs/HTMLMedia 需要精确 probe旧的
MIME 集合不能作为 READY receipt,本地编码固定为 `BLOCKED`
6. N-021-A部分Blender 5.2 `Scene.ed/Editing.seqbase` 读取 Scene、Movie、Image、Sound、
Meta 和协议支持的 Effect显示范围由持久 `start/startofs/endofs/len` 计算,保留 channel、
mute/lock、相对媒体路径、24/1.001 FPS 和 effect input stable ID。绝对路径、未知类型、
@@ -32,16 +34,45 @@
仍 residenttimeline/current frame/asset hashes 作为内容寻址 session manifest 写入 OPFS终止
StorageWorker 与 media Worker 后在 frame 765432 恢复。session SHA-256 固定为
`d2e7e3c5ed9ae4fda6fe358cebb474f5774f1d2037dff3df9b6dfde9e0bebd2d`
11. 上述门只放行 fixture 的 IMAGE/SOUND 原始本地资源读取,不声称 WebCodecs MOVIE decode、
waveform/proxy 生成或最终编码完成;`video/mp4`local encoding 仍结构化阻断。
11. 上述 V1 长媒体门只放行 fixture 的 IMAGE/SOUND 原始本地资源读取,不声称 WebCodecs MOVIE
seek、waveform/proxy 生成或最终编码完成local encoding 仍结构化阻断。
12. M11-09 runtime codec probeschema 1 request/result 绑定 IMAGE/SOUND/MOVIE family、规范 MIME、
byte length 和 source SHA-256且不接收 source path/扩展名字段。Chromium 用 ImageBitmap
解码 8×8 PNG用固定 48 kHz OfflineAudioContext 解码 1 秒 WAV用 HTMLMedia 加载、seek
并绘制 16×16 两帧 H.264 MP4三类均 READY。错误扩展名不影响结果损坏 bytes、hash
drift、MIME/family 和 backend 伪造均返回 `SEQUENCER_CODEC_UNSUPPORTED`
13. M11-10 proxy cacheschema 1 identity 绑定 MOVIE source family/MIME/bytes/SHA-256、当前
READY HTMLMedia receipt、SRGB8/STRAIGHT RGBA8 profile 和 source framepayload 再独立绑定
byte length/SHA-256。Chromium 从真实 H.264 初始 decoded frame 生成 8x8/256-byte proxy
一帧预算 LRU 发生确定性淘汰content-addressed payload/manifest 经新 Storage Worker 重开
后复验。source、decode receipt、identity 或 payload 漂移均在消费前稳定阻断。
14. M11-11 media revision gateSEEK/SCRUB/DECODE 使用同一 schema 1 request绑定 timeline
ID/revision、单调 request revision、operation 和 framecompleted result 必须逐字段回显并绑定
source frame/payload hash。Chromium 中旧 SEEK 晚于新 SCRUB 返回、真实 H.264 DECODE 跨
timeline replacement 返回及伪造 result 全部在 publish/cache callback 前成为
`STALE/REVISION_CONFLICT`;只有当前 SCRUB 与当前 DECODE 发布。
15. M11-12 final export routeschema 1 将真实 Main timeline ID/revision、source `.blend`
SHA-256、帧范围/帧率、分辨率和 container/video/audio codec 绑定到 settings/request SHA-256。
无 endpoint 时返回 `SERVER_EXPORT/BLOCKED/SEQUENCER_EXPORT_SERVER_UNAVAILABLE`;有 endpoint
时只返回 `SERVER_EXPORT_REQUIRED`。Chromium 中注入和实际探测到的 `VideoEncoder` 都不能
`localEncoding``BLOCKED` 提升为本地完成。
16. M11-13 audio session recoveryschema 1 分开报告
`UNAVAILABLE/SUSPENDED/RUNNING/CLOSED` context 与 `BLOCKED/SILENT/ENABLED` output
revision 随 initialize/mute/resume/suspend/close 单调推进。Chromium 在真实用户手势内创建
`AudioContext`,通过 suspend、mute、muted resume、unmute、二次 suspend/resume 和 close
mute 将 gain 归零unmute 恢复 0.75close 再归零并断开节点。API/构造器缺失与 resume
failure 分别稳定返回 `SEQUENCER_AUDIO_DEVICE_UNAVAILABLE`
`SEQUENCER_AUDIO_RESUME_FAILED`,不会误报输出启用。
## 仍然阻断
- N-021-A/BMain strip 写回、非 CROSS transition/modifier 完整参数、undo/redo 和 save/reopen
基础真实 reader 与 CROSS/GAMMA_CROSS 帧描述已完成。
- N-021-CWebCodecs 精确 seek/decode、音频 waveform、proxy 生成、A/V sync、丢帧和
损坏媒体处理。
- N-021-D浏览器不支持的 codec、混音与最终编码的服务端 Blender job
- N-021-CM11-09/10/11/13 完成三类短 fixture 的初始实际解码门、MOVIE 初始帧 RGBA8 proxy
cache identity、迟到结果 publish/cache gate 和实时 AudioContext 生命周期WebCodecs 帧精确
seek/decode、多帧 proxy、音频 waveform、A/V sync、实际混音、丢帧和长媒体损坏恢复仍阻断
- N-021-DM11-12 已冻结最终编码的 server-export 路由与请求 identity真正服务端 Blender
encode job、进度/取消、混音和输出结果校验仍阻断。
- N-021-EV1 有界 Chromium/OPFS 长媒体门已完成;完整桌面/Chromium 解码/渲染 golden 仍阻断。
## 验收
@@ -50,4 +81,9 @@
WEB_TEST_PORT=5321 npm --prefix web run test:e2e -- --grep "N-021 sequencer"
npm --prefix web run test:sequencer-main-reader
npm --prefix web run test:long-media-performance
WEB_TEST_PORT=5570 npm --prefix web run test:sequencer-codec-probe
WEB_TEST_PORT=5573 npm --prefix web run test:sequencer-media-cache
WEB_TEST_PORT=5576 npm --prefix web run test:sequencer-media-revision
WEB_TEST_PORT=5579 npm --prefix web run test:sequencer-final-export
WEB_TEST_PORT=5586 npm --prefix web run test:sequencer-audio-recovery
```

View File

@@ -1,6 +1,6 @@
{
"schemaVersion": 2,
"updatedAt": "2026-08-14",
"updatedAt": "2026-08-17",
"source": "docs/BLENDER_5_2_WEB_FEATURE_PARITY.md",
"parityStatusEnum": ["COMPLETE", "BLOCKED"],
"releaseClassEnum": ["LOCAL_EXACT", "LOCAL_BOUNDED", "SERVER", "EXCLUDED"],
@@ -13,10 +13,10 @@
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["C3-roundtrip", "D2-nanovdb-bounded-webgpu-integration", "E2-vdb-network-worker-quota-tamper-rollback-faults"],
"v1ExcludedSlices": ["C2-new-external-font-import", "D2-nanovdb-production-viewport-automatic-page-fault-depth-composition", "C3-volume-combined-asset-viewport-reopen", "E1-volume-glb-usd-loss-desktop-chromium-golden", "E2-vdb-large-stream-device-loss-oom"],
"v1ExcludedSlices": ["C2-new-external-font-import", "D2-nanovdb-production-viewport-automatic-page-fault-depth-composition", "E1-volume-glb-usd-loss-desktop-chromium-golden"],
"roadmapStatus": "in_progress",
"completedSlices": ["A1", "A2-malformed-binary-partial", "A2-integer-overflow-fixtures", "A2-multichunk-attribute-completeness", "B2", "B3-metadata", "B3-vdb-conversion-request-boundary", "B3-nanovdb-manifest-range-hash-protocol", "B3-nanovdb-serial-range-streamer", "B3-vdb-stage-capability-gates", "B3-vdb-real-resource-license-hash-catalog", "B3-desktop-openvdb13-nanovdb32-converter", "B3-native-conversion-determinism-malformed-input", "B3-vdb-server-job-isolation-cancel-timeout", "B3-vdb-desktop-server-hash-equality", "B3-nanovdb-http-retry-if-range-body-resume", "C1-topology-partial", "C1-handle-points-partial", "C1-handle-preview-raycast-partial", "C1-handle-identity-gizmo-main-roundtrip", "C1-multi-handle-selection-highlight-bounded-commit", "C1-gizmo-revision-delta-transaction-boundary", "C1-continuous-handle-gizmo-preview-single-commit", "C1-handle-local-origin-orientation-gizmo", "C1-rename-partial", "C1-create-delete-poly-partial", "C1-poly-bezier-nurbs-1d-conversion", "C1-multispline-create-delete-bulk-handle-cyclic-transaction", "C1-surface-2d-topology-transaction", "C2-font-geometry-partial", "C2-font-layout-partial", "C2-font-character-style-textbox-roundtrip", "C2-existing-packed-vfont-style-links", "C2-builtin-font-evaluation-exact", "C3-roundtrip", "C3-volume-main-properties-save-reopen", "C3-nanovdb-opfs-binding-worker-reopen", "D1-raycast-partial", "D1-offscreen-vert-edge-partial", "D1-selection-history-partial", "D1-cross-object-history-range-patch", "D1-handle-identity-axis-gizmo", "D2-partial", "D2-nanovdb-float32-cpu-wgsl-sampling", "D2-nanovdb-bounded-webgpu-integration", "D2-webgpu-device-loss-session-recovery", "D2-nanovdb-grid-material-mapping", "D2-nanovdb-explicit-resident-page-lru-recovery", "E1-partial", "E1-desktop-geometry-golden", "E1-true-2d-surface-desktop-golden", "E1-glb-evaluated-nonmesh-roundtrip-partial", "E1-glb-curve-line-surface-mesh-evaluated", "E1-usda-four-object-desktop-roundtrip", "E1-pointcloud-curves-hair-glb-usd-loss-fixture", "E2-1M-chromium", "E2-chromium-worker-recovery", "E2-opfs-quota-chromium", "E2-vdb-network-worker-quota-tamper-rollback-faults"],
"blockedSlices": ["C2-new-external-font-import", "D2-nanovdb-production-viewport-automatic-page-fault-depth-composition", "C3-volume-combined-asset-viewport-reopen", "E1-volume-glb-usd-loss-desktop-chromium-golden", "E2-vdb-large-stream-device-loss-oom"],
"completedSlices": ["A1", "A2-malformed-binary-partial", "A2-integer-overflow-fixtures", "A2-multichunk-attribute-completeness", "B2", "B3-metadata", "B3-vdb-conversion-request-boundary", "B3-nanovdb-manifest-range-hash-protocol", "B3-nanovdb-serial-range-streamer", "B3-vdb-stage-capability-gates", "B3-vdb-real-resource-license-hash-catalog", "B3-desktop-openvdb13-nanovdb32-converter", "B3-native-conversion-determinism-malformed-input", "B3-vdb-server-job-isolation-cancel-timeout", "B3-vdb-desktop-server-hash-equality", "B3-nanovdb-http-retry-if-range-body-resume", "C1-topology-partial", "C1-handle-points-partial", "C1-handle-preview-raycast-partial", "C1-handle-identity-gizmo-main-roundtrip", "C1-multi-handle-selection-highlight-bounded-commit", "C1-gizmo-revision-delta-transaction-boundary", "C1-continuous-handle-gizmo-preview-single-commit", "C1-handle-local-origin-orientation-gizmo", "C1-rename-partial", "C1-create-delete-poly-partial", "C1-poly-bezier-nurbs-1d-conversion", "C1-multispline-create-delete-bulk-handle-cyclic-transaction", "C1-surface-2d-topology-transaction", "C2-font-geometry-partial", "C2-font-layout-partial", "C2-font-character-style-textbox-roundtrip", "C2-existing-packed-vfont-style-links", "C2-builtin-font-evaluation-exact", "C3-roundtrip", "C3-volume-main-properties-save-reopen", "C3-nanovdb-opfs-binding-worker-reopen", "C3-volume-combined-asset-viewport-reopen", "D1-raycast-partial", "D1-offscreen-vert-edge-partial", "D1-selection-history-partial", "D1-cross-object-history-range-patch", "D1-handle-identity-axis-gizmo", "D2-partial", "D2-nanovdb-float32-cpu-wgsl-sampling", "D2-nanovdb-bounded-webgpu-integration", "D2-webgpu-device-loss-session-recovery", "D2-nanovdb-grid-material-mapping", "D2-nanovdb-explicit-resident-page-lru-recovery", "D2-nanovdb-production-viewport-automatic-page-fault", "E1-partial", "E1-desktop-geometry-golden", "E1-true-2d-surface-desktop-golden", "E1-glb-evaluated-nonmesh-roundtrip-partial", "E1-glb-curve-line-surface-mesh-evaluated", "E1-usda-four-object-desktop-roundtrip", "E1-pointcloud-curves-hair-glb-usd-loss-fixture", "E1-volume-desktop-main-offscreen-pixel-golden", "E2-1M-chromium", "E2-chromium-worker-recovery", "E2-opfs-quota-chromium", "E2-vdb-network-worker-quota-tamper-rollback-faults", "E2-vdb-large-stream-device-loss-oom"],
"blockedSlices": ["C2-new-external-font-import", "D2-nanovdb-production-viewport-automatic-page-fault-depth-composition", "E1-volume-glb-usd-loss-desktop-chromium-golden"],
"excludedSlices": [],
"acceptance": ["web:test:nonmesh-roundtrip", "web:test:nonmesh-desktop-golden", "web:test:nonmesh-glb-blender-roundtrip", "web:test:nonmesh-usd-serialization", "web:test:nonmesh-usd-blender-roundtrip", "web:test:nonmesh-binary", "web:test:selection-history", "web:test:nonmesh-interaction", "web:test:vdb", "web:test:vdb-availability", "web:test:vdb-native", "web:test:vdb-server", "web:test:vdb-opfs", "web:test:vdb-webgpu", "web:test:vdb-viewport", "web:test:vdb-faults", "web:e2e:N-015|non-mesh", "web:e2e:real OPFS quota"],
"dependencies": []
@@ -72,7 +72,7 @@
"v1RequiredSlices": ["B-world-scene-render-delta-roundtrip", "B-C-nanovdb-float32-wgsl-bounded-ray-integration"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E", "B-C-nanovdb-production-viewport-paging-advanced-material", "E-volume-desktop-chromium-pixel-golden"],
"roadmapStatus": "planned",
"completedSlices": ["A-camera-light-world-scene-reader-partial", "A-main-camera-dof-properties-partial", "A-main-light-world-properties-partial", "A-white-balance-integrity-gate", "B-three-exposure-shadow-mapping-partial", "B-bounded-kelvin-linear-light-color", "B-world-scene-render-delta-roundtrip", "B-volume-material-manifest-boundary", "B-C-nanovdb-float32-wgsl-bounded-ray-integration"],
"completedSlices": ["A-camera-light-world-scene-reader-partial", "A-main-camera-dof-properties-partial", "A-main-light-world-properties-partial", "A-white-balance-integrity-gate", "B-three-exposure-shadow-mapping-partial", "B-bounded-kelvin-linear-light-color", "B-world-scene-render-delta-roundtrip", "B-volume-material-manifest-boundary", "B-C-nanovdb-float32-wgsl-bounded-ray-integration", "D-final-render-server-routing-fail-closed", "D-server-render-source-build-settings-output-hash-binding", "E-bounded-realtime-blender-reference-image-metrics"],
"blockedSlices": ["A", "B", "C", "D", "E", "B-C-nanovdb-production-viewport-paging-advanced-material", "E-volume-desktop-chromium-pixel-golden"],
"acceptance": ["web:test:lighting-roundtrip", "web:e2e:N-019 Scene exposure"],
"dependencies": ["N-018"]
@@ -86,7 +86,7 @@
"v1RequiredSlices": ["B-real-main-exposure-invert-cpu-chain", "D-unsupported-node-preservation-gate"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E"],
"roadmapStatus": "planned",
"completedSlices": ["A-graph-resource-cycle-schema", "A-main-graph-structure-reader-partial", "A-main-exposure-default-invert-parameter-reader", "B-bounded-cpu-executor-partial", "B-real-main-exposure-invert-cpu-chain", "C-image-operation-budget-cancel-partial", "C-content-addressed-frame-lru-cache", "D-unsupported-node-preservation-gate"],
"completedSlices": ["A-graph-resource-cycle-schema", "A-main-graph-structure-reader-partial", "A-main-exposure-default-invert-parameter-reader", "B-bounded-cpu-executor-partial", "B-real-main-exposure-invert-cpu-chain", "B-webgpu-constant-exposure-invert-golden-partial", "B-D-unsupported-full-graph-execution-block", "C-image-operation-budget-cancel-partial", "C-content-addressed-frame-lru-cache", "D-unsupported-node-preservation-gate"],
"blockedSlices": ["A", "B", "C", "D", "E"],
"acceptance": ["web:test:compositor-main-reader", "web:e2e:N-020 CPU compositor"],
"dependencies": ["N-019"]
@@ -100,7 +100,7 @@
"v1RequiredSlices": ["B-real-main-cross-still-frame-resolution", "C-runtime-codec-probe-gate"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E"],
"roadmapStatus": "planned",
"completedSlices": ["A-strip-resource-schema", "A-main-strip-timeline-reader-partial", "B-deterministic-move-trim-split-partial", "B-source-frame-seek", "B-active-frame-dependency-resolution", "B-cross-transition-progress-input-resolution", "B-real-main-cross-still-frame-resolution", "C-runtime-codec-probe-gate"],
"completedSlices": ["A-strip-resource-schema", "A-main-strip-timeline-reader-partial", "B-deterministic-move-trim-split-partial", "B-source-frame-seek", "B-active-frame-dependency-resolution", "B-cross-transition-progress-input-resolution", "B-real-main-cross-still-frame-resolution", "C-runtime-codec-probe-gate", "C-runtime-image-sound-movie-byte-decode-probe", "C-source-decode-bound-movie-proxy-cache", "C-seek-scrub-decode-revision-gate", "C-audio-context-suspend-device-mute-recovery", "D-final-export-server-routing-fail-closed"],
"blockedSlices": ["A", "B", "C", "D", "E"],
"acceptance": ["web:test:sequencer-main-reader", "web:e2e:N-021 sequencer"],
"dependencies": ["N-020"]

View File

@@ -1,8 +1,8 @@
{
"schemaVersion": 4,
"source": "docs/status/parity-ledger.json",
"sourceSha256": "1e16518a25c6b6bed4ab7f605ea1ad5babe529f2842c858b20ae6daae30bd478",
"generatedAt": "2026-08-15T05:37:25.215Z",
"sourceSha256": "0a9b4c1026c42b5f77869f222b1531601ed229184a1d1737e74047c7b3406730",
"generatedAt": "2026-08-17T08:22:00.415Z",
"families": [
{
"id": "N-015",
@@ -18,9 +18,7 @@
"v1ExcludedSlices": [
"C2-new-external-font-import",
"D2-nanovdb-production-viewport-automatic-page-fault-depth-composition",
"C3-volume-combined-asset-viewport-reopen",
"E1-volume-glb-usd-loss-desktop-chromium-golden",
"E2-vdb-large-stream-device-loss-oom"
"E1-volume-glb-usd-loss-desktop-chromium-golden"
],
"roadmapStatus": "in_progress",
"completedSlices": [
@@ -61,6 +59,7 @@
"C3-roundtrip",
"C3-volume-main-properties-save-reopen",
"C3-nanovdb-opfs-binding-worker-reopen",
"C3-volume-combined-asset-viewport-reopen",
"D1-raycast-partial",
"D1-offscreen-vert-edge-partial",
"D1-selection-history-partial",
@@ -72,6 +71,7 @@
"D2-webgpu-device-loss-session-recovery",
"D2-nanovdb-grid-material-mapping",
"D2-nanovdb-explicit-resident-page-lru-recovery",
"D2-nanovdb-production-viewport-automatic-page-fault",
"E1-partial",
"E1-desktop-geometry-golden",
"E1-true-2d-surface-desktop-golden",
@@ -79,17 +79,17 @@
"E1-glb-curve-line-surface-mesh-evaluated",
"E1-usda-four-object-desktop-roundtrip",
"E1-pointcloud-curves-hair-glb-usd-loss-fixture",
"E1-volume-desktop-main-offscreen-pixel-golden",
"E2-1M-chromium",
"E2-chromium-worker-recovery",
"E2-opfs-quota-chromium",
"E2-vdb-network-worker-quota-tamper-rollback-faults"
"E2-vdb-network-worker-quota-tamper-rollback-faults",
"E2-vdb-large-stream-device-loss-oom"
],
"blockedSlices": [
"C2-new-external-font-import",
"D2-nanovdb-production-viewport-automatic-page-fault-depth-composition",
"C3-volume-combined-asset-viewport-reopen",
"E1-volume-glb-usd-loss-desktop-chromium-golden",
"E2-vdb-large-stream-device-loss-oom"
"E1-volume-glb-usd-loss-desktop-chromium-golden"
],
"excludedSlices": [],
"acceptance": [
@@ -274,7 +274,10 @@
"B-bounded-kelvin-linear-light-color",
"B-world-scene-render-delta-roundtrip",
"B-volume-material-manifest-boundary",
"B-C-nanovdb-float32-wgsl-bounded-ray-integration"
"B-C-nanovdb-float32-wgsl-bounded-ray-integration",
"D-final-render-server-routing-fail-closed",
"D-server-render-source-build-settings-output-hash-binding",
"E-bounded-realtime-blender-reference-image-metrics"
],
"blockedSlices": [
"A",
@@ -317,6 +320,8 @@
"A-main-exposure-default-invert-parameter-reader",
"B-bounded-cpu-executor-partial",
"B-real-main-exposure-invert-cpu-chain",
"B-webgpu-constant-exposure-invert-golden-partial",
"B-D-unsupported-full-graph-execution-block",
"C-image-operation-budget-cancel-partial",
"C-content-addressed-frame-lru-cache",
"D-unsupported-node-preservation-gate"
@@ -362,7 +367,12 @@
"B-active-frame-dependency-resolution",
"B-cross-transition-progress-input-resolution",
"B-real-main-cross-still-frame-resolution",
"C-runtime-codec-probe-gate"
"C-runtime-codec-probe-gate",
"C-runtime-image-sound-movie-byte-decode-probe",
"C-source-decode-bound-movie-proxy-cache",
"C-seek-scrub-decode-revision-gate",
"C-audio-context-suspend-device-mute-recovery",
"D-final-export-server-routing-fail-closed"
],
"blockedSlices": [
"A",