From 9037eee1570b71f50f2aa5e6ef1bccd755cb4ec4 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Fri, 4 Sep 2026 07:40:40 +0800 Subject: [PATCH] chore(web): continuous handoff WBV2-P1170-001 --- docs/EXECUTION_QUEUE.md | 6 +- docs/status/WBV2-P1170-001.md | 9 + docs/tasks/WBV2-P1170-001.md | 48 + .../wbv2-compositor-8ee7e86684d23363.blend | Bin 0 -> 100829 bytes tests/golden/WBV2-P1170-000/manifest.json | 53 + .../WBV2-P1170-000/module-execution-plan.json | 10039 ++++++++++++++++ .../compositor-main-reader-production.json | 89 + tests/golden/WBV2-P1170-001/manifest.json | 134 + .../golden/WBV2-P1170-001/module-receipt.json | 172 + tests/golden/WBV2-P1170-001/module-run.log | 49 + tests/golden/WBV2-P1170-001/task-context.json | 217 + tests/golden/WBV2/task-catalog.jsonl | 2 + tests/golden/WBV2/task-index.json | 2 +- 13 files changed, 10816 insertions(+), 4 deletions(-) create mode 100644 docs/status/WBV2-P1170-001.md create mode 100644 docs/tasks/WBV2-P1170-001.md create mode 100644 tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend create mode 100644 tests/golden/WBV2-P1170-000/manifest.json create mode 100644 tests/golden/WBV2-P1170-000/module-execution-plan.json create mode 100644 tests/golden/WBV2-P1170-001/compositor-main-reader-production.json create mode 100644 tests/golden/WBV2-P1170-001/manifest.json create mode 100644 tests/golden/WBV2-P1170-001/module-receipt.json create mode 100644 tests/golden/WBV2-P1170-001/module-run.log create mode 100644 tests/golden/WBV2-P1170-001/task-context.json diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index a3caba6ac..47620ce8d 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -15,9 +15,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P1169-001` | -| parent manifest | `tests/golden/WBV2-P1169-000/manifest.json` | -| 任务卡 | [`tasks/WBV2-P1169-001.md`](tasks/WBV2-P1169-001.md) | +| 当前任务 | `WBV2-P1170-001` | +| parent manifest | `tests/golden/WBV2-P1170-000/manifest.json` | +| 任务卡 | [`tasks/WBV2-P1170-001.md`](tasks/WBV2-P1170-001.md) | | 专项验收 | `node tools/web/check-execution-control-plane.mjs` | | legacy coverage checkpoint | `M16-GAP-00282` | | legacy coverage parent | `tests/golden/M16-GAP-00281/manifest.json` | diff --git a/docs/status/WBV2-P1170-001.md b/docs/status/WBV2-P1170-001.md new file mode 100644 index 000000000..3a76b0be9 --- /dev/null +++ b/docs/status/WBV2-P1170-001.md @@ -0,0 +1,9 @@ +# WBV2-P1170-001 status + +- task: `WBV2-P1170-001`; module: `AUTO_COMPOSITOR_NATIVE_NODE_READER`; status: `done` +- source hashes stable: `true`; commands passed: `4` +- existing production evidence reused: `false`; skipped commands: `0` +- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt +- dynamic source inventory: `3745` units; verified `574`; unverified `3171`; planning estimate `5200` (non-binding); this-segment binding delta: `8` +- historical 6900-entry inventory remains read-only; full-family parity: `false` +- nextTask: `NONE` diff --git a/docs/tasks/WBV2-P1170-001.md b/docs/tasks/WBV2-P1170-001.md new file mode 100644 index 000000000..54c4f3172 --- /dev/null +++ b/docs/tasks/WBV2-P1170-001.md @@ -0,0 +1,48 @@ +# WBV2-P1170-001: verify auto-generated native compositor reader batch + +- task: WBV2-P1170-001 +- parent: WBV2-P1170-000 +- status: in_progress +- gap: capability:AUTO_COMPOSITOR_NATIVE_NODE_READER +- ownerFamily: NODES +- targetImplementationClass: LOCAL_EXACT +- batchId: WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363 +- selectedRecordIds: ["node:CompositorNodeImage","node:CompositorNodeImageCoordinates","node:CompositorNodeImageInfo","node:CompositorNodeInpaint","node:CompositorNodeKeying","node:CompositorNodeKeyingScreen","node:CompositorNodeKuwahara","node:CompositorNodeLensdist"] +- commandBudget: max=48; read/exploration max=16 +- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1170-001 --write` + +## 目标 + +以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 CompositorNodeImage, CompositorNodeImageCoordinates, CompositorNodeImageInfo, CompositorNodeInpaint, CompositorNodeKeying, CompositorNodeKeyingScreen, CompositorNodeKuwahara, CompositorNodeLensdist 的真实 modifier/RNA 元数据。 + +## 输入与范围 + +- Blender modifier sources: `blender-5.2.0/source/blender/modifiers/intern/` +- RNA source: `blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc` +- Native reader: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Fixtures: `tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend` +- Chromium test: `web/tests/e2e/compositor-main-reader-production.spec.ts` +- Selected modifier units: `modifier-source:CompositorNodeImage`, `modifier-source:CompositorNodeImageCoordinates`, `modifier-source:CompositorNodeImageInfo`, `modifier-source:CompositorNodeInpaint`, `modifier-source:CompositorNodeKeying`, `modifier-source:CompositorNodeKeyingScreen`, `modifier-source:CompositorNodeKuwahara`, `modifier-source:CompositorNodeLensdist` +- Selected RNA units: none (source-only dependency batch) + +## 验收 + +- one shared Main/WASM/Worker/Chromium chain observes every selected type +- malformed input is rejected without Main mutation +- save/reopen and deterministic second read are exact +- only Chromium is used; JS simulation and per-API duplicate workers are forbidden +- each selected source unit receives an explicit hash-bound coverage binding +- `node tools/web/check-task-context.mjs --task WBV2-P1170-001 --write` + +## 失败边界 + +- any missing source, unsupported type, hash drift, malformed data or non-exact recovery keeps the batch `in_progress`/`blocked` +- partial batch success never claims the omitted family; historical inventory remains read-only + +## 交付与回滚 + +- Receipt: `tests/golden/WBV2-P1170-001/module-receipt.json` +- Aggregate production evidence: `tests/golden/WBV2-P1170-001/modifier-reader-batch-production.json` +- Manifest: `tests/golden/WBV2-P1170-001/manifest.json` +- Status: `docs/status/WBV2-P1170-001.md` +- Rollback: restore WBV2-P1170-000 as queue parent without rewriting prior evidence. diff --git a/tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend b/tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend new file mode 100644 index 0000000000000000000000000000000000000000..38debf9796e239c997f04011fd6fd649406ade3f GIT binary patch literal 100829 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%0D$PRhmpD*I4XHr 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%0DFDN$K-!?QlcdaHrbYlk zlm@CCbf~h%2N^w_=K=+Q=~!UEhpQHW0X21$#2hBb2%Xf3;O!BR!VvCR5wjhZ77R?v z`jpWC3IO+{A_F#CyrrdjF%Nkz4-tA%(`>~=we*sB6PKPOF5TETvm|kkA})zm*7!f_ z;$;Qnke$`8H?ECCjB9TJlzSZbPx905LuRg61Ld zwoR_onl3oO6%@h-1iGLdq;Rb8fEzYYY{4ll7znO08P8mw08WIb#)Kq7G^r4JOf-

;6dlv2Y`tOuGA z%Brl1apH!se7XBa2y1tw3ZyL*)RP6w+2c$H*MN=!x+)?z1iiFrpU&Z*(})c-=k@gY zfyysf#-)O$pbBUz+8q|B26Ps9ddgRVda{JkRS~)2G-4yo+2f2@&`TRI=k@e4l0%UR zR6tI^=sD47fB|goTbemKTe_r~t5{*Nnv_lS)4njIt`N1BUDbBZ>PQNaISXAVKXLN9 zY&aYOe_cnGzkWr$wy~qtM>3g9R?1wm(u2;Q1(pm$l28c!^Q7#c zk<3RpTBhP#h%)j4TP=N%Dl3gsy`MMbIIe}c3A%+;%Z1+Yo98Q)Yh8%-%&Ce?$eDU)% z>$YplimXk1l1;<{+cK+rH@&9qG&L<1MVok(6G-7Sv<0%0l}`5$zW-T*J{c!}mhxPd zA}o{YOeY_p&9s=zfBvil6)I^;d6<-y-U8@F>~f7?G#Jelvyym}5BM*(DZB1M6A?VtcG>&uq~^o0fa0lg#;VGwyK4n2pDG-`A> z91cbi8)?$0dEFXPYg)8~vfAfAFX5qV3Lti*Vc83)h8E--xAlORHO9Xjfn2`-w0vRz z0e?t>@CYEq;m`Xh1&;@#q_E1lC*_K^*95qfF2X*6U6G-gGbyfa;UsmOk zUyt&q`nH0kBa8BnL&jNAq+|GXRX8o&vb)^u%EIcpNjTlAnxZbMRc)@XS(YRm63*Jf ziC-6PU)EjQ&8q8GbBb!SOdvZP7$M8sK z0!{#)PtF3uVQbci0!a6w%#~miT?3HlJP{3jV zhZwH==yaQ_f23AyR$WopyDBej7i)S*DoYz=6_l2t(|;&3jiTcibw`dyzenh{dTc)l zT(>Q;z{tCqm_gB+ig)GREDMS9TET|8_qMnPO7x1REYTo=gW{g4)Z6`_%1_w^m%?*^rIp#%g)Kpc64=goOr*g z-2AZs8^PZGcF`Y7&-rn)F!y`4t;)4f zBgpu8cA@p$gyAnRSPcX;TUi$9dS zo?3rLG?M4@naBzF%oH$(iZLb~3~yeeyJ(-!1^fw!%?07|md@ceU$VisSXwjPQYJNM z^X^3W`-fe+M(jf%93(2EJlJtrdL%mo6H@>H00cl7BVV5a0jwbr6f>Ct9>pIFMc_@o z`7T}n1qnXUK!5@PCg~3W2p~o%AVO$A2HX%ud=pU|5Cz#kWCZ}^9XCqgybUJIFA1%$ zk*gfW7N$|s+>E?1<8O?7B@o1?{`x|Q>!o<)Aq=OfdnMabNRX`Yqk1m5J3z;$+`+II z)1dE>u{ds3yvvJovUu>#KVxuPMu{Mi-OK8G+l;I9_YXMb>d-z-xT2KTCt_bP;SoBB{hkCG6p489|Ge(W-9t zk5xTgEF7-&HODjUlYg~-H=m~!oW%Dfo928rvfU11ry5|U*L&Kf!{PzfLX}ZU5THI`a?;SO1H=x3>*72D484@%YZVa1&k31|a>e{%V707dttbg+ zs_JE>Wc~;@iH1;$s;)X*@*0I{D%r~DlJ=&y4~Nf@F(=AEtUgkR_}idQbs#wh%(Y}J z)_14`o$oS#Gz(KXVc=%U%s9@o^e<^7lmChK=z3S|npSP;>&>917VVISxQ*3a;I0q}C>i&^-e`t1{#yo)Kz?H()!LuSh3e{e@xKH&+T~HZn(}}_A9Elac zxrG|FH#zO56x^-Oma3DKZuQ7L=er5Z`!wG8c~jGUTUYXJrRcaYC@|Iq=z!I8o?6e- z`~CE11|y@<*aU}RxIVodpW)W3`B9jrbH|vw&~&rMkQ>WD;3g6t*w5Trf;?8S zF_4H%<~1(Mc*AK8$uf7?9qS2j=dtf1ii;TLqh_Vi51ifVX3w>)1S_ZN3xFF&4_s4k z!;#^?KFMyE4kd1^;Ex?6OuTWgk4EHq{pHxP?%}k2kXelpaol+L<=D!kyy-@P>)6V` zd|H8w&btB~-fWCIoaRCJ_xER)l?_!}lo0N>tcLRD)eG!e;Fqr^fQ@jUVYS<3=(@4j zjvp=Hw{LF>y-lAW{d9g3Mlv<L zqZmY%HEhq5LO*-z_Es|v{HdJo%i&8AFMX?bv?!0KmXP{q^tYmfJ%9-kwF5xr1e z>y`8@U>GMzt%`E0W=?u5M1$Lv4Z)?ZK$VZ~UFu=3v9AnDu>yd?4xWW}TO>ueHovsm zuA_Xr;$8doxO)e%!m&g81qT}SZGxm{(OPW`jc`II&7}lWh_`-mp7$lFi_%a|s#_c+ zOGQ6Sog^;-Wg1=JG3hsZN6%;!eKstVWyoAXmrZQM89DSc7eB=PX$sfh6Wg=ngrxoR zj7_bz?Y`^q_&Cw`bA45#Rc;n#dLwQb6t>91++$P%KAFC|w&*yIZ!-$+^f$w+AT5GZ8YXjC~l&qrraW&N~U4i=8aHaon-MztpKVb`u{ z&B#P#@-){`o?s#Zn`)Qic;2ga_yOTss!Q70k0p}V@s^gOhg7QDX)f;7+ln$mW0=Q6sM~S9} zrpD@N-=rO_S@m3cW*ICHx7B977fO2JYFLn0<^2Sd*T;SIAFjWq{|xk*AmUs>A(#WlcJJ{U0i zC20_0wcX~=IAJU|E}(Sbc=|JK5or8C3^@Q&E7a}xbd8cKi))djIumqY-pm+Gq`bxO zt&L^_hyd@*^n3fWGciEgp1=tf*|}0bayzg)VE)xRvI>a~`5)O);OV{v?V-K3rQ7U6 zZ_UJA5Q`hONXMeyY>9n@I1`B6YWi6nr8J~^jQ@dCt*h@B@sm(g7)w1d+Ouj38WomI zivv`WY--ZfWLHqTI0-Y+n;s@$r$_j^bVrXS9o>-Xl$;whJB%=B)(M0T^{?OIBSSr6 zD)6b9X-W-R#VMJM+Tl-**+lTUrTxm-se=YByFdoiZQL5m_8`lGimvW_UuzR;0uVMV z8BukKO@Yv2O2LH73)!tvsdDAFQ|j@DV$JZb675Ru7Zlbz4oqt|sJZIM>!GYQTIBge z=hB<*golak{1AiOn&bP17`FSgb^IWfbH|G`i0>)2kMMNnHWfYvM)#zQ<`rffj?Tzu zFbmSo?s^% z)4M-((-5XXY6r8Xg9S$kZdT}9+E+GrSFq!;PcX)|ctBN>(t=yNkSI{I(gBEOxK4!}qFC&J#*F?9EiZ;uedrvT)CNcVP*zOe5Q+f>6>Nvsv#q$Oh zapOR zS4Yx~;4f1h}S()ehT zh9rtqnTXH{^4d{E2thw=TYD*f_KuKIXY9+8(uSt{|yHp;)X>OfBL4 zM|Ky#2jM>PB)L_>434~6a)3}>y51gG=Zl}L>ckE-0+&#VgYJaafgSQvYv%GN>RMm( za%}bzA8hWLrW~`nmPX182Ekx!bU%WeiXxW-6?A=cB7@*fuf(jk5S45d!wnZ7^(&0B z<=$Uk&{dOg!|jaG_IC&%)S-Hx)t4=<-5*!G&^&rS@Q8HlG^U`QVhI781taz zAKc7_8^(YTsT*o$M>z%gA8yGhJ8#Ks7Tod=3DS-4X?BBPtuk3%UIXM7NJMg(neQYv z(~)vr_2@o{CWcxJZ&E`%y7@E%cByGfn#s_eT)}|`Kg1YsMaKo2c0nmrBRyY0vD(>2_$CnudYXj|}v4O@L zoeI7-b_0N$qEkxTq7+%=u;QP(QDmYjO%>s`cDy4j}5B>Vl=NY+8UxKt@S6JRr@5-yyzS(Hty?Y zXSq8H#JAF)K&QpL`k5;E_&02Pk6EJXhOL>hHMhm~Wi|y(%M2o2TwDNT^Fouvjp3k= zxA`>{0+@Uw86iaDG_WzV!K~>t)4(9Kr?@`56Old{A+p zI)J2VuPVStdv_dEMV-x-lshg6?$)%1SQa*WF2Xq~xuiD1%7C^nCe+VAS%Zvr5Z+HL!x;ig(CZXp zAQIg!IsykeOfyjY)m^+&XO`f>r5m6d=g9-Q9p)agx-A^&<5R4cV%hQZHZw1s-6WFK z{;$y=ZhXe~Im-$3obVlN@0F~Io_{|8`S|CbS)Za}{2dm~6(NMGWJZlUSRZgE_6i!7 zrP8W}?wgDWDFYz;r9_uDABw?N9?gAJ5+ope+h5)dK$FpQK@os z=btBA#;dmEiWH5IwJyN)CpGSAuhKN^5Xc>fbqUU4Ct=_XVZBEPGuj@G^%}YDI^596 zbRMgwJfWupv)n#=vU9^+pO&eQmDb(hfpMSMi+IpDuTR zNV)~RMm$I7q9z9$hgw58Ay5KnK2o-(M-q5cRq_t9bj;q&uQ(ExO&4R6pG!B9C`!o{ zbHSY)lN?5SEdm^CBv!l@)LQ!i_xp)a1~?BP8GjYvp1J)BF~jV!+Q z-G9#|UsNZjy?%t(M^1-&sfNC$^TiH-@dHgatS%aM2;LW4_5m`ntE-H z0}WhMV_2w1$vg<_)UYFhS*%7a%fleFXGU2LfU(Hwm!A8ax>j1n_p3IKo}WsIaJQmIet#vY>U9{Z{{gjx3V8)2AgG`85Hoq}l zh+WT?S2X7UOKY?K|E?1hm} z*!jMyZn<#wwgC_(!E|4nC43j{u{P^6LP7rB1d(*H>PME`OailGvfY;CG3`Le3tbr! zxoX85si4)0fRj@We>WhO{n+UzG*8lbOG&HiA38CJFQ47}7luX{5hv(z>a z)2oZ=660hCvHIp&0gcg!Nb1u>d|O!;O>D^vx-U1XXJpAj3hL4VW`L{3nApCJKCMkt zbUoD6B%o*Ru)Yie!pS)ss-v|qArXX3O)jcQ0m&laaqAey&CoY_(bbJm_1?UgxIjHkmH3}JVj*LMA zcBU`pa;kXxTc^#ceJw(1Xo-P=xjK^vC|fg2X}=`9jS;hB%fFFZmZHRn;KhZ;zAK`7 zE>*P6G4qbsq#2r^VLNH!HRzLEecJR1l-`tp5_Zk5*Csd&sFes#MDm^1&ChkU#i92B z4FH83q=nYN#x>RAe9Y0IRnk_sTYe;wlyszsA=2otfs~$`5_;_M{cu#I&=d>fXY_xp zRlP{39$1K&IrfH}rb?5Zy<2s4FH+YQKSI4+x#;`SY$Vmji6x^&jJgAZ@3mh1@9yg^ z$dExE^U_vUtHuB#D`8j+AEs=l z9OPD1L0=n|qPDa@7~NC(1ohh2a;vb#shvAQmXW3~Ry*6&b~?@XKEZw;WOf+Wre6+s zv_~t_EuRhbrR4fI8PKwp~1p{QMLP&*ns2Z6tnbfXp%^+6-&m zrgkl(<(#E{0FB^59I1AO*t*p4T#notVy&;6SuN*eXczoJx0oJoCQ)$ReY3$!l5!96 zda-Evqj|Au5Fw3~CcZY!u_W0dUz3|+wr`-p4#Ib|v=Xo5n)AnOdhn+g=Kw@7HbKV@ zTs?H&X4^INUfo%VZ1ARf=X3p4N{(B@QkBbFku1Z4A&Tbd_sMGX7+B*R^6V!IRjOtXF!OC+CE55@qnbL(ZAZptmekI`n zY0SIz_4Tl4!;ZmkBkE3<=bhPlO`2zlYhGKj6s>wqrs_Q0s_2WbY3q@xQuR@x22bA+ zPKUo|rUMKMiN?Rrr*8O5cfzLQoLuQ&wacv>2=Ncg3%Rs~jXxlW0(l zK46|+bUS+8nsJwvo~0n%GA^Z#(CC)f!w@%Nq?XFj)J{zdc<#(Lv9T2~k>@h5?j62A z3Y1oMGP(@%Znwsech%l2FS6vGVag4>UrSI-x+9ICa6s;2$jS<}aULI$SZ65yCS5Rp zlhP^jze#7H{G_D%Q8`&zn_Oo{ORcZg?aHeUag{}e(lZU93Jo^VaR+SWuSP&Ux9f2m zgECbWB^7d3nJUToa>r(l<(IFNiTfssuULSKRy}}gtiZBN-@b@kopP0?D}fZ8w){xF zrixV)!sAw0krqqL!MSAj3nJX;#vl|@yRr|Lk< z)T+{>bV(}TvO--os0o`Q{~D<0;!=UKCyAH|g|f<)Q!15McA0%QsESQdM3Yq*f#qfZ z|0nMQi&S*`L?dJ><*(FoPaPy>+p0e0Dl&qSQsP2IkbFmF5QeqKC(2QH`vE&(B^!FcYt8eD(xmJ&ObM6FV`vpeZxPg9QKdR9lH*npg&Ho9l2W0*r`P17vZTn| zs&hn9q9_~ncS>h~ozFR&(QfF7d@IdVGtQfC;@!7tf9GwuZnv7I${NLtSl^$kf8gTk zWH_bvfd;cjgj};b-CK_c?+8+~{+vl+V_FjXJaVtHzc1ucPPB+n1XQw|O~_ltQaVUf|`P_eW5iU9!K z7$Az?(VV#FAMD;~i+#I;p_pH8zBqi3vI9dth$B1trS^l^HD9`;zhQ6GvSM&H_Hg7r z58s0%0SFqAio}6a6MFJYvHJ9b%CD{HR@7^N{e=5pbi1LL^Lb0_A0K(v3)1VYRdOI+ zHbiUM$K}vbOp%uw_svWL8mw=juVA{0Kka-{k6z{Sl2m(qm$|)I!0FXnM`5x1Y9LFG zY4BQ;=m!y_bl1HCo?5Q?wh}?%?zZLReHO5>SBJ(Fj0_BN+YFY7=eg zA9!Vy#}En17#Z9fOsl25HkPp*{Ib( zRaOtsnOB%%rCoH&&rlHzL0v<|{X^hUVnI&B1>b;F5GifH<3R4a{BWl6f0Hb2OlSj0 zqEOLc)BD*>JOY4f+}#z`IXm!F13Fn&jWAmTYJ2Af!*X(vV6BkQ`hZ%*9C=qdTMy`; z?)q0C3{X)tZ4FFd4VRMPa^Tg8MPuJq&;~>Es~Tq-MD&izC``uV83$WiF@6SSa#TVP zK_R{o0gtQrlE)N)!cjEN&o0)8fb=!TC6oq%pTDeNu~lWjd1$1ZQx0bw=vlq-ZrtGH zZ2!XYaI}ywNXN*OE&%n^Tt#Kw@FC8@Lc~x^b%ur>X^YH=uSV%Y^};3VbBA{wW=V z2MWblzyZ3~i=0~RFT)hZ3Lq14Dgge=S3)fIT-KA3?G-GJ%2+rRQRSv@jlto%D1`tx zPc=Cbp`@0JjSb@^54^#4*DTcw^U#Deii1j|5Kv_)<#lil^Jvg=IGmh3FbBsPtRNOZ zvXIIAKl7-FT#2zOEq4Jk+#(`_Q<|~;tR;qqdu(9@!f#0!O!!ysOJKMtF(88z zo3r%_yG<>Jz2UC>$AGZU92>x2tBhs46Pk;=QOk=Ug;tj;7WbRKJSYlO=K}u!2N_ly zW+|M9^LI!0$ZwqeMrTG(YN~y2hLOm|o~D@jg@X0bc&PU@_~XwI6HIVyvp++GCi#Vs zKpJbUFhkU%G{^{0m-&KJ?#S+ns{Dp>cOi=dg%yC#hpXM6B7b9A=(&rHz_rlKWba@> zBUpv?(3WlHO>nLf;vjQJ0M+Fk0Dv@9f8)*hLKg&PTI<>C=HS8oH1VasSow zCFhi+%Y7-4{zv;>Er)sk@zjFD{>{0jBu_~3y+f1Ufj|V^894zBXS@Te>bXF*Z$Ol6 zx2=0S0p2{c)V#S{9KG8v`gQ=X=KHK`0X1}EM^R~?O`3$dX-ko?uvRP8REKIK{yeM9 zlA%g z*=}Iq^240$xoysy)u*d_T@ly4wqL4`76%@*YzQ}LgG~kuVgRs_6dsDd=8(VkjOIx@ zS?75dcf7Ldr8&ONc@4|UgoK4H?(WlvB-N~+@u7sHImLz+)H7dqKp`iCg(-o<<&AUg zdn|<*Fr!(Jj+!Q4!gwH(_Uv8 z?3N)@#*A?m&xm2eI;7aNk%DyU)SGPpVZmF&n)FI(rr#V4s+GY92A(UprooH)Zv0_h zn4Z#B7Nh_O+(exc%R5H4Qo}bzgZCwF%zHO@tFF>hHr`KFb{Wc1+P}83t^SyXXRW4+<6y)!?j@z>&^lu^9@35V zVLA|_0|$)`;IDmLA!ko?rlo=w6eW!L%%QoHxQ;9%w`tEcx7|&YR!!A8J$4&i-OlJ8uG>hkq>zx9 zgv+?*L`7~EssrLCOfs>DO&HTC=HH#|UTD-&Hj~9&Oq|evs(O#0&v;_=VSUl9U z&)HVuXRp{)ToF6okWCf+l8nB+rwI$w(m`=|Ov8zrDb{ob8TRdMr>_^#RJ@bCzENAM zGG6G4LMfiHKek<^vl_8_Z7LzZx~!lLVl?09kxS|MK}14i=ZP+P;c@#%Ov0EAht^yC zO$#j@amQoX3r+o2#O(H8nj-G$ny?Nvn{Zb;rVVB$Uh(9KI7vhbvfbzm3$P=Iy^WaT9pxq@2TZ3BN@Xb_-~bJUH7+FvR}|0kmLFSYUAgE2f<8X;b3Yg9#S_y6_G4c$Ur z=YYV-*0y`Tx*9%k+%pg02#1pndESFf){X$lJkKF2Kz8KGcju9Qypy~(@n`%7xKL*T zOz}Ws5xI9f50Jk+pwijIuGwB2k&~3sO-C(}IOd2kD}W1`r3FBQ*Qb%sBl6?UuNlU- zeHl~jx3&+O%X~Be_Q+lTHG2DL zaojx42qzj*DZ;$}V4t5(n+>a8cht-c{#8oN;|wdEz2_XV`NDUCuRF<1K20ILZ&Y){ zhM^*vbxd-o zZ8MmVfuAYEUxY$e##SL1{q-S;i-6<*$5GFjM}EGlDa=%OeB@s! z4j!Ew9a9~SKwuHGSWhgJ+(Cr+A8%HIX!$|Lrv(DbpV;)JkbtnqFa~4v$Ouq0>q#LC zBw&#R1MP8Uu}=L0tK-dG$lahEHRxC@S9ra|)&1n-`|0Ydn^kUaQtOpHv8&xg@mIKu z;QP5>6A4u0?0{Qkva(2pipMm`L-5fkL9nW}kSHijwBF$2kIj{IuhHX~LY51D!GBZ~ zv&&Q@_BmPvU0Z&(Wh(!kf~9=Ga}N+VZpL4oGaykNUg&ps8Qm5^^xc6V%MC9vIUbR2 z{9{r6C+mnxVE~*_B;ABS7u01xPw>l5`~5&HA`u8yk#K|>NMy1NWOCVZi_Ag^2?=vW zMMd^L0N|slDr)v=( zqJ|BlF&Mqy?gBs{kzg45@@uU)9gm(QlE`2?o12Rb`}_$-qcLPMSt=AuCcv<*?|Qx8 z4M(Cg*zI<_IqdhoI2;bz)z#IZDDnXk#D@k4KegNK1%tp~vDvIYK0bW)^z@S2+uMH` zpPrFHm>~X}JvBXTv)*{@cD^v&YQx9Zb2}1~<+uCl_joeBv%S5&x~kTo{xy2oAR2?E z7Y2tb7zm=#Xe^PzWU^GQ5EK^X=IYAU4}$#F*49QK7)TGnqzj zG!p$w{B$O(m2VcC&6Yp_(69^x1_@F`UUamzjm7gE z0-@mWUq&{Y&kq2C<9yNU_5AB-5(#Kc~Y#*uk={!*z_eo?E{def-ad-L*k^Kx=_{4XjSn~;zYA7HV6LvNFY9Y-u2*aKzZ=~?oO<+hbvYdjjfVk&PK*Ko!|FsBgCGbH3{6Z((&qaEg@%SM6&Dw$ zMns$+_XP-N5ekE)L_|QEB)X#N{K@>bMTQCo*xw&e$O3`mGRYw@TX?Ktw7u?foV(F-gbM@*lZK#E_XY}^;}IknleO^8nOCpO&cq0l$NLoR%P1!XDp01Y5W?q%c6Eb zWsy=|fut<)ld^uy?pud&DVZ{C#0(odZoNJ;b3-djl`&p|NZFjVNs4ghV6Aem?k~W- zPIuDiRg>%Nzcecg;JMj+`R_dZ=ekI?jkO#}eX`Ya&#hC)I)2sJ8Ed$o|xB3&D< z$3E@OgOiCj}S7?B2hfU$h?UH0Et8A z`9MK}5hEPfL03Mi-q<4*w5#{l3@fB;}%ER*sV5MmTCfH@RKCq|uib9_cqcu6>| zeNC}5>|ww+6iwxrZgZb}8Sgq+22`tE#FY~aD{85As8C5q3Mrrg0VU*z2xQTPRq*=vlu|VJ-lewTkK0UYP-GsERKH*R+#Bmo+7^EAj=n;0*zh&6sDmE+?$Yyv zR@N8(F7O>!%FB?{qoE}f-qE&(;Ey)x4N+Sh5!exw>mE+n!T|VVvVHcy$vb<0SRQd3 zL?X{VEof{b{P(fp+_NKvqV>_DU`K&>u$Hh^W#TUXu*0n100v`ulPO+HZ-a&Xa|aav z{x}F1K=8e#!*e{cH$Vd9?AzWKd$VvHkg;=b#wfPou*@*66@0_j34R1p@S(Gq;jBs3 zI7--i_|uLhP_lT6GqFc&@WWuk{DEh~*rz@Yrp`+~j6vx=1pHW=g9Rc6Lg&jqXdZP> zeG;Anj)&8ITMDDMJH-H1XN4wkT=UbYj<6^VE`ejAW5}y0s;DG}1b4yI{XGFs^-`R> zOq_?UBCt$B*DuTi1n)Oz{aPP;L;OAO#o;5I;>=6V6lV2idh5clilFQqnGYEF+;iZd zpdv0u{|e|7k0QiTWODxm4z(z(swB|`Bbqrg*)|o7p&fjPt})neGI%a;=1Xm8GH?ti zXt&1~W$P-rY~9FJ`M{*yjc#~-bcKic2p7t0=`k3dTzSg|V{p(KSpLQnUS$_joy{R*)PiszuhZ}ed_y|Zv`K`FTTBxvf)ATL36$%NXOeaNk_ z$sUh+x$Myo!+Bwq;nEM@34AUeU;hbw**#y;C$_Fb=y0z>j9q6Jw3T-tFF;#w_~7Lq z5b`+WQ)Nift6EY07&IN4w}^VUbTf>V%AFjOq(nxCy+T zdOMsoiZFMGxNo3y>zzG(nX)J*A>ZLOJtrNBdzwgKY?vYNeNpt*%xpxG(hKOtEqJJP}lawra* zIO~;?Y0eF)Qpk-H0HWz)7a2}#CQR|Fslrt%{I^U3VWi$A*lfY5b&#=hZeS0hG-$o- zjaYnjxWxZb)0XR7#90}aV16u&f)Ai8OkMs89bp#&5f1-SFji*NI$^?5l`gKfl<3*= zC-84zY%RN&oIwk5eY3NEk+X;~sIK%#1n>#KG={tCyEh>~&4#_fQs0_<3E9gw;lAh90@R%!Xoj!#E7*IpC`@SG zWDWca6=vRf9XmBav1A-Be`AwYj;7XoW|(m>Q<``eN~LIbJE~+?kveqlY*xqDfYu65 z<4aOZdik^6?Q(0s^68i+CR!vL8W!VHWXEfS!n|GrYPtaz`P=l^s+n_0E%1^{J#|~{ zB(3m%a5S8v@QolV4x01TklnJGzUq%#pV{Im1fGzAK`xxK6trTwJ?%R=$nJyIs>1bA zikT-d{;i_txCXG0^9ow@=@&lY6#>B8oVq}i;LM9=Tm_fTAoMXnO)NI&cfv9&b$bGb z->4M8ycKMT@VGWNj(=$hZOl)EXtp-}fuDb^PL-$6BDb`Q23%DwC0*PHTvenuN2buyXkm(9HrG_I<^u7$6KVk*9s0b= zBr8Opa@Dzl6%c{vOim3Q455pCwSf;MWpM$cCjY2=lWAF<*H_=jc5s`}n9o>Ekq)}` zHd3_jj0C(}&$f50oy*N*Tp*w&MKJ7coL80!X1v2Y7cXA8Ecu?~5nUCn)knHIB1QCY zAniW+WEi_wH!dKEmhqOlESKK4Fa@aeC+acM5teo17f&vwCaIEQwxEpox5iYXwy zcM5NUrkkN*U8C&!at{RU?veh)ld8@jBrAEvyu05H=0Q z9AE3|E!3x}hBQ-VODfkB;3`k&V_z=Uhcs_vIsG`o3S{r1DTjU-(EU%JKeIVQu7_9T zQz!XWMil9J_vfgqA-`;d`#t|Y&uy8WMDc7 z-KiO)FKN1w=GW=X%odvk*~?;-RiOH{C$HMuQF7@$LGAz0dO9q#@JSR%;Dz=gH7)#> zy5A8-{ z`|Aw}5iUw9wX-6*sHhkP)yS)r>ON-9{QJf^Kldkuch)Ui06eY6%{Wox#t{Q3Tnb~` zZ<;8nNO4_M6}52x0WKP`FrAa%faw1uKWu-pliKd2)h^Rs9QMPZr)h_v!4l z+u^kdc32q5td;)KCu9|fi0_(M`8+~|>vtQgr?Vv8fH1YGzPii{SPI!G z`t7n)69Ch+qMHvV-)`^o;&Dnfu{RNZh7Xv*oV!t~0#H5Iins4W}p z+f;#bkcZ9?orqucVv6YocuD6&{pL9Xy(QcB03OV6VwTVjD|Axg=wlMCwp2ONkaax* z7U)*JsR=1Q81euMNkDYeagQ?@SvVLcCr3E+C@eab4HU&p?Q$v{>Zbc!irDy`Qo9Gf zLy>^&38>(3(T`~`+K^uuHrBA%KtJ#(Oifg=BD(W=MPCvguh!!s%8cqrgsqXxUy^Mb za^&V!;Mj?18r z)%7IeEhx>;k)Q4JmUV6wth0F(R!n8LnpHeB-f=DdUqjtpBct4(iG1=G?QQCMjJ(3rI)Dm9{-T zCA~${Qs#GPLkOMY^nSVn>gjx4*ckeqRgG{xDT};!;Nhk(4llUnU#-by5e!D4meb@G z#2J0y(;d&(S1!TZ`|3!Z8%@5eN-C#oZyHNaJzL8JpYE1jXowkE-VLg?u*a5mqD5|ysCdFth4z+IRo0(Dl;^an4vOCahDQ9@lBGn zkK??CcYZ~tP+?yQMC`xvW+-BpO-Y4Zp$|5Y2sMRW+6U#(=3SQvnrScg7sp~`eP0Q& za)FiG!Lw{vx77{ayjhEvHcHmZd92*#U!!Ku_jgpT1}K}t29a-(tioiJtN z#&b^)I>DvukgNLIzid{VwL#g?8YDv+BM7s62_sWV`M?rM7ZF%s&n6(GlC5R*YF*A{ zB1UmSc!JYFtfzN;3BRZC?=%nS&~O|S(5d5)3b^1QHghQ>X4vwf3PjHy&hLQh!xMn7 z^4wW$jWz|Q{;Eei^y>?SwxePg6+KAHJDdvT7F;-DZO;J5q@G@49gU zofl(ZQfkUV1bzl-`(W}*O|jVi$Bxo0FmSlKp2~j!w?Ih0IyzQ>taWRHrrU-Nkyz8a z+!fYMDqeFqI%3m}_vqIafqDOTc7i&1WIp5QgT6yWUt`MfxHK$Wc>ptY8gqi_OdtV8 znMU&lbZ*jngO5~hyJ=uoS#H$TIn zzNf`;aKJ>br^C#p39<#RntH!~D`pHP(A&_F)|>C#Y2R3o5ghW%fParVFoPBCq%k=j zdoliu43I${LlAc-ay{k@+t4X_xkqcWuA1F$w*#G~Ew%|pV(j%wY(Kis`f2vNRUFNP zbyLF7Fb04JyvuJ2HWTfM$rO8?anFyS<6oBrzsCmpE zkY^<@CNFn9Gjgu&mL8(Y#KaeV|(_I^V_$1)ANd8T8`|6Vw&+kkEeLxWHkea^xQ*u(X?_L}EhK{22|@|iyOFJie| zMU$vGx|riCs4kZyv^>>vvmSeC&zrT8oyFoph%{}g$ved=H>W;_>xAx+ho(y1{hTFV zvBA*~Y3a3JRyiY2A^%Ixy(`$+Tc_WIsZU5s7fj_D#2LhPMep&F&45~u*IW*xY2)0) zun(sh7{E8^{O8C}w>}b-*+g^*;GUxF-$`gE+!*Ang<^!Oh;BD4=p#5xr*#-ai7@v_ zK2|V4$>eMPnOx}{@g!z~jrp;&hPTea+`F&GNKhjW#DUXRyf43YS`;C5nxEtKQhog+rS_*bJod24IpL?1h0*+(+W<6D zqQ#-Wc+_Twv;o~h{_~$WeI|PV-N4W6q9X*FLTW~eepc8FU901{=^=cN^%yjkfHQj& zSZ>>5ny&e%n&_PC0)O<+#ekJNx8_;S>ud}Devh)68c(0$xn+$!=K^h{udE z7q{afa52NckE|i-94V@`$6>e7CY+1Ny%yG>3i>QQD;Cw;W8|uscY7l{3q#Wb?T{3@ zd9YVv#+nO_`&6^k5dT!Q>LL+2J4N#Ox7uJEzvqnmWs_>3xm9uxI-eRPz4#d`(B0$h zez6w44L(Ls?>!?IDBq@|QQ|nS_}al0n{Nw@heh!)@vVYfJ`=oOFuQ@5M$$8+ZxPa? zk$5KQ+X1;e$=)Gzi?AO|(mN?{2cCsV_YUS3apTTthB-{<(db?whbtwS`NWzo z5z=M$rbYrXJ}kgbXJsd?tll2_8h5=pg4s}qdKx#O+j@*`0Ke+s(9C#N_E=!h_7x_0 zN%ztP=t@Peij%adF&x>Z(^qT^KKJWI=&iY=x+@3>5a*I}qOH~@TLBWes4b_aH+df` zbfhQm4)s_eu9534>?(NCSwJ%)*BcMYX5Yk&42t|!i6!UNob1*?3*`T1Fo`WJ%8faU zGu?>KdD|0eEayAdh5!d;eQ+c;;Ty)@oiy@zbz+6~p0`uk=$bPy+Q zGTgD6jHhTb7y#~mJZ+dS1Dz;1A8esAcG@I8mc6Wr=)U7P|9D9>2UBtG zNHclWGApcoY?IT3W`v7OP!>^8-`3dnm{yuRu#M)X_r!j8*j##m$BxL>yJAaU z_pVkONaZ7E!q`Jx{!($rIxloNq6GKdLcYm75Eda)%*9W$Y1BF-69FNLH>j13J>0oNU;yi?8na5iEp>jd@I4q_SC33tJ~dM*eM z?4^2agCvY$!6!tz8H2-Zn7TP(P&-w_UvtV`CgkvDf z2kROZ#Hi2}at`mIE2})kwWFwi5G=wJj!+d4EELugx{1Y541K#K6v${LLX zc01L{`xJNt;v^JiVu8IuCi9>s5`=CHA8b3M0@s9>Y-&H%Oz3w838LXqRn!#x%^f&C zIh%l%r?HclA9dimnKh>%-iYp9gN{Z+yopFPs4v@WJ!8{6iX<_$P!M-{D17x1s{AJ zE`$|%WLYL_fnfcd;oQV^ffAgu{{jvZcc6CvD_@)m8mKiDr*sd4!?tYEo#e%>OL7SJ ztx@wRSL3H4G=d!z`l)o8Kbj#v76bc&wriQn)LZWe%&i?lbYT$=HG?5!S7^W&gvhU} zhhu#>W28(ClAnxiH4jbmZtQgpv2cdqE`aTqP9$81%V+&f_Of#7h~iuO>T`=*9mG1G zr>m$8F>cTov=G()HBQ_%Wmi3>$2sG0$kJj${9_39ceeoVWjZFs8gWmCTKpNVBarcU zJWBQcPIZTZ!(e;a(IM^CwgncKU3NQq4c&v&I%}sRD;?eqqG6~LnBW07Y@P729a@<~ z55>=5zod6a4CjxjZ0bk}Rc-iaKlAy+f3fh9AarU@dNbTcXTh4F6Hb4sJ33g}r=BYI zaVX>BuQ#fqCG~~yvL*`e(3}tsL7nZci$rX9_UCE}}66*0JrBd3#p7pX)bWT2Nr$lRSTg!&3_&bEgX ztKmyvm^ zVT}w8?{-vu>f4>1+L<}cXtNJFu=IRI1@`qyr&{`Y_RO!3vtswzmBMoCkh2IRveq@$M%Wko`e?#}MNG&V&Sz|MHb&2Vgv| zeh3&%3&tD})Qojorz-jmLO}_5bHy{ntr51T#37cKm*9dg0M8kkx==PM0#nZ9<{|j! zA5uL;EecgsJNhwPQ$rO7I_P$gMEkMe&i2UXMlGpIazHHYiMS$>0f*x0?bn{75yAS} zTFPoq4pG1L(oTNDp}1g6Asz9Mhxv&gb^vpB$P+Uj!-#q(<3rvRz_iPQ%mzv z9xaBj*et|?S$9M*^$gQ4{6cb3l}@|FVQNAtW#j|6Y(2 zcQ|R!jxvo6+$Nq|g4|&NDRRfe;WFrgeSX~5 zsMq7TeflmZFS3w(JC_nFRmzm(XDDCc9NF+>ZlWTa);<>K{GNZu;VlU09Cx7iQ){`W zpec5E+E+Jpq`3{*Q{55TegSP0)&xvdvTKG~$7iRS4yP^6P%45=!5NX8-Ow**Jt}=9 z{!R6F(ZhG&1Jc27b z#7WD16=m_z+O@-JpNjX@_X6L!BQ+?c*5PGBjqHbYB{k2<{v-h$2yf|4SBM{!cPn|n z@RSus*FYNsSoDZ>9L5Ye`WOSF=%7SRzJRSzrsQqL#0?tQl&QYz83+Blg9oj)Nn3hT z9+%UJjtdgX*?$#3)b`f2^PhHS|8V2H@KFcCHdYu=70+T@H7^gLxGt*sZnP7~c}iPH z*;fT(2E8>Jr_DX}OAL^Vc^mGPtHN+wbsoGSb8raT8H3s*5R-f4a$kiDHSC|aY~L0P zrUPPU`1?Fs-~vrA{#$+U4>9)Kzc{*@&DjjEqkd6ZUmZ|SFy6juM9|B3>Yygd{{tt4 zpN&{9u)3YjDCE|x%2F=ciWjJJ0oVXTWf0^y-Dt;6{v(b=6x48`6 z&_5Q5v@zAApO$B+%WNNQv!INCAhQe!pT}$FIF2A6eQ^XL3p2xA=0mg8w$^2p6J}P6p65yU(5096O zml7(c({RDDdX|n!`SPT=PnKzw)5rDH%+szGs}?-TK0qsP|I>S_12B8(p8aVhje`Aa zS9A30E)i+ZxO@V-;=qjZRX&-Q>i!oyo@@4>h;FKV5KYExhx8ucZtpB63eOte-v=O- z4SI#WcPEBD`*v0ZB)HX0Fy7WR?1d!KSw|3>*&A{a5uIkHKt^T0(qQ8+oA@P{5d4?h zZz(ZgG-69F3lFq)F@I;3rhUhV!N&_q6yH_w&v5E8pt}}j1$%#O>}Rri6xH|oX6gFx z=>Mh}GqGa32Z_3aJ0eZ`12Yge6lxj!k=>FTN{q-T>I|yga4W_~b}^jQCi5Q~r>{|) zHxTpS_!Pp;(h)cE{gCl!P}sE5fDMc*q~g|%JaTMouPkiXq@o7LznHw`M&B79b00|B zHcQ2kv5P>~wqZtJI|bDYdN78WoMBrvTtISXi<0IKXgpC}cvSaYBs@gvoSnEdAAdJ@ z6~^c*Z}p`7s?_>48^f=0c;9gra1A?JoiDbJ+J=Sb(2ibT41^}3ChrxD(Ws0QO( z+c!5+!4*s55kE!a(iK0#NmHcF%j=aoiicTuPATvMo(O<&xmbPcZ|;L#k&IXEU;MY6YV1v)b{JJ-Qo`v^z8- zh*U2$1FJMIxFKs47uYdqv>)67D5@KLZfKP9Pm*q!Zc^>%<+NAq(0UVt;sq{&06N)+>IJiC4*ha7w&Mvsr2mv!x_( z!pTeTKcj}S#1qedOr$}^`}&XCu=Q;){e!KOYU+bx}r z-Zsu*Lr4y*-{3APci?U~r{TBRx$>Q4W{lqP)5@U z`XiYM8xvnmgeMF_IIjwFCec>}{?QI%4=OwH+;mM3KQ=35I>7t70oQVX@d$9MD zyqV1MJdXSRxGCk&M=Qld07qI~UjSMFSOB+O)3cf?t03iQ)+qt4;FqSop9AQu`DiW^0z-QK$a?3$k8pm0es5CKR&I?6!-Y-B+-HA~HMlpI6FFYtAr+&)ez zGkGNIZ69Hoa5z)|x!${<9(m7i{I+X)mgBh3>-K5;sD08tXi=YTLSAG79^Yr533ibQ zH9gDm>$Yl&n$Y>=_^sA$CFJE zr{{PzJ;z3F?G=4$8-G8{l`A})U-RtvaH6g{JwwM`;YqP5Bld1 z{ioydUE6+Wq1jI=yKnretsg&ray-82+OFwYj`RF=^EOxWG)DtPZTt#y1*zvzD=Yn! z1PKy!=Yo2U0)E$aO`|ZQAjc@YD7YxJD4-~)D5NN$kmGltnx5s@ece1z8%Rw9p@DjS z;&*(b@ z)0`HWY1!%UokRV=0T|`-WkJm=I`J$Vplfub-T^yJcqm*8H>vjXp}IzcSE}Q+{e|?q z)WN%z^I2QYrNvy_m6lXgQ|O*Mv@F{*`81qK{PDpcNF@&e9Bryg`#(>EA}i$>q{x0npTm8g2S<7kDvsx4-A>u7!1V`&~L2I zhnn^*nvmuCE;^UEScxw5*2)Ph>l(!w#O1X@Qwl7JCxzYj=7GTq>%oMFIFrGysV*4; z4_ZLr30DGjM28CNbD3<FHS_O3rC;B{wFx9bhX`kZ`f9paX3d#Tsm_=E5T#^%}8bv00-fZw6Y;obEdV&5k` zhLPdthAR^(gV4T1fyVkw=+d5F^O2-^UeiyUGrOnui$BeXDAT|Iz?60!9@z**O)J=S zC@Gj^ftNETelAXZTelt@?Np_ASxMXu|7Cl|I#~C8gSkzuVLYdXz=FH%432(c*B zJ)?Bbm=TB$h$a3e*L%UbXZ?}dX{UE&5_GnE8uck<7@Mnx&yet?Cv{Buu|A6kr`9)V z5X)1C(9c7J;xv@KdO5QE^t*=h+R}>|$H+-0uR%%w!OZN@Qhyo&@R3h*22iMWBuV!NMMm z;5y_l+p|MI9a7`6_ywLZ{vcGWmG${E0z1TY>7y(_ebt@DdwrPBJ7FCJ^$7@Utj_^8?U^@yzx7 z&`8vp>kTkr9azftTz2LW`HmC5pcZVcMsS2l0)I}cgfoM{i=B$r7nsdArvD(dFWwtw z?#CQ`)@Kx^J=5Tm7R?`ZAG!X)XxxJW6*UD%*3I2bwZx9lUI5 z#$EJieWB5Pvq&AdWqS^=L#7B@j>>MJ7q=E5IKt=wXO2}8n&H8Vt*h%FK+SPF4bfli zMI-F7xjyT2-_xE^Ft1)CM4$eNB?ebv-}ZT~A4E=d`ys5)2jY{L1A(ZoV{C4X<;e&x z;?tU3qu*YD_k?v|s2rCxS{rQMR<^rjT~Pd7E7^R$t&8#T$PS*@ zoAtRZH^pgJuA>vRU``1w7b!DYxI^Rj^k3ha>a#vqN8X{B;cB;QMR-lq(kvGX23kiH zX#Px|n^gN~JJ#p=j3#Y~Q!=d2KJ3fktc}e80PCy=;OCT$UNBAzgR*nR-ErFW&OM>0 z*P=Lkvpy3Iy?UMJ@Qj)SK2j>@ox;C*pS*@ZAN+Sm2?oG0W7uHPG)z0{liVOV1Kn>E z)@Sg@xDRZD{tfIa7wQFkN1=DPvt?WmMSn zQDLBuhUP{?^T;L+=w&rx#!rn00)=LV)Qq=Wm><73V2**e8(8|Fk(ID<^2^N@#yj)H zh7&W!J0s>VVzz9Vg(H|AAuw!XCe2@bz?%r>rNYg}%ow)7=Go`vF0a+7Q06s^{K_(~ zF@F*IMlfS3zcVY)J{*|AlwrZgiw|fMy?6mhQOzq(*rpcRy1cx|a9*}-X>;aPX3LhL zP)tmXw+83~Tlh-wOqc&5KQds-yyi4RX3~HuGw5Rj$1h{HY>93KDAgt=fJNV;erjY?PpB3)y7a}E7G z1Ok!bw6TO8i+wpTh_s2Z*;fwbT(O%C=Q@WYN0Rh}#J$6Vz8P+O;i$N7lioNKl#6qP zCM4cI*rPa&wonNayWPkUtbMSdT&(uNa-UEsRK|i{FA?6n#PX}bKA8ynU_xX$6r+hD zF89@JArLA4T*_{q7yiUz;Fvph!|JB))=<0hOe8Wflf~Ht&PsK<_sD zvCV2=O^jg~@=DOQIEuHBl)-wekhUOO7~Wzw+$$H>zTLi_5a-ceu}M&b+4y;47AxUT zIdlWZ8xZV@2mXYyAR*8eW=$9}-kLCM#B}k(yikTs88lsdJkd7RVxVXfV?Vbb+lVV| zvoL6o2GYdZ7{+WK7TSpO!1AZ8-9+yu-b8S;*?>fwH#y2|AvkUmVcr;88Evj@A}NyP zcguaY@z!JIhUH3+?H(()9uNp;yT=O9SAgyT+6vHj3t_g9Mtzj?=Yc|?&PfuN8mB*tQ2?E86rArAb34dsT0?xBgW+ARmx zuw3b}BIMbENZYJd^JXmk+Tmsvz52n&?t&Fm`J02uCWYdq6}xl*}(BDZ()q~ z!A5Tg97EYCl>18C5INdx;S5K+iLuxSzP|D@2p5C{dT0+w6km_F(ngN1Nsl%O!eC$R z8%3CBd)071h!k#QWVl7TM`vu0?X8Zo8eQjJNDgMkRZ!X&q>5b%z_OgX9&lU=S zG}#EkUY^V~jGTmpKR5675bf4uC4@I+4$O&gdUE2+lhIy7v=~kFxqW9`r8o|SwlcXd zBAQn$CVG+mMRsTl&&Y0}&@GH%Y(@jF5nh$Lm=ww@r@R)So^gg~43df{v#&=~VbaOR1zZ?zA!g+kvL z8~Pzd*-a*fF%Oh|pv!dy_6>bBZ~VR*nfqQga3(8f-&cBGI2$5Kkv8+fnHSE0U?li` z-zR<~tPIO>G>}>Iazy47Sj&x3`xa#r(j->i1K4SgfOTnYPNG8j3+ z3r8FJ2S(<^@^-r|ixVdlBE4_+*#>PPtmigE4xFro<86pG`)pq>l*w@9mr=~c@oqOU zcFYErIb1FG!A5Zg-fA-0OPrkxYhoC~eZ#<*2y=lX4R@=BHZe||p)k%+oS|HtI734@ z&lbM!dA&s2DE`pM&sK(?7ZYE!$r@POvw^jcj2&~q$SYUMac1QWm;-INQY@#zTr%7% zMhnX@=Av?#C4}4S<%)r0S<DKeL)x=D_l!#b}{td)b7<@ii;O5%!6;?l<|IG;s|~( z@@cg1MH68vc(!n;l!-pDkR1BC0gYc618bAycg7pjCN?8$FV~)xH!zv22L=Ygz#vZs zjzZ#%278e&aumteH`Ye*Hr{OC=y@_vwoLXI#^M0Uz}T9YD9+aSl(26F@&>DgY{(nz zHe$w4)s5cKA5ZKqR~DX81u@RZ5I2P3=(VL7_))4 z$Nh-4hrFCuk|Ov61OsEV@8#LRIH6dMtAR2c4dgU{WfWb@z%d4nAdn3QM0z18mad0#B{&3w ziL~+)8q1X)Dx{aAP^bGguu`P zvf*k%Uo%DG^%+ssvxBfJ?&68wRcp%57hYoi#FE}M&V?Q*?D+6#Pa^R%+1G9Z487s*cY$RbLIf6kr?<;Ab_r+edk2bT#Nbq&} z^GkGrug`mZ9uQdrN0@68S9)SOl=EUkADk>gq)nUwlwHG(Ft7HBvYYq=+xu>|4}^)X zg}@O;=43Qc7TUg=O|%{4)xz6SyXrd5k%ekoJTvRS;IM*0{KeaGTDdxZ!78e+M zC|AP35(auzth^ydaaRt!jbG3sXtRZ0Sqo_{&$Ef%D8j;*>)7qPHh$hqbb*_>)yi88 z2Ij!QF%-JIC(ckV2971@D?x(?1>s)z1Z^c~8yJg)KctJwrC18ZTrw~=oDf3jc|#s9 z`}U1OHr%%!+^uwZv`;qZs<|#}uA1wb>zWJpLoUK5+jWc?)Z{7Y-IeoS~ctjxbv|REA_2&?AmEem9vdq|v_7hO>cStSmn=tii$4b67B4iY~yNc;xD zAP{^O%0O_Gg)!PF3b`g{x1kYM!anlD(O@vqd)3IV{Ae&zv4vy@$;QdPy@Y~r zLP6p}HgMMC8VDxRUJrplvfMY;KpGgkLXtx_@;i4Uz1jzoqib>~=h?s+IJ&~p^$_Td zHrEv!>DnV}IGbxYSGJL^Sm>gCI2y!I_O}qola06;#8Cvw;lA5Pb9pe@H-a>=Bt4w? zLkr1a<0lgmW8VjxjX1Hii7<}_28FUmaRkW?sBAz|`34@V#a!YK>3JUPbH!laCmX@q zH}k-lSB|%FjM>IryFl`%{AS(^#La^Cyde;1F-~}!^kO!U^gfzQhI^4Nm>4vBHhv&U z#zLETECg#IcvoUBEO2^k-%a#9G8{|ST%0>wt~=SE)pnbAIv z{9v)6(nW(Evw`Ip(r`$_qZkH#Kj4de;Yb>YlZ~PXtKn>9If6kh*H^4qi3QoLkg%`z z)x4iF6!JVF@rT?Ca)sk;(xb^>TEd}GByr!(%W^rsY9cIl!+oWAqs2U+mj?s{l>2}@ zTlnQZn2`6CF&inuDB8f84W!*}IG9a@UD`lf5EhRdB4wma9A&TEH-fJk&Q=R;pC{gI zvk+*sjkwp|Ec_9J{z~ta`)Xr2D{o)yvxPD*7n>x(QONUVc!@GEcDuzH%6VWY`(7f< zqsfHC94O=(SMyxQYBHBtj-OYni7?!28SQ(CwArL*13_?vk+l~tNJt#V&-T#xg+X4B z2ikhXVPQGqU~sP3z>oI&Y{On63Ccp+WjF&_;$Gk^hO3e1#PQ~$!NMW(_J|{6wVSJ_ z#ED)I?naVfY-o(RUN|zeg@?HE`)aq+7Jfmt59XrXWZ*%&Zmv=+b6>3tfy^QT?wD;1 z3U4^i1=fbhhsF}DiQtSRb70VuE?1A0pS_+QD?L_VpDYM`;b1xO^(tM5ukaN#LByDHDg5i8&f>QoPY{$3{^|_AI1*I9mz(Y~biwDRW>D_@dFi8W{?eU@49_ z*FzwXO)PWZ2;OFRi9z723}c|{*NC(Iv(V>au-onBI!Lquxemew;SR#l#2_45+HQ|F zul#B-Fh~qX@b(}0^A*`WKU?`(yoH~P_R(&)&)fA9zY(l`FqaRT5}cJXG0spf_lcz^ zmbb6ASO(d`PsaKTMbIEpke=!O$%G*LDXjP?bAkD!ov z8^InhXq?e-uc0$OadNisyE2Nq(v)zp1FEXVJ5J6Fc4^t}0mdPdMTiZD+o z_R(H9u_R^R9*KjAkKiq&!AM;AR|{Q>WlbDq-fX0aw@Wc7yv@dshJ%T*4;($O3~e}X zs0?8u4Gj8*n+$WG7aKpJQIydD4!uMXv{b?J<~ZPM?}r3yu3g>-o7uv$1WA`otc5XJ z_`;Di5eC{u5Xc*GwAXF?eqx{vH;UwlgY|eN44gq6Z?zFdjyM?XlZ`lXC?>u5e&-RN}L#k z14kT52H8N;l?!jQFm`1WapgzietOCq4F@B0;4*JW7Lu`VoGtTY9vB3Y-w2McgK(1| z>6N&fEgb5x^2Q2z`(QDe_(Ou@PZ`F7!q^K((t>DW%=V368P4F*V4sW>WgZYLEJ-j3 zH-jgVBX|q?V6ZRud1Ltf5bPUqv)LEkfNbCEXZF!#G7+rdXkt(pCk{^Lfuv20#lDh+ zegBlS5BvdXvST24BSD(&69RD{js}?c=K+Z#jrQ4QAvu1a?3akUG6|NrS2&jC=Y6)A z3!HtUSd!bquO`Mq(j&vi?}zljAaIO{KP6c6%2B-4LN5l6BPb(Fu>?sQ2n%Vhap)$( zT#w>UiThk4?JGanqU)FI7%e1263l(az!*s4Y&a3-xm-UajwbWS7zo-1Z86XV+Qc4j zW(#k(uXgMkB2n5>72j0LD_T56#CXynQ;maGv686cwnJxS&MX^SDF&kLs!15+@ zUB&@lu5gUGTreH&KG{QM4lGG=I3c{* z_WgYEj)ktTHVaAb29lv@^M+vG45SSUW#LbGE5q@#;b0%_pBYXZCqeKv?F)*9waXC< z>XB_lM#FtSx4{^$3~9I8_Xx&D(Ho+Pw?kMclYt^mw1qJnNPB^Qqm2A+InWDnL8Hqx z`(CcASc!#RF07F_n#>kX4t+E$Lm$lpe_$W%+h-%i688rh!2~uJ6y8(qRpfHFgmauQ~gM~EM5UeDJeRF-Qfu&dCM6bl98S-qQXDf4$6_EVET_|yB zN?aNj+}O&1K_d=!j};nC9Bm;DD7^fcg`iL=jzHl*uo4_g5-60(!jjB=wy;))wU8G3 zz@H#nNDII6MusssSl)m!u?Es+HZsh0Da8>7f^k9;Cer>XV`C`ffw%9696=fm^h$B0 zk+yG)GnDhrm0nFONgT{|%|#A^V+j=Q`owfurkI`%2P_fiv6p1N#y3V&Od?EtJJTAlP>+ZQ%IbJTNG9 zdBefdQ^iUw9OwguJP>C4O41g3LpRqf97Wed<2SxSng_rSlKfo1LLty*<&71u z7M3>L=(-fe(Hr`Kjo%1{KdwnIEJtwHO&o7EO4J<>ihO>b;u=Glq zNS^y@+rrv5kmfz~jpOH)G~6cx$?vsIgoT4R+7~of`)sa9FqDO*4UC1Z;b3_a`)=Og zZK!P&~!lq#^*Ur6*7`x+5vY+COZ6E>4FAKA}p`y z$}8%5MOI!>l~)A9RrJ9t^57M9@QOHiMXp!0!7HM2k4S^(h%$JN2!rQ{E_jZ}g6D`T zc#epI=ZK~}M>N56L=rqlB;`3Gp67@nc#a5yyNDjRizv!nL=Jos?VO3Ifin?78I#@E z0LWrm3hj6_KW*{aaU38F@t`k?0jwQTK}I zTY-75z^p4Eno}bBt)6`CWLi0y)=j2WlWD!cw9c8QP=w@UKXNZty`TOWC=BX5jM6vD&QZgAa4!i zt$@7skD35KmSpEhDgtOdz_j-9PBp-gJURlEkFR@t)#GacK99HJ@zy)uYR6macq;+k zI>%e(cxxPQh2yPnyw#1jw((Xr-nz!Ms&TCY_?pI#R5a=t*J{SKmQl%=)-k44jA;#H zS_Lqz0k~E$-l<>gNcG|_lYu2ryEp<%xsiEpWDstoamO@6;f!6^Lv7VMVGBD^hzHS9wUJ?(hm#jt(Qz z)i5GcjuELjOe+r4O%qaYm=GJ@TEkm2_=>@oMx@61kUBI2YVNDh*PySsujO0GIvz-+ z;Xvx`TE%O%El90xNTqE^1=^50!-mxG>(7PM*;m=Mg4Y_W753KGTfeu;@K*1wF}xK{ zh2f=Q-umX}CtqLq>cUqyUt9Rv<|_-=%H~>qrgcqS;jL=kn&w3_t!Jjy%(bfU))d}a zW?IR79Wx!nKkxty`v5 z%YW1?Zyn*SB1~%t(~4zUuS{#tv|5?gD%T3awSEA|JOlF1fJ`fusRw`54!&|wU2oms zs|L?m!E;jZtQkBj2G4rIR}0=+!CNVKZ~a0Y&uPcAJLFlXJnID4D#2G(0;-g+Jo`~2 z_*zH6=mT{3Q6IRcM!Bat@O9@}8+dxgS16T%uR3pSePw-JO{j?k97(_=@j+W z(_2lolt(2^>%Mr@(OX4tt#9q#O5Zx)`rCc-cAmUlCvV5e+ijxBcNh3BlkYJ3&H~?E z@|`8qu99h#@2G$sly=ua$=glxb`*HK3A~*oZx_kiLGpHwyqzPj5cjC2qm#hfMc~>s zay3nW4g%9|k!kmUYsbhO-6C>0;My$`$9#1Scsjzr$j5$(pr(gq?g8}&81 zL%w5x8l4@6T)RT9qX*Ct@=kXe-5_tbfVWe?+X+IuK&Blae@wdsOo!n`jmC32Ki&=j z?*ZPfkM9g{447Mx$#miW1h=+bs1e7lhLv9GtGBve5b~DI!wC({LrQGc4)la8Ew+IZzq7a3&7if@pfN)=S3J@7jMVK+imf7TD)BrZ->PJ=&pD>E8eb( zx1*w);@U}Z?V`ALP+YqwuALLtu8C{M#B~N1K(|Eglz6)&-VTYkJL2t(c)KFrj)=D# zA^-rGc0#;e5N`*>+x_r%J`6_J!z*+=yh69bwUcx0bdb~KFzs-7yBprlhQH`)_=~CY z7hRmU8+yCk+X<-#qr-LO+mTUAxy&x^Ih4hPy0fE#_H^MQhP{V=?!*XDMef&si)w zi*=q|3|Mq<-VTPhdo%4`n07AQWjE8Vg=w3&W8v-Cyq(Y6t$Di@-cHTirMZfAzM@0( zc4yws%-gB(b}3A|GH*xb?Z&*Fn70e_c3|G_%iDQ*yDo3XW!j-I?M~Q=&V*@K!n7k{ z+HIM3TBco=X*a^O6JgqgaP6>MrvR?qm221Yc2?f5%6A}4yAR&ZgSYG8?KpTl*V}FI zc2wR@gSX4z?J#(|3*OFxx2xdoD0sUmZ#Ti)N$_@3-j3((B6vFp-tK|7i}H33yxq>* zHSl&&-j0E{(|Nnr+p*qm^>(VaOT8WHDi$*p$1xP$>FrD>(UsomNI%i-Q*@(yI?=VO z*RK1HemA9{pS-k_mvZvbO(oi^3q6N3du_!d8s2WmB33Q@X|(J3W1kC;H8W>U`iLcaul=yFID8FiM$k%mmUHI z1FqDNmlpC;LS8z^OBe7|0ry<`2`b1m5I|n~$4<}$+ywPwCMW`4Vks*z&q|D133`B+ z_CXCWrF=~39xv77opchk03$*3c#6kI-0{?ouY(RsfTwdjmE&m~Pu+M5$2;^52R4G9 zado4Jc`jnnMbI{gm}esHCW5kYrE3fU1Xbgu1NepML(nv?6peRA0|0u4l!cgQAs#IR zHRB*?8Oxz$ymX8!6=NP~80$a<@X`Rh6pWXC@lr2d+QmCPc_|lHy2X`h@zN|_ip7;) zaivyVt9VMqC_2TJN^zx8ycCKned47~ytIicW#Xkvyi|#oCh<}vUV6lp8gZpXT%}O69y%hnME?QXF1-!oRnuf1b{s%ASHxV^3jEUr)cM-qRSK z!g&hA(>GW8!j-ykrEXr@!b{t{l!ceFd8yA!*IeleFIDr>G%rQ-(lakL^Qy3%6kb~9 zrDR?@=1Rp}X_zYobERKi>gC#H6y@T&QWU22gef)Qr6s(Sgn^)2{()-Q2byIcrp|JV zxCc7Ia;OMT8p4%gdFhpx_Po?el`92-2l~M~P!HaLcJP#gm%5&AFp5%nsRl32;H4NW zhhDH8YQb`715GOG{Tuy3&2==t@Ob+FdEV(m85=GM$}FCnwXn$#iNm zofmlLoOfpOPE6iufp=c=PD|cd$@>ZGFe~uRq~x8Gypsa&oWMIJd1oZ=gyfx%ywj0) zO5mN1yb}Tsn2fyB0q0H1&6>!58c=|~@XiB}jx+n{9y*ZgG{AN8@lF!1 zbB}wb9t%A>Hw*Am7Mf?FMGLLvpggVNQp5g8p<`~D8ayZZ7-Qg7DI>WdM;5h^E&J@h%dA8}fxO{ymN} zX8D^*4rh+<%-3_$@bh+^;w9LArmhV9EqY~`XBiePL+v_gKY@ORpP@I;-l)C#Go7>P zL?fGmG0bxepN=7Rg)`4^9t~$L!!TjLq4V|gn@$;~-aBJ>C!BY}@Xj~yeBqrgyl&ok zgP$$@Y;&C~T*72C&u^w2od-};P5bugRgjXCRYotR!rKzBg`u_R8GrO~M=FHq@=bSxdcJJ$Vy?zajk4=v! z6GP8$fAIY>B00*=S2T!tix5C3`bYTURN7;S+6NysVcI>!TV{4z*LrAr3=zfB_?p9$ zGsug!4(oG~Ppo33Vg-4?h0o#w&ch5sKyZ)>RSTt8{lX*Jvx}piarBHxm&_TLxy+ zBd#caHOi4$@~J+34s&heW6r5AeH?Rn!#n3xo6deHl^m~4{}*$*{wh0Oliq<@SvSp& zSEsjNI@Vv|;#KJln0kWLurc7kfo6O}A2Jp`u%)RTRSg*n9azyWwH9Z02FsF;1r9DG z$BX!>akc`b|6aa-`LEP{Dbj(q_e@c0r6j(s=;>5@@!)OtOyjc*^EVk3uR#Ppwm8%5 zR5Q*rL}0|*XzFssy9bl;$M=#N)?Rsww!EjVP@gldF9Z{$?Egpn8u%-ezv`aH%kZd` zRztBLE&HE(E*#Lmi%|!=_y;8_$|lN@lj6Sz(4wRsB7NYy!HSi?cFE)P$9(MnC3#GW z(t>zVYuu!d@UQkKwc@F^4$n%|&ZYpjw-;0|^s7w85*_^UZ3KlYQ)um#f4xp)UQGhi z|CiQqdqCK0KtO$K!Q}B>A1+1n)DBuneMKOb)LJD(EY<2nasaK4q<1N$V)3h{sZUL~ zZX9ync*eP6+&R;K@XN6J95;W=dh)xEeEG@)gn!hZ)P0c;eZb#F>{>=O~PpU+_;?S0^P5%>MVfqOGiH@Sj;_xzk_x=s+y&+5!tc*x5q}vqu&ai(yVpr+7Q0f#6OK87;?(sqc#zB;lXOU+ zs&EceuXIEAo&N)AMPDbsd`TkYm%qI#f@3h}e@y2}%Mm~2pi4J&#BM|j$eB}SRkbW? zf-VGF92IFI-P?(c4gOX^T~`eQ3F^8B=35E1n<|y!-ZBnN*%ty;9iBLkV$=aGCTbs@FvGUejs2FFExf7KT=!&3p|vIm`e zQN{gJf%Ed{#JGRr664Z8&rLJ_?(Q}s<&BK0ieM?amA0I+>Xu#D@(4@a90@Q$+wt$3 zZYkwqflV10hd>j){qIS})IV%G`DavnZBjWjD2C{MUsLygv%Y^};KIp>ppx;xAYz1~ zP~l{pUe|>Y`~?nBp<-;2lBf^>uG{q48XfRb=YbfmYqUa-QLXM2p|^bpgxZAg*ZkEH zk~@;sn+$?!KNHJ|4*-$)MRi*-`KO(E?t$ARaci%!^b5lkZTzt_y1!#VV9HF(jjkHU zL|C9a=~%W9yl1d|xiF&RgZXY=q3^Pfi+g56&am68a*F;QqY1WW9Y; zSk*+tOzIxl(XcQGpr=S|3YyT4)SHNdfrWA7Wq8>9Kk9=;zg_fV;nV3bu--)W=O8k% z?&rxxw7gX-K_7r5>W9zkh_%05dmLN49aGZaXtTVg&O4HxY+fVJB2wwhAWXiN4!Ja` z4FK@uU#M02Cy`$P-tchhY<%kKCj=23YIy6qAK!3u>y?R!ZR~_e&)fWb!uQuxUxL7e zi=VfZkzKj{ow>Ei%5F=O4Tu*}3+a zTRAZ(c`jem^7$x2naDj7@TZ;s25~arFL5$#<`|Bz*;d{^bje_hHD|F;o7OuYe|h{k z9Tv3wS``HNA53BbZf!-ZA2hnIQ_RR{>zyuhx_hH`Dq+IhtKpclpWF&9KPqbYyj@Fc z#HT;Rt0IYx%|Y__mtF8NMN1}unhrz=d4X|~rI;gbP+K1Pi8wbMv7D?@NK$mc>l4-4 z7TBlD1Znqt!z?rw({36@gjw7$IAYfhq+ZzOAxMdrNR}K^GzMjRgmAvro^MzPb9@rg z?^XuF2QYMv+|z`QTi-vk3bWoS^-Yl+7P0tnE2%e6Msw(=`b}#uz0})%MXmQ_qBnN7 z6x+Je^~JA{pJdg#2`7XAZWNg7C!6W(uRon4=zG4*@q9VdryoYkd6MU#;Z?gWGC!0Y zJwVjB?aN1~AP55f@$p?8;%>Jfh>XllK9p+@oaEXb(0i#Rc>=Mn%ME3v4~T>?-8)bA zeLHXtx{okh3s3u*)_LQDOvHNug21W55K%nQ$LxW>-7eU>w@!wY|6X{X7lUQO3~V5h zq&R5cBknLQHVfAyP2ZX7&@os4Ev}{S6yWc_rgKTO?Mb!imRn}1Br}c#R8rq_m3|$CDuj^DCDxsS#;>gFtTR?C1s{-R)oMviaH?XUAhqYUuU zd9`^V9crQ1fryKUY8AxJ&^(M;9cVhFp!5ufQx3gy8J8qr#f-S(e ztex!m18PS&MP_>Sd<4G2l-~_G-PTj&Y{TC3AJVzdmd>1-UR$blHE&uV&w)RHwcv57 z-MfY$>ItyiV(Be28yMP3d_S(>Fiie{)tPgo0UL(|$141E$cu)H%Gmokl!;8Z(ACKC7Wrrig76h@xB_nu5I@Jhld>3 z%UO#{B7JOcdk^&nw}W%byf8tq^7m&im~7>EGp_@$OSf*rd7(m*{<2S}N_Agetbkq8 zTC*C-{N0;d$#%mhFksvMV^>jRl1RmF&~B;m1^rgDcDd@jDBLp9sa-KPcq# z=2+l=u-DJtpiCDAw1lWtVI1r~EDTK!C3>uzszlqYf0VwznKqPYv~DVXRE5JhSkf9~ z=)z3&LV*L7ho@{qiNDrNe;!sPU>r4Qi+F?}$#=(HrAVG&$oa%q8 ziaCJpnzFxA`jDvFpcIoJ(V!$jYIq-~sB4GWaM!0ES>s-Oet zkE*^?z`p90e)__`>AeGJ#{PJsgAPsU%8KxX1IF}Y)L9|#LSgyo;y_~9iINCixcqeU zq-xpAL5-#aUV)eGb5DPd+cqU)9aL!z08)eQf-vz^KPW*+&omwD;6rNAS|}_PE+UR0 zNwP|s-s}L_li)aEYxhN{v_h&C$boI&IVw6m9;vvLbdNf+HhgOFz9a4uf`2aW>A9)oAP&^(NLV^>#PlZ z=JXBu{!2Anoig>g!WSp@=hJl5f9>A=wp2vl3^SK+3ggAEbO4iRfuN_6J-;bFP{k*QXGOjM~z zv=FaJ|5@})c+c3R^U9Mw#`EFvZw&<^O7n^D>`G_VpLGu4R2#K*bWN8SP5;T4t-Jhh z5gJ`{c{mj1aLewomtB>YU8R>@1&w5fDpYJ?upk#IR*J^M2iSND*-;A$4zLvA5|~{v z>>xxK=#yGN2`x~70UZ6x(n48~h4M(a{E7{ikfJr!$|MF1tuB-7DtjX)lM?C&XA>;M zfL zmGBEw$Q-48bX4{OW0yc9vCv2+Bt;X_qg_6dF{%*M(u7~J91WN43oqLMj~|U3m91jz zA{{TmBD~%c%H9ylmI<0Q;Krl7tQe>PTp}74LL=$Hf@maNl(2ZD#0I|sg9ixG%{m$f za7+`~4)H#bEE{&W)B}!FIqaD6B_vIhuxLwY_DbDw_=I2BfL~a*UszkJK0*iVqyx4) zDyzfTIT5Ncb`CT}rCsZCjN;!X3M54ZQlT;*R5}_AiUy0DL*RmuvZ-`3Q{$b7hRmyW z7BrQIDp@#1>BcYm&kfjG7?~@Ztka8w;p-_Z#JiZnij}&-@QJms0be8U*HMGvZ7CW4 zI!lLT>x2vx9RD|t8B;i0o=Q^u5Uy&sxu{rT9yIg zAI(RRphf6))T;gIcN_yoANj4vKvKeVDzCpFz^au9Hq}b%=>^&s6?}yhdiA)Sz zvVi-a57%vh1F?2;G(|y}%&hRU99?g$ooUPX#G*@J7z;BiZlL1H{X_gXYr=rZw=}hC zrDp$_NWy3?v3jLeiWd@zj*o8ei37X1-eMd8*cC{x=6lNy^vjZmSIvu)9 znz&3}bkrcJz!%uyh3BQHDJwV(=aW$5zHDKoZ5{%+* z<~{WJX0Bc4n>O^{_3WF`$?4%u%qs=5&r?9kwR#sGHrn5@gm^xr)!#5E+{d*AJq}RT zS+zve8mQd32|$c_%5L6!SZ4iAe=Np^_pE@0s$kxzlJ{tXMWa|KO5StDn1YzOqc-7wVKs2@l1W z`n#y$mA=?S&AKN%m?^ll;(TdE=#r7G%!l5}$;~ziN0Y*H9`aC7h4eEl5`p$TZdaLVbQ%mKG@5Vf>*MF!~~2o#l}6P$|=4aZwtfh%H)!`N-{;%y)&$ zy^Dk2Y)rgtjbS#MGzAddnSVuye`THz$@9i>kj*BVKJTb9HQ8@gz#4k}0KtJF+RQ!*byH^FWXJlP35q-XbWNkVVH)|098 z!ACx>Rj`pxT1_tCtmn6pq$#YF8o1RlyO3nF@}7xJD)99d^_Oa&&9mQXTNPA694he8 z=ZmMqvoQ*H{^KTe!{(`j z!m_8wD}^Obn^y{po<`obq)}&vhpcJIU4CZ?(-O_X=K|tCB}LFh;>QM!{W|UB-P?!CQ!HynuVGc@ql6K#OQ~ zP^vtS7gV^jKpqRtr^#ER=H;};^GoGZPA@vM1+iG?(&V|kpcgUF9GW~Q?3$|BL7vE4 zL1)(9)VeX3JRu_2^=a0rx18MhYK*-784l@>{hV3Mk1uouKXM=QEK8UYBc(qKVzy56 zf|eq*3qol>h(3q$_DR-+ZZ9~E4P@}4$6!wAny z-Ab+-6_H-kk*PDjA24c5-l*SzvJncl2?d*kf^|Z{DxrW*DEL4qcti)- zr<2@Kj;@Qo$emjnH&Qsn398ej3rY%!Bj?4C1!8sDUuC#grJR|*%A}Yx&5LS{XJ57U z&LK$_4Grt_s~fLL-#IFHj)A(vpl&cI5(agJK@l*h3k(W}Ih^nn0Fcgrl}j?_M|DbH zWv(8{)oQlqLKkvhB*}uK1K07-hu)8vwC5t)`3i*Ke9l5z+*ze@L&h!A;z#^V598w$ zFV)FdGhv_>v^r^&kbo8=vviZSDYI+DnIv%n0|)t#b(rQaxF0?nESBGyV25U^sc@>% zy;5#Se9O5+ezpb$o2bkb>!-0xI9z2F(6jDRgYGJ@7t7$7#6c3DD(8xIM*Hk^thb6S zXSBa6X6a{`3t6FqO`!TF41<2@tXp}v4`LH^{0n)Ub1f6A)j~5$0rncpx;@f=a%88e z@^5i@edFvZ1|8DejkbYS#4User-eRJI+c_V3;4LV6xby6aHh&>?IM zdZ%h=pzw{!_>PT7tisd7f<;=Lz7{thW2!7~$_uLM1yzBmS_itOSq4F@{aw@K&l_K= zyf$*aRBe0`Jz195J*8spMFPkJ=rWbswc2Y6#fS1jRnNDe9w_IMQvHEKON=uYT&P5a zF;TRrr{GR3Ak*XptS|qr!4`1V@uP$|wZDRnjwagcu56Y$aX|iNRE?Yt)(wx|QbUa#HoFSUS}SSo z6)@#(q9d)$5oWZj=rE=C7_%cx8Ncl(79^aQvOn{4I>1Qhb=>-VoSzQSwwYZ~IB^`I zUw&oH+g4H7bG!$LDJ}Q}l_1zkj>7y@qCRqaAq(PR@T}Z`g;>Sbyrg$lW_I%1MC%WB z@+G>D2*FZ1l~&Di2hD8sw_LRLTw1%po6LKCXmKKymDDp9cS+kDLMk5vHCd_Q zV`yHYrpy8;pqrOKWg)4J#j$p2N+0}f<#xM9%}(BzTK#Bd(kaYJyLsp|Bz3TN6v0fN z-taa-g(a&A-uMh!d9l%r_KL^HGYC>#M>hr7nEddUlREPSg=1)@LpoTD+m*YR8~96+ zhUhWo%sU$i5BR`C;uE=V1jxB;Ygd%xbK{pVw}+QuHn;tCD%#(e{dOzn6c_&#(}C-liEP5e5BKqAa_4j$4AG% zJ?`G@+33-yB_<-1R(?c$@qX8H{b1%W0`u|l{tQ*ENAoP=v-g{xmOu33HSYt%j9XVk zrVJC zTOfl;v{fgSYk|+V+l~Gz=3~{q2T@I(^Wb)IQ;<2~&W{K2n6G{+@j6Ppx3`J6zbck1 z5X??sk0A@erkIWgYES*TB|Ay6>DX%UH<{l2((5+5wQIF#L2HL%KE zc_q*Xo#EqoFxCBa4+)-blnQ_!)X+`;lut2xR)U>)2_jzlu$J@p?NuYE6+yX`eAeF0 zMObs-U2zTFF8x(29Ly?7@l#%L^o`0HcF5}P0mA0y{Jm%N<{ zr`pQ#Kn>w^Xl6*svl8rpavo>Ew^5~4qvMTA<=UHE1P_meH0Y?huS#JWR*}0v+NnzOSEr zxn2kKXUl@nk=5U?;Od@W|(%I-rKiBnFI&i{xJk`>BnL#vfX z$zQp$4)*gHGL~Hj@g3orRwcNPE2QeSv?~DDsUY{91G-%Iv(^vP+no&V5 zD~C(A6X7(~iGNaj?GPVb6sD>W;5W?=xK8ml z$DrJUhZ*s4iB{{zZLj2jiegJ7Hc4yoIlADiaoL*Hn(;5JRXfA_2fi;JP>%OmSfkah z{HHLn`ID+klRE$nKZ~M174PTDh{wc&ULAHvy$-d|jyYdkpXT&9JBJ!hJWTIukFDg( zdDBQ@m3zD&GL3#dfUes%ve5$(QoHml+9iQhSs1leukmf4vD|eki90YL=&BrWPdS|t zGHon-f*+yD=^Q9eJw$_2e$JI%#{P6FZPH^cOc5;QAH^Hl=vvq-&gj<{LPPm++E|c$2T1cb_+$ZF+lV&?g|!CPLs8> z6m6`5Ddq;^#$5tZD7yuev4X3azF$pZANf!l3%Y7}ydXvAV0$kJpcAKfh?Da9z_Gc9O1rUAnXELN4P@_B%UT~ zjB*0CJj7ETGPQ)@FAI*hDhektJ4tG#Za^ZvAQ4`WJ2W{ze=EyynsqKEgh|V00}?{3 z(WA=hp`66EWH%uGH0vDE^dnhjnlh6X%Le2YZ7f?9eI%=idOn=}9OER?!j+AT8&+#u z2O^Fx%BrH~04>%yBw$!AbzL=KT{XsHaY)T?9jGDWybgiVxUxbaec5eF| z@=%m{RaIzRm1kX*WnJ~xn(FbI>fV~_`kLyyHPwO>SrDm4k}4~Sn&U&}^VLY806UNy zNT;u=LJ1J_7Oqp=1kw@(*+5ths&&7TJp#T(Ieh`np#*0U`hy5S?{2VanKz`3!bQXR zwQ&8wp;~r(Z~+(yT@AMe?8gdTfX|gvcGHoY18OlRI1hmrT{yQ++#4^5Sq&ID$Aio- zLl$iVpI{-usC*)_Za~du4OonY1fb>!6zeH99yu1dUok*z7p~h2;zgAOpys%d`P@h+ z?v{sXl#ofa`50he7w%>!&ax9{(aB+S9frQY>Qgn*UpJA0zlf}qLS=H6&hS5vklsPZ zo%@7vJW?%In(H@zfF*NelR1nGX|?`?`-^$~Cg2BFVAjejVpDJ(Hy52*@ot~0gcN(K z$1~|g6(b8|Wi^HWE2y&VrZ&_AlG*GWH}dPc%A<)`+}-Pgh@BsJyc_!Vi&ShF`=c;+ zqZbtZFJ#uZCE}C4w3T`np6w<;5*e`jn>N#IQ!Pgk+)aLtv;PbNy)j;(2v5P4#1Kle z*d=A7PYA0F)fD>+E&P%oF;t~t%M33PBpLz)8MfH-A}bA$AQ7t3Z88A#7#TcGX&*pX zO(T@15uDSAohiiV6q-YK$;p>om}*aK;wLuE5Ss9WCVN5?KLNSJyA)l0yc^fG7lm!u z^=cB>t&Uo{n&R3dI0cszL&#}Av8aZp@^iP$lu+;`P4*&{f+QnZFSJGHo(~pHoxK>B zKy^h`sy?4Ec|IX9t7;@oGrCMOlA;-blBx&$DH{oB0}Q&6W+Xu~5~mr7(TqfCMj|vL zAk7FsGlHWkxly3=qSC_unj+j!VeNO>NkJ-2P&SfhW?ULl9IiQDeq%@%lmp}Vizxi8 zXe+A*gX)DcHjrz2O*`2!&IO3GCtJ*!Bb1FAcp#%LPj-t`0U+n|gFxI&qs5%y`GFS} z=Z;|jkjInVDIUlUPyKgj`uuTSn@8oMOLpNzpUF~6y$k1E%XWj=0^dStNa*oX-lXuE z4&9$3il5s0Iy8TlD10JsdIHZx6h4)0dIHXt*?JYmJ7j-~$bU-M^u#CGvV6kzbx8aa zVe9>#9I11x!I>1E9|>Od#3iZaN6H*Oz0o_I94UVM)S?$M*1_>}nWeWrIgGfXr zv5voIt}MMFk0QlaJ(H4bA4LLJJ+Vo=k0L)FX&9prqaC{#PqwpV$xj6v zp3zCX_{djB8iu_~BOPzfmL)zpZ+Nnvxk`Mp*zgQan#_qTKGM+b1&?$LowbZ{XX15J98ENw7%}?nPi(C8F-|j-isdYXg+fVeyUmbgeTeJA|XdFtIw8&KgFzj z+Wp35MQR*rDD)N&b>y8b3x3jF_k@@ztb5)_;$`|IwC-u1#QQMv&!NWU-lf3~%-J&k zr-Bm=P;c>IN7UIe->0@UPjHgjOh-m<@qZ<=9jU$P|GECuIQHD=2svB+;<@C^8McN%g!X;^vKFX4dGtIK!^3&a!F+9PuG&j+(Qk)Uf@8-v!wlrj)dO8El)%* z`#^`;SqWz(KIR8Qg$kNq0HIyDR&q}!TipP zx<%LQhL;|Ki>|z>@4`$SJ)bJSSc<8B>0$h0DeSy)45JKRzw;t4jIu<2DnfbbL3tO} z6ho7>j4w*0?6a- zn%X<=M3Zxtnft1H<2#Q!s#}T6l6PRMD%O>~3NqfVh!tV40;dE+kDINl*vH$YuqAS@ z3;Nn+9gzZ< zoZMRrJUVQ<>obmZH=;F5qD1($_A^QYS=IQ%cLTRb&DGb|st{(`k`3w-q~`LA>d``z zcLSHG>K?$>WO9hhR;9Sq3jk8UjF)ZB1o5pAx1IL=q%BCxc7)}Y>*v6J)H3D1mTgAq z)~jYQlt@J>`(QiW%U#RMUDFGUY5TAkQT6U4`J;y_C0&ie$6KkSZg9}Zgl$VYzk1(Y zE1Q8-buiMkEMf-m~)Wg(W#l$_3s;*n9*sSBNq^^T>C44PJ z?2P-|Z0+@OM;X~uy_MoC)cX~iHOrdodzi8(9R#~!is;y&Qf|fC8J1?}U~b-YmHjle z$+S`gOLp4TMb_n#()#+;uLU-4?p5G{@@}4ImYr=Doo&xtmWzYGn@mm^H>(~r8rhVr zPOz-GUxw*A7-p5=&qFDV2c&NGC#5X)w_m}OgipL%ov1lh=iBCOzCb6Y_uDcQ`?^ zX?u(7dIMv;1!KJVV!Sn0yPf+;#nS)sY+9Wx@Z`yy`FGp&wTPV+U;YY5an-uz>i%bhXD*QVN+DE05a1` zwVCUXhjR6+Ym65%nx=LIW#<|>1!;iyP2|RZH8NkGXKxGh@Alh3hSMbemFR1kCs1bz z)EPJ85i66s?dd2v$3aau!v{Qq4vMafN%F`#Qq5tgGA#hb7M4U8ibWSVy4jk$G1qQp zy4z+lX_6=!RCsoL@i0%en&Q*uH!K{xyqt}GJ!Z>HD?lJ+h6#;}R~Y6UTUtC4OmBSe z&py1D6~8rdF9vhMxonNQP$!A!%T zos6c;4n6}{6ZOoy;mvn3$e3=mo8H~}UyZ=a^L#!QU7if>Vz;f?JFNq2-Q7=Y{i`%{ z5#AE7`E!f;f}5Ym1BmDLE(4=U=QqhQS&`$%WO3#s$4H8oa& zJ;uBLkV>afMCrx62NQN;6cH-r9Ie88fSc|)#v;Sno_VZA)CYCj2q(XY^LfY=<^80K zIztr&*r@}SD#)&!+-14|JGGdQw!ME#uLBqTiwU= zcUt$(YY{aY+pQ^r_HM4<@EhLhws^AOhaTwBT{A_rsjk^PnW7qmK?cGm(e+#16UU+8 zfgYhXZ=JRQi(78q*q!Ti_wTg!w(~gT^UAX3eeaNJLa=EzIsRq&Z{aT>;u%m$b@EBeNVdDr18S;#~k3gzzr@{OmeU3IZg?Dbhr;6p<`RB+FOh zu6Lx7^EI5zt9#79Cx7Ko*k%-orP^}?*z_T`MiJ@Bls%? z{%7Cl3)W9gUyh*lqu)UYW)j(is%k=2JPK>`M#Os|?s_56G#nl&SiNr!wi+FD?gni$ z?!HNh;4GFzA|zwB8Ji}1n{h^UBQQi%oM9t<%(qH2vtzP9m!A`H=_8*lBZAP-v*r}f zda06+3?`|9&6+r7m#S@QvuiCj5W%#G9Axp4sxAsVLK(uih_wjyxd4+@6b>5uFjn7( zja9YiDL%I6&uLTlt_@HW)TJ0#8XWebCcm1=rjoNd=bFK$0*qCMaYc%%Dur6&ud~71Wa2px{74{w%U%XDaF9Y? zLkwdPH(FFr$!Sz_HH9Z0QH%usB#%&V8T+9v~F;oRCqSWUtQdF0uy(afhlZLRB?b z5$K-VK|FPO8ii=WB0^EXGCao;@#{+>vgwcvpptc4a8neC6Y>y^tXrsdOfh$h>Ka0x7B)$F9;c5eLFOL1WF3+PzB>7KS)sScdqi?G41quaxmxxf zAh-G{d#eaZ8aZi+qoqa{5js0vJ>g^FB1YRwMFyISl2v!_y8vipm6otnicM;h%>)I5 z0`^m+F-xp1xMNjL)Qb}`2a0_Qae-!Y-fd(n>P15F9-^s<=R0|U0)rz$$+C6`V?-`V zb2FyX-r!-5++&I)KQatVHXI&p_mL;Etyksq zp4N4C*1YtBdwRh=yk4){`5vjDA*YIg!}^F}eF%he5D@9?JY}hhD^0FRT+1@tVr$AW zTpG5mE5T$H32EgI>8B6rqlfeZEd{-KJB&n^=ewYSbFEOmBN9`T9e1=Hd$b+%(IAuc zPe-BdOoTUYlT=CJy6@E{5WT3vuzs+7V$E*tkQC8Ly3Hkv7&LCWlD$B+3wxN3H4>qM zcx%H&K;;r!Qjf7lk6pgPEmmA+%LlySTVMzZz5#{|g3+G#HZ;=hNV0+597&~GoYZp= zR}-pQLApX866E)N80PSbj`*xv&7J2<6F8xp&eeYPK~{9&0H{sER25-rlMqQoh}xua&@|~X2?h^<6$Ze- z0b{{)i4$X{bM`6JyGv>5L`Cf}%NqQ0(!>J?^q~qrRb{38-70&4ktlIlAI{MYbas)F ztM6~nC8*SCW8k7NxCl(`48Z=lY!xn)WHZr#aTctTK3in{2M}fp`B}vJ_#IKDPNI`k z-AHVJpESY?{Z<{?yx>MFF8gJE-V0L;_1L9)=u@i7Qn}45mBn%+bci!4oE&GDPi=Zd zy17!cTSi`SiMN{z4@1FkIX$K+J5U?#smk`$Mmwsq9kr3ytF+qqLD>m+@p$&YCd7Re z;(c7Bj&&-gHS*AuZBUEyS~wQ1FcvMF0#V?2cIqa?^teV6>m-D662v&=(v-Pqjhr;) zo2W%uEi$u~O}=RHShmF`1az#-Ar^CyoR>IKO^LzP>fIR2me_=-tU|btYgn*O$+X66 z^awsxW_Z!%m2!K|0cKL888y(61M{`ff=ELTU-GQlvbmC%q z%Er4CVgu_*BkO|%e`r|6SKf(S(WQ}WzuJ>jkJ|lI=M9`hAF%jlDSP^eaigA8;0ORQ z0)UK&DeI6LwMoj%E-p+|Wo>Gs7FAiRyR)Vfu z&7F?;!*FhJM4>*?uR4HK76wJY`k^o_?uq@H~p~UW2 zjq+0IL)k`tINfz82+YYcPNX`claoC;(emO4c7-A1Mrjm4Kx;2^t2)VzpPZ?N%Tx=? z6jj)PFb->CFiux!jh9eGd|KoTQQ!`Q?^WZ6Y@q}vb1k0Jnh8-zZ{rbU?yx2TS#(x& zyYXFi%`4?Znmy_8_H&@tnw#OQz3F{P!0+flOIRdvKO@}qk7^grKfG7&y zhGb!#d`ZgM@WoP<310FfU^viYr`nNFV^64o5o&A*HP(chmoO&}lB^l2Q60X>1ux=) zyKrgoOajq?xIJP`b2V9imYB@4CRwm+fBjw*1bbLxgmIFjHS(bV#iI57*%PY}-@_Ws z^U3l!#cI{-PEim$B9lVDr?@$kaZ_O0o(CF}&a>!kQ3vDy3F~&lU z7jF|A-s?8K7utecJ*>Hl0w^K@MfSY76g8V2To~Hju{oZ%m-)rs&Ff7lmp#*HhUN7q zDE$RPZ?49Lfa;!9U9_8HJww~8307^rLJh8>1|wG5OJ;b&8ZLnM%&uoC^44j3b2k2} z=@y0DT1=`k`3YCji(cO}y)%!v8akg6)!k>@a21{pSB$^vJ0BR;c0IVCQ4numLTl$g zs8Ib0Xa8$C{!M?pNWVp%r$X_tN*?QwpS1EzSpJ`c&CRiI@+k}zmIb)nf-u|P^IYt4 z=30&l0M=^L6m(oAb{H}CLL^3ZQ-933ft?oX+-Iz0PHzgN=?TJ#7tW<>c{i>w$8a}X z`+8MjwW{#)X@yzWPF(VS)1&>Yl((j%bJ(c$4b2AAuQ4mrg;KBK%vB9029<|zo;RNO z%tv?EJ}3l*M`=5Z_SfJaC^5WF;;4|yeV5VimZOQXeTiio@}u7N(Q#rGs~Cq!nv!8R zpZy(}!)=&DILsjo=D7xfuHZnzOHx^EI`QsTaQKz%JaN<&dB(4+NN=&Gg8I>5Z0qIOC}bXD(K8UHGSnf0uS&%4HF= zXGdGI#(AOtrc>yKX8vAr@HdwUwfl}Xc zX~m~8`a9Yryp*W*c@+&Uc=Ik<^KN(LYRk;8Z_Hg0erKOxOS#Nnifh0B@1KmTDGx+? z{^|bpzvbV7p+EdJU+oRopZhTWckT9?3Z?5qWp78^G(NJ`@lI*RYP8MeW2fE8dvDp8 z+SOX`eVg5Q*E5T3!>c>E^Iy6#>7(E&x_NiE(tpT}J^6ld!vf{6lJ;NiY|e8s#d!GK zAZ>T`c-|y6+x%cEY`?Q;_PPJ@BENli^~u<=n>uiR{_jLfzk$=~ zUg^GViqp%%t7DPs|8D4$2Al8vuhgQ~yu!=)(UUWk`F~JJzXb-R-sDC%9z3|qqQUXY zq`tHz_}$@8R^{JfpI-im89v_aaw={OeUWHkI4#x*3$A|e_KA5C@sukd+O%yTmR_UG7w}1L{ST{{3cy@ziV{ZIj}q%)HAtY9PG-%7Tyx^aHb{-#vwUJf78dlYVc`QBCV_VyPsV{IjZ zfZ}L0=CMh$Pq5Ip+xqTeu(0CW@fTO9hP`F4dJ_CHa)0}OiD(IKSWg^8s3!b3^K|vm z^nb2@F1JMguIgPo$L;XPbOzmD=KL$ML#a0ZIQrk&@AcT5KfIUuvzDwv|87_*ZhdI_ zB)Vz1*h!-W&c#QX8LP)K_rD!Iy~v^Si813cZ7RIFd1`SNnX2dgIlb|t~9i^U(!Fb>^)&e)-IRD zDgSu{%Z#{kbWiQWV?nj}h**9mr9;`G4j+%T|KRTsJQ+FH%{XN<1 z{_NIJ1-QVO_++U2)+e(&K}+kqGI;gg$pw{?s_g`;!K~BNgl3D}f8w%oW49CGrgXyX zw~u0_e1H70URE`#WHu4>zgODpVE4PVZvy6u?0os=*T}%RU)wnI4(f=%@Tse|j%FFvniSUnO5_0A-vjbf}fjzJ9%yA0$ z-1v|E2K4^`K|sF0`XjBYn|-_bUvIl>j!pjtdut{9dxkI}@rJ|nl8c#rjvQ;T!5&ot ziQ!k=oVs!I;|>Z>x8oj4$Xwg0oA4Vd?{55j_=gp6UITai-*`jk8zQm(XAJ`H7h6BZ z#0r@3Jc0J``46RS2^=||Kjgz;ajcpBd~yogGVO*#&mWvX=R0xN1Me2*#I@Xh96br` z)r@g7fBMfff6MvtDH5&{y*#kIV~aN&`Vr`-V2BuuMV+( z3`~WS+O3|{4sZt4&5>H{nV0@}`<|09r#re&ciNW?eP8Yu_@t7&OL_0WxijoEsIZlu z+;6(9a)A8oQuh3hro)-`Ty)|s`jQbJ$J^pQIrT5cr~f^KzWD;rVW_X%Y&leSD9!W? zsj+@5J@&W5x%UN`JA)+GM!P3*=oSS1wCU$1-4uGn6m9@s8_p++rtnA`f;Zcg`^Dlm zz&36h$xe~}z(Z#MAazPc*Pu4tfUcEpNXU!jc`s2H-3`J1P3hoP`#w&L#Nm|b#4Mss z5p~}W@nZOJHOhTMWfLd2-5jd#hkptBsD0a6;T~xpZ;xINgZ|;o$f*Bqnn$G5SCs{) zIC~v2-O3Mt1dSTpny|MG&#q!RU*+^(Q~8G>-?S6;u-SLE;fcE=Xd|ah_gf=;1T8l9 z+l+^ez0%?`lhZS)+*fJuMrm`>J1+eCwn5Y!Tkd==`$a>>&}7hRveLt>XL5+nFc(qf z9-r3tXpez!wxCCDqtCC;vDSSUAO3`yeEP9e-#?;rA7$nv9-u?^?s5ZC>JCExO+-AM zeEVw5x7cCPJfoPKq3Q|I{@Bd!5;&!O!h@? z

  • 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 literal 0 HcmV?d00001 diff --git a/tests/golden/WBV2-P1170-000/manifest.json b/tests/golden/WBV2-P1170-000/manifest.json new file mode 100644 index 000000000..553e61dca --- /dev/null +++ b/tests/golden/WBV2-P1170-000/manifest.json @@ -0,0 +1,53 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1170-000", + "parentTask": "WBV2-P1169-001", + "operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "MODULE_EXECUTION_QUEUE_BRIDGE", + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1169-001/manifest.json", + "sha256": "bff38cea67a05f75bd7b5721da87bcb211137265acd51f70973379730ee6f2c1" + }, + "plan": { + "path": "tests/golden/WBV2-P1170-000/module-execution-plan.json", + "sha256": "0e4f6c10d6d6a2fafa947e52b61b5d8fc84b82850cdf4b791272bfec07b8fe4c" + }, + "report": { + "path": "tests/golden/WBV2-P1170-000/successor-authorization-report.json", + "sha256": "953fcef680fbb14286e980bc302024172fcceb0eda93c1b2e009838aeda69d00" + }, + "status": { + "path": "docs/status/WBV2-P1170-000.md", + "sha256": "68810c742d319f8f4c66485fb1fbfad97272bf99c2c2e6aad5c2be5d8e09fef8" + } + }, + "assertions": { + "sourceBackedSuccessor": true, + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchSize": 8, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 566, + "dynamicUnverifiedUnits": 3179, + "boundUnitDelta": 0, + "fullHistoricalReproduction": false + }, + "nextTask": "WBV2-P1170-001" +} diff --git a/tests/golden/WBV2-P1170-000/module-execution-plan.json b/tests/golden/WBV2-P1170-000/module-execution-plan.json new file mode 100644 index 000000000..d7126d64d --- /dev/null +++ b/tests/golden/WBV2-P1170-000/module-execution-plan.json @@ -0,0 +1,10039 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_MODULE_EXECUTION_P1170", + "operation": "FUNCTION_MODULE_MIGRATION_PLAN", + "status": "COMPLETED_MODULE_EXECUTION", + "authority": "blender_main_source_and_existing_hash_bound_receipts", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "inventory": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "mutation": "forbidden_by_module_execution" + }, + "reusePolicy": { + "completedReceipts": "reuse_without_rerun", + "continuationEvidence": "excluded", + "duplicateValidation": "forbidden", + "fullFamilyParity": "never_inferred" + }, + "verificationPolicy": { + "browser": "chromium_only", + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "failure": "keep_module_in_progress_and_do_not_advance" + }, + "modules": [ + { + "id": "RENDER_LIGHT_CAMERA", + "task": "WBV2-P1100-001", + "owner": "RENDER", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-LIGHT-TYPE", + "CAP-RENDER-LIGHT-AREA-SHAPE", + "CAP-RENDER-LIGHT-CONTRIBUTION-FACTORS", + "CAP-RENDER-LIGHT-SHADOW-CONTROLS", + "CAP-RENDER-LIGHT-CASCADE-CONTROLS", + "CAP-RENDER-LIGHT-AREA-SIZE-Z", + "CAP-RENDER-LIGHT-CLIP-START", + "CAP-RENDER-WORLD-LIGHTING-CONTROLS", + "CAP-RENDER-WORLD-PROBE-CONTROLS", + "CAP-RENDER-WORLD-ENVIRONMENT-STRENGTH", + "CAP-RENDER-CAMERA-DOF-FOCUS-OBJECT", + "CAP-RENDER-CAMERA-PANORAMA" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P595-002/manifest.json", + "report": "tests/golden/WBV2-P595-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P596-002/manifest.json", + "report": "tests/golden/WBV2-P596-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P597-002/manifest.json", + "report": "tests/golden/WBV2-P597-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P598-002/manifest.json", + "report": "tests/golden/WBV2-P598-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P599-002/manifest.json", + "report": "tests/golden/WBV2-P599-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P600-002/manifest.json", + "report": "tests/golden/WBV2-P600-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P601-002/manifest.json", + "report": "tests/golden/WBV2-P601-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P602-002/manifest.json", + "report": "tests/golden/WBV2-P602-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P603-002/manifest.json", + "report": "tests/golden/WBV2-P603-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P604-002/manifest.json", + "report": "tests/golden/WBV2-P604-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P605-002/manifest.json", + "report": "tests/golden/WBV2-P605-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P606-002/manifest.json", + "report": "tests/golden/WBV2-P606-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SCENE_OBJECT_MESH", + "task": "WBV2-P1100-002", + "owner": "SCENE_MESH", + "sourceBacked": true, + "capabilities": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-CORE-SCENE-OBJECT", + "CAP-OBJECT-MOVE-COLLECTION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "report": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P24-002/manifest.json", + "report": "tests/golden/WBV2-P24-002/object-move-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MATERIAL_ANIMATION", + "task": "WBV2-P1100-003", + "owner": "MATERIAL_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-MATERIAL-ANIMATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "NONMESH_GEOMETRY", + "task": "WBV2-P1101-000", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-VIEWPORT-NONMESH", + "CAP-NATIVE-DATABLOCK" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "NODES_SIMULATION", + "task": "WBV2-P1101-001", + "owner": "NODES_SIMULATION", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES", + "CAP-SIMULATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ASSET_IO", + "task": "WBV2-P1101-002", + "owner": "ASSET", + "sourceBacked": true, + "capabilities": [ + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-ASSET-CATALOG-MUTATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "report": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SCULPT_PAINT", + "task": "WBV2-P1101-003", + "owner": "SCULPT_PAINT", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-ATTRIBUTES", + "CAP-SCULPT-PAINT" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P16-002/manifest.json", + "report": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UI_EDITOR", + "task": "WBV2-P1102-000", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-UI-EDITOR" + ], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "INVENTORY_GATE", + "task": "WBV2-P1102-001", + "owner": "RELEASE", + "sourceBacked": true, + "capabilities": [], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "OBJECT_OPERATIONS", + "task": "WBV2-P1103-000", + "owner": "OBJECT", + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT-DUPLICATE", + "CAP-OBJECT-CREATE", + "CAP-OBJECT-PARENT", + "CAP-OBJECT-COLLECTION", + "CAP-OBJECT-RENAME", + "CAP-OBJECT-DELETE", + "CAP-OBJECT-TRANSFORM" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P17-002/manifest.json", + "report": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P18-002/manifest.json", + "report": "tests/golden/WBV2-P18-002/object-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P19-002/manifest.json", + "report": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P20-002/manifest.json", + "report": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P21-002/manifest.json", + "report": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P22-002/manifest.json", + "report": "tests/golden/WBV2-P22-002/object-delete-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P23-002/manifest.json", + "report": "tests/golden/WBV2-P23-002/object-transform-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_SEQUENCER", + "task": "WBV2-P1104-000", + "owner": "MEDIA", + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR-NODE-GRAPH", + "CAP-COMPOSITOR-UNSUPPORTED-GATE", + "CAP-SEQUENCER-MEDIA-RECOVERY" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUDIO_PARTICLE", + "task": "WBV2-P1105-000", + "owner": "AUDIO_PARTICLE", + "sourceBacked": true, + "capabilities": [ + "CAP-SOUND-PROPERTIES", + "CAP-SPEAKER-PROPERTIES", + "CAP-PARTICLE-SETTINGS" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P33-001/manifest.json", + "report": "tests/golden/WBV2-P33-001/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P33-002/manifest.json", + "report": "tests/golden/WBV2-P33-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "RIG_ANIMATION", + "task": "WBV2-P1106-000", + "owner": "RIG", + "sourceBacked": true, + "capabilities": [ + "CAP-RIG-POSE", + "CAP-CONSTRAINTS", + "CAP-NLA-ANIMATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "report": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CORE_SCENE_GRAPH_SETTINGS", + "task": "WBV2-P1129-001", + "owner": "CORE_SCENE", + "sourceBacked": true, + "capabilities": [ + "CAP-SCENE-COMPOSITOR-SETTINGS", + "CAP-SCENE-PERFORMANCE-SETTINGS", + "CAP-SCENE-SAMPLING-SETTINGS" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P65-002/manifest.json", + "report": "tests/golden/WBV2-P65-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P66-002/manifest.json", + "report": "tests/golden/WBV2-P66-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P67-002/manifest.json", + "report": "tests/golden/WBV2-P67-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UI_EDITOR_VIEW2D_STATE", + "task": "WBV2-P1130-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-EDITOR-VIEW2D-CUR", + "CAP-EDITOR-VIEW2D-MASK", + "CAP-EDITOR-VIEW2D-FAIL-CLOSED" + ], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "CURVE_TOPOLOGY_EDITOR", + "task": "WBV2-P1131-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-TOGGLE-CYCLIC", + "CAP-CURVE-TOPOLOGY-GATE", + "CAP-CURVE-TOPOLOGY-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/M9-05/manifest.json", + "report": "tests/golden/M9-05/curve-toggle-cyclic.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CURVE_HANDLE_GIZMO", + "task": "WBV2-P1132-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-HANDLE-MAIN", + "CAP-CURVE-HANDLE-GIZMO-PREVIEW", + "CAP-CURVE-HANDLE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CURVE_SPLINES_TRANSACTION", + "task": "WBV2-P1133-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-SPLINES-MAIN", + "CAP-CURVE-SPLINES-RECOVERY", + "CAP-CURVE-SPLINES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SURFACE_TOPOLOGY_TRANSACTION", + "task": "WBV2-P1134-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-SURFACE-TOPOLOGY-MAIN", + "CAP-SURFACE-NURBS-BOUNDS", + "CAP-SURFACE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FONT_BODY_TRANSACTION", + "task": "WBV2-P1135-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-BODY-MAIN", + "CAP-FONT-BODY-RECOVERY", + "CAP-FONT-BODY-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FONT_PROPERTIES_TRANSACTION", + "task": "WBV2-P1136-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-PROPERTIES-MAIN", + "CAP-FONT-PROPERTIES-RECOVERY", + "CAP-FONT-PROPERTIES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "METABALL_ELEMENTS_TRANSACTION", + "task": "WBV2-P1137-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-METABALL-ELEMENTS-MAIN", + "CAP-METABALL-ELEMENTS-RECOVERY", + "CAP-METABALL-ELEMENTS-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "TEXT_SOURCE_TRANSACTION", + "task": "WBV2-P1138-001", + "owner": "SCRIPTING", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXT-SOURCE-MAIN", + "CAP-TEXT-SOURCE-RECOVERY", + "CAP-TEXT-SOURCE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1137-001/manifest.json", + "report": "tests/golden/WBV2-P1137-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "TEXTURE_PROPERTIES_TRANSACTION", + "task": "WBV2-P1139-001", + "owner": "TEXTURE", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXTURE-PROPERTIES-MAIN", + "CAP-TEXTURE-PROPERTIES-RECOVERY", + "CAP-TEXTURE-PROPERTIES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1138-001/manifest.json", + "report": "tests/golden/WBV2-P1138-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ACTION_GROUP_READER", + "task": "WBV2-P1140-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-GROUP-READER", + "CAP-ACTION-GROUP-RECOVERY", + "CAP-ACTION-GROUP-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1112-000/manifest.json", + "report": "tests/golden/WBV2-P1112-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ACTION_POSE_MARKERS_READER", + "task": "WBV2-P1141-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-POSE-MARKERS-READER", + "CAP-ACTION-POSE-MARKERS-RECOVERY", + "CAP-ACTION-POSE-MARKERS-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1140-001/manifest.json", + "report": "tests/golden/WBV2-P1140-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_SAMPLE_READER", + "task": "WBV2-P1142-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-SAMPLE-READER", + "CAP-FCURVE-SAMPLE-RECOVERY", + "CAP-FCURVE-SAMPLE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1141-001/manifest.json", + "report": "tests/golden/WBV2-P1141-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_MODIFIER_READER", + "task": "WBV2-P1143-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-MODIFIER-READER", + "CAP-FCURVE-MODIFIER-RECOVERY", + "CAP-FCURVE-MODIFIER-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1142-001/manifest.json", + "report": "tests/golden/WBV2-P1142-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "DRIVER_READER", + "task": "WBV2-P1144-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-DRIVER-READER", + "CAP-DRIVER-RECOVERY", + "CAP-DRIVER-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1143-001/manifest.json", + "report": "tests/golden/WBV2-P1143-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CORRECTIVE_SMOOTH_READER", + "task": "WBV2-P1145-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-CORRECTIVE-SMOOTH-READER", + "CAP-CORRECTIVE-SMOOTH-RECOVERY", + "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts", + "tests/files/web/modifier_corrective_smooth_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH", + "task": "WBV2-P1146-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH-READER", + "CAP-MODIFIER_READER_BATCH-RECOVERY", + "CAP-MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts", + "tests/files/web/modifier_reader_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_TWO", + "task": "WBV2-P1147-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_TWO-READER", + "CAP-MODIFIER_READER_BATCH_TWO-RECOVERY", + "CAP-MODIFIER_READER_BATCH_TWO-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_two_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_THREE", + "task": "WBV2-P1148-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_THREE-READER", + "CAP-MODIFIER_READER_BATCH_THREE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_THREE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_three_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_FOUR", + "task": "WBV2-P1149-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FOUR-READER", + "CAP-MODIFIER_READER_BATCH_FOUR-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FOUR-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvproject.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvwarp.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_normal_edit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_to_mesh.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_four_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_FIVE", + "task": "WBV2-P1150-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FIVE-READER", + "CAP-MODIFIER_READER_BATCH_FIVE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FIVE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshsequencecache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_multires.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_ocean.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_five_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "task": "WBV2-P1151-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-READER", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-RECOVERY", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_build.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_color.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_length.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_texture.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_time.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_SIX", + "task": "WBV2-P1152-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_SIX-READER", + "CAP-MODIFIER_READER_BATCH_SIX-RECOVERY", + "CAP-MODIFIER_READER_BATCH_SIX-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_mesh_to_volume.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_particleinstance.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_surface.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgmix.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgproximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend", + "tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend", + "tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend", + "tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend", + "tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend", + "tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "task": "WBV2-P1153-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1150-001/manifest.json", + "report": "tests/golden/WBV2-P1150-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1151-001/manifest.json", + "report": "tests/golden/WBV2-P1151-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1152-001/manifest.json", + "report": "tests/golden/WBV2-P1152-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SOLIDIFY_DEPENDENCY_REUSE", + "task": "WBV2-P1154-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify.cc", + "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json", + "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_RNA_READER_BATCH", + "task": "WBV2-P1155-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_RNA_READER_BATCH-READER", + "CAP-MODIFIER_RNA_READER_BATCH-RECOVERY", + "CAP-MODIFIER_RNA_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend", + "tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_VOLUME_DISPLACE_BATCH", + "task": "WBV2-P1156-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-READER", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-RECOVERY", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_displace.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SHAPE_KEY_POINT_READER_BATCH", + "task": "WBV2-P1157-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-SHAPE_KEY_POINT_READER_BATCH-READER", + "CAP-SHAPE_KEY_POINT_READER_BATCH-RECOVERY", + "CAP-SHAPE_KEY_POINT_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_READER_BATCH", + "task": "WBV2-P1158-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_READER_BATCH-READER", + "CAP-LINE_STYLE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_COLLECTION_READER_BATCH", + "task": "WBV2-P1159-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-READER", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_main_api.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_modifier_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_SUBTYPE_READER_BATCH", + "task": "WBV2-P1160-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-READER", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "task": "WBV2-P1161-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-READER", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "tests/files/web/fcurve_modifier_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SHAPEKEY_READER_BATCH", + "task": "WBV2-P1162-001", + "owner": "MODIFIER", + "sourceBacked": true, + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "capabilities": [ + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-READER", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-RECOVERY", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_shapekey.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_NODE_READER_BATCH", + "task": "WBV2-P1163-001", + "owner": "MEDIA", + "sourceBacked": true, + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "capabilities": [ + "CAP-COMPOSITOR_NODE_READER_BATCH-READER", + "CAP-COMPOSITOR_NODE_READER_BATCH-RECOVERY", + "CAP-COMPOSITOR_NODE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_glare.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_NATIVE_NODE_BATCH", + "task": "WBV2-P1164-001", + "owner": "MEDIA", + "sourceBacked": true, + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "capabilities": [ + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-READER", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-RECOVERY", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1165-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_anti_aliasing.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bilateral_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blank_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_box_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_brightness_contrast.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_channel_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1166-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_chroma_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_balance.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_correction.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_spill.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_combine_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_to_display.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1167-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convolve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_corner_pin.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_crop.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_curves.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_directional_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_defocus.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1168-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_denoise.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_despeckle.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_difference_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_dilate_erode.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_displace.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_distance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_ellipse_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1169-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:21d6a496860ad568", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask", + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_filter.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_flip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_correct.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_saturation_value.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_id_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-21d6a496860ad568.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1170-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + } + ], + "tasks": [ + { + "id": "WBV2-P1096-000", + "phase": "1096", + "title": "supersede_generic_continuation_queue", + "kind": "bridge", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1095-003" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "bridge", + "gate": "QUEUE", + "card": "docs/tasks/WBV2-P1096-000.md", + "behavior": "Replace the generic continuation queue with a finite module execution plan without claiming capability parity.", + "outputs": [ + "bridge manifest", + "status" + ], + "acceptance": [ + "no parity claim", + "inventory preserved", + "module plan hash-bound" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1100-000", + "phase": "1100", + "title": "reorganize_module_execution_plan", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1096-000" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-000.md", + "behavior": "Reuse completed source-backed work and activate finite module-level implementation and verification.", + "outputs": [ + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "completed receipts reused", + "generic continuation excluded", + "one module active", + "inventory preserved" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1100-001", + "phase": "1100", + "title": "verify_render_light_camera_module", + "kind": "module", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P1100-000" + ], + "parityId": "RENDER_LIGHT_CAMERA", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-render_light_camera", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-001.md", + "behavior": "Complete the RENDER_LIGHT_CAMERA module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RENDER_LIGHT_CAMERA", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-LIGHT-TYPE", + "CAP-RENDER-LIGHT-AREA-SHAPE", + "CAP-RENDER-LIGHT-CONTRIBUTION-FACTORS", + "CAP-RENDER-LIGHT-SHADOW-CONTROLS", + "CAP-RENDER-LIGHT-CASCADE-CONTROLS", + "CAP-RENDER-LIGHT-AREA-SIZE-Z", + "CAP-RENDER-LIGHT-CLIP-START", + "CAP-RENDER-WORLD-LIGHTING-CONTROLS", + "CAP-RENDER-WORLD-PROBE-CONTROLS", + "CAP-RENDER-WORLD-ENVIRONMENT-STRENGTH", + "CAP-RENDER-CAMERA-DOF-FOCUS-OBJECT", + "CAP-RENDER-CAMERA-PANORAMA" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P595-002/manifest.json", + "report": "tests/golden/WBV2-P595-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P596-002/manifest.json", + "report": "tests/golden/WBV2-P596-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P597-002/manifest.json", + "report": "tests/golden/WBV2-P597-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P598-002/manifest.json", + "report": "tests/golden/WBV2-P598-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P599-002/manifest.json", + "report": "tests/golden/WBV2-P599-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P600-002/manifest.json", + "report": "tests/golden/WBV2-P600-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P601-002/manifest.json", + "report": "tests/golden/WBV2-P601-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P602-002/manifest.json", + "report": "tests/golden/WBV2-P602-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P603-002/manifest.json", + "report": "tests/golden/WBV2-P603-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P604-002/manifest.json", + "report": "tests/golden/WBV2-P604-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P605-002/manifest.json", + "report": "tests/golden/WBV2-P605-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P606-002/manifest.json", + "report": "tests/golden/WBV2-P606-002/implementation-report.json" + } + ], + "positive": [ + "setLightProperties", + "setWorldProperties", + "setCameraProperties", + "camera panorama", + "world environment", + "light shadow/cascade" + ], + "negative": [ + "invalid enum", + "invalid numeric bounds", + "near/far conflict", + "unknown target", + "stale revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker disposal" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:lighting-field-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-lighting-fields-production.spec.ts tests/e2e/lighting-field-roundtrip.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1100-002", + "phase": "1100", + "title": "verify_scene_object_mesh_module", + "kind": "module", + "owner": "SCENE_MESH", + "dependsOn": [ + "WBV2-P1100-001" + ], + "parityId": "SCENE_OBJECT_MESH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-scene_object_mesh", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-002.md", + "behavior": "Complete the SCENE_OBJECT_MESH module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCENE_OBJECT_MESH", + "sourceBacked": true, + "capabilities": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-CORE-SCENE-OBJECT", + "CAP-OBJECT-MOVE-COLLECTION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "report": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P24-002/manifest.json", + "report": "tests/golden/WBV2-P24-002/object-move-receipt-report.json" + } + ], + "positive": [ + "mesh topology", + "visibility", + "transform", + "collection membership" + ], + "negative": [ + "invalid selection", + "stale revision", + "linked data" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts tests/e2e/wbv2-scene-object-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1100-003", + "phase": "1100", + "title": "verify_material_animation_module", + "kind": "module", + "owner": "MATERIAL_ANIMATION", + "dependsOn": [ + "WBV2-P1100-002" + ], + "parityId": "MATERIAL_ANIMATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-material_animation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-003.md", + "behavior": "Complete the MATERIAL_ANIMATION module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MATERIAL_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-MATERIAL-ANIMATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json" + } + ], + "positive": [ + "principled material", + "image node", + "keyframe", + "FCurve" + ], + "negative": [ + "unsupported graph", + "stale revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-animation-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-000", + "phase": "1101", + "title": "verify_nonmesh_geometry_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1100-003" + ], + "parityId": "NONMESH_GEOMETRY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nonmesh_geometry", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-000.md", + "behavior": "Complete the NONMESH_GEOMETRY module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NONMESH_GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-VIEWPORT-NONMESH", + "CAP-NATIVE-DATABLOCK" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "positive": [ + "curve", + "surface", + "font", + "volume", + "metaball", + "grease pencil" + ], + "negative": [ + "unsupported data", + "resource missing", + "malformed geometry" + ], + "recovery": [ + "save/reopen", + "resource disposal" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-viewport-nonmesh-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-001", + "phase": "1101", + "title": "verify_nodes_simulation_module", + "kind": "module", + "owner": "NODES_SIMULATION", + "dependsOn": [ + "WBV2-P1101-000" + ], + "parityId": "NODES_SIMULATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nodes_simulation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-001.md", + "behavior": "Complete the NODES_SIMULATION module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NODES_SIMULATION", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES", + "CAP-SIMULATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "allowlisted node graph", + "physics manifest", + "stable hash" + ], + "negative": [ + "unsupported node", + "budget exceeded", + "stale revision" + ], + "recovery": [ + "save/reopen", + "cache disposal" + ], + "commands": [ + "npm --prefix web run test:geometry-node-main-reader", + "npm --prefix web run test:physics-main-reader" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-002", + "phase": "1101", + "title": "verify_asset_io_module", + "kind": "module", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1101-001" + ], + "parityId": "ASSET_IO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-asset_io", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-002.md", + "behavior": "Complete the ASSET_IO module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ASSET_IO", + "sourceBacked": true, + "capabilities": [ + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-ASSET-CATALOG-MUTATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "report": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json" + } + ], + "positive": [ + "append", + "link", + "override", + "reload", + "asset catalog v2" + ], + "negative": [ + "missing source", + "ownership violation", + "hash drift", + "collision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "IndexedDB restart" + ], + "commands": [ + "npm --prefix web run test:asset-catalog-v2", + "npm --prefix web run test:asset-catalog-migration", + "npm --prefix web run test:asset-catalog-negatives", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-link-override-production.spec.ts tests/e2e/wbv2-asset-catalog-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-003", + "phase": "1101", + "title": "verify_sculpt_paint_module", + "kind": "module", + "owner": "SCULPT_PAINT", + "dependsOn": [ + "WBV2-P1101-002" + ], + "parityId": "SCULPT_PAINT", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-sculpt_paint", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-003.md", + "behavior": "Complete the SCULPT_PAINT module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCULPT_PAINT", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-ATTRIBUTES", + "CAP-SCULPT-PAINT" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P16-002/manifest.json", + "report": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json" + } + ], + "positive": [ + "vertex colors", + "vertex weights", + "bounded sculpt stroke" + ], + "negative": [ + "mirror unverified", + "invalid patch", + "unsupported brush" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run test:paint-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-paint-attributes-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1102-000", + "phase": "1102", + "title": "implement_ui_editor_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1101-003" + ], + "parityId": "UI_EDITOR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-ui_editor", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1102-000.md", + "behavior": "Complete the UI_EDITOR module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-UI-EDITOR" + ], + "sourcePaths": [ + "web/protocol/editor-workflow.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [], + "positive": [ + "editor context", + "workspace", + "area/region" + ], + "negative": [ + "unsupported editor", + "invalid context" + ], + "recovery": [ + "worker restart", + "save/reopen" + ], + "commands": [ + "npm --prefix web run test:editor-main-reader", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/ui-editor-workflow-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1102-001", + "phase": "1102", + "title": "close_module_execution_gate", + "kind": "module", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P1102-000" + ], + "parityId": "INVENTORY_GATE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-inventory_gate", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1102-001.md", + "behavior": "Complete the INVENTORY_GATE module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "INVENTORY_GATE", + "sourceBacked": true, + "capabilities": [], + "sourcePaths": [ + "tests/golden/WBV2-P0-002/parity-map.json", + "tests/golden/WBV2-P1100-000/module-execution-plan.json" + ], + "reuseReceipts": [], + "positive": [ + "aggregate module receipts", + "catalog hash" + ], + "negative": [ + "missing receipt", + "hash drift", + "false completion" + ], + "recovery": [ + "re-run affected module only" + ], + "commands": [ + "node tools/web/check-wbv2-module-execution.mjs", + "npm --prefix web run build" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1103-000", + "phase": "1103", + "title": "aggregate_object_operations_module", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1102-001" + ], + "parityId": "OBJECT_OPERATIONS", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_operations", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1103-000.md", + "behavior": "Aggregate the existing source-backed Object Main operations into one module and revalidate the Chromium operator matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "OBJECT_OPERATIONS", + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT-DUPLICATE", + "CAP-OBJECT-CREATE", + "CAP-OBJECT-PARENT", + "CAP-OBJECT-COLLECTION", + "CAP-OBJECT-RENAME", + "CAP-OBJECT-DELETE", + "CAP-OBJECT-TRANSFORM" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P17-002/manifest.json", + "report": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P18-002/manifest.json", + "report": "tests/golden/WBV2-P18-002/object-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P19-002/manifest.json", + "report": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P20-002/manifest.json", + "report": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P21-002/manifest.json", + "report": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P22-002/manifest.json", + "report": "tests/golden/WBV2-P22-002/object-delete-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P23-002/manifest.json", + "report": "tests/golden/WBV2-P23-002/object-transform-receipt-report.json" + } + ], + "positive": [ + "duplicate", + "create", + "parent", + "collection", + "rename", + "delete", + "transform apply" + ], + "negative": [ + "unknown object", + "invalid parent cycle", + "malformed transform" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts tests/e2e/wbv2-object-create-production.spec.ts tests/e2e/wbv2-object-parent-production.spec.ts tests/e2e/wbv2-collection-create-production.spec.ts tests/e2e/wbv2-object-rename-production.spec.ts tests/e2e/wbv2-object-delete-production.spec.ts tests/e2e/wbv2-object-transform-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1104-000", + "phase": "1104", + "title": "verify_compositor_sequencer_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1103-000" + ], + "parityId": "COMPOSITOR_SEQUENCER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_sequencer", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1104-000.md", + "behavior": "Verify the source-backed compositor and sequencer module through golden, unsupported-gate and media recovery cases.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main or compositor mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "COMPOSITOR_SEQUENCER", + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR-NODE-GRAPH", + "CAP-COMPOSITOR-UNSUPPORTED-GATE", + "CAP-SEQUENCER-MEDIA-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/compositor.ts", + "web/protocol/sequencer.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "positive": [ + "compositor node graph", + "sequencer still-image timeline", + "media cache contract" + ], + "negative": [ + "unsupported compositor node", + "invalid sequencer strip", + "stale media revision" + ], + "recovery": [ + "worker restart", + "save/reopen", + "media cache replay", + "movie codec blocked without READY receipt" + ], + "commands": [ + "npm --prefix web run test:compositor-node-golden", + "npm --prefix web run test:compositor-unsupported-gate", + "npm --prefix web run test:sequencer-main-reader", + "node --test web/tests/unit/sequencer-media-cache.test.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/smoke.spec.ts -g \"N-021 sequencer|real Blender 5.2 sequencer\"", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1105-000", + "phase": "1105", + "title": "verify_audio_particle_module", + "kind": "module", + "owner": "AUDIO_PARTICLE", + "dependsOn": [ + "WBV2-P1104-000" + ], + "parityId": "AUDIO_PARTICLE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-audio_particle", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1105-000.md", + "behavior": "Verify Sound, Speaker and ParticleSettings mutations against authoritative Blender Main with explicit build capability gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven or a typed build capability blocker is recorded", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "AUDIO_PARTICLE", + "sourceBacked": true, + "capabilities": [ + "CAP-SOUND-PROPERTIES", + "CAP-SPEAKER-PROPERTIES", + "CAP-PARTICLE-SETTINGS" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/protocol/io-media-commands.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P33-001/manifest.json", + "report": "tests/golden/WBV2-P33-001/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P33-002/manifest.json", + "report": "tests/golden/WBV2-P33-002/implementation-report.json" + } + ], + "positive": [ + "Sound properties", + "Speaker properties", + "ParticleSettings properties" + ], + "negative": [ + "missing Main datablock", + "unsupported build feature", + "out-of-range property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker restart" + ], + "commands": [ + "cmake --build build_web_blender6 --target web_engine -- -j8", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-audio-particle-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1106-000", + "phase": "1106", + "title": "verify_rig_animation_module", + "kind": "module", + "owner": "RIG", + "dependsOn": [ + "WBV2-P1105-000" + ], + "parityId": "RIG_ANIMATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-rig_animation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1106-000.md", + "behavior": "Verify armature pose, constraints and NLA animation through the existing Blender Main primitives.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RIG_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-RIG-POSE", + "CAP-CONSTRAINTS", + "CAP-NLA-ANIMATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nla.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "report": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "armature pose", + "constraint edit", + "NLA stack" + ], + "negative": [ + "missing bone", + "invalid constraint influence", + "stale NLA revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-rig-pose-production.spec.ts", + "npm --prefix web run test:nla-operator", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1107-000", + "phase": "1107", + "title": "verify_modifier_system_module", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1106-000" + ], + "parityId": "MODIFIER_SYSTEM", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_system", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1107-000.md", + "behavior": "Verify modifier stack visibility and bounded parameter mutation through authoritative Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SYSTEM", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER-STATE-MUTATION", + "CAP-MODIFIER-PARAMETER-EDIT", + "CAP-MODIFIER-STACK-READER" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/modifier-graph.ts", + "web/protocol/depsgraph.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P9-002/manifest.json", + "report": "tests/golden/WBV2-P9-002/modifier-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P11-002/manifest.json", + "report": "tests/golden/WBV2-P11-002/modifier-parameter-receipt-report.json" + } + ], + "positive": [ + "modifier visibility toggle", + "bounded DECIMATE parameter mutation", + "modifier stack evaluation reader" + ], + "negative": [ + "unknown modifier UUID", + "stale mesh revision", + "out-of-range parameter" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts tests/e2e/wbv2-modifier-parameter-production.spec.ts", + "npm --prefix web run test:modifier-goldens", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1108-000", + "phase": "1108", + "title": "verify_nodes_graph_module", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1107-000" + ], + "parityId": "NODES_GRAPH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nodes_graph", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1108-000.md", + "behavior": "Verify Geometry Nodes graph identity, allowlisted evaluation, field budgets and unsupported graph retention.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive graph reader/evaluation evidence is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NODES_GRAPH", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES-GRAPH", + "CAP-GEOMETRY-NODES-ALLOWLIST", + "CAP-GEOMETRY-NODES-FIELD-BUDGET" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/geometry-nodes.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/depsgraph.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "allowlisted graph identity", + "Blender depsgraph geometry evaluation", + "field materialization with exact domain cardinality" + ], + "negative": [ + "unsupported node graph", + "field budget overflow", + "stale or invalid graph command" + ], + "recovery": [ + "save/reopen", + "worker restart", + "graph retention after rejected command", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:geometry-node-evaluator-golden", + "npm --prefix web run test:geometry-node-field-budget", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1109-000", + "phase": "1109", + "title": "verify_io_format_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1108-000" + ], + "parityId": "IO_FORMAT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-io_format", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1109-000.md", + "behavior": "Verify format capability routing, runtime receipts, recovery and fail-closed file UI gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive format routing/readiness evidence is proven", + "negative and recovery cases are proven", + "Chromium and deterministic recovery receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "IO_FORMAT", + "sourceBacked": true, + "capabilities": [ + "CAP-IO-FORMAT-CAPABILITY-MATRIX", + "CAP-IO-FORMAT-RUNTIME-RECEIPTS", + "CAP-IO-FORMAT-RECOVERY", + "CAP-IO-FORMAT-UI-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/asset-library-io.ts", + "web/protocol/io-format-capability-matrix.ts", + "web/protocol/io-format-receipt-binding.ts", + "web/protocol/io-format-runtime-receipt.ts", + "web/protocol/io-format-recovery.ts", + "web/protocol/io-format-ui-gate.ts", + "web/protocol/glb-export.ts", + "web/protocol/glb-import.ts", + "web/protocol/nonmesh-export.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "GLB export readiness", + "format runtime receipt inventory", + "declared .blend import route" + ], + "negative": [ + "unverified format route", + "cancelled or OOM operation", + "unsupported file extension" + ], + "recovery": [ + "worker restart", + "small operation recovery", + "deterministic receipt replay", + "fail-closed UI route" + ], + "commands": [ + "node tools/web/check-io-format-receipt-bindings.mjs", + "node tools/web/check-io-format-runtime-receipts.mjs", + "node tools/web/check-io-format-recovery.mjs", + "node tools/web/check-io-format-ui-gate.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/io-format-recovery.spec.ts tests/e2e/io-format-ui-gate.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1110-000", + "phase": "1110", + "title": "verify_render_pipeline_module", + "kind": "module", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P1109-000" + ], + "parityId": "RENDER_PIPELINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-render_pipeline", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1110-000.md", + "behavior": "Verify render backend routing, explicit resource budgets and Blender reference comparison in Chromium.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive render/reference evidence is proven", + "negative and recovery cases are proven", + "Chromium and deterministic render receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RENDER_PIPELINE", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-BACKEND-ROUTING", + "CAP-RENDER-RESOURCE-BUDGET", + "CAP-RENDER-REFERENCE-COMPARISON" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/render-routing.ts", + "web/protocol/render-budget.ts", + "web/protocol/render-capabilities.ts", + "web/protocol/render-image-comparison.ts", + "web/protocol/server-render-job.ts", + "web/app/src/three-adapter/render-routing.ts", + "web/app/src/three-adapter/render-image-comparison.ts", + "web/app/src/workers/viewport-render.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "bounded local backend routing", + "reference render metrics", + "resource budget acceptance" + ], + "negative": [ + "unknown or unavailable backend", + "aggregate texture/light budget overflow", + "wrong composition reference" + ], + "recovery": [ + "retain previous texture set", + "offscreen renderer parity", + "worker restart", + "deterministic second render" + ], + "commands": [ + "npm --prefix web run test:render-resource-budget", + "npm --prefix web run test:render-routing", + "npm --prefix web run test:render-reference", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1111-000", + "phase": "1111", + "title": "verify_scripting_security_module", + "kind": "module", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1110-000" + ], + "parityId": "SCRIPTING_SECURITY", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-scripting_security", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1111-000.md", + "behavior": "Verify script source Main reader, deny-by-default permission policy and sandbox isolation/recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive reader and policy evidence is proven", + "negative and recovery cases are proven", + "Chromium sandbox receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCRIPTING_SECURITY", + "sourceBacked": true, + "capabilities": [ + "CAP-SCRIPT-MAIN-READER", + "CAP-SCRIPT-PERMISSION-POLICY", + "CAP-SCRIPT-SANDBOX-ISOLATION", + "CAP-SCRIPT-SANDBOX-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/scripting-platform.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/workers/script-permission-policy-test.worker.ts", + "web/app/src/workers/script-sandbox-isolation-test.worker.ts", + "web/app/src/workers/script-sandbox-recovery-test.worker.ts", + "web/app/src/testing/script-sandbox-recovery.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "script source inventory reader", + "explicit READ_MAIN permission", + "new-generation recovery audit" + ], + "negative": [ + "autorun denied by default", + "undeclared permission", + "sandbox crash/timeout/late result" + ], + "recovery": [ + "worker restart", + "sandbox generation rollover", + "continuous audit chain", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:script-main-reader", + "npm --prefix web run test:scripting-isolation", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/script-permission-policy.spec.ts tests/e2e/script-sandbox-isolation.spec.ts tests/e2e/script-sandbox-recovery.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1112-000", + "phase": "1112", + "title": "verify_animation_timeline_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1111-000" + ], + "parityId": "ANIMATION_TIMELINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-animation_timeline", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1112-000.md", + "behavior": "Verify frame evaluation and NLA time mapping through the production Worker and Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive frame/NLA evaluation is proven", + "negative and recovery cases are proven", + "Chromium and deterministic evaluation receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ANIMATION_TIMELINE", + "sourceBacked": true, + "capabilities": [ + "CAP-FRAME-EVALUATION", + "CAP-NLA-TIME-MAPPING", + "CAP-ANIMATION-SAVE-REOPEN" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nla.ts", + "web/protocol/depsgraph.ts", + "web/protocol/scene-ir.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "frame 1/5/10 evaluation", + "NLA track and strip mapping", + "Blender depsgraph animation result" + ], + "negative": [ + "stale NLA revision", + "invalid strip topology", + "unsupported animation domain" + ], + "recovery": [ + "save/reopen", + "worker restart", + "deterministic repeated evaluation", + "preserve rejected stack" + ], + "commands": [ + "npm --prefix web run test:frame-evaluation", + "node tools/web/check-nla-evaluation-golden.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/nla-evaluation-golden.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1113-000", + "phase": "1113", + "title": "verify_shader_material_module", + "kind": "module", + "owner": "MATERIAL", + "dependsOn": [ + "WBV2-P1112-000" + ], + "parityId": "SHADER_MATERIAL", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-shader_material", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1113-000.md", + "behavior": "Verify bounded Shader graph compilation, stable compile keys and fail-closed pipeline recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Shader Main compilation is proven", + "negative and recovery cases are proven", + "Chromium and deterministic compile receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SHADER_MATERIAL", + "sourceBacked": true, + "capabilities": [ + "CAP-SHADER-GRAPH-COMPILER", + "CAP-SHADER-COMPILE-KEY", + "CAP-SHADER-FAIL-CLOSED-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/shader-graph.ts", + "web/protocol/shader-graph-commands.ts", + "web/protocol/shader-compiler.ts", + "web/protocol/render-capabilities.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "Principled/Image/Normal/Math graph compile", + "stable compile key", + "real Main shader material path" + ], + "negative": [ + "unknown shader node", + "graph cycle or duplicate link", + "unsupported renderer backend" + ], + "recovery": [ + "retain previous material after compile failure", + "worker restart", + "deterministic repeated compile", + "save/reopen material graph" + ], + "commands": [ + "npm --prefix web run test:shader-compile", + "npm --prefix web run test:shader-pipeline", + "npm --prefix web run test:shader-capability", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1114-000", + "phase": "1114", + "title": "verify_grease_pencil_module", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1113-000" + ], + "parityId": "GREASE_PENCIL", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-grease_pencil", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1114-000.md", + "behavior": "Verify Grease Pencil layer/frame Main mutations, stable identity validation and roundtrip recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Grease Pencil Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE-PENCIL-LAYER-FRAME", + "CAP-GREASE-PENCIL-STROKE-READER", + "CAP-GREASE-PENCIL-ROUNDTRIP" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/grease-pencil.ts", + "web/protocol/grease-pencil-reorder.ts", + "web/protocol/grease-pencil-selection.ts", + "web/protocol/grease-pencil-marquee.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/grease-pencil.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "create and reorder layer", + "insert and move frame", + "stable Grease Pencil drawing reader" + ], + "negative": [ + "forged drawing identity", + "occupied frame target", + "stale layer/frame revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic layer/frame replay" + ], + "commands": [ + "npm --prefix web run test:grease-pencil-reorder", + "npm --prefix web run test:grease-pencil", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1115-000", + "phase": "1115", + "title": "verify_curve_surface_editing_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1114-000" + ], + "parityId": "CURVE_SURFACE_EDITING", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_surface_editing", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1115-000.md", + "behavior": "Verify Curve topology/handle edits, Surface topology and non-mesh/font roundtrip through Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive non-mesh Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_SURFACE_EDITING", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-HANDLES", + "CAP-SURFACE-TOPOLOGY", + "CAP-NONMESH-FONT-ROUNDTRIP" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nonmesh-geometry-commands.ts", + "web/protocol/curve-topology-editor.ts", + "web/protocol/non-mesh.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + } + ], + "positive": [ + "Curve control point and handle edit", + "Curve cyclic/topology operator", + "Surface and Font property mutation" + ], + "negative": [ + "invalid curve selection/domain", + "occupied or stale frame/topology target", + "malformed non-mesh property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic multispline replay" + ], + "commands": [ + "npm --prefix web run test:curve-topology-operator", + "npm --prefix web run test:nonmesh-roundtrip", + "npm --prefix web run test:nonmesh-desktop-golden", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1116-000", + "phase": "1116", + "title": "verify_storage_recovery_module", + "kind": "module", + "owner": "STORAGE", + "dependsOn": [ + "WBV2-P1115-000" + ], + "parityId": "STORAGE_RECOVERY", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-storage_recovery", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1116-000.md", + "behavior": "Verify IndexedDB catalog migration/restart and OPFS asset preview deduplication, quarantine and reference GC.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive storage commit/recovery evidence is proven", + "negative and quarantine cases are proven", + "Chromium restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "STORAGE_RECOVERY", + "sourceBacked": true, + "capabilities": [ + "CAP-INDEXEDDB-CATALOG-MIGRATION", + "CAP-OPFS-PREVIEW-COMMIT", + "CAP-OPFS-QUARANTINE-GC" + ], + "sourcePaths": [ + "web/protocol/storage.ts", + "web/protocol/storage-budget.ts", + "web/protocol/save-transaction.ts", + "web/protocol/recent-projects.ts", + "web/protocol/asset-preview.ts", + "web/protocol/asset-preview-decode.ts", + "web/app/src/storage/asset-catalog-indexeddb.ts", + "web/app/src/storage/asset-preview-opfs-commit.ts", + "web/app/src/storage/asset-preview-quarantine.ts", + "web/app/src/storage/asset-preview-reference-gc.ts", + "web/app/src/storage/opfs-files.ts", + "web/app/src/storage/migrations.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "v1 to v2 catalog migration", + "page/Worker restart identity", + "content-addressed preview deduplication" + ], + "negative": [ + "partial catalog migration", + "corrupt preview quarantine", + "cross-project or non-final reference GC" + ], + "recovery": [ + "IndexedDB restart", + "OPFS commit replay", + "quarantine cleanup", + "deterministic reference reclamation" + ], + "commands": [ + "npm --prefix web run test:asset-catalog-restart", + "npm --prefix web run test:asset-preview-dedup", + "npm --prefix web run test:asset-preview-quarantine", + "npm --prefix web run test:asset-preview-reference-gc", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1117-000", + "phase": "1117", + "title": "verify_simulation_cache_module", + "kind": "module", + "owner": "SIMULATION", + "dependsOn": [ + "WBV2-P1116-000" + ], + "parityId": "SIMULATION_CACHE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-simulation_cache", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1117-000.md", + "behavior": "Verify simulation cache identity, physics-family payload integrity, lifecycle recovery and deterministic LRU pruning.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive cache identity/lifecycle evidence is proven", + "negative integrity and budget cases are proven", + "Chromium restart and quarantine receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SIMULATION_CACHE", + "sourceBacked": true, + "capabilities": [ + "CAP-SIMULATION-CACHE-IDENTITY", + "CAP-PHYSICS-CACHE-INTEGRITY", + "CAP-SIMULATION-CACHE-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/simulation-cache.ts", + "web/protocol/physics-simulation.ts", + "web/protocol/physics-cache-playback.ts", + "web/protocol/storage.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "graph/source/revision cache identity", + "all physics-family frame hashes", + "verified playback lifecycle" + ], + "negative": [ + "source or payload hash drift", + "revision/range mismatch", + "cache byte/frame budget overflow" + ], + "recovery": [ + "cancel and cleanup", + "LRU prune with protected playback", + "corruption quarantine", + "worker restart" + ], + "commands": [ + "npm --prefix web run test:simulation-cache-identity", + "npm --prefix web run test:simulation-cache-lifecycle", + "npm --prefix web run test:physics-cache-family", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1118-000", + "phase": "1118", + "title": "verify_ui_input_interaction_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1117-000" + ], + "parityId": "UI_INPUT_INTERACTION", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-ui_input_interaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1118-000.md", + "behavior": "Verify keyboard-only user actions, input mutex, IME/pointer state and responsive editor interaction under deployment CSP.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive keyboard Main mutation and save are proven", + "negative mutex/input cases are proven", + "Chromium accessibility and responsive receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_INPUT_INTERACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-KEYBOARD-USER-ACTIONS", + "CAP-INPUT-MODAL-STATE", + "CAP-IME-SHORTCUT-GUARD", + "CAP-RESPONSIVE-CSP-UI" + ], + "sourcePaths": [ + "web/app/index.html", + "web/app/src/app/App.tsx", + "web/app/src/app/app-shell.css", + "web/app/src/workers/web-engine.worker.ts", + "web/protocol/user-action-state.ts", + "web/protocol/project-action-mutex.ts", + "web/protocol/ime-composition.ts", + "web/protocol/input-modal.ts", + "web/protocol/pointer-contract.ts", + "web/protocol/worker-fault.ts", + "web/tests/unit/user-action-state.test.mjs", + "web/tests/unit/project-action-mutex.test.mjs", + "web/tests/unit/ime-composition.test.mjs", + "web/tests/unit/input-modal.test.mjs", + "web/tests/unit/pointer-contract.test.mjs" + ], + "reuseReceipts": [], + "positive": [ + "keyboard-only Add Cube Main mutation", + "keyboard save/reopen and GLB export", + "responsive controls at desktop/mobile viewports" + ], + "negative": [ + "concurrent project action mutex", + "IME shortcut suppression", + "pointer cancel/touch modal cleanup" + ], + "recovery": [ + "worker restart", + "save interruption recovery", + "responsive layout preservation", + "deterministic repeated keyboard loop" + ], + "commands": [ + "node --test web/tests/unit/user-action-state.test.mjs web/tests/unit/project-action-mutex.test.mjs web/tests/unit/ime-composition.test.mjs web/tests/unit/input-modal.test.mjs web/tests/unit/pointer-contract.test.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/user-action-state.spec.ts tests/e2e/project-action-mutex.spec.ts tests/e2e/keyboard-accessibility.spec.ts tests/e2e/responsive-layout.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1119-000", + "phase": "1119", + "title": "verify_library_workflow_module", + "kind": "module", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1118-000" + ], + "parityId": "LIBRARY_WORKFLOW", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-library_workflow", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1119-000.md", + "behavior": "Verify append, link, override and reload library flows through authoritative Main with path and dependency safety gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive library Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LIBRARY_WORKFLOW", + "sourceBacked": true, + "capabilities": [ + "CAP-LIBRARY-APPEND", + "CAP-LIBRARY-LINK", + "CAP-LIBRARY-OVERRIDE", + "CAP-LIBRARY-RELOAD-SAFETY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/library-main-append.ts", + "web/protocol/library-linked-mutation.ts", + "web/protocol/library-linked-reload.ts", + "web/protocol/library-linked-missing.ts", + "web/protocol/library-override-writer.ts", + "web/protocol/library-override-freshness.ts", + "web/protocol/library-negative-cases.ts", + "web/protocol/library-operation-identity.ts", + "web/protocol/library-source-origin.ts", + "web/protocol/asset-path.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P9-003/manifest.json", + "report": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json" + } + ], + "positive": [ + "append object into Main", + "linked read-only object", + "local override and reload identity" + ], + "negative": [ + "missing library source", + "dependency/cross-library cycle", + "unsafe path or ownership mutation" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic library replay" + ], + "commands": [ + "npm --prefix web run test:library-main-append", + "npm --prefix web run test:library-link-chromium", + "npm --prefix web run test:library-override-chromium", + "npm --prefix web run test:library-negative-cases", + "npm --prefix web run test:library-path-security", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1120-000", + "phase": "1120", + "title": "verify_volume_nanovdb_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1119-000" + ], + "parityId": "VOLUME_NANOVDB", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-volume_nanovdb", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1120-000.md", + "behavior": "Verify NanoVDB manifest, paged feedback, OPFS commit/restart and production viewport volume roundtrip.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive volume resource and viewport evidence is proven", + "negative and recovery cases are proven", + "Chromium OPFS/restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "VOLUME_NANOVDB", + "sourceBacked": true, + "capabilities": [ + "CAP-NANOVDB-MANIFEST", + "CAP-NANOVDB-PAGED-FEEDBACK", + "CAP-NANOVDB-OPFS-RESTART", + "CAP-NANOVDB-VIEWPORT-ROUNDTRIP" + ], + "sourcePaths": [ + "web/protocol/volume-vdb.ts", + "web/protocol/nanovdb-page-feedback.ts", + "web/protocol/nanovdb-device-recovery.ts", + "web/protocol/storage.ts", + "web/app/src/volume/nanovdb-opfs.ts", + "web/app/src/volume/nanovdb-stream.ts", + "web/app/src/volume/nanovdb-viewport.ts", + "web/app/src/volume/nanovdb-float32.ts", + "web/app/src/render/nanovdb-volume-renderer.ts", + "web/app/src/workers/vdb-opfs-test.worker.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "validated NanoVDB bundle manifest", + "content-addressed OPFS commit", + "main/offscreen production viewport volume" + ], + "negative": [ + "manifest/chunk hash mismatch", + "stale source binding", + "WebGPU/resource availability block" + ], + "recovery": [ + "OPFS Worker restart", + "paged feedback resume", + "quota/device loss cleanup", + "deterministic volume save/reopen" + ], + "commands": [ + "npm --prefix web run test:vdb-availability", + "npm --prefix web run test:vdb-native", + "npm --prefix web run test:nanovdb-page-feedback", + "npm --prefix web run test:nanovdb-opfs-restart", + "npm --prefix web run test:nanovdb-volume-roundtrip", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1121-000", + "phase": "1121", + "title": "verify_paint_stroke_module", + "kind": "module", + "owner": "SCULPT", + "dependsOn": [ + "WBV2-P1120-000" + ], + "parityId": "PAINT_STROKE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-paint_stroke", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1121-000.md", + "behavior": "Verify paint pointer sessions, depth visibility and PBVH capability gates through the production Worker.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive paint Main transaction is proven", + "negative and recovery cases are proven", + "Chromium pointer/GPU receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "PAINT_STROKE", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-POINTER-SESSION", + "CAP-PAINT-DEPTH-VISIBILITY", + "CAP-PAINT-PBVH-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/sculpt.ts", + "web/protocol/paint.ts", + "web/protocol/paint-stroke-session.ts", + "web/protocol/paint-depth-visibility.ts", + "web/protocol/paint-pbvh-capability.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/three-adapter/paint-depth-visibility.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "ordered paint pointer chunks", + "main/offscreen depth visibility", + "PBVH inventory capability query" + ], + "negative": [ + "stale/discontinuous pointer chunks", + "forged or over-budget depth samples", + "missing PBVH WASM entrypoint" + ], + "recovery": [ + "pointer cancel without Main mutation", + "undo step after paint commit", + "worker restart", + "deterministic capability replay" + ], + "commands": [ + "npm --prefix web run test:paint-stroke-session", + "npm --prefix web run test:paint-depth-visibility", + "npm --prefix web run test:paint-pbvh-capability", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1122-000", + "phase": "1122", + "title": "verify_engine_runtime_module", + "kind": "module", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P1121-000" + ], + "parityId": "ENGINE_RUNTIME", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-engine_runtime", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1122-000.md", + "behavior": "Verify WebEngine variant manifest/selection, compiled WASM Main ABI and Worker crash recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive compiled WASM Main lifecycle is proven", + "negative variant/hash cases are proven", + "Chromium Worker restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ENGINE_RUNTIME", + "sourceBacked": true, + "capabilities": [ + "CAP-ENGINE-VARIANT-MANIFEST", + "CAP-ENGINE-WASM-MAIN-ABI", + "CAP-WORKER-CRASH-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.h", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/CMakeLists.txt", + "web/protocol/engine-variant.ts", + "web/protocol/worker-fault.ts", + "web/protocol/save-transaction.ts", + "web/app/src/engine-client/engine-variant-bootstrap.ts", + "web/app/src/engine-client/browser-engine-variant-session.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "single/pthread manifest binding", + "compiled WASM Main open/save lifecycle", + "engine and storage Worker recovery" + ], + "negative": [ + "malformed variant/resource declaration", + "mixed-version/hash mismatch", + "pthread unavailable fallback" + ], + "recovery": [ + "single-thread fallback", + "Worker crash restart", + "operation-log restore", + "deterministic repeated startup" + ], + "commands": [ + "npm --prefix web run test:engine-manifest-v2", + "npm --prefix web run test:engine-variant-selection", + "npm --prefix web run test:engine-variant-fallback", + "npm --prefix web run test:engine-variant-install", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-native-engine-production.spec.ts tests/e2e/worker-crash-recovery.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1123-000", + "phase": "1123", + "title": "repair_glb_roundtrip_dependency_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1122-000" + ], + "parityId": "GLB_ROUNDTRIP_REPAIR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-glb_roundtrip_repair", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1123-000.md", + "behavior": "Repair the standalone GLB checker dependency chain and verify mesh/non-mesh Blender roundtrip plus Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive GLB and non-mesh roundtrip are proven", + "negative and recovery cases are proven", + "Chromium save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GLB_ROUNDTRIP_REPAIR", + "sourceBacked": true, + "capabilities": [ + "CAP-GLB-MESH-ROUNDTRIP", + "CAP-GLB-NONMESH-ROUNDTRIP", + "CAP-GLB-CHROMIUM-RECOVERY" + ], + "sourcePaths": [ + "tools/web/check-glb-blender-roundtrip.mjs", + "tools/web/check-nonmesh-glb-blender-roundtrip.mjs", + "tools/web/blender-check-glb-roundtrip.py", + "web/protocol/glb-export.ts", + "web/protocol/glb-import.ts", + "web/protocol/nonmesh-export.ts", + "web/protocol/nonmesh-binary.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "mesh/material/skin/animation GLB roundtrip", + "Curve/Surface/Font/Metaball non-mesh mapping", + "desktop GLB Main persistence in Chromium" + ], + "negative": [ + "sparse or oversized GLB", + "external URI/extension rejection", + "non-mesh export loss gate" + ], + "recovery": [ + "cancel without publishing output", + "Worker restart", + "OPFS quota retains old asset", + "deterministic Blender roundtrip" + ], + "commands": [ + "npm --prefix web run test:glb-blender-roundtrip", + "npm --prefix web run test:nonmesh-glb-blender-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/glb-negative-cases.spec.ts tests/e2e/glb-recovery.spec.ts tests/e2e/glb-main-persistence.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1124-000", + "phase": "1124", + "title": "record_historical_hash_drift_module", + "kind": "module", + "owner": "PROVENANCE", + "dependsOn": [ + "WBV2-P1123-000" + ], + "parityId": "HISTORICAL_HASH_DRIFT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-historical_hash_drift", + "gate": "EVIDENCE", + "card": "docs/tasks/WBV2-P1124-000.md", + "behavior": "Record legacy M12 artifact hash drift without re-signing historical manifests or changing the immutable inventory.", + "outputs": [ + "drift report", + "module receipt", + "manifest", + "status" + ], + "acceptance": [ + "original and observed hashes are recorded", + "provenance remains BLOCKED_SOURCE_LOST where bytes cannot be restored", + "historical manifests and inventory remain unchanged", + "deterministic drift evidence is reproducible", + "no full-family parity claim" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "HISTORICAL_HASH_DRIFT", + "sourceBacked": true, + "capabilities": [ + "CAP-HISTORICAL-HASH-AUDIT", + "CAP-PROVENANCE-SOURCE-LOST-GATE" + ], + "sourcePaths": [ + "tools/web/check-m12-manifest-drift.mjs", + "tests/golden/corrective/rehydration/M12-manifest-sha-drift.json", + "tests/golden/WBV2-P0-002/parity-map.json" + ], + "reuseReceipts": [], + "positive": [ + "84 drift entries captured", + "43 affected artifact paths indexed", + "immutable inventory binding preserved" + ], + "negative": [ + "missing original bytes", + "attempted historical re-signing", + "inventory mutation" + ], + "recovery": [ + "deterministic report rerun", + "source cache can restore original bytes later", + "new capability manifests reference drift evidence only" + ], + "commands": [ + "node tools/web/check-m12-manifest-drift.mjs --write", + "node tools/web/check-m12-manifest-drift.mjs", + "node tools/web/check-wbv2-module-execution.mjs" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1125-000", + "phase": "1125", + "title": "repair_geometry_nodes_allowlist_module", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1124-000" + ], + "parityId": "GEOMETRY_NODES_ALLOWLIST_REPAIR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-geometry_nodes_allowlist_repair", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1125-000.md", + "behavior": "Persist Geometry Nodes graph overrides in Web-safe Main storage and align allowlist assertions with real materialization behavior.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "supported graph Main materialization is proven", + "unsupported graph remains rejected without mutation", + "save/reopen graph retention is exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GEOMETRY_NODES_ALLOWLIST_REPAIR", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES-MAIN-PERSISTENCE", + "CAP-GEOMETRY-NODES-ALLOWLIST-CONSISTENCY", + "CAP-GEOMETRY-NODES-SAVE-REOPEN" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/geometry-nodes.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/web-engine.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/geometry-node-allowlist.spec.ts", + "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "allowlisted graph materializes into Main", + "Scene IDProperty graph override persists", + "save/reopen retains graph identity/hash" + ], + "negative": [ + "unsupported simulation node", + "invalid graph schema", + "missing node/link endpoint" + ], + "recovery": [ + "rejected graph leaves baseline unchanged", + "undo/redo graph override", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "cmake --build build_web_blender6 --target web_engine -- -j8", + "npm --prefix web run test:geometry-node-allowlist", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "npm --prefix web run test:geometry-node-field-budget", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1126-000", + "phase": "1126", + "title": "verify_grease_pencil_viewport_module", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1125-000" + ], + "parityId": "GREASE_PENCIL_VIEWPORT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-grease_pencil_viewport", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1126-000.md", + "behavior": "Verify Grease Pencil 2D/3D selection and marquee integration on both viewport backends using an isolated Chromium port.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "2D and 3D selection revisions converge", + "main-thread and Offscreen marquee are exact", + "stale/foreign selection cases remain fail-closed", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL_VIEWPORT", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE-PENCIL-SELECTION-REVISION", + "CAP-GREASE-PENCIL-MARQUEE-MAIN", + "CAP-GREASE-PENCIL-MARQUEE-OFFSCREEN" + ], + "sourcePaths": [ + "web/protocol/grease-pencil-selection.ts", + "web/protocol/grease-pencil-marquee.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/grease-pencil.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/workers/viewport-render.worker.ts" + ], + "reuseReceipts": [], + "positive": [ + "2D canvas selection revision", + "main-thread 3D marquee selection", + "OffscreenCanvas 3D marquee selection" + ], + "negative": [ + "stale selection revision", + "foreign drawing identity", + "duplicate or forged point candidate" + ], + "recovery": [ + "selection convergence across backends", + "worker viewport restart", + "deterministic repeated marquee", + "preserve Main revision" + ], + "commands": [ + "WEB_TEST_PORT=5331 npm --prefix web run test:e2e -- --workers=1 tests/e2e/grease-pencil-selection.spec.ts tests/e2e/grease-pencil-marquee.spec.ts", + "node --test web/tests/unit/grease-pencil-selection.test.mjs web/tests/unit/grease-pencil-marquee.test.mjs", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1127-000", + "phase": "1127", + "title": "verify_tracking_mask_module", + "kind": "module", + "owner": "TRACKING", + "dependsOn": [ + "WBV2-P1126-000" + ], + "parityId": "TRACKING_MASK", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-tracking_mask", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1127-000.md", + "behavior": "Verify Mask reader, editable point raycast/marquee and tracking capability gates through Chromium.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Mask reader and interaction evidence is proven", + "negative solve/resource cases are proven", + "Chromium stable IDs and recovery receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TRACKING_MASK", + "sourceBacked": true, + "capabilities": [ + "CAP-MASK-MAIN-READER", + "CAP-MASK-POINT-RAYCAST", + "CAP-TRACKING-SOLVE-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/tracking-mask.ts", + "web/protocol/scene-ir.ts", + "web/app/src/tracking/MaskSelection.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/tests/e2e/smoke.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "Mask layers and splines reader", + "editable Mask point raycast", + "N-022 tracking marker/mask gate" + ], + "negative": [ + "foreign mask point identity", + "missing resource binding", + "camera solve unavailable" + ], + "recovery": [ + "main/offscreen marquee parity", + "worker restart", + "deterministic stable IDs", + "preserve source Main on blocked solve" + ], + "commands": [ + "npm --prefix web run test:mask-main-reader", + "WEB_TEST_PORT=5340 npm --prefix web run test:e2e -- --workers=1 tests/e2e/smoke.spec.ts -g \"N-022 tracking|real Blender 5.2 Mask\"", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1128-000", + "phase": "1128", + "title": "verify_ffmpeg_movie_codec_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1127-000" + ], + "parityId": "SEQUENCER_MOVIE_CODEC", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-sequencer_movie_codec", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1128-000.md", + "behavior": "Use a local ffmpeg.wasm Worker fallback for movie probing and proxy-frame extraction when Chromium HTML media decoding is unavailable.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and core-resource hashes are bound", + "positive MP4 probe and RGBA frame are proven", + "corrupt and source-identity cases are rejected", + "AbortSignal cancellation leaves no live Worker", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SEQUENCER_MOVIE_CODEC", + "sourceBacked": true, + "capabilities": [ + "CAP-FFMPEG-WASM-MOVIE-PROBE", + "CAP-FFMPEG-WASM-PROXY-FRAME", + "CAP-MOVIE-CODEC-RECOVERY" + ], + "sourcePaths": [ + "web/package.json", + "web/package-lock.json", + "web/protocol/sequencer.ts", + "web/app/src/sequencer/SequencerCodecProbe.ts", + "web/app/src/sequencer/FFmpegMovieProbe.ts", + "web/app/src/sequencer/ffmpeg-movie-probe.worker.ts", + "web/app/src/sequencer/SequencerMediaProxyCache.ts", + "web/app/src/vendor/ffmpeg/ffmpeg-core.js", + "web/app/src/vendor/ffmpeg/ffmpeg-core.wasm", + "web/app/public/vendor/ffmpeg/ffmpeg-core.js", + "web/app/public/vendor/ffmpeg/ffmpeg-core.wasm", + "third_party/ffmpeg.wasm/package.json", + "third_party/ffmpeg.wasm/README.md", + "web/tests/e2e/ffmpeg-movie-probe-production.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "browser decode fallback to ffmpeg.wasm", + "16x16 MP4 metadata probe", + "8x8 RGBA proxy frame extraction" + ], + "negative": [ + "corrupt movie payload", + "source SHA mismatch", + "ffmpeg runtime unavailable" + ], + "recovery": [ + "AbortSignal cancellation", + "Worker termination after response", + "cache manifest identity binding", + "deterministic repeated probe" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5342 npm --prefix web run test:e2e -- --workers=1 tests/e2e/ffmpeg-movie-probe-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1129-000", + "phase": "1129", + "title": "authorize_scene_settings_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1128-000" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1129", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1129-000.md", + "behavior": "Authorize one source-backed Core Scene Graph settings module after the terminal P1128 module epoch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1128 evidence remains hash-bound", + "existing receipts are reused", + "inventory remains immutable", + "one source-backed module is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ] + }, + { + "id": "WBV2-P1129-001", + "phase": "1129", + "title": "verify_scene_settings_module", + "kind": "module", + "owner": "CORE_SCENE", + "dependsOn": [ + "WBV2-P1129-000" + ], + "parityId": "CORE_SCENE_GRAPH_SETTINGS", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-core_scene_graph_settings", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1129-001.md", + "behavior": "Verify the existing Blender Main scene compositor, performance and sampling setting transactions as one aggregate module.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutations are proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CORE_SCENE_GRAPH_SETTINGS", + "sourceBacked": true, + "capabilities": [ + "CAP-SCENE-COMPOSITOR-SETTINGS", + "CAP-SCENE-PERFORMANCE-SETTINGS", + "CAP-SCENE-SAMPLING-SETTINGS" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-scene-settings-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P65-002/manifest.json", + "report": "tests/golden/WBV2-P65-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P66-002/manifest.json", + "report": "tests/golden/WBV2-P66-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P67-002/manifest.json", + "report": "tests/golden/WBV2-P67-002/implementation-report.json" + } + ], + "positive": [ + "compositor device/precision mutation", + "performance thread/persistence mutation", + "sampling filter/dither mutation" + ], + "negative": [ + "invalid sampling range", + "unknown scene target", + "malformed property set" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic scene settings snapshot" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5344 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-scene-settings-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1130-000", + "phase": "1130", + "title": "authorize_editor_view2d_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1129-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1130", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1130-000.md", + "behavior": "Authorize one source-backed UI editor View2D reader/protocol module after the P1129 scene settings module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1129 evidence remains hash-bound", + "P1102 editor workflow source remains unchanged", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1130-001", + "phase": "1130", + "title": "verify_editor_view2d_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1130-000" + ], + "parityId": "UI_EDITOR_VIEW2D_STATE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-ui_editor_view2d_state", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1130-001.md", + "behavior": "Preserve Blender Graph/Dope Sheet View2D cur and mask state through the Web editor protocol without changing the existing editor workflow parser.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive reader state is proven", + "negative no-publish and recovery are proven", + "Chromium and save/reopen compatibility are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_EDITOR_VIEW2D_STATE", + "sourceBacked": true, + "capabilities": [ + "CAP-EDITOR-VIEW2D-CUR", + "CAP-EDITOR-VIEW2D-MASK", + "CAP-EDITOR-VIEW2D-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/editor-view2d.ts", + "web/app/src/workers/editor-view2d-test.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/ui-editor-view2d-production.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "Graph main-region View2D cur retention", + "Graph main-region pixel mask retention", + "reader/protocol exact state" + ], + "negative": [ + "inverted View2D bounds", + "malformed mask range", + "missing View2D payload" + ], + "recovery": [ + "immutable base editor workflow", + "worker termination", + "deterministic repeated parse", + "save/reopen reader compatibility" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5346 npm --prefix web run test:e2e -- --workers=1 tests/e2e/ui-editor-view2d-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1131-000", + "phase": "1131", + "title": "authorize_curve_topology_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1130-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1131", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1131-000.md", + "behavior": "Authorize one source-backed Curve topology editor module after the P1130 View2D module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1130 evidence remains hash-bound", + "Curve topology source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1131-001", + "phase": "1131", + "title": "verify_curve_topology_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1131-000" + ], + "parityId": "CURVE_TOPOLOGY_EDITOR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_topology_editor", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1131-001.md", + "behavior": "Verify the Blender Curve TOGGLE_CYCLIC topology transaction through the existing Main, protocol, Worker and frontend path.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_TOPOLOGY_EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-TOGGLE-CYCLIC", + "CAP-CURVE-TOPOLOGY-GATE", + "CAP-CURVE-TOPOLOGY-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/curve-topology-editor.ts", + "web/app/src/workers/curve-topology-contract-test.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/curve-topology-contract.spec.ts", + "web/tests/e2e/curve-topology-operator.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "TOGGLE_CYCLIC Main mutation", + "operator gate exposes only verified capability", + "save/reopen preserves cyclic spline state" + ], + "negative": [ + "unknown curve operator", + "stale revision claim", + "selection and payload budget overflow" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic contract parse" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5347 npm --prefix web run test:e2e -- --workers=1 tests/e2e/curve-topology-contract.spec.ts tests/e2e/curve-topology-operator.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1132-000", + "phase": "1132", + "title": "authorize_curve_handle_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1131-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1132", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1132-000.md", + "behavior": "Authorize one source-backed Curve handle gizmo module after the P1131 topology module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1131 evidence remains hash-bound", + "Curve handle source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1132-001", + "phase": "1132", + "title": "verify_curve_handle_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1132-000" + ], + "parityId": "CURVE_HANDLE_GIZMO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_handle_gizmo", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1132-001.md", + "behavior": "Verify Curve handle position edits through Blender Main, protocol, Worker, renderer preview and frontend gizmo.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_HANDLE_GIZMO", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-HANDLE-MAIN", + "CAP-CURVE-HANDLE-GIZMO-PREVIEW", + "CAP-CURVE-HANDLE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/nonmesh-interaction.ts", + "web/app/src/workers/nonmesh-interaction-test.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/nonmesh.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/tests/e2e/wbv2-curve-handle-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Curve handle position Main mutation", + "local handle gizmo preview", + "save/reopen preserves handle state" + ], + "negative": [ + "invalid handle identity", + "stale base revision", + "malformed handle position" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic preview" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5348 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-curve-handle-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1133-000", + "phase": "1133", + "title": "authorize_curve_splines_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1132-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1133", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1133-000.md", + "behavior": "Authorize one source-backed Curve spline transaction module after the P1132 handle module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1132 evidence remains hash-bound", + "Curve spline source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1133-001", + "phase": "1133", + "title": "verify_curve_splines_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1133-000" + ], + "parityId": "CURVE_SPLINES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_splines_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1133-001.md", + "behavior": "Verify complete Curve spline replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_SPLINES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-SPLINES-MAIN", + "CAP-CURVE-SPLINES-RECOVERY", + "CAP-CURVE-SPLINES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/tests/e2e/wbv2-curve-splines-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "complete Curve spline Main transaction", + "POLY/BEZIER descriptor retention", + "save/reopen preserves spline state" + ], + "negative": [ + "invalid spline offsets", + "stale base revision", + "mismatched handle payload" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic binary-geometry transaction" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5349 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-curve-splines-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1134-000", + "phase": "1134", + "title": "authorize_surface_topology_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1133-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1134", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1134-000.md", + "behavior": "Authorize one source-backed Surface topology transaction module after the P1133 Curve spline module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1133 evidence remains hash-bound", + "Surface topology source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1134-001", + "phase": "1134", + "title": "verify_surface_topology_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1134-000" + ], + "parityId": "SURFACE_TOPOLOGY_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-surface_topology_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1134-001.md", + "behavior": "Verify Surface NURBS topology replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SURFACE_TOPOLOGY_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-SURFACE-TOPOLOGY-MAIN", + "CAP-SURFACE-NURBS-BOUNDS", + "CAP-SURFACE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/tests/e2e/wbv2-surface-topology-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Surface topology Main transaction", + "NURBS dimensions and weights retention", + "save/reopen preserves surface state" + ], + "negative": [ + "invalid surface dimensions", + "stale base revision", + "control grid budget mismatch" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic surface transaction" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5350 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-surface-topology-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1135-000", + "phase": "1135", + "title": "authorize_font_body_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1134-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1135", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1135-000.md", + "behavior": "Authorize one source-backed Font body transaction module after the P1134 Surface topology module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1134 evidence remains hash-bound", + "Font body source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1135-001", + "phase": "1135", + "title": "verify_font_body_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1135-000" + ], + "parityId": "FONT_BODY_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-font_body_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1135-001.md", + "behavior": "Verify Font body replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FONT_BODY_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-BODY-MAIN", + "CAP-FONT-BODY-RECOVERY", + "CAP-FONT-BODY-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-font-body-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Font body Main mutation", + "UTF-8 text retention", + "save/reopen preserves text" + ], + "negative": [ + "unknown Font data ID", + "body byte budget overflow", + "malformed body payload" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic text state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5351 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-font-body-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1136-000", + "phase": "1136", + "title": "authorize_font_properties_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1135-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1136", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1136-000.md", + "behavior": "Authorize one source-backed Font properties transaction module after the P1135 Font body module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1135 evidence remains hash-bound", + "Font property source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1136-001", + "phase": "1136", + "title": "verify_font_properties_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1136-000" + ], + "parityId": "FONT_PROPERTIES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-font_properties_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1136-001.md", + "behavior": "Verify Font property replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FONT_PROPERTIES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-PROPERTIES-MAIN", + "CAP-FONT-PROPERTIES-RECOVERY", + "CAP-FONT-PROPERTIES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-font-properties-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Font property Main mutation", + "bounded alignment/extrude fields", + "save/reopen preserves properties" + ], + "negative": [ + "unknown Font data ID", + "invalid alignment enum", + "out-of-range numeric property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic property state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5352 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-font-properties-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1137-000", + "phase": "1137", + "title": "authorize_metaball_elements_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1136-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1137", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1137-000.md", + "behavior": "Authorize one source-backed Metaball element transaction module after the P1136 Font properties module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1136 evidence remains hash-bound", + "Metaball element source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1137-001", + "phase": "1137", + "title": "verify_metaball_elements_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1137-000" + ], + "parityId": "METABALL_ELEMENTS_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-metaball_elements_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1137-001.md", + "behavior": "Verify Metaball element replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "METABALL_ELEMENTS_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-METABALL-ELEMENTS-MAIN", + "CAP-METABALL-ELEMENTS-RECOVERY", + "CAP-METABALL-ELEMENTS-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-metaball-elements-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Metaball element Main mutation", + "bounded position/radius/scale retention", + "save/reopen preserves elements" + ], + "negative": [ + "unknown Metaball data ID", + "invalid radius", + "element count topology mismatch" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic element state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-metaball-elements-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1138-000", + "phase": "1138", + "title": "authorize_text_source_module", + "kind": "enabling", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1137-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1138", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1138-000.md", + "behavior": "Authorize a source-backed Text datablock mutation after the P1137 Metaball module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1137 evidence remains hash-bound", + "ID_TXT is registered for WITH_WEB", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1138-001", + "phase": "1138", + "title": "verify_text_source_module", + "kind": "module", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1138-000" + ], + "parityId": "TEXT_SOURCE_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-text_source_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1138-001.md", + "behavior": "Verify Text source replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TEXT_SOURCE_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXT-SOURCE-MAIN", + "CAP-TEXT-SOURCE-RECOVERY", + "CAP-TEXT-SOURCE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/blenkernel/intern/idtype.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-text-source-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1137-001/manifest.json", + "report": "tests/golden/WBV2-P1137-001/module-receipt.json" + } + ], + "positive": [ + "Text source Main mutation", + "ID_TXT registration in WITH_WEB", + "save/reopen preserves source" + ], + "negative": [ + "unknown Text data ID", + "source over 1 MiB", + "linked/read-only Text" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic source state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-text-source-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1139-000", + "phase": "1139", + "title": "authorize_texture_properties_module", + "kind": "enabling", + "owner": "TEXTURE", + "dependsOn": [ + "WBV2-P1138-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1139", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1139-000.md", + "behavior": "Authorize a source-backed Texture property mutation module after P1138 Text.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1138 evidence remains hash-bound", + "ID_TE is registered for WITH_WEB", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1139-001", + "phase": "1139", + "title": "verify_texture_properties_module", + "kind": "module", + "owner": "TEXTURE", + "dependsOn": [ + "WBV2-P1139-000" + ], + "parityId": "TEXTURE_PROPERTIES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-texture_properties_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1139-001.md", + "behavior": "Verify Texture property replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TEXTURE_PROPERTIES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXTURE-PROPERTIES-MAIN", + "CAP-TEXTURE-PROPERTIES-RECOVERY", + "CAP-TEXTURE-PROPERTIES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/blenkernel/intern/idtype.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-texture-properties-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1138-001/manifest.json", + "report": "tests/golden/WBV2-P1138-001/module-receipt.json" + } + ], + "positive": [ + "Texture property Main mutation", + "ID_TE registration in WITH_WEB", + "save/reopen preserves properties" + ], + "negative": [ + "unknown Texture data ID", + "noise depth outside Blender bounds", + "non-finite numeric property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic property state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-texture-properties-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1140-000", + "phase": "1140", + "title": "authorize_action_group_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1139-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1140", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1140-000.md", + "behavior": "Authorize a source-backed ActionGroup reader and recovery module after P1139 Texture.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1139 evidence remains hash-bound", + "ActionGroup has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1140-001", + "phase": "1140", + "title": "verify_action_group_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1140-000" + ], + "parityId": "ACTION_GROUP_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-action_group_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1140-001.md", + "behavior": "Verify ActionGroup metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ACTION_GROUP_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-GROUP-READER", + "CAP-ACTION-GROUP-RECOVERY", + "CAP-ACTION-GROUP-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-action-group-reader-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1112-000/manifest.json", + "report": "tests/golden/WBV2-P1112-000/module-receipt.json" + } + ], + "positive": [ + "ActionGroup Main reader exposes group and expanded metadata", + "three grouped location F-Curves remain grouped", + "save/reopen preserves group metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing animation target is fail-closed", + "unsupported group payload is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic group state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5356 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-action-group-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1141-000", + "phase": "1141", + "title": "authorize_action_pose_markers_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1140-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1141", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1141-000.md", + "behavior": "Authorize a source-backed ActionPoseMarkers reader and recovery module after P1140.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1140 evidence remains hash-bound", + "ActionPoseMarkers has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1141-001", + "phase": "1141", + "title": "verify_action_pose_markers_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1141-000" + ], + "parityId": "ACTION_POSE_MARKERS_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-action_pose_markers_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1141-001.md", + "behavior": "Verify ActionPoseMarkers metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ACTION_POSE_MARKERS_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-POSE-MARKERS-READER", + "CAP-ACTION-POSE-MARKERS-RECOVERY", + "CAP-ACTION-POSE-MARKERS-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-action-pose-markers-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1140-001/manifest.json", + "report": "tests/golden/WBV2-P1140-001/module-receipt.json" + } + ], + "positive": [ + "ActionPoseMarkers Main reader exposes marker names and frames", + "three Blender pose markers remain ordered", + "save/reopen preserves marker metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing animation target is fail-closed", + "non-finite marker frame is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic marker state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5359 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-action-pose-markers-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1142-000", + "phase": "1142", + "title": "authorize_fcurve_sample_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1141-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1142", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1142-000.md", + "behavior": "Authorize a source-backed FCurveSample reader and recovery module after P1141.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1141 evidence remains hash-bound", + "FCurveSample has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1142-001", + "phase": "1142", + "title": "verify_fcurve_sample_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1142-000" + ], + "parityId": "FCURVE_SAMPLE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_sample_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1142-001.md", + "behavior": "Verify FCurveSample data through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_SAMPLE_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-SAMPLE-READER", + "CAP-FCURVE-SAMPLE-RECOVERY", + "CAP-FCURVE-SAMPLE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-fcurve-sample-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1141-001/manifest.json", + "report": "tests/golden/WBV2-P1141-001/module-receipt.json" + } + ], + "positive": [ + "FCurveSample Main reader exposes sampled source and values", + "four native FPoint samples remain ordered", + "save/reopen preserves sampled data" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing sampled payload is fail-closed", + "non-finite sampled value is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic sampled state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5365 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-sample-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1143-000", + "phase": "1143", + "title": "authorize_fcurve_modifier_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1142-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1143", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1143-000.md", + "behavior": "Authorize a source-backed FCurve modifier reader and recovery module after P1142.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1142 evidence remains hash-bound", + "FCurveModifiers has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1143-001", + "phase": "1143", + "title": "verify_fcurve_modifier_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1143-000" + ], + "parityId": "FCURVE_MODIFIER_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_modifier_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1143-001.md", + "behavior": "Verify FCurve modifier metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_MODIFIER_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-MODIFIER-READER", + "CAP-FCURVE-MODIFIER-RECOVERY", + "CAP-FCURVE-MODIFIER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1142-001/manifest.json", + "report": "tests/golden/WBV2-P1142-001/module-receipt.json" + } + ], + "positive": [ + "FCurveModifiers Main reader exposes native modifier stack", + "FModifierCycles preserves type/name/flags/influence", + "save/reopen preserves modifier metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing modifier payload is fail-closed", + "unsupported modifier type is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic modifier state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5368 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-modifier-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1144-000", + "phase": "1144", + "title": "authorize_driver_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1143-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1144", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1144-000.md", + "behavior": "Authorize a source-backed Driver reader and recovery module after P1143.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1143 evidence remains hash-bound", + "Driver has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1144-001", + "phase": "1144", + "title": "verify_driver_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1144-000" + ], + "parityId": "DRIVER_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-driver_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1144-001.md", + "behavior": "Verify Driver metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "DRIVER_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-DRIVER-READER", + "CAP-DRIVER-RECOVERY", + "CAP-DRIVER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-driver-reader-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1143-001/manifest.json", + "report": "tests/golden/WBV2-P1143-001/module-receipt.json" + } + ], + "positive": [ + "AnimData driver list is read from Blender Main", + "Driver preserves scripted expression and variables", + "save/reopen preserves driver metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing driver target is fail-closed", + "non-finite driver influence is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic driver state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-driver-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1145-000", + "phase": "1145", + "title": "authorize_corrective_smooth_reader_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1144-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1145", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1145-000.md", + "behavior": "Authorize a source-backed Corrective Smooth reader/recovery module after the Driver reader.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "Corrective Smooth has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1145-001", + "phase": "1145", + "title": "verify_corrective_smooth_reader_module", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1145-000" + ], + "parityId": "CORRECTIVE_SMOOTH_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-corrective_smooth_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1145-001.md", + "behavior": "Verify Corrective Smooth modifier type and RNA metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CORRECTIVE_SMOOTH_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-CORRECTIVE-SMOOTH-READER", + "CAP-CORRECTIVE-SMOOTH-RECOVERY", + "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts", + "tests/files/web/modifier_corrective_smooth_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "Corrective Smooth type is read from Blender Main", + "RNA metadata is preserved", + "save/reopen preserves modifier metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported modifier data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1146-000", + "phase": "1146", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1145-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1146", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1146-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1146-001", + "phase": "1146", + "title": "verify modifier reader batch", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1146-000" + ], + "parityId": "MODIFIER_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1146-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH-READER", + "CAP-MODIFIER_READER_BATCH-RECOVERY", + "CAP-MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts", + "tests/files/web/modifier_reader_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_datatransfer type is read from Blender Main", + "MOD_dynamicpaint type is read from Blender Main", + "MOD_explode type is read from Blender Main", + "MOD_fluid type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_datatransfer", + "modifier-source:MOD_dynamicpaint", + "modifier-source:MOD_explode", + "modifier-source:MOD_fluid", + "rna-struct:DataTransferModifier", + "rna-struct:DynamicPaintModifier", + "rna-struct:ExplodeModifier", + "rna-struct:FluidModifier", + "rna-struct:FluidDomainSettings" + ] + } + }, + { + "id": "WBV2-P1147-000", + "phase": "1147", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1146-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1147", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1147-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1147-001", + "phase": "1147", + "title": "verify modifier reader batch two", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1147-000" + ], + "parityId": "MODIFIER_READER_BATCH_TWO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_two", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1147-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_TWO batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_TWO", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_TWO-READER", + "CAP-MODIFIER_READER_BATCH_TWO-RECOVERY", + "CAP-MODIFIER_READER_BATCH_TWO-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_two_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_laplaciandeform type is read from Blender Main", + "MOD_laplaciansmooth type is read from Blender Main", + "MOD_mask type is read from Blender Main", + "MOD_mesh_to_volume type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_laplaciandeform", + "modifier-source:MOD_laplaciansmooth", + "modifier-source:MOD_mask", + "modifier-source:MOD_shrinkwrap", + "rna-struct:LaplacianDeformModifier", + "rna-struct:LaplacianSmoothModifier", + "rna-struct:MaskModifier", + "rna-struct:ShrinkwrapModifier" + ] + } + }, + { + "id": "WBV2-P1148-000", + "phase": "1148", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1147-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1148", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1148-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1148-001", + "phase": "1148", + "title": "verify modifier reader batch three", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1148-000" + ], + "parityId": "MODIFIER_READER_BATCH_THREE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_three", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1148-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_THREE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_THREE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_THREE-READER", + "CAP-MODIFIER_READER_BATCH_THREE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_THREE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_three_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_remesh type is read from Blender Main", + "MOD_skin type is read from Blender Main", + "MOD_weighted_normal type is read from Blender Main", + "MOD_warp type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1148-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_three_scene.blend WBV2_BATCH_TYPES='[\"REMESH\",\"SKIN\",\"WEIGHTED_NORMAL\",\"WARP\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_remesh\",\"modifier-source:MOD_skin\",\"modifier-source:MOD_weighted_normal\",\"modifier-source:MOD_warp\",\"rna-struct:RemeshModifier\",\"rna-struct:SkinModifier\",\"rna-struct:WeightedNormalModifier\",\"rna-struct:WarpModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_remesh", + "modifier-source:MOD_skin", + "modifier-source:MOD_weighted_normal", + "modifier-source:MOD_warp", + "rna-struct:RemeshModifier", + "rna-struct:SkinModifier", + "rna-struct:WeightedNormalModifier", + "rna-struct:WarpModifier" + ] + } + }, + { + "id": "WBV2-P1149-000", + "phase": "1149", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1148-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1149", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1149-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1149-001", + "phase": "1149", + "title": "verify modifier reader batch four", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1149-000" + ], + "parityId": "MODIFIER_READER_BATCH_FOUR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_four", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1149-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_FOUR batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_FOUR", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FOUR-READER", + "CAP-MODIFIER_READER_BATCH_FOUR-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FOUR-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvproject.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvwarp.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_normal_edit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_to_mesh.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_four_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_uvproject type is read from Blender Main", + "MOD_uvwarp type is read from Blender Main", + "MOD_volume_displace type is read from Blender Main", + "MOD_volume_to_mesh type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1149-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_four_scene.blend WBV2_BATCH_TYPES='[\"UV_PROJECT\",\"UV_WARP\",\"NORMAL_EDIT\",\"VOLUME_TO_MESH\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_uvproject\",\"modifier-source:MOD_uvwarp\",\"modifier-source:MOD_normal_edit\",\"modifier-source:MOD_volume_to_mesh\",\"rna-struct:UVProjectModifier\",\"rna-struct:UVWarpModifier\",\"rna-struct:NormalEditModifier\",\"rna-struct:VolumeToMeshModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1149-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_uvproject", + "modifier-source:MOD_uvwarp", + "modifier-source:MOD_normal_edit", + "modifier-source:MOD_volume_to_mesh", + "rna-struct:UVProjectModifier", + "rna-struct:UVWarpModifier", + "rna-struct:NormalEditModifier", + "rna-struct:VolumeToMeshModifier" + ] + } + }, + { + "id": "WBV2-P1150-000", + "phase": "1150", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1149-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1150", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1150-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1150-001", + "phase": "1150", + "title": "verify modifier reader batch five", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1150-000" + ], + "parityId": "MODIFIER_READER_BATCH_FIVE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_five", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1150-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_FIVE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_FIVE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FIVE-READER", + "CAP-MODIFIER_READER_BATCH_FIVE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FIVE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshsequencecache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_multires.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_ocean.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_five_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_meshcache type is read from Blender Main", + "MOD_meshsequencecache type is read from Blender Main", + "MOD_multires type is read from Blender Main", + "MOD_ocean type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1150-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_five_scene.blend WBV2_BATCH_TYPES='[\"MESH_CACHE\",\"MESH_SEQUENCE_CACHE\",\"MULTIRES\",\"OCEAN\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_meshcache\",\"modifier-source:MOD_meshsequencecache\",\"modifier-source:MOD_multires\",\"modifier-source:MOD_ocean\",\"rna-struct:MeshCacheModifier\",\"rna-struct:MeshSequenceCacheModifier\",\"rna-struct:MultiresModifier\",\"rna-struct:OceanModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_meshcache", + "modifier-source:MOD_meshsequencecache", + "modifier-source:MOD_multires", + "modifier-source:MOD_ocean", + "rna-struct:MeshCacheModifier", + "rna-struct:MeshSequenceCacheModifier", + "rna-struct:MultiresModifier", + "rna-struct:OceanModifier" + ] + } + }, + { + "id": "WBV2-P1151-000", + "phase": "1151", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1150-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1151", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1151-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1151-001", + "phase": "1151", + "title": "verify Grease Pencil modifier reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1151-000" + ], + "parityId": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-grease_pencil_modifier_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1151-001.md", + "behavior": "Verify the GREASE_PENCIL_MODIFIER_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-READER", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-RECOVERY", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_build.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_color.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_length.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_texture.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_time.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_grease_pencil_armature type is read from Blender Main", + "MOD_grease_pencil_array type is read from Blender Main", + "MOD_grease_pencil_build type is read from Blender Main", + "MOD_grease_pencil_color type is read from Blender Main", + "MOD_grease_pencil_dash type is read from Blender Main", + "MOD_grease_pencil_envelope type is read from Blender Main", + "MOD_grease_pencil_hook type is read from Blender Main", + "MOD_grease_pencil_lattice type is read from Blender Main", + "MOD_grease_pencil_length type is read from Blender Main", + "MOD_grease_pencil_mirror type is read from Blender Main", + "MOD_grease_pencil_multiply type is read from Blender Main", + "MOD_grease_pencil_noise type is read from Blender Main", + "MOD_grease_pencil_offset type is read from Blender Main", + "MOD_grease_pencil_opacity type is read from Blender Main", + "MOD_grease_pencil_outline type is read from Blender Main", + "MOD_grease_pencil_shrinkwrap type is read from Blender Main", + "MOD_grease_pencil_simplify type is read from Blender Main", + "MOD_grease_pencil_smooth type is read from Blender Main", + "MOD_grease_pencil_subdiv type is read from Blender Main", + "MOD_grease_pencil_texture type is read from Blender Main", + "MOD_grease_pencil_thickness type is read from Blender Main", + "MOD_grease_pencil_time type is read from Blender Main", + "MOD_grease_pencil_tint type is read from Blender Main", + "MOD_grease_pencil_weight_angle type is read from Blender Main", + "MOD_grease_pencil_weight_proximity type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1151-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_grease_pencil_scene.blend WBV2_BATCH_TYPES='[\"GREASE_PENCIL_ARMATURE\",\"GREASE_PENCIL_ARRAY\",\"GREASE_PENCIL_BUILD\",\"GREASE_PENCIL_COLOR\",\"GREASE_PENCIL_DASH\",\"GREASE_PENCIL_ENVELOPE\",\"GREASE_PENCIL_HOOK\",\"GREASE_PENCIL_LATTICE\",\"GREASE_PENCIL_LENGTH\",\"GREASE_PENCIL_MIRROR\",\"GREASE_PENCIL_MULTIPLY\",\"GREASE_PENCIL_NOISE\",\"GREASE_PENCIL_OFFSET\",\"GREASE_PENCIL_OPACITY\",\"GREASE_PENCIL_OUTLINE\",\"GREASE_PENCIL_SHRINKWRAP\",\"GREASE_PENCIL_SIMPLIFY\",\"GREASE_PENCIL_SMOOTH\",\"GREASE_PENCIL_SUBDIV\",\"GREASE_PENCIL_TEXTURE\",\"GREASE_PENCIL_THICKNESS\",\"GREASE_PENCIL_TIME\",\"GREASE_PENCIL_TINT\",\"GREASE_PENCIL_VERTEX_WEIGHT_ANGLE\",\"GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_grease_pencil_armature\",\"modifier-source:MOD_grease_pencil_array\",\"modifier-source:MOD_grease_pencil_build\",\"modifier-source:MOD_grease_pencil_color\",\"modifier-source:MOD_grease_pencil_dash\",\"modifier-source:MOD_grease_pencil_envelope\",\"modifier-source:MOD_grease_pencil_hook\",\"modifier-source:MOD_grease_pencil_lattice\",\"modifier-source:MOD_grease_pencil_length\",\"modifier-source:MOD_grease_pencil_mirror\",\"modifier-source:MOD_grease_pencil_multiply\",\"modifier-source:MOD_grease_pencil_noise\",\"modifier-source:MOD_grease_pencil_offset\",\"modifier-source:MOD_grease_pencil_opacity\",\"modifier-source:MOD_grease_pencil_outline\",\"modifier-source:MOD_grease_pencil_shrinkwrap\",\"modifier-source:MOD_grease_pencil_simplify\",\"modifier-source:MOD_grease_pencil_smooth\",\"modifier-source:MOD_grease_pencil_subdiv\",\"modifier-source:MOD_grease_pencil_texture\",\"modifier-source:MOD_grease_pencil_thickness\",\"modifier-source:MOD_grease_pencil_time\",\"modifier-source:MOD_grease_pencil_tint\",\"modifier-source:MOD_grease_pencil_weight_angle\",\"modifier-source:MOD_grease_pencil_weight_proximity\",\"rna-struct:GreasePencilArmatureModifier\",\"rna-struct:GreasePencilArrayModifier\",\"rna-struct:GreasePencilBuildModifier\",\"rna-struct:GreasePencilColorModifier\",\"rna-struct:GreasePencilEnvelopeModifier\",\"rna-struct:GreasePencilHookModifier\",\"rna-struct:GreasePencilLatticeModifier\",\"rna-struct:GreasePencilLengthModifier\",\"rna-struct:GreasePencilMirrorModifier\",\"rna-struct:GreasePencilMultiplyModifier\",\"rna-struct:GreasePencilNoiseModifier\",\"rna-struct:GreasePencilOffsetModifier\",\"rna-struct:GreasePencilOpacityModifier\",\"rna-struct:GreasePencilOutlineModifier\",\"rna-struct:GreasePencilShrinkwrapModifier\",\"rna-struct:GreasePencilSimplifyModifier\",\"rna-struct:GreasePencilSmoothModifier\",\"rna-struct:GreasePencilSubdivModifier\",\"rna-struct:GreasePencilTextureModifier\",\"rna-struct:GreasePencilTimeModifier\",\"rna-struct:GreasePencilTintModifier\",\"rna-struct:GreasePencilWeightAngleModifier\",\"rna-struct:GreasePencilWeightProximityModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_grease_pencil_armature", + "modifier-source:MOD_grease_pencil_array", + "modifier-source:MOD_grease_pencil_build", + "modifier-source:MOD_grease_pencil_color", + "modifier-source:MOD_grease_pencil_dash", + "modifier-source:MOD_grease_pencil_envelope", + "modifier-source:MOD_grease_pencil_hook", + "modifier-source:MOD_grease_pencil_lattice", + "modifier-source:MOD_grease_pencil_length", + "modifier-source:MOD_grease_pencil_mirror", + "modifier-source:MOD_grease_pencil_multiply", + "modifier-source:MOD_grease_pencil_noise", + "modifier-source:MOD_grease_pencil_offset", + "modifier-source:MOD_grease_pencil_opacity", + "modifier-source:MOD_grease_pencil_outline", + "modifier-source:MOD_grease_pencil_shrinkwrap", + "modifier-source:MOD_grease_pencil_simplify", + "modifier-source:MOD_grease_pencil_smooth", + "modifier-source:MOD_grease_pencil_subdiv", + "modifier-source:MOD_grease_pencil_texture", + "modifier-source:MOD_grease_pencil_thickness", + "modifier-source:MOD_grease_pencil_time", + "modifier-source:MOD_grease_pencil_tint", + "modifier-source:MOD_grease_pencil_weight_angle", + "modifier-source:MOD_grease_pencil_weight_proximity", + "rna-struct:GreasePencilArmatureModifier", + "rna-struct:GreasePencilArrayModifier", + "rna-struct:GreasePencilBuildModifier", + "rna-struct:GreasePencilColorModifier", + "rna-struct:GreasePencilEnvelopeModifier", + "rna-struct:GreasePencilHookModifier", + "rna-struct:GreasePencilLatticeModifier", + "rna-struct:GreasePencilLengthModifier", + "rna-struct:GreasePencilMirrorModifier", + "rna-struct:GreasePencilMultiplyModifier", + "rna-struct:GreasePencilNoiseModifier", + "rna-struct:GreasePencilOffsetModifier", + "rna-struct:GreasePencilOpacityModifier", + "rna-struct:GreasePencilOutlineModifier", + "rna-struct:GreasePencilShrinkwrapModifier", + "rna-struct:GreasePencilSimplifyModifier", + "rna-struct:GreasePencilSmoothModifier", + "rna-struct:GreasePencilSubdivModifier", + "rna-struct:GreasePencilTextureModifier", + "rna-struct:GreasePencilTimeModifier", + "rna-struct:GreasePencilTintModifier", + "rna-struct:GreasePencilWeightAngleModifier", + "rna-struct:GreasePencilWeightProximityModifier" + ] + } + }, + { + "id": "WBV2-P1152-000", + "phase": "1152", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1151-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1152", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1152-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1152-001", + "phase": "1152", + "title": "verify modifier reader batch six", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1152-000" + ], + "parityId": "MODIFIER_READER_BATCH_SIX", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_six", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1152-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_SIX batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_SIX", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_SIX-READER", + "CAP-MODIFIER_READER_BATCH_SIX-RECOVERY", + "CAP-MODIFIER_READER_BATCH_SIX-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_mesh_to_volume.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_particleinstance.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_surface.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgmix.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgproximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend", + "tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend", + "tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend", + "tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend", + "tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend", + "tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_mesh_to_volume type is read from Blender Main", + "MOD_particleinstance type is read from Blender Main", + "MOD_surface type is read from Blender Main", + "MOD_weightvgedit type is read from Blender Main", + "MOD_weightvgmix type is read from Blender Main", + "MOD_weightvgproximity type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1152-001 WBV2_BATCH_FIXTURES='[\"tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend\",\"tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend\",\"tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend\",\"tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend\",\"tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend\",\"tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend\"]' WBV2_BATCH_TYPES='[\"MESH_TO_VOLUME\",\"PARTICLE_INSTANCE\",\"SURFACE\",\"VERTEX_WEIGHT_EDIT\",\"VERTEX_WEIGHT_MIX\",\"VERTEX_WEIGHT_PROXIMITY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_mesh_to_volume\",\"modifier-source:MOD_particleinstance\",\"modifier-source:MOD_surface\",\"modifier-source:MOD_weightvgedit\",\"modifier-source:MOD_weightvgmix\",\"modifier-source:MOD_weightvgproximity\",\"rna-struct:MeshToVolumeModifier\",\"rna-struct:ParticleInstanceModifier\",\"rna-struct:SurfaceModifier\",\"rna-struct:VertexWeightEditModifier\",\"rna-struct:VertexWeightMixModifier\",\"rna-struct:VertexWeightProximityModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_mesh_to_volume", + "modifier-source:MOD_particleinstance", + "modifier-source:MOD_surface", + "modifier-source:MOD_weightvgedit", + "modifier-source:MOD_weightvgmix", + "modifier-source:MOD_weightvgproximity", + "rna-struct:MeshToVolumeModifier", + "rna-struct:ParticleInstanceModifier", + "rna-struct:SurfaceModifier", + "rna-struct:VertexWeightEditModifier", + "rna-struct:VertexWeightMixModifier", + "rna-struct:VertexWeightProximityModifier" + ] + } + }, + { + "id": "WBV2-P1153-000", + "phase": "1153", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1152-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1153", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1153-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1153-001", + "phase": "1153", + "title": "reuse verified modifier receipts for shared source utilities", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1153-000" + ], + "parityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_source_dependency_reuse", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1153-001.md", + "behavior": "Verify the MODIFIER_SOURCE_DEPENDENCY_REUSE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1150-001/manifest.json", + "report": "tests/golden/WBV2-P1150-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1151-001/manifest.json", + "report": "tests/golden/WBV2-P1151-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1152-001/manifest.json", + "report": "tests/golden/WBV2-P1152-001/module-receipt.json" + } + ], + "dependencyReuse": [ + { + "unitId": "modifier-source:MOD_grease_pencil_util", + "representativeUnitId": "modifier-source:MOD_grease_pencil_array", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "marker": "MOD_grease_pencil_util.hh", + "productionEvidence": "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_mdd", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_read_mdd_times", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_pc2", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_read_pc2_times", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_util", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_util.hh", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_weightvg_util", + "representativeUnitId": "modifier-source:MOD_weightvgedit", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "marker": "MOD_weightvg_util.hh", + "productionEvidence": "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json" + } + ], + "positive": [ + "MOD_grease_pencil_util type is read from Blender Main", + "MOD_meshcache_mdd type is read from Blender Main", + "MOD_meshcache_pc2 type is read from Blender Main", + "MOD_meshcache_util type is read from Blender Main", + "MOD_weightvg_util type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "node tools/web/reuse-wbv2-source-dependencies.mjs --task WBV2-P1153-001 --write" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_grease_pencil_util", + "modifier-source:MOD_meshcache_mdd", + "modifier-source:MOD_meshcache_pc2", + "modifier-source:MOD_meshcache_util", + "modifier-source:MOD_weightvg_util" + ] + } + }, + { + "id": "WBV2-P1154-000", + "phase": "1154", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1153-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1154", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1154-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1154-001", + "phase": "1154", + "title": "verify solidify split helper sources", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1154-000" + ], + "parityId": "MODIFIER_SOLIDIFY_HELPER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_solidify_dependency_reuse", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1154-001.md", + "behavior": "Verify the MODIFIER_SOLIDIFY_HELPER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SOLIDIFY_HELPER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-READER", + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-RECOVERY", + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_generate_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" + } + ], + "positive": [ + "MOD_solidify_extrude type is read from Blender Main", + "MOD_solidify_nonmanifold type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1154-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURE=tests/files/web/modifier_generate_scene.blend WBV2_BATCH_TYPES='[\"SOLIDIFY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_solidify_extrude\",\"modifier-source:MOD_solidify_nonmanifold\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_solidify_extrude", + "modifier-source:MOD_solidify_nonmanifold" + ] + } + }, + { + "id": "WBV2-P1155-000", + "phase": "1155", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1154-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1155", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1155-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1155-001", + "phase": "1155", + "title": "verify modifier RNA reader batch", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1155-000" + ], + "parityId": "MODIFIER_RNA_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_rna_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1155-001.md", + "behavior": "Verify the MODIFIER_RNA_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_RNA_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_RNA_READER_BATCH-READER", + "CAP-MODIFIER_RNA_READER_BATCH-RECOVERY", + "CAP-MODIFIER_RNA_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend", + "tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_lineart type is read from Blender Main", + "MOD_particlesystem type is read from Blender Main", + "MOD_decimate type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1155-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1155-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURES='[\"tests/files/web/modifier_grease_pencil_scene.blend\",\"tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend\",\"tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend\"]' WBV2_BATCH_TYPES='[\"LINEART\",\"PARTICLE_SYSTEM\",\"DECIMATE\"]' WBV2_BATCH_UNITS='[\"rna-struct:GreasePencilLineartModifier\",\"rna-struct:ParticleSystemModifier\",\"rna-struct:DecimateModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1155-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "rna-struct:GreasePencilLineartModifier", + "rna-struct:ParticleSystemModifier", + "rna-struct:DecimateModifier" + ] + } + }, + { + "id": "WBV2-P1156-000", + "phase": "1156", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1155-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1156", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1156-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1156-001", + "phase": "1156", + "title": "verify volume displace modifier reader", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1156-000" + ], + "parityId": "MODIFIER_VOLUME_DISPLACE_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_volume_displace_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1156-001.md", + "behavior": "Verify the MODIFIER_VOLUME_DISPLACE_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_VOLUME_DISPLACE_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-READER", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-RECOVERY", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_displace.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_volume_displace type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1156-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1156-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend WBV2_BATCH_TYPES='[\"VOLUME_DISPLACE\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_volume_displace\",\"rna-struct:VolumeDisplaceModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1156-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_volume_displace", + "rna-struct:VolumeDisplaceModifier" + ] + } + }, + { + "id": "WBV2-P1157-000", + "phase": "1157", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1156-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1157", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1157-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1157-001", + "phase": "1157", + "title": "verify shape key point reader", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1157-000" + ], + "parityId": "SHAPE_KEY_POINT_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-shape_key_point_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1157-001.md", + "behavior": "Verify the SHAPE_KEY_POINT_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SHAPE_KEY_POINT_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-SHAPE_KEY_POINT_READER_BATCH-READER", + "CAP-SHAPE_KEY_POINT_READER_BATCH-RECOVERY", + "CAP-SHAPE_KEY_POINT_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1157-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1157-001/shape-key-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/rigged_shape_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:ShapeKeyPoint\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-shape-key-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1157-001/shape-key-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:ShapeKeyPoint" + ] + } + }, + { + "id": "WBV2-P1158-000", + "phase": "1158", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1157-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1158", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1158-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1158-001", + "phase": "1158", + "title": "verify line style reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1158-000" + ], + "parityId": "LINE_STYLE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1158-001.md", + "behavior": "Verify the LINE_STYLE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_READER_BATCH-READER", + "CAP-LINE_STYLE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1158-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1158-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:FreestyleLineStyle\",\"rna-struct:LineStyleModifier\",\"rna-struct:LineStyleAlphaModifier\",\"rna-struct:LineStyleColorModifier\",\"rna-struct:LineStyleGeometryModifier\",\"rna-struct:LineStyleThicknessModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1158-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:FreestyleLineStyle", + "rna-struct:LineStyleModifier", + "rna-struct:LineStyleAlphaModifier", + "rna-struct:LineStyleColorModifier", + "rna-struct:LineStyleGeometryModifier", + "rna-struct:LineStyleThicknessModifier" + ] + } + }, + { + "id": "WBV2-P1159-000", + "phase": "1159", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1158-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1159", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1159-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1159-001", + "phase": "1159", + "title": "verify line style collection reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1159-000" + ], + "parityId": "LINE_STYLE_COLLECTION_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_collection_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1159-001.md", + "behavior": "Verify the LINE_STYLE_COLLECTION_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_COLLECTION_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-READER", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_main_api.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_modifier_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1159-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1159-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/line_style_modifier_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:BlendDataLineStyles\",\"rna-struct:LineStyleColorModifiers\",\"rna-struct:LineStyleAlphaModifiers\",\"rna-struct:LineStyleThicknessModifiers\",\"rna-struct:LineStyleGeometryModifiers\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1159-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:BlendDataLineStyles", + "rna-struct:LineStyleColorModifiers", + "rna-struct:LineStyleAlphaModifiers", + "rna-struct:LineStyleThicknessModifiers", + "rna-struct:LineStyleGeometryModifiers" + ] + } + }, + { + "id": "WBV2-P1160-000", + "phase": "1160", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1159-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1160", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1160-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1160-001", + "phase": "1160", + "title": "verify line style modifier subtype reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1160-000" + ], + "parityId": "LINE_STYLE_SUBTYPE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_subtype_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1160-001.md", + "behavior": "Verify the LINE_STYLE_SUBTYPE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_SUBTYPE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-READER", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1160-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1160-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/line_style_subtype_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:LineStyleAlphaModifier_AlongStroke\",\"rna-struct:LineStyleAlphaModifier_CreaseAngle\",\"rna-struct:LineStyleAlphaModifier_Curvature_3D\",\"rna-struct:LineStyleAlphaModifier_DistanceFromCamera\",\"rna-struct:LineStyleAlphaModifier_DistanceFromObject\",\"rna-struct:LineStyleAlphaModifier_Material\",\"rna-struct:LineStyleAlphaModifier_Noise\",\"rna-struct:LineStyleAlphaModifier_Tangent\",\"rna-struct:LineStyleColorModifier_AlongStroke\",\"rna-struct:LineStyleColorModifier_CreaseAngle\",\"rna-struct:LineStyleColorModifier_Curvature_3D\",\"rna-struct:LineStyleColorModifier_DistanceFromCamera\",\"rna-struct:LineStyleColorModifier_DistanceFromObject\",\"rna-struct:LineStyleColorModifier_Material\",\"rna-struct:LineStyleColorModifier_Noise\",\"rna-struct:LineStyleColorModifier_Tangent\",\"rna-struct:LineStyleGeometryModifier_2DOffset\",\"rna-struct:LineStyleGeometryModifier_2DTransform\",\"rna-struct:LineStyleGeometryModifier_BackboneStretcher\",\"rna-struct:LineStyleGeometryModifier_BezierCurve\",\"rna-struct:LineStyleGeometryModifier_Blueprint\",\"rna-struct:LineStyleGeometryModifier_GuidingLines\",\"rna-struct:LineStyleGeometryModifier_PerlinNoise1D\",\"rna-struct:LineStyleGeometryModifier_PerlinNoise2D\",\"rna-struct:LineStyleGeometryModifier_Polygonalization\",\"rna-struct:LineStyleGeometryModifier_Sampling\",\"rna-struct:LineStyleGeometryModifier_Simplification\",\"rna-struct:LineStyleGeometryModifier_SinusDisplacement\",\"rna-struct:LineStyleGeometryModifier_SpatialNoise\",\"rna-struct:LineStyleGeometryModifier_TipRemover\",\"rna-struct:LineStyleThicknessModifier_AlongStroke\",\"rna-struct:LineStyleThicknessModifier_Calligraphy\",\"rna-struct:LineStyleThicknessModifier_CreaseAngle\",\"rna-struct:LineStyleThicknessModifier_Curvature_3D\",\"rna-struct:LineStyleThicknessModifier_DistanceFromCamera\",\"rna-struct:LineStyleThicknessModifier_DistanceFromObject\",\"rna-struct:LineStyleThicknessModifier_Material\",\"rna-struct:LineStyleThicknessModifier_Noise\",\"rna-struct:LineStyleThicknessModifier_Tangent\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1160-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:LineStyleAlphaModifier_AlongStroke", + "rna-struct:LineStyleAlphaModifier_CreaseAngle", + "rna-struct:LineStyleAlphaModifier_Curvature_3D", + "rna-struct:LineStyleAlphaModifier_DistanceFromCamera", + "rna-struct:LineStyleAlphaModifier_DistanceFromObject", + "rna-struct:LineStyleAlphaModifier_Material", + "rna-struct:LineStyleAlphaModifier_Noise", + "rna-struct:LineStyleAlphaModifier_Tangent", + "rna-struct:LineStyleColorModifier_AlongStroke", + "rna-struct:LineStyleColorModifier_CreaseAngle", + "rna-struct:LineStyleColorModifier_Curvature_3D", + "rna-struct:LineStyleColorModifier_DistanceFromCamera", + "rna-struct:LineStyleColorModifier_DistanceFromObject", + "rna-struct:LineStyleColorModifier_Material", + "rna-struct:LineStyleColorModifier_Noise", + "rna-struct:LineStyleColorModifier_Tangent", + "rna-struct:LineStyleGeometryModifier_2DOffset", + "rna-struct:LineStyleGeometryModifier_2DTransform", + "rna-struct:LineStyleGeometryModifier_BackboneStretcher", + "rna-struct:LineStyleGeometryModifier_BezierCurve", + "rna-struct:LineStyleGeometryModifier_Blueprint", + "rna-struct:LineStyleGeometryModifier_GuidingLines", + "rna-struct:LineStyleGeometryModifier_PerlinNoise1D", + "rna-struct:LineStyleGeometryModifier_PerlinNoise2D", + "rna-struct:LineStyleGeometryModifier_Polygonalization", + "rna-struct:LineStyleGeometryModifier_Sampling", + "rna-struct:LineStyleGeometryModifier_Simplification", + "rna-struct:LineStyleGeometryModifier_SinusDisplacement", + "rna-struct:LineStyleGeometryModifier_SpatialNoise", + "rna-struct:LineStyleGeometryModifier_TipRemover", + "rna-struct:LineStyleThicknessModifier_AlongStroke", + "rna-struct:LineStyleThicknessModifier_Calligraphy", + "rna-struct:LineStyleThicknessModifier_CreaseAngle", + "rna-struct:LineStyleThicknessModifier_Curvature_3D", + "rna-struct:LineStyleThicknessModifier_DistanceFromCamera", + "rna-struct:LineStyleThicknessModifier_DistanceFromObject", + "rna-struct:LineStyleThicknessModifier_Material", + "rna-struct:LineStyleThicknessModifier_Noise", + "rna-struct:LineStyleThicknessModifier_Tangent" + ] + } + }, + { + "id": "WBV2-P1161-000", + "phase": "1161", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1160-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1161", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1161-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1161-001", + "phase": "1161", + "title": "verify FCurve modifier subtype reader batch", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1161-000" + ], + "parityId": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_modifier_subtype_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1161-001.md", + "behavior": "Verify the FCURVE_MODIFIER_SUBTYPE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-READER", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "tests/files/web/fcurve_modifier_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1161-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1161-001/fcurve-modifier-production.json WBV2_BATCH_FIXTURE=tests/files/web/fcurve_modifier_subtype_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:FModifierEnvelope\",\"rna-struct:FModifierGenerator\",\"rna-struct:FModifierLimits\",\"rna-struct:FModifierNoise\",\"rna-struct:FModifierSmooth\",\"rna-struct:FModifierStepped\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-modifier-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1161-001/fcurve-modifier-production.json" + ], + "coverageBindings": [ + "rna-struct:FModifierEnvelope", + "rna-struct:FModifierGenerator", + "rna-struct:FModifierLimits", + "rna-struct:FModifierNoise", + "rna-struct:FModifierSmooth", + "rna-struct:FModifierStepped" + ] + } + }, + { + "id": "WBV2-P1162-000", + "phase": "1162", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1161-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1162", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1162-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1162-001", + "phase": "1162", + "title": "verify shape key modifier reader dependency", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1162-000" + ], + "parityId": "MODIFIER_SHAPEKEY_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_shapekey_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1162-001.md", + "behavior": "Verify the MODIFIER_SHAPEKEY_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "module": { + "moduleId": "MODIFIER_SHAPEKEY_READER_BATCH", + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-READER", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-RECOVERY", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_shapekey.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_shapekey type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1162-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1162-001/shape-key-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/rigged_shape_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_shapekey\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-shape-key-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1162-001/shape-key-reader-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_shapekey" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1163-000", + "phase": "1163", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1162-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1163", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1163-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1163-001", + "phase": "1163", + "title": "verify compositor node reader batch", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1163-000" + ], + "parityId": "COMPOSITOR_NODE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_node_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1163-001.md", + "behavior": "Verify the COMPOSITOR_NODE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "module": { + "moduleId": "COMPOSITOR_NODE_READER_BATCH", + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR_NODE_READER_BATCH-READER", + "CAP-COMPOSITOR_NODE_READER_BATCH-RECOVERY", + "CAP-COMPOSITOR_NODE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_glare.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1163-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1163-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeGlare\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeGlare\",\"node:CompositorNodeViewer\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1163-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1164-000", + "phase": "1164", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1163-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1164", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1164-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1164-001", + "phase": "1164", + "title": "verify native compositor transform blur alpha reader", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1164-000" + ], + "parityId": "COMPOSITOR_NATIVE_NODE_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_native_node_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1164-001.md", + "behavior": "Verify the COMPOSITOR_NATIVE_NODE_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "module": { + "moduleId": "COMPOSITOR_NATIVE_NODE_BATCH", + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-READER", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-RECOVERY", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeTransform type is read from Blender Main", + "CompositorNodeBlur type is read from Blender Main", + "CompositorNodeAlphaOver type is read from Blender Main", + "CompositorNodeViewer type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1164-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1164-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_node_batch_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeTransform\",\"CompositorNodeBlur\",\"CompositorNodeAlphaOver\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeTransform\",\"node:CompositorNodeBlur\",\"node:CompositorNodeAlphaOver\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1164-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1165-000", + "phase": "1165", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1164-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1165", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1165-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1165-001", + "phase": "1165", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1165-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1165-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_anti_aliasing.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bilateral_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blank_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_box_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_brightness_contrast.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_channel_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeAntiAliasing type is read from Blender Main", + "CompositorNodeBilateralblur type is read from Blender Main", + "CompositorNodeBlankImage type is read from Blender Main", + "CompositorNodeBokehBlur type is read from Blender Main", + "CompositorNodeBokehImage type is read from Blender Main", + "CompositorNodeBoxMask type is read from Blender Main", + "CompositorNodeBrightContrast type is read from Blender Main", + "CompositorNodeChannelMatte type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1165-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1165-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend WBV2_BATCH_TYPES='[\"CompositorNodeAntiAliasing\",\"CompositorNodeBilateralblur\",\"CompositorNodeBlankImage\",\"CompositorNodeBokehBlur\",\"CompositorNodeBokehImage\",\"CompositorNodeBoxMask\",\"CompositorNodeBrightContrast\",\"CompositorNodeChannelMatte\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeAntiAliasing\",\"node:CompositorNodeBilateralblur\",\"node:CompositorNodeBlankImage\",\"node:CompositorNodeBokehBlur\",\"node:CompositorNodeBokehImage\",\"node:CompositorNodeBoxMask\",\"node:CompositorNodeBrightContrast\",\"node:CompositorNodeChannelMatte\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1165-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1166-000", + "phase": "1166", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1165-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1166", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1166-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1166-001", + "phase": "1166", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1166-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1166-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_chroma_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_balance.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_correction.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_spill.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_combine_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_to_display.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeChromaMatte type is read from Blender Main", + "CompositorNodeColorBalance type is read from Blender Main", + "CompositorNodeColorCorrection type is read from Blender Main", + "CompositorNodeColorMatte type is read from Blender Main", + "CompositorNodeColorSpill type is read from Blender Main", + "CompositorNodeCombineColor type is read from Blender Main", + "CompositorNodeConvertColorSpace type is read from Blender Main", + "CompositorNodeConvertToDisplay type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1166-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1166-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend WBV2_BATCH_TYPES='[\"CompositorNodeChromaMatte\",\"CompositorNodeColorBalance\",\"CompositorNodeColorCorrection\",\"CompositorNodeColorMatte\",\"CompositorNodeColorSpill\",\"CompositorNodeCombineColor\",\"CompositorNodeConvertColorSpace\",\"CompositorNodeConvertToDisplay\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeChromaMatte\",\"node:CompositorNodeColorBalance\",\"node:CompositorNodeColorCorrection\",\"node:CompositorNodeColorMatte\",\"node:CompositorNodeColorSpill\",\"node:CompositorNodeCombineColor\",\"node:CompositorNodeConvertColorSpace\",\"node:CompositorNodeConvertToDisplay\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1166-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1167-000", + "phase": "1167", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1166-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1167", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1167-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1167-001", + "phase": "1167", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1167-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1167-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convolve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_corner_pin.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_crop.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_curves.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_directional_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_defocus.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeConvolve type is read from Blender Main", + "CompositorNodeCornerPin type is read from Blender Main", + "CompositorNodeCrop type is read from Blender Main", + "CompositorNodeCryptomatte type is read from Blender Main", + "CompositorNodeCryptomatteV2 type is read from Blender Main", + "CompositorNodeCurveRGB type is read from Blender Main", + "CompositorNodeDBlur type is read from Blender Main", + "CompositorNodeDefocus type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1167-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1167-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend WBV2_BATCH_TYPES='[\"CompositorNodeConvolve\",\"CompositorNodeCornerPin\",\"CompositorNodeCrop\",\"CompositorNodeCryptomatte\",\"CompositorNodeCryptomatteV2\",\"CompositorNodeCurveRGB\",\"CompositorNodeDBlur\",\"CompositorNodeDefocus\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeConvolve\",\"node:CompositorNodeCornerPin\",\"node:CompositorNodeCrop\",\"node:CompositorNodeCryptomatte\",\"node:CompositorNodeCryptomatteV2\",\"node:CompositorNodeCurveRGB\",\"node:CompositorNodeDBlur\",\"node:CompositorNodeDefocus\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1167-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1168-000", + "phase": "1168", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1167-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1168", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1168-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1168-001", + "phase": "1168", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1168-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1168-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_denoise.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_despeckle.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_difference_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_dilate_erode.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_displace.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_distance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_ellipse_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeDenoise type is read from Blender Main", + "CompositorNodeDespeckle type is read from Blender Main", + "CompositorNodeDiffMatte type is read from Blender Main", + "CompositorNodeDilateErode type is read from Blender Main", + "CompositorNodeDisplace type is read from Blender Main", + "CompositorNodeDistanceMatte type is read from Blender Main", + "CompositorNodeDoubleEdgeMask type is read from Blender Main", + "CompositorNodeEllipseMask type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1168-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1168-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend WBV2_BATCH_TYPES='[\"CompositorNodeDenoise\",\"CompositorNodeDespeckle\",\"CompositorNodeDiffMatte\",\"CompositorNodeDilateErode\",\"CompositorNodeDisplace\",\"CompositorNodeDistanceMatte\",\"CompositorNodeDoubleEdgeMask\",\"CompositorNodeEllipseMask\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeDenoise\",\"node:CompositorNodeDespeckle\",\"node:CompositorNodeDiffMatte\",\"node:CompositorNodeDilateErode\",\"node:CompositorNodeDisplace\",\"node:CompositorNodeDistanceMatte\",\"node:CompositorNodeDoubleEdgeMask\",\"node:CompositorNodeEllipseMask\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1168-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1169-000", + "phase": "1169", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1168-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1169", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1169-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1169-001", + "phase": "1169", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1169-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1169-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:cd9ae59d0f9640d1", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:cd9ae59d0f9640d1", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_filter.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_flip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_correct.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_saturation_value.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_id_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-cd9ae59d0f9640d1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeFilter type is read from Blender Main", + "CompositorNodeFlip type is read from Blender Main", + "CompositorNodeHueCorrect type is read from Blender Main", + "CompositorNodeHueSat type is read from Blender Main", + "CompositorNodeIDMask type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1169-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1169-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-cd9ae59d0f9640d1.blend WBV2_BATCH_TYPES='[\"CompositorNodeFilter\",\"CompositorNodeFlip\",\"CompositorNodeHueCorrect\",\"CompositorNodeHueSat\",\"CompositorNodeIDMask\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeFilter\",\"node:CompositorNodeFlip\",\"node:CompositorNodeHueCorrect\",\"node:CompositorNodeHueSat\",\"node:CompositorNodeIDMask\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1169-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1170-000", + "phase": "1170", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1169-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1170", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1170-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1170-001", + "phase": "1170", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1170-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1170-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeImage type is read from Blender Main", + "CompositorNodeImageCoordinates type is read from Blender Main", + "CompositorNodeImageInfo type is read from Blender Main", + "CompositorNodeInpaint type is read from Blender Main", + "CompositorNodeKeying type is read from Blender Main", + "CompositorNodeKeyingScreen type is read from Blender Main", + "CompositorNodeKuwahara type is read from Blender Main", + "CompositorNodeLensdist type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1170-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1170-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend WBV2_BATCH_TYPES='[\"CompositorNodeImage\",\"CompositorNodeImageCoordinates\",\"CompositorNodeImageInfo\",\"CompositorNodeInpaint\",\"CompositorNodeKeying\",\"CompositorNodeKeyingScreen\",\"CompositorNodeKuwahara\",\"CompositorNodeLensdist\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeImage\",\"node:CompositorNodeImageCoordinates\",\"node:CompositorNodeImageInfo\",\"node:CompositorNodeInpaint\",\"node:CompositorNodeKeying\",\"node:CompositorNodeKeyingScreen\",\"node:CompositorNodeKuwahara\",\"node:CompositorNodeLensdist\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1170-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + } + ] +} diff --git a/tests/golden/WBV2-P1170-001/compositor-main-reader-production.json b/tests/golden/WBV2-P1170-001/compositor-main-reader-production.json new file mode 100644 index 000000000..76458e056 --- /dev/null +++ b/tests/golden/WBV2-P1170-001/compositor-main-reader-production.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1170-001", + "operation": "COMPOSITOR_MAIN_READER_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "sourceUnits": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "expectedTypes": [ + "CompositorNodeImage", + "CompositorNodeImageCoordinates", + "CompositorNodeImageInfo", + "CompositorNodeInpaint", + "CompositorNodeKeying", + "CompositorNodeKeyingScreen", + "CompositorNodeKuwahara", + "CompositorNodeLensdist" + ], + "sourceRnaStructs": { + "rna-struct:CompositorNodeTree": "scene.compositorGraph", + "rna-struct:NodeTree": "scene.compositorGraph", + "rna-struct:NodeLinks": "scene.compositorGraph.links", + "rna-struct:NodeLink": "scene.compositorGraph.links[]" + }, + "fixtureSha256": "7f0bf62decd47ce8fb21b29b206d185405bbee47035d9d586348eec2e0d84a33", + "graphs": [ + { + "id": "compositor:scene:Scene", + "name": "Scene Compositor", + "nodeTypes": [ + "COMPOSITE", + "CONSTANT_COLOR", + "CompositorNodeImage", + "CompositorNodeImageCoordinates", + "CompositorNodeImageInfo", + "CompositorNodeInpaint", + "CompositorNodeKeying", + "CompositorNodeKeyingScreen", + "CompositorNodeKuwahara", + "CompositorNodeLensdist" + ], + "links": [ + { + "fromNodeId": "compositor-node:1474080387", + "fromSocket": "Color", + "toNodeId": "compositor-node:1412991936", + "toSocket": "Image" + } + ] + } + ], + "reopenedGraphs": [ + { + "id": "compositor:scene:Scene", + "name": "Scene Compositor", + "nodeTypes": [ + "COMPOSITE", + "CONSTANT_COLOR", + "CompositorNodeImage", + "CompositorNodeImageCoordinates", + "CompositorNodeImageInfo", + "CompositorNodeInpaint", + "CompositorNodeKeying", + "CompositorNodeKeyingScreen", + "CompositorNodeKuwahara", + "CompositorNodeLensdist" + ], + "links": [ + { + "fromNodeId": "compositor-node:1474080387", + "fromSocket": "Color", + "toNodeId": "compositor-node:1412991936", + "toSocket": "Image" + } + ] + } + ], + "openedRevision": 1, + "reopenedRevision": 1 +} diff --git a/tests/golden/WBV2-P1170-001/manifest.json b/tests/golden/WBV2-P1170-001/manifest.json new file mode 100644 index 000000000..a11f390cb --- /dev/null +++ b/tests/golden/WBV2-P1170-001/manifest.json @@ -0,0 +1,134 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1170-001", + "parentTask": "WBV2-P1170-000", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "taskClass": "MODULE", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "BLENDER_WEB_FUNCTION_MODULE", + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1170-000/manifest.json", + "sha256": "f529ca2c6d4a8431328363225d5edb7ce2db05fc2ee31ec324bf6765908d3c30" + }, + "source1": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "sha256": "0b8033151a43aefe832aa6b3c129dee262a9eeeff881bd38e9697e92697cc77e" + }, + "source2": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "sha256": "956ed8cd1c2e0142ea2b6e9c90ad9fddb0e4e869da381d29bcc5fe2dd233cecb" + }, + "source3": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "sha256": "6e2e8fd7aa80888eeba932c6ca7e0318807c810ab2a82d6ef9540991ac196cab" + }, + "source4": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "sha256": "aff2809fdf8d36e41e2419895350567103c252100803f9421b6979577d0c3100" + }, + "source5": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "sha256": "fd41b4d54dc369dfd6187e302f71a8710520ac3154af3364b25b05f904c7d4f1" + }, + "source6": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "sha256": "aa68fc58d9f5e4248e7f6a4e00ec9ec98c5224cf7205a96f98916dd86df23805" + }, + "source7": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "sha256": "d3402d826f132ef46fe115eb961c4bb2cc79420d25bf06f95050da25185057c0" + }, + "source8": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "sha256": "afdd19935fd14112498d67d9853d5deaff47e48e13a402b7de9d553a5b6a4a0d" + }, + "source9": { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "sha256": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "source10": { + "path": "web/tests/e2e/compositor-main-reader-production.spec.ts", + "sha256": "b573ac61d289a63389631bc80dd4195acf10c7383c4db3f2adde0e09aa01c9d7" + }, + "source11": { + "path": "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "sha256": "7f0bf62decd47ce8fb21b29b206d185405bbee47035d9d586348eec2e0d84a33" + }, + "source12": { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "sha256": "66fc59cba55a8c17d398b74d12ea4a9f09746c0f30c40f579c44aa34956e3072" + }, + "evidence1": { + "path": "tests/golden/WBV2-P1170-001/compositor-main-reader-production.json", + "sha256": "76da1f6a141c427e9d461c256a1801e09b9ca7947fe94d1b6566f2ae0e040730" + }, + "moduleReceipt": { + "path": "tests/golden/WBV2-P1170-001/module-receipt.json", + "sha256": "22afaca147aede5deb121fdb3d815e5c868d6aec40ecd2fee520437fb88fb32b" + }, + "status": { + "path": "docs/status/WBV2-P1170-001.md", + "sha256": "4cc6603ffe6a249136b93b461745e0812aa64492af5ab58866a5ba98e052c94f" + }, + "log": { + "path": "tests/golden/WBV2-P1170-001/module-run.log", + "sha256": "304d9d61c4ba75f118526209c46055a1ece7eab014cc02a666a34484ef99120d" + }, + "plan": { + "path": "tests/golden/WBV2-P1170-000/module-execution-plan.json", + "sha256": "c0ad17f6f2a7c37c5c46421fe9d99d5a6d4ec77ce01565ec6efdf75c9fb16027" + }, + "taskContext": { + "path": "tests/golden/WBV2-P1170-001/task-context.json", + "sha256": "cd6835a533c80952f8fac2e66cf266c0fac30c0fd9f4b98e1fbdfe9da2646e80" + } + }, + "assertions": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "sourceBacked": true, + "positiveCases": 10, + "negativeCases": 3, + "recoveryCases": 3, + "commandCount": 4, + "reusedReceiptCount": 1, + "sourceUnchanged": true, + "fullFamilyParity": false, + "dynamicInventoryPath": "tests/golden/WBV2/dynamic-inventory.json", + "dynamicSourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 574, + "dynamicUnverifiedUnits": 3171, + "planningEstimate": 5200, + "historicalInventoryTotal": 6900, + "historicalEffectiveCompleted": 290, + "historicalEffectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1170-001/module-receipt.json b/tests/golden/WBV2-P1170-001/module-receipt.json new file mode 100644 index 000000000..2e8d107fa --- /dev/null +++ b/tests/golden/WBV2-P1170-001/module-receipt.json @@ -0,0 +1,172 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1170-001", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16, + "commandCount": 4, + "readCommandCount": 0, + "withinBudget": true + }, + "status": "PASS", + "source": { + "paths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "auditedPaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp" + ], + "before": { + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc": "0b8033151a43aefe832aa6b3c129dee262a9eeeff881bd38e9697e92697cc77e", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc": "956ed8cd1c2e0142ea2b6e9c90ad9fddb0e4e869da381d29bcc5fe2dd233cecb", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc": "6e2e8fd7aa80888eeba932c6ca7e0318807c810ab2a82d6ef9540991ac196cab", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc": "aff2809fdf8d36e41e2419895350567103c252100803f9421b6979577d0c3100", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc": "fd41b4d54dc369dfd6187e302f71a8710520ac3154af3364b25b05f904c7d4f1", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc": "aa68fc58d9f5e4248e7f6a4e00ec9ec98c5224cf7205a96f98916dd86df23805", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc": "d3402d826f132ef46fe115eb961c4bb2cc79420d25bf06f95050da25185057c0", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc": "afdd19935fd14112498d67d9853d5deaff47e48e13a402b7de9d553a5b6a4a0d", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "after": { + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc": "0b8033151a43aefe832aa6b3c129dee262a9eeeff881bd38e9697e92697cc77e", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc": "956ed8cd1c2e0142ea2b6e9c90ad9fddb0e4e869da381d29bcc5fe2dd233cecb", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc": "6e2e8fd7aa80888eeba932c6ca7e0318807c810ab2a82d6ef9540991ac196cab", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc": "aff2809fdf8d36e41e2419895350567103c252100803f9421b6979577d0c3100", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc": "fd41b4d54dc369dfd6187e302f71a8710520ac3154af3364b25b05f904c7d4f1", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc": "aa68fc58d9f5e4248e7f6a4e00ec9ec98c5224cf7205a96f98916dd86df23805", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc": "d3402d826f132ef46fe115eb961c4bb2cc79420d25bf06f95050da25185057c0", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc": "afdd19935fd14112498d67d9853d5deaff47e48e13a402b7de9d553a5b6a4a0d", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "unchanged": true + }, + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json", + "manifestSha256": "a53ebdc52db5dcf27d44e938e5551f1ee2adae8e46c3fe8661604ee6b1000f8c", + "reportSha256": "6dd419799e1a4b9251328d9496f2459d148cd89118740a06b0ee6ffb78e0b1d2" + } + ], + "cases": { + "positive": [ + "CompositorNodeImage type is read from Blender Main", + "CompositorNodeImageCoordinates type is read from Blender Main", + "CompositorNodeImageInfo type is read from Blender Main", + "CompositorNodeInpaint type is read from Blender Main", + "CompositorNodeKeying type is read from Blender Main", + "CompositorNodeKeyingScreen type is read from Blender Main", + "CompositorNodeKuwahara type is read from Blender Main", + "CompositorNodeLensdist type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ] + }, + "commands": [ + { + "command": "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "exitCode": 0, + "durationMs": 144 + }, + { + "command": "npm --prefix web run typecheck", + "exitCode": 0, + "durationMs": 3356 + }, + { + "command": "npm --prefix web run build", + "exitCode": 0, + "durationMs": 3927 + }, + { + "command": "WBV2_BATCH_TASK=WBV2-P1170-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1170-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend WBV2_BATCH_TYPES='[\"CompositorNodeImage\",\"CompositorNodeImageCoordinates\",\"CompositorNodeImageInfo\",\"CompositorNodeInpaint\",\"CompositorNodeKeying\",\"CompositorNodeKeyingScreen\",\"CompositorNodeKuwahara\",\"CompositorNodeLensdist\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeImage\",\"node:CompositorNodeImageCoordinates\",\"node:CompositorNodeImageInfo\",\"node:CompositorNodeInpaint\",\"node:CompositorNodeKeying\",\"node:CompositorNodeKeyingScreen\",\"node:CompositorNodeKuwahara\",\"node:CompositorNodeLensdist\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts", + "exitCode": 0, + "durationMs": 2835 + } + ], + "verification": { + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "chromiumOnly": true, + "fullFamilyParity": false + }, + "efficiency": { + "existingEvidenceReused": false, + "skippedCommands": 0, + "totalDurationMs": 10262, + "reusePolicy": "hash_bound_receipt" + }, + "inventory": { + "historical": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "mutation": "forbidden_by_module_execution" + }, + "dynamic": { + "path": "tests/golden/WBV2/dynamic-inventory.json", + "sha256": "de749a2e252a48e5d28d1b51138ab88c64318117903b01a3b73f3642db083de4", + "sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "unitCount": 3745, + "planningEstimate": 5200, + "hardTarget": false, + "verifiedUnits": 574, + "unverifiedUnits": 3171 + } + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1170-001/module-run.log b/tests/golden/WBV2-P1170-001/module-run.log new file mode 100644 index 000000000..f105a7ee0 --- /dev/null +++ b/tests/golden/WBV2-P1170-001/module-run.log @@ -0,0 +1,49 @@ +> source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm +ninja: no work to do. + +> npm --prefix web run typecheck + +> blender-web-editor@0.1.0-rc.1 typecheck +> tsc -p tsconfig.json --noEmit + + +> npm --prefix web run build + +> blender-web-editor@0.1.0-rc.1 build +> tsc -p tsconfig.json && vite build --config app/vite.config.ts + +vite v8.2.0 building client environment for production... + transforming...✓ 102 modules transformed. +rendering chunks... +computing gzip size... +dist/index.html 0.46 kB │ gzip: 0.29 kB +dist/assets/storage.worker-D9TqXsGS.js 66.59 kB +dist/assets/web-engine.worker-ynL11m10.js 362.11 kB +dist/assets/viewport-render.worker-BKnJyAEz.js 634.08 kB +dist/assets/web_engine-C04Dp4ba.wasm 16,243.50 kB │ gzip: 3,858.52 kB +dist/assets/index-BgTbQCE2.css 15.35 kB │ gzip: 3.91 kB +dist/assets/index-B1m0FaKy.js 1,190.30 kB │ gzip: 316.69 kB + +✓ built in 492ms +[plugin rolldown:vite-resolve] Module "module" has been externalized for browser compatibility, imported by "/home/mes123456/workinf_Blender_Wasm/web/app/src/vendor/blender/web_engine.js". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details. +[plugin builtin:vite-reporter] +(!) Some chunks are larger than 500 kB after minification. Consider: +- Using dynamic import() to code-split the application +- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting +- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit. + +> WBV2_BATCH_TASK=WBV2-P1170-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1170-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend WBV2_BATCH_TYPES='["CompositorNodeImage","CompositorNodeImageCoordinates","CompositorNodeImageInfo","CompositorNodeInpaint","CompositorNodeKeying","CompositorNodeKeyingScreen","CompositorNodeKuwahara","CompositorNodeLensdist"]' WBV2_BATCH_UNITS='["node:CompositorNodeImage","node:CompositorNodeImageCoordinates","node:CompositorNodeImageInfo","node:CompositorNodeInpaint","node:CompositorNodeKeying","node:CompositorNodeKeyingScreen","node:CompositorNodeKuwahara","node:CompositorNodeLensdist"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts + +> blender-web-editor@0.1.0-rc.1 test:e2e +> playwright test --config playwright.config.ts --workers=1 tests/e2e/compositor-main-reader-production.spec.ts + + +Running 1 test using 1 worker + + ✓ 1 tests/e2e/compositor-main-reader-production.spec.ts:15:1 › WBV2-P1104-000 reads compositor NodeTree and links from Blender Main without JS execution (1.7s) + + 1 passed (2.5s) +[WebServer] (node:1256893) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +[WebServer] (Use `node --trace-warnings ...` to show where the warning was created) +(node:1256947) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) diff --git a/tests/golden/WBV2-P1170-001/task-context.json b/tests/golden/WBV2-P1170-001/task-context.json new file mode 100644 index 000000000..48ef62262 --- /dev/null +++ b/tests/golden/WBV2-P1170-001/task-context.json @@ -0,0 +1,217 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1170-001", + "parentTask": "WBV2-P1170-000", + "status": "in_progress", + "goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 CompositorNodeImage, CompositorNodeImageCoordinates, CompositorNodeImageInfo, CompositorNodeInpaint, CompositorNodeKeying, CompositorNodeKeyingScreen, CompositorNodeKuwahara, CompositorNodeLensdist 的真实 modifier/RNA 元数据。", + "scope": { + "gap": "capability:AUTO_COMPOSITOR_NATIVE_NODE_READER", + "ownerFamily": "NODES", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P1170-001 --write" + ], + "inputPaths": [], + "inputMetadata": { + "docs/EXECUTION_QUEUE.md": { + "path": "docs/EXECUTION_QUEUE.md", + "exists": true, + "bytes": 4030, + "mtime_ns": "1788478840346336937", + "sha256": "34c007b94e7762de7ad84d3738787b1fb10c89cbf3187eb21572aa6a12f9a216" + }, + "docs/tasks/WBV2-P1170-001.md": { + "path": "docs/tasks/WBV2-P1170-001.md", + "exists": true, + "bytes": 2975, + "mtime_ns": "1788478829616364906", + "sha256": "e1eb0f493b65121a64cbe629dec8109a8c70d1e8138a39df3250f4aee0eb0cd7" + }, + "tests/golden/WBV2-P1170-000/manifest.json": { + "path": "tests/golden/WBV2-P1170-000/manifest.json", + "exists": true, + "bytes": 1788, + "mtime_ns": "1788478829616892580", + "sha256": "f529ca2c6d4a8431328363225d5edb7ce2db05fc2ee31ec324bf6765908d3c30" + }, + "docs/status/WBV2-P1170-000.md": { + "path": "docs/status/WBV2-P1170-000.md", + "exists": true, + "bytes": 366, + "mtime_ns": "1788478829616532163", + "sha256": "68810c742d319f8f4c66485fb1fbfad97272bf99c2c2e6aad5c2be5d8e09fef8" + } + }, + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 745, + "contextRemainingTokens": 185 + }, + "source": { + "bytes": 9159, + "tokens": 2291 + }, + "selected": [], + "excluded": [ + { + "path": "blender-5.2.0/source/blender/modifiers/intern/", + "bytes": 10155, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "bytes": 521651, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "bytes": 314614, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "bytes": 100829, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/compositor-main-reader-production.spec.ts", + "bytes": 3876, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1170-001/module-receipt.json", + "bytes": 9476, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P1170-001/modifier-reader-batch-production.json", + "bytes": null, + "reason": "MISSING_PATH" + }, + { + "path": "tests/golden/WBV2-P1170-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P1170-001.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 0, + "bytes": 0, + "tokens": 0 + } + }, + "exitCriteria": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "nextTask": null, + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P1170-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P1170-000/manifest.json", + "parentStatus": "docs/status/WBV2-P1170-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P1170-001.md", + "tests/golden/WBV2-P1170-000/manifest.json", + "docs/status/WBV2-P1170-000.md" + ], + "machineOnly": [ + "tests/golden/WBV2/task-index.json", + "tests/golden/M15-03A/task-catalog.jsonl" + ], + "optionalByNeed": [ + "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "任务卡列出的精确协议/生产路径", + "任务卡明确命名的长期计划小节" + ], + "forbiddenByDefault": [ + "完整 CURRENT_EXECUTION_PLAN.md", + "完整 PROJECT_STATUS_AND_NEXT_WORK.md", + "全部 docs/status/*.md", + "完整 parity/WBS 计划", + "README 历史和 test-results/" + ] + }, + "parent": { + "manifest": { + "schemaVersion": 1, + "task": "WBV2-P1170-000", + "parentTask": "WBV2-P1169-001", + "status": "done", + "nextTask": "WBV2-P1170-001", + "artifactCount": 4 + }, + "statusSummary": [ + "# WBV2-P1170-000 status", + "- task: `WBV2-P1170-000`; parent: `WBV2-P1169-001`; status: `done`", + "- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed", + "- source-backed batch authorized: `AUTO_COMPOSITOR_NATIVE_NODE_READER` (8 units)", + "- dynamic inventory: `3745` units; verified `566`; unverified `3179`; bound delta `0`", + "- nextTask: `WBV2-P1170-001`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 2975, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 49, + "taskTokens": 744 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 4030, + "lines": 58, + "tokens": 1008 + }, + { + "path": "docs/tasks/WBV2-P1170-001.md", + "bytes": 2975, + "lines": 49, + "tokens": 744 + }, + { + "path": "tests/golden/WBV2-P1170-000/manifest.json", + "bytes": 1788, + "lines": 54, + "tokens": 447 + }, + { + "path": "docs/status/WBV2-P1170-000.md", + "bytes": 366, + "lines": 8, + "tokens": 92 + } + ], + "sourceTokens": 2291, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 2291, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3315, + "serializedContextTokens": 699, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index 0ac5a2558..3e8efb859 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -117,3 +117,5 @@ {"id":"WBV2-P1168-001","gapId":"AUTO_COMPOSITOR_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1168","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} {"id":"WBV2-P1169-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1169","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} {"id":"WBV2-P1169-001","gapId":"AUTO_COMPOSITOR_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1169","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} +{"id":"WBV2-P1170-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1170","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} +{"id":"WBV2-P1170-001","gapId":"AUTO_COMPOSITOR_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1170","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} diff --git a/tests/golden/WBV2/task-index.json b/tests/golden/WBV2/task-index.json index 15d75609b..435cab165 100644 --- a/tests/golden/WBV2/task-index.json +++ b/tests/golden/WBV2/task-index.json @@ -1 +1 @@ -{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1169-000/module-execution-plan.json","sha256":"6f73d1581aa630f25a7a0a853dd89281d1c9831bc2ce11b2205ae8d4709c69df"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"37795f1309a04926f5c177133a66b1e1c677cdfaaaed7b7be0ffccb624491370"},"taskCount":119,"activeTask":null,"entries":{"WBV2-P1096-000":{"line":0,"offset":0,"length":267,"previous":"WBV2-P1095-003","next":"WBV2-P1100-000"},"WBV2-P1100-000":{"line":1,"offset":267,"length":300,"previous":"WBV2-P1096-000","next":"WBV2-P1100-001"},"WBV2-P1100-001":{"line":2,"offset":567,"length":375,"previous":"WBV2-P1100-000","next":"WBV2-P1100-002"},"WBV2-P1100-002":{"line":3,"offset":942,"length":377,"previous":"WBV2-P1100-001","next":"WBV2-P1100-003"},"WBV2-P1100-003":{"line":4,"offset":1319,"length":386,"previous":"WBV2-P1100-002","next":"WBV2-P1101-000"},"WBV2-P1101-000":{"line":5,"offset":1705,"length":374,"previous":"WBV2-P1100-003","next":"WBV2-P1101-001"},"WBV2-P1101-001":{"line":6,"offset":2079,"length":382,"previous":"WBV2-P1101-000","next":"WBV2-P1101-002"},"WBV2-P1101-002":{"line":7,"offset":2461,"length":363,"previous":"WBV2-P1101-001","next":"WBV2-P1101-003"},"WBV2-P1101-003":{"line":8,"offset":2824,"length":374,"previous":"WBV2-P1101-002","next":"WBV2-P1102-000"},"WBV2-P1102-000":{"line":9,"offset":3198,"length":365,"previous":"WBV2-P1101-003","next":"WBV2-P1102-001"},"WBV2-P1102-001":{"line":10,"offset":3563,"length":371,"previous":"WBV2-P1102-000","next":"WBV2-P1103-000"},"WBV2-P1103-000":{"line":11,"offset":3934,"length":373,"previous":"WBV2-P1102-001","next":"WBV2-P1104-000"},"WBV2-P1104-000":{"line":12,"offset":4307,"length":389,"previous":"WBV2-P1103-000","next":"WBV2-P1105-000"},"WBV2-P1105-000":{"line":13,"offset":4696,"length":426,"previous":"WBV2-P1104-000","next":"WBV2-P1106-000"},"WBV2-P1106-000":{"line":14,"offset":5122,"length":366,"previous":"WBV2-P1105-000","next":"WBV2-P1107-000"},"WBV2-P1107-000":{"line":15,"offset":5488,"length":373,"previous":"WBV2-P1106-000","next":"WBV2-P1108-000"},"WBV2-P1108-000":{"line":16,"offset":5861,"length":385,"previous":"WBV2-P1107-000","next":"WBV2-P1109-000"},"WBV2-P1109-000":{"line":17,"offset":6246,"length":397,"previous":"WBV2-P1108-000","next":"WBV2-P1110-000"},"WBV2-P1110-000":{"line":18,"offset":6643,"length":394,"previous":"WBV2-P1109-000","next":"WBV2-P1111-000"},"WBV2-P1111-000":{"line":19,"offset":7037,"length":384,"previous":"WBV2-P1110-000","next":"WBV2-P1112-000"},"WBV2-P1112-000":{"line":20,"offset":7421,"length":397,"previous":"WBV2-P1111-000","next":"WBV2-P1113-000"},"WBV2-P1113-000":{"line":21,"offset":7818,"length":393,"previous":"WBV2-P1112-000","next":"WBV2-P1114-000"},"WBV2-P1114-000":{"line":22,"offset":8211,"length":384,"previous":"WBV2-P1113-000","next":"WBV2-P1115-000"},"WBV2-P1115-000":{"line":23,"offset":8595,"length":388,"previous":"WBV2-P1114-000","next":"WBV2-P1116-000"},"WBV2-P1116-000":{"line":24,"offset":8983,"length":388,"previous":"WBV2-P1115-000","next":"WBV2-P1117-000"},"WBV2-P1117-000":{"line":25,"offset":9371,"length":413,"previous":"WBV2-P1116-000","next":"WBV2-P1118-000"},"WBV2-P1118-000":{"line":26,"offset":9784,"length":409,"previous":"WBV2-P1117-000","next":"WBV2-P1119-000"},"WBV2-P1119-000":{"line":27,"offset":10193,"length":379,"previous":"WBV2-P1118-000","next":"WBV2-P1120-000"},"WBV2-P1120-000":{"line":28,"offset":10572,"length":392,"previous":"WBV2-P1119-000","next":"WBV2-P1121-000"},"WBV2-P1121-000":{"line":29,"offset":10964,"length":375,"previous":"WBV2-P1120-000","next":"WBV2-P1122-000"},"WBV2-P1122-000":{"line":30,"offset":11339,"length":385,"previous":"WBV2-P1121-000","next":"WBV2-P1123-000"},"WBV2-P1123-000":{"line":31,"offset":11724,"length":385,"previous":"WBV2-P1122-000","next":"WBV2-P1124-000"},"WBV2-P1124-000":{"line":32,"offset":12109,"length":431,"previous":"WBV2-P1123-000","next":"WBV2-P1125-000"},"WBV2-P1125-000":{"line":33,"offset":12540,"length":406,"previous":"WBV2-P1124-000","next":"WBV2-P1126-000"},"WBV2-P1126-000":{"line":34,"offset":12946,"length":397,"previous":"WBV2-P1125-000","next":"WBV2-P1127-000"},"WBV2-P1127-000":{"line":35,"offset":13343,"length":406,"previous":"WBV2-P1126-000","next":"WBV2-P1128-000"},"WBV2-P1128-000":{"line":36,"offset":13749,"length":406,"previous":"WBV2-P1127-000","next":"WBV2-P1129-000"},"WBV2-P1129-000":{"line":37,"offset":14155,"length":331,"previous":"WBV2-P1128-000","next":"WBV2-P1129-001"},"WBV2-P1129-001":{"line":38,"offset":14486,"length":393,"previous":"WBV2-P1129-000","next":"WBV2-P1130-000"},"WBV2-P1130-000":{"line":39,"offset":14879,"length":348,"previous":"WBV2-P1129-001","next":"WBV2-P1130-001"},"WBV2-P1130-001":{"line":40,"offset":15227,"length":387,"previous":"WBV2-P1130-000","next":"WBV2-P1131-000"},"WBV2-P1131-000":{"line":41,"offset":15614,"length":349,"previous":"WBV2-P1130-001","next":"WBV2-P1131-001"},"WBV2-P1131-001":{"line":42,"offset":15963,"length":383,"previous":"WBV2-P1131-000","next":"WBV2-P1132-000"},"WBV2-P1132-000":{"line":43,"offset":16346,"length":345,"previous":"WBV2-P1131-001","next":"WBV2-P1132-001"},"WBV2-P1132-001":{"line":44,"offset":16691,"length":380,"previous":"WBV2-P1132-000","next":"WBV2-P1133-000"},"WBV2-P1133-000":{"line":45,"offset":17071,"length":346,"previous":"WBV2-P1132-001","next":"WBV2-P1133-001"},"WBV2-P1133-001":{"line":46,"offset":17417,"length":387,"previous":"WBV2-P1133-000","next":"WBV2-P1134-000"},"WBV2-P1134-000":{"line":47,"offset":17804,"length":353,"previous":"WBV2-P1133-001","next":"WBV2-P1134-001"},"WBV2-P1134-001":{"line":48,"offset":18157,"length":392,"previous":"WBV2-P1134-000","next":"WBV2-P1135-000"},"WBV2-P1135-000":{"line":49,"offset":18549,"length":339,"previous":"WBV2-P1134-001","next":"WBV2-P1135-001"},"WBV2-P1135-001":{"line":50,"offset":18888,"length":385,"previous":"WBV2-P1135-000","next":"WBV2-P1136-000"},"WBV2-P1136-000":{"line":51,"offset":19273,"length":349,"previous":"WBV2-P1135-001","next":"WBV2-P1136-001"},"WBV2-P1136-001":{"line":52,"offset":19622,"length":391,"previous":"WBV2-P1136-000","next":"WBV2-P1137-000"},"WBV2-P1137-000":{"line":53,"offset":20013,"length":354,"previous":"WBV2-P1136-001","next":"WBV2-P1137-001"},"WBV2-P1137-001":{"line":54,"offset":20367,"length":393,"previous":"WBV2-P1137-000","next":"WBV2-P1138-000"},"WBV2-P1138-000":{"line":55,"offset":20760,"length":340,"previous":"WBV2-P1137-001","next":"WBV2-P1138-001"},"WBV2-P1138-001":{"line":56,"offset":21100,"length":388,"previous":"WBV2-P1138-000","next":"WBV2-P1139-000"},"WBV2-P1139-000":{"line":57,"offset":21488,"length":344,"previous":"WBV2-P1138-001","next":"WBV2-P1139-001"},"WBV2-P1139-001":{"line":58,"offset":21832,"length":393,"previous":"WBV2-P1139-000","next":"WBV2-P1140-000"},"WBV2-P1140-000":{"line":59,"offset":22225,"length":362,"previous":"WBV2-P1139-001","next":"WBV2-P1140-001"},"WBV2-P1140-001":{"line":60,"offset":22587,"length":382,"previous":"WBV2-P1140-000","next":"WBV2-P1141-000"},"WBV2-P1141-000":{"line":61,"offset":22969,"length":368,"previous":"WBV2-P1140-001","next":"WBV2-P1141-001"},"WBV2-P1141-001":{"line":62,"offset":23337,"length":389,"previous":"WBV2-P1141-000","next":"WBV2-P1142-000"},"WBV2-P1142-000":{"line":63,"offset":23726,"length":364,"previous":"WBV2-P1141-001","next":"WBV2-P1142-001"},"WBV2-P1142-001":{"line":64,"offset":24090,"length":383,"previous":"WBV2-P1142-000","next":"WBV2-P1143-000"},"WBV2-P1143-000":{"line":65,"offset":24473,"length":369,"previous":"WBV2-P1142-001","next":"WBV2-P1143-001"},"WBV2-P1143-001":{"line":66,"offset":24842,"length":385,"previous":"WBV2-P1143-000","next":"WBV2-P1144-000"},"WBV2-P1144-000":{"line":67,"offset":25227,"length":351,"previous":"WBV2-P1143-001","next":"WBV2-P1144-001"},"WBV2-P1144-001":{"line":68,"offset":25578,"length":376,"previous":"WBV2-P1144-000","next":"WBV2-P1145-000"},"WBV2-P1145-000":{"line":69,"offset":25954,"length":371,"previous":"WBV2-P1144-001","next":"WBV2-P1145-001"},"WBV2-P1145-001":{"line":70,"offset":26325,"length":386,"previous":"WBV2-P1145-000","next":"WBV2-P1146-000"},"WBV2-P1146-000":{"line":71,"offset":26711,"length":303,"previous":"WBV2-P1145-001","next":"WBV2-P1146-001"},"WBV2-P1146-001":{"line":72,"offset":27014,"length":356,"previous":"WBV2-P1146-000","next":"WBV2-P1147-000"},"WBV2-P1147-000":{"line":73,"offset":27370,"length":303,"previous":"WBV2-P1146-001","next":"WBV2-P1147-001"},"WBV2-P1147-001":{"line":74,"offset":27673,"length":360,"previous":"WBV2-P1147-000","next":"WBV2-P1148-000"},"WBV2-P1148-000":{"line":75,"offset":28033,"length":303,"previous":"WBV2-P1147-001","next":"WBV2-P1148-001"},"WBV2-P1148-001":{"line":76,"offset":28336,"length":362,"previous":"WBV2-P1148-000","next":"WBV2-P1149-000"},"WBV2-P1149-000":{"line":77,"offset":28698,"length":303,"previous":"WBV2-P1148-001","next":"WBV2-P1149-001"},"WBV2-P1149-001":{"line":78,"offset":29001,"length":361,"previous":"WBV2-P1149-000","next":"WBV2-P1150-000"},"WBV2-P1150-000":{"line":79,"offset":29362,"length":303,"previous":"WBV2-P1149-001","next":"WBV2-P1150-001"},"WBV2-P1150-001":{"line":80,"offset":29665,"length":361,"previous":"WBV2-P1150-000","next":"WBV2-P1151-000"},"WBV2-P1151-000":{"line":81,"offset":30026,"length":303,"previous":"WBV2-P1150-001","next":"WBV2-P1151-001"},"WBV2-P1151-001":{"line":82,"offset":30329,"length":369,"previous":"WBV2-P1151-000","next":"WBV2-P1152-000"},"WBV2-P1152-000":{"line":83,"offset":30698,"length":303,"previous":"WBV2-P1151-001","next":"WBV2-P1152-001"},"WBV2-P1152-001":{"line":84,"offset":31001,"length":360,"previous":"WBV2-P1152-000","next":"WBV2-P1153-000"},"WBV2-P1153-000":{"line":85,"offset":31361,"length":303,"previous":"WBV2-P1152-001","next":"WBV2-P1153-001"},"WBV2-P1153-001":{"line":86,"offset":31664,"length":367,"previous":"WBV2-P1153-000","next":"WBV2-P1154-000"},"WBV2-P1154-000":{"line":87,"offset":32031,"length":303,"previous":"WBV2-P1153-001","next":"WBV2-P1154-001"},"WBV2-P1154-001":{"line":88,"offset":32334,"length":365,"previous":"WBV2-P1154-000","next":"WBV2-P1155-000"},"WBV2-P1155-000":{"line":89,"offset":32699,"length":303,"previous":"WBV2-P1154-001","next":"WBV2-P1155-001"},"WBV2-P1155-001":{"line":90,"offset":33002,"length":360,"previous":"WBV2-P1155-000","next":"WBV2-P1156-000"},"WBV2-P1156-000":{"line":91,"offset":33362,"length":303,"previous":"WBV2-P1155-001","next":"WBV2-P1156-001"},"WBV2-P1156-001":{"line":92,"offset":33665,"length":365,"previous":"WBV2-P1156-000","next":"WBV2-P1157-000"},"WBV2-P1157-000":{"line":93,"offset":34030,"length":303,"previous":"WBV2-P1156-001","next":"WBV2-P1157-001"},"WBV2-P1157-001":{"line":94,"offset":34333,"length":364,"previous":"WBV2-P1157-000","next":"WBV2-P1158-000"},"WBV2-P1158-000":{"line":95,"offset":34697,"length":303,"previous":"WBV2-P1157-001","next":"WBV2-P1158-001"},"WBV2-P1158-001":{"line":96,"offset":35000,"length":357,"previous":"WBV2-P1158-000","next":"WBV2-P1159-000"},"WBV2-P1159-000":{"line":97,"offset":35357,"length":303,"previous":"WBV2-P1158-001","next":"WBV2-P1159-001"},"WBV2-P1159-001":{"line":98,"offset":35660,"length":368,"previous":"WBV2-P1159-000","next":"WBV2-P1160-000"},"WBV2-P1160-000":{"line":99,"offset":36028,"length":303,"previous":"WBV2-P1159-001","next":"WBV2-P1160-001"},"WBV2-P1160-001":{"line":100,"offset":36331,"length":365,"previous":"WBV2-P1160-000","next":"WBV2-P1161-000"},"WBV2-P1161-000":{"line":101,"offset":36696,"length":303,"previous":"WBV2-P1160-001","next":"WBV2-P1161-001"},"WBV2-P1161-001":{"line":102,"offset":36999,"length":372,"previous":"WBV2-P1161-000","next":"WBV2-P1162-000"},"WBV2-P1162-000":{"line":103,"offset":37371,"length":303,"previous":"WBV2-P1161-001","next":"WBV2-P1162-001"},"WBV2-P1162-001":{"line":104,"offset":37674,"length":365,"previous":"WBV2-P1162-000","next":"WBV2-P1163-000"},"WBV2-P1163-000":{"line":105,"offset":38039,"length":303,"previous":"WBV2-P1162-001","next":"WBV2-P1163-001"},"WBV2-P1163-001":{"line":106,"offset":38342,"length":360,"previous":"WBV2-P1163-000","next":"WBV2-P1164-000"},"WBV2-P1164-000":{"line":107,"offset":38702,"length":303,"previous":"WBV2-P1163-001","next":"WBV2-P1164-001"},"WBV2-P1164-001":{"line":108,"offset":39005,"length":360,"previous":"WBV2-P1164-000","next":"WBV2-P1165-000"},"WBV2-P1165-000":{"line":109,"offset":39365,"length":303,"previous":"WBV2-P1164-001","next":"WBV2-P1165-001"},"WBV2-P1165-001":{"line":110,"offset":39668,"length":366,"previous":"WBV2-P1165-000","next":"WBV2-P1166-000"},"WBV2-P1166-000":{"line":111,"offset":40034,"length":303,"previous":"WBV2-P1165-001","next":"WBV2-P1166-001"},"WBV2-P1166-001":{"line":112,"offset":40337,"length":366,"previous":"WBV2-P1166-000","next":"WBV2-P1167-000"},"WBV2-P1167-000":{"line":113,"offset":40703,"length":303,"previous":"WBV2-P1166-001","next":"WBV2-P1167-001"},"WBV2-P1167-001":{"line":114,"offset":41006,"length":366,"previous":"WBV2-P1167-000","next":"WBV2-P1168-000"},"WBV2-P1168-000":{"line":115,"offset":41372,"length":303,"previous":"WBV2-P1167-001","next":"WBV2-P1168-001"},"WBV2-P1168-001":{"line":116,"offset":41675,"length":366,"previous":"WBV2-P1168-000","next":"WBV2-P1169-000"},"WBV2-P1169-000":{"line":117,"offset":42041,"length":303,"previous":"WBV2-P1168-001","next":"WBV2-P1169-001"},"WBV2-P1169-001":{"line":118,"offset":42344,"length":366,"previous":"WBV2-P1169-000","next":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1170-000/module-execution-plan.json","sha256":"c0ad17f6f2a7c37c5c46421fe9d99d5a6d4ec77ce01565ec6efdf75c9fb16027"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"3c415c42e222f9ea15a9701d77f6c169dcab8d78181d35473286bfd9b0259cdd"},"taskCount":121,"activeTask":null,"entries":{"WBV2-P1096-000":{"line":0,"offset":0,"length":267,"previous":"WBV2-P1095-003","next":"WBV2-P1100-000"},"WBV2-P1100-000":{"line":1,"offset":267,"length":300,"previous":"WBV2-P1096-000","next":"WBV2-P1100-001"},"WBV2-P1100-001":{"line":2,"offset":567,"length":375,"previous":"WBV2-P1100-000","next":"WBV2-P1100-002"},"WBV2-P1100-002":{"line":3,"offset":942,"length":377,"previous":"WBV2-P1100-001","next":"WBV2-P1100-003"},"WBV2-P1100-003":{"line":4,"offset":1319,"length":386,"previous":"WBV2-P1100-002","next":"WBV2-P1101-000"},"WBV2-P1101-000":{"line":5,"offset":1705,"length":374,"previous":"WBV2-P1100-003","next":"WBV2-P1101-001"},"WBV2-P1101-001":{"line":6,"offset":2079,"length":382,"previous":"WBV2-P1101-000","next":"WBV2-P1101-002"},"WBV2-P1101-002":{"line":7,"offset":2461,"length":363,"previous":"WBV2-P1101-001","next":"WBV2-P1101-003"},"WBV2-P1101-003":{"line":8,"offset":2824,"length":374,"previous":"WBV2-P1101-002","next":"WBV2-P1102-000"},"WBV2-P1102-000":{"line":9,"offset":3198,"length":365,"previous":"WBV2-P1101-003","next":"WBV2-P1102-001"},"WBV2-P1102-001":{"line":10,"offset":3563,"length":371,"previous":"WBV2-P1102-000","next":"WBV2-P1103-000"},"WBV2-P1103-000":{"line":11,"offset":3934,"length":373,"previous":"WBV2-P1102-001","next":"WBV2-P1104-000"},"WBV2-P1104-000":{"line":12,"offset":4307,"length":389,"previous":"WBV2-P1103-000","next":"WBV2-P1105-000"},"WBV2-P1105-000":{"line":13,"offset":4696,"length":426,"previous":"WBV2-P1104-000","next":"WBV2-P1106-000"},"WBV2-P1106-000":{"line":14,"offset":5122,"length":366,"previous":"WBV2-P1105-000","next":"WBV2-P1107-000"},"WBV2-P1107-000":{"line":15,"offset":5488,"length":373,"previous":"WBV2-P1106-000","next":"WBV2-P1108-000"},"WBV2-P1108-000":{"line":16,"offset":5861,"length":385,"previous":"WBV2-P1107-000","next":"WBV2-P1109-000"},"WBV2-P1109-000":{"line":17,"offset":6246,"length":397,"previous":"WBV2-P1108-000","next":"WBV2-P1110-000"},"WBV2-P1110-000":{"line":18,"offset":6643,"length":394,"previous":"WBV2-P1109-000","next":"WBV2-P1111-000"},"WBV2-P1111-000":{"line":19,"offset":7037,"length":384,"previous":"WBV2-P1110-000","next":"WBV2-P1112-000"},"WBV2-P1112-000":{"line":20,"offset":7421,"length":397,"previous":"WBV2-P1111-000","next":"WBV2-P1113-000"},"WBV2-P1113-000":{"line":21,"offset":7818,"length":393,"previous":"WBV2-P1112-000","next":"WBV2-P1114-000"},"WBV2-P1114-000":{"line":22,"offset":8211,"length":384,"previous":"WBV2-P1113-000","next":"WBV2-P1115-000"},"WBV2-P1115-000":{"line":23,"offset":8595,"length":388,"previous":"WBV2-P1114-000","next":"WBV2-P1116-000"},"WBV2-P1116-000":{"line":24,"offset":8983,"length":388,"previous":"WBV2-P1115-000","next":"WBV2-P1117-000"},"WBV2-P1117-000":{"line":25,"offset":9371,"length":413,"previous":"WBV2-P1116-000","next":"WBV2-P1118-000"},"WBV2-P1118-000":{"line":26,"offset":9784,"length":409,"previous":"WBV2-P1117-000","next":"WBV2-P1119-000"},"WBV2-P1119-000":{"line":27,"offset":10193,"length":379,"previous":"WBV2-P1118-000","next":"WBV2-P1120-000"},"WBV2-P1120-000":{"line":28,"offset":10572,"length":392,"previous":"WBV2-P1119-000","next":"WBV2-P1121-000"},"WBV2-P1121-000":{"line":29,"offset":10964,"length":375,"previous":"WBV2-P1120-000","next":"WBV2-P1122-000"},"WBV2-P1122-000":{"line":30,"offset":11339,"length":385,"previous":"WBV2-P1121-000","next":"WBV2-P1123-000"},"WBV2-P1123-000":{"line":31,"offset":11724,"length":385,"previous":"WBV2-P1122-000","next":"WBV2-P1124-000"},"WBV2-P1124-000":{"line":32,"offset":12109,"length":431,"previous":"WBV2-P1123-000","next":"WBV2-P1125-000"},"WBV2-P1125-000":{"line":33,"offset":12540,"length":406,"previous":"WBV2-P1124-000","next":"WBV2-P1126-000"},"WBV2-P1126-000":{"line":34,"offset":12946,"length":397,"previous":"WBV2-P1125-000","next":"WBV2-P1127-000"},"WBV2-P1127-000":{"line":35,"offset":13343,"length":406,"previous":"WBV2-P1126-000","next":"WBV2-P1128-000"},"WBV2-P1128-000":{"line":36,"offset":13749,"length":406,"previous":"WBV2-P1127-000","next":"WBV2-P1129-000"},"WBV2-P1129-000":{"line":37,"offset":14155,"length":331,"previous":"WBV2-P1128-000","next":"WBV2-P1129-001"},"WBV2-P1129-001":{"line":38,"offset":14486,"length":393,"previous":"WBV2-P1129-000","next":"WBV2-P1130-000"},"WBV2-P1130-000":{"line":39,"offset":14879,"length":348,"previous":"WBV2-P1129-001","next":"WBV2-P1130-001"},"WBV2-P1130-001":{"line":40,"offset":15227,"length":387,"previous":"WBV2-P1130-000","next":"WBV2-P1131-000"},"WBV2-P1131-000":{"line":41,"offset":15614,"length":349,"previous":"WBV2-P1130-001","next":"WBV2-P1131-001"},"WBV2-P1131-001":{"line":42,"offset":15963,"length":383,"previous":"WBV2-P1131-000","next":"WBV2-P1132-000"},"WBV2-P1132-000":{"line":43,"offset":16346,"length":345,"previous":"WBV2-P1131-001","next":"WBV2-P1132-001"},"WBV2-P1132-001":{"line":44,"offset":16691,"length":380,"previous":"WBV2-P1132-000","next":"WBV2-P1133-000"},"WBV2-P1133-000":{"line":45,"offset":17071,"length":346,"previous":"WBV2-P1132-001","next":"WBV2-P1133-001"},"WBV2-P1133-001":{"line":46,"offset":17417,"length":387,"previous":"WBV2-P1133-000","next":"WBV2-P1134-000"},"WBV2-P1134-000":{"line":47,"offset":17804,"length":353,"previous":"WBV2-P1133-001","next":"WBV2-P1134-001"},"WBV2-P1134-001":{"line":48,"offset":18157,"length":392,"previous":"WBV2-P1134-000","next":"WBV2-P1135-000"},"WBV2-P1135-000":{"line":49,"offset":18549,"length":339,"previous":"WBV2-P1134-001","next":"WBV2-P1135-001"},"WBV2-P1135-001":{"line":50,"offset":18888,"length":385,"previous":"WBV2-P1135-000","next":"WBV2-P1136-000"},"WBV2-P1136-000":{"line":51,"offset":19273,"length":349,"previous":"WBV2-P1135-001","next":"WBV2-P1136-001"},"WBV2-P1136-001":{"line":52,"offset":19622,"length":391,"previous":"WBV2-P1136-000","next":"WBV2-P1137-000"},"WBV2-P1137-000":{"line":53,"offset":20013,"length":354,"previous":"WBV2-P1136-001","next":"WBV2-P1137-001"},"WBV2-P1137-001":{"line":54,"offset":20367,"length":393,"previous":"WBV2-P1137-000","next":"WBV2-P1138-000"},"WBV2-P1138-000":{"line":55,"offset":20760,"length":340,"previous":"WBV2-P1137-001","next":"WBV2-P1138-001"},"WBV2-P1138-001":{"line":56,"offset":21100,"length":388,"previous":"WBV2-P1138-000","next":"WBV2-P1139-000"},"WBV2-P1139-000":{"line":57,"offset":21488,"length":344,"previous":"WBV2-P1138-001","next":"WBV2-P1139-001"},"WBV2-P1139-001":{"line":58,"offset":21832,"length":393,"previous":"WBV2-P1139-000","next":"WBV2-P1140-000"},"WBV2-P1140-000":{"line":59,"offset":22225,"length":362,"previous":"WBV2-P1139-001","next":"WBV2-P1140-001"},"WBV2-P1140-001":{"line":60,"offset":22587,"length":382,"previous":"WBV2-P1140-000","next":"WBV2-P1141-000"},"WBV2-P1141-000":{"line":61,"offset":22969,"length":368,"previous":"WBV2-P1140-001","next":"WBV2-P1141-001"},"WBV2-P1141-001":{"line":62,"offset":23337,"length":389,"previous":"WBV2-P1141-000","next":"WBV2-P1142-000"},"WBV2-P1142-000":{"line":63,"offset":23726,"length":364,"previous":"WBV2-P1141-001","next":"WBV2-P1142-001"},"WBV2-P1142-001":{"line":64,"offset":24090,"length":383,"previous":"WBV2-P1142-000","next":"WBV2-P1143-000"},"WBV2-P1143-000":{"line":65,"offset":24473,"length":369,"previous":"WBV2-P1142-001","next":"WBV2-P1143-001"},"WBV2-P1143-001":{"line":66,"offset":24842,"length":385,"previous":"WBV2-P1143-000","next":"WBV2-P1144-000"},"WBV2-P1144-000":{"line":67,"offset":25227,"length":351,"previous":"WBV2-P1143-001","next":"WBV2-P1144-001"},"WBV2-P1144-001":{"line":68,"offset":25578,"length":376,"previous":"WBV2-P1144-000","next":"WBV2-P1145-000"},"WBV2-P1145-000":{"line":69,"offset":25954,"length":371,"previous":"WBV2-P1144-001","next":"WBV2-P1145-001"},"WBV2-P1145-001":{"line":70,"offset":26325,"length":386,"previous":"WBV2-P1145-000","next":"WBV2-P1146-000"},"WBV2-P1146-000":{"line":71,"offset":26711,"length":303,"previous":"WBV2-P1145-001","next":"WBV2-P1146-001"},"WBV2-P1146-001":{"line":72,"offset":27014,"length":356,"previous":"WBV2-P1146-000","next":"WBV2-P1147-000"},"WBV2-P1147-000":{"line":73,"offset":27370,"length":303,"previous":"WBV2-P1146-001","next":"WBV2-P1147-001"},"WBV2-P1147-001":{"line":74,"offset":27673,"length":360,"previous":"WBV2-P1147-000","next":"WBV2-P1148-000"},"WBV2-P1148-000":{"line":75,"offset":28033,"length":303,"previous":"WBV2-P1147-001","next":"WBV2-P1148-001"},"WBV2-P1148-001":{"line":76,"offset":28336,"length":362,"previous":"WBV2-P1148-000","next":"WBV2-P1149-000"},"WBV2-P1149-000":{"line":77,"offset":28698,"length":303,"previous":"WBV2-P1148-001","next":"WBV2-P1149-001"},"WBV2-P1149-001":{"line":78,"offset":29001,"length":361,"previous":"WBV2-P1149-000","next":"WBV2-P1150-000"},"WBV2-P1150-000":{"line":79,"offset":29362,"length":303,"previous":"WBV2-P1149-001","next":"WBV2-P1150-001"},"WBV2-P1150-001":{"line":80,"offset":29665,"length":361,"previous":"WBV2-P1150-000","next":"WBV2-P1151-000"},"WBV2-P1151-000":{"line":81,"offset":30026,"length":303,"previous":"WBV2-P1150-001","next":"WBV2-P1151-001"},"WBV2-P1151-001":{"line":82,"offset":30329,"length":369,"previous":"WBV2-P1151-000","next":"WBV2-P1152-000"},"WBV2-P1152-000":{"line":83,"offset":30698,"length":303,"previous":"WBV2-P1151-001","next":"WBV2-P1152-001"},"WBV2-P1152-001":{"line":84,"offset":31001,"length":360,"previous":"WBV2-P1152-000","next":"WBV2-P1153-000"},"WBV2-P1153-000":{"line":85,"offset":31361,"length":303,"previous":"WBV2-P1152-001","next":"WBV2-P1153-001"},"WBV2-P1153-001":{"line":86,"offset":31664,"length":367,"previous":"WBV2-P1153-000","next":"WBV2-P1154-000"},"WBV2-P1154-000":{"line":87,"offset":32031,"length":303,"previous":"WBV2-P1153-001","next":"WBV2-P1154-001"},"WBV2-P1154-001":{"line":88,"offset":32334,"length":365,"previous":"WBV2-P1154-000","next":"WBV2-P1155-000"},"WBV2-P1155-000":{"line":89,"offset":32699,"length":303,"previous":"WBV2-P1154-001","next":"WBV2-P1155-001"},"WBV2-P1155-001":{"line":90,"offset":33002,"length":360,"previous":"WBV2-P1155-000","next":"WBV2-P1156-000"},"WBV2-P1156-000":{"line":91,"offset":33362,"length":303,"previous":"WBV2-P1155-001","next":"WBV2-P1156-001"},"WBV2-P1156-001":{"line":92,"offset":33665,"length":365,"previous":"WBV2-P1156-000","next":"WBV2-P1157-000"},"WBV2-P1157-000":{"line":93,"offset":34030,"length":303,"previous":"WBV2-P1156-001","next":"WBV2-P1157-001"},"WBV2-P1157-001":{"line":94,"offset":34333,"length":364,"previous":"WBV2-P1157-000","next":"WBV2-P1158-000"},"WBV2-P1158-000":{"line":95,"offset":34697,"length":303,"previous":"WBV2-P1157-001","next":"WBV2-P1158-001"},"WBV2-P1158-001":{"line":96,"offset":35000,"length":357,"previous":"WBV2-P1158-000","next":"WBV2-P1159-000"},"WBV2-P1159-000":{"line":97,"offset":35357,"length":303,"previous":"WBV2-P1158-001","next":"WBV2-P1159-001"},"WBV2-P1159-001":{"line":98,"offset":35660,"length":368,"previous":"WBV2-P1159-000","next":"WBV2-P1160-000"},"WBV2-P1160-000":{"line":99,"offset":36028,"length":303,"previous":"WBV2-P1159-001","next":"WBV2-P1160-001"},"WBV2-P1160-001":{"line":100,"offset":36331,"length":365,"previous":"WBV2-P1160-000","next":"WBV2-P1161-000"},"WBV2-P1161-000":{"line":101,"offset":36696,"length":303,"previous":"WBV2-P1160-001","next":"WBV2-P1161-001"},"WBV2-P1161-001":{"line":102,"offset":36999,"length":372,"previous":"WBV2-P1161-000","next":"WBV2-P1162-000"},"WBV2-P1162-000":{"line":103,"offset":37371,"length":303,"previous":"WBV2-P1161-001","next":"WBV2-P1162-001"},"WBV2-P1162-001":{"line":104,"offset":37674,"length":365,"previous":"WBV2-P1162-000","next":"WBV2-P1163-000"},"WBV2-P1163-000":{"line":105,"offset":38039,"length":303,"previous":"WBV2-P1162-001","next":"WBV2-P1163-001"},"WBV2-P1163-001":{"line":106,"offset":38342,"length":360,"previous":"WBV2-P1163-000","next":"WBV2-P1164-000"},"WBV2-P1164-000":{"line":107,"offset":38702,"length":303,"previous":"WBV2-P1163-001","next":"WBV2-P1164-001"},"WBV2-P1164-001":{"line":108,"offset":39005,"length":360,"previous":"WBV2-P1164-000","next":"WBV2-P1165-000"},"WBV2-P1165-000":{"line":109,"offset":39365,"length":303,"previous":"WBV2-P1164-001","next":"WBV2-P1165-001"},"WBV2-P1165-001":{"line":110,"offset":39668,"length":366,"previous":"WBV2-P1165-000","next":"WBV2-P1166-000"},"WBV2-P1166-000":{"line":111,"offset":40034,"length":303,"previous":"WBV2-P1165-001","next":"WBV2-P1166-001"},"WBV2-P1166-001":{"line":112,"offset":40337,"length":366,"previous":"WBV2-P1166-000","next":"WBV2-P1167-000"},"WBV2-P1167-000":{"line":113,"offset":40703,"length":303,"previous":"WBV2-P1166-001","next":"WBV2-P1167-001"},"WBV2-P1167-001":{"line":114,"offset":41006,"length":366,"previous":"WBV2-P1167-000","next":"WBV2-P1168-000"},"WBV2-P1168-000":{"line":115,"offset":41372,"length":303,"previous":"WBV2-P1167-001","next":"WBV2-P1168-001"},"WBV2-P1168-001":{"line":116,"offset":41675,"length":366,"previous":"WBV2-P1168-000","next":"WBV2-P1169-000"},"WBV2-P1169-000":{"line":117,"offset":42041,"length":303,"previous":"WBV2-P1168-001","next":"WBV2-P1169-001"},"WBV2-P1169-001":{"line":118,"offset":42344,"length":366,"previous":"WBV2-P1169-000","next":"WBV2-P1170-000"},"WBV2-P1170-000":{"line":119,"offset":42710,"length":303,"previous":"WBV2-P1169-001","next":"WBV2-P1170-001"},"WBV2-P1170-001":{"line":120,"offset":43013,"length":366,"previous":"WBV2-P1170-000","next":null}}}