From 65db4197351eb6f54f154c0ccaf1e0892dc58983 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Fri, 4 Sep 2026 08:02:06 +0800 Subject: [PATCH] chore(web): continuous handoff WBV2-P1215-001 --- docs/EXECUTION_QUEUE.md | 6 +- docs/status/WBV2-P1215-001.md | 9 + docs/tasks/WBV2-P1215-001.md | 48 + .../wbv2-geometry-0a8d3bb55b10e188.blend | Bin 0 -> 97900 bytes tests/golden/WBV2-P1215-000/manifest.json | 50 + .../WBV2-P1215-000/module-execution-plan.json | 18382 ++++++++++++++++ .../geometry-node-reader-production.json | 43 + tests/golden/WBV2-P1215-001/manifest.json | 116 + .../golden/WBV2-P1215-001/module-receipt.json | 154 + tests/golden/WBV2-P1215-001/module-run.log | 49 + tests/golden/WBV2-P1215-001/task-context.json | 217 + tests/golden/WBV2/task-catalog.jsonl | 2 + tests/golden/WBV2/task-index.json | 2 +- 13 files changed, 19074 insertions(+), 4 deletions(-) create mode 100644 docs/status/WBV2-P1215-001.md create mode 100644 docs/tasks/WBV2-P1215-001.md create mode 100644 tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend create mode 100644 tests/golden/WBV2-P1215-000/manifest.json create mode 100644 tests/golden/WBV2-P1215-000/module-execution-plan.json create mode 100644 tests/golden/WBV2-P1215-001/geometry-node-reader-production.json create mode 100644 tests/golden/WBV2-P1215-001/manifest.json create mode 100644 tests/golden/WBV2-P1215-001/module-receipt.json create mode 100644 tests/golden/WBV2-P1215-001/module-run.log create mode 100644 tests/golden/WBV2-P1215-001/task-context.json diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index 0c0bb0a60..8bb2d1804 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -15,9 +15,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P1214-001` | -| parent manifest | `tests/golden/WBV2-P1214-000/manifest.json` | -| 任务卡 | [`tasks/WBV2-P1214-001.md`](tasks/WBV2-P1214-001.md) | +| 当前任务 | `WBV2-P1215-001` | +| parent manifest | `tests/golden/WBV2-P1215-000/manifest.json` | +| 任务卡 | [`tasks/WBV2-P1215-001.md`](tasks/WBV2-P1215-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-P1215-001.md b/docs/status/WBV2-P1215-001.md new file mode 100644 index 000000000..d90592adc --- /dev/null +++ b/docs/status/WBV2-P1215-001.md @@ -0,0 +1,9 @@ +# WBV2-P1215-001 status + +- task: `WBV2-P1215-001`; module: `AUTO_GEOMETRY_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 `753`; unverified `2992`; planning estimate `5200` (non-binding); this-segment binding delta: `5` +- historical 6900-entry inventory remains read-only; full-family parity: `false` +- nextTask: `NONE` diff --git a/docs/tasks/WBV2-P1215-001.md b/docs/tasks/WBV2-P1215-001.md new file mode 100644 index 000000000..6c0e82bff --- /dev/null +++ b/docs/tasks/WBV2-P1215-001.md @@ -0,0 +1,48 @@ +# WBV2-P1215-001: verify auto-generated native geometry node reader batch + +- task: WBV2-P1215-001 +- parent: WBV2-P1215-000 +- status: in_progress +- gap: capability:AUTO_GEOMETRY_NATIVE_NODE_READER +- ownerFamily: NODES +- targetImplementationClass: LOCAL_EXACT +- batchId: WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188 +- selectedRecordIds: ["node:FunctionNodeProjectPoint","node:FunctionNodeQuaternionToRotation","node:FunctionNodeReplaceString","node:FunctionNodeReverseString","node:FunctionNodeRotateRotation"] +- commandBudget: max=48; read/exploration max=16 +- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1215-001 --write` + +## 目标 + +以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 FunctionNodeProjectPoint, FunctionNodeQuaternionToRotation, FunctionNodeReplaceString, FunctionNodeReverseString, FunctionNodeRotateRotation 的真实 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-geometry-0a8d3bb55b10e188.blend` +- Chromium test: `web/tests/e2e/geometry-node-main-reader.spec.ts` +- Selected modifier units: `modifier-source:FunctionNodeProjectPoint`, `modifier-source:FunctionNodeQuaternionToRotation`, `modifier-source:FunctionNodeReplaceString`, `modifier-source:FunctionNodeReverseString`, `modifier-source:FunctionNodeRotateRotation` +- 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-P1215-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-P1215-001/module-receipt.json` +- Aggregate production evidence: `tests/golden/WBV2-P1215-001/modifier-reader-batch-production.json` +- Manifest: `tests/golden/WBV2-P1215-001/manifest.json` +- Status: `docs/status/WBV2-P1215-001.md` +- Rollback: restore WBV2-P1215-000 as queue parent without rewriting prior evidence. diff --git a/tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend b/tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend new file mode 100644 index 0000000000000000000000000000000000000000..47bd9a20c1eaa40270378311089ec76980563232 GIT binary patch literal 97900 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

lH`FO7WyG&PZVdS9~G7FpHE>;kP>k5G( zM<(7B4*CmBf(jIVz+bAC0&Xsk;Uhb&VvBqR;K?}}(kSe4**hhLO8S#%|Df|7>rA{d zBV-Km0;}e_1T2bIHg(4UI$2J1f&j!Fb(}Je`gA}Pl$fWVdEk3IN$!V3vCdqA+d4ST z5(y|gNl)Itc4E;f@_D=fHF+nX`UyN30#TrX?h=$_6>qz$D#kbjwHEnC4lG-oQsM>< zTC5-w@YB_l32j81n)=9hp>(LLhje(Ns#u+|({?nIG$+9mFbk93pW0WQVE*;P%-4*b zP*i1aQh{hj`F92ZDpUAkCHHSx7%+UU6mxYz$NV078U0z;bZc8Z$sk~-Dz3!DmZcLq z1fYoDyymP?KbMZ)xRr&?SAln}W~)%drbV+KrUjRQ=O^A_&;c~SlgI@cP?t&xQf_Swc0uS)PK!0P#&%>% zcG+8`vY};F&}4A#)=?%GcE3S;Md|`$%6^Jt^zF`$!g4JXAIlG+J=#R4a>w71MiyOO z0{e!rMKDeSGD{QgFffPsl=MY4d^xG=kUj|TA&|a@cf2%b&05-h6Rr~0&^vdizI^BY zG};UcaGfdOcaGm_)}9>lC$fqMwPqpf3CDDNCke>nn!M&&4TG>66=v#l6znLW@CTT` zPCO+s4D46TVr2kkFTzO;)B}hkF6D14qx=2n-|I147)1NlSHeTcxzv%*c!iQLRUFfq{WA~sM)eF%h5`k)` zXQd3UZ_f_ZfS`iiO_7ld?=Zj}Ym4r}GWS*TZa=BZ1Aw*+W%tJcy)#&Fjp*6E>SnD~ zM&viln>JEYe{tGnFJ9|}R6@Z#4S(YR{c0QkWoKke!}+4BTD>g$KAE#JRZKF_s0H*# z^s^l^`>zEjEvRk_m|4@2S96O}>VvhE`tNAnjlreEJ=;|PkD5{g5V)hoyicPcu1}YpIz7`Q;r4|q8Tw{=U{IcaC3%s-yXXI z8=Ud~%`5Q+Fm585eI|2m!=E>@)kP~~B%YJVwXe*&PW}7DM<5`8b!Gn{2RpcZzc9^6 zgbLdox!;O!_J$!!OEJ|gUCjAB%jw`yXg|{IRQ$t)_>s@mP}|%9+&o2AeQU#CYSQC+ zY-u6N+nEv9_Z?`U43J`@d35~08z9VnT5vGd=R>Xx(m6d|6Re1Ina-HPldXy8i{F7!=_&{duY#>`u|qbRwOsGvchk#N&2I|vxohzQ?W z8iui7WfDf)hX-jF)pMlK!*A25<~t`)zq{Y z*04iMSu1*=M1f-=gbl8~%<_;WMlQI1ZK0<>T{h3hH{&qv9fA>o{k|xGbZLA9cNJJi zr-4}**QMM+prPRkfPGrCmJ1}#u^g;y|n^z9&ZMtc)BIjCij zJ$#=~!zV{jc%rm`0aOPXw&tBsUWJn_ElCnU@W7W{I#H^kCPw0cYmN#22RDgff!TsY zXoS9I)+D6t4?o=YP2_dA3O1pDIJCBKY-J8W`i)F$K*ctT%0U;~!vFdRkA8Irv=W-+ zZqRK@eqlnX3EN%FC?R&(9Mu4<8*U_4Xn*?VWFLJCpuUa8+(&W0HnEmSTsQytbz~K} zNaqxcq?7|)x=m^@gCf!D%@Bl+m$8ReSZUH!g30ZIe^hT0bp3x-hGp->TJ;*w#SMBT z+E7Q{n^3Q5XlD@7Nq}IxYqyq9*rLC{k*%(>`{HK0eEdmek%t}!^^1B>KO ztEadOHghRX&q8YAunw(T4UXNRhvl`{NT~Zcd9os|;Za1(DTZA+lXCgkWbADoB6qq8XzyRH*zv!^>`<<;NR{7aSRo6{-ajjSO_=DY z`97x&GA4gr)e&_8Sb9Isf-|SpJNF8aQ%lLzaR1&X&Wm|tEbYA!^)wj6qIeorP=GHy zqr;8Qr=(bPY&q~mKY*T>GJ8wcKm_osodxg&2NqBl6)H`u&tK)25PE|gezd#Bjl<{h zAPr1MVP2a{c&ptD^>Bws@2Bg`IgIy`Zc+CKGY7Kyu7d1D~LVm=WUGH%lxHXCx zK|{@yIced15iK0h!#HQa_y!Ao+cnkbJ;@AWB|U1b==6aLc)FmS2ZotH$mW!4E2-ow zb`GI8ZEj9hLq(Eqg45&ohbIZuMOw`$hm0`!2C-<=B|{*X{6RI*$Bu=^lhqQ5vS5Q7 zka6;CG72f2xX2>Vd@LgUN)zKz#&|px)R;I&hHC4dq&B9_V()RK39PQtPT&i0Smw_G8$M980X@?g8)iAaHn`G?V`57& z^sl8@wXupruS!cMz=IIp6%{3@_bPN4)YvXcEM%48lDl^=>;-|R=QU1vs3=*s zkdw}-bN2~(_721$MRhcbtT)@yj$(|zqvnGYrE+QWeesUCamL2R4o-g8(Vm43gLw=)4za;*2b+i`u0!69~EILI#et-M3+~!HL zR&!ls28aI2?+_48VaR7wcUE|Z(TtU=`uBc>;YUi>eSP5f_QquJw^YcA z{orQrBt688Cmtbd|7L3d_zqMWqlt}XIq#2i$?Smet|Qi22R&EaDLin}VuyQmlOw!X z8EIxnZAem((p{kuHBHW^9=}=!j!jPpP8grC0F`I~d2(DnJ&qm3`P(qg?)w-Pl*WFZ z!w0Oo51Qh8$nk@XC;c3zA!~n8Ccr5Vz)%Fxu7A)4pD8}!%;#7UIZzNQS!w*2Mg5w% ztqC)0B0J|BrV|7*#*#0fnA0*uzNnkEMAw`f$NfL4&MU=yWgMs9=;Fy{1;sTx$*iZK zJ8RJDq&OfZ$ezP!LQVIwU>3n$uj=%UzoFS_Ai*9dZ70__wc^Eb&KfYRM)-`2m~W*G zGJZ6V0Q0hPhT2_DxQ8s#C&Iw3!wN9+?Ac8-m_#YsfTeR~iXln^0RG9fC!`6@NxuPcS)(FP|Q&IJSZ@@O6=iM1Og*iCg&J=O}G(Lv8PIo zKv6J{jE;i`m+SIb6T3KC$aV?AX9gNJH#8Q1WBBDl8YY1x^PW&COAkn5*#(X^~v zu)F9_k*yVcYQ3L@m;*0TR@q>+t3%k;giXa12^Io(DFX*(Nm7d%U$PvEAq~bPcxM;# zfh}}AB+`g9kb^7%2mR16Cj11s$VZu30v~M>Qy|MwF&{7g69NDiT-4}NohBTS?RZcbRq)dY|B2KKD%C2CF_KR49i(t?Nz1rn%aDJ7k zB8Yi_StC>H#|M4s%>{&L*QJkZTUrW-GHm1i(};NAxrT`|g%6)N)lbJK?#s^Ya!<%V zN$tk<&#MQ;N?iR>i*jZEbVn};NR=ZU2x^b@V;XXlSRELj7v*5MLQ7|?;)ZylH+3Q( z*zuvT^=^WkC!DZ$l;@XEFDn3t4MRjhw`|qE8%k)&qa_O(UoOXYIGsR4ld5G?Bhv&F zY{0P6Eud(tN@S7@u_7lM%;}IBF_Mr+K8A8Q2r7UTC<$E^K&j z_3JFoCa(};g5-!0=eH+QJ*i@G)*b(vAWTHiGUmWuIM|VxY=I4!%h;fdV!;qgA&`7; zk_S|+6@}Q66{v46T%Fx_33B|dAG^t*xGJWMdfzt1L+zE#k>NEVe%fTQ$LlI1bvp#N z+tFuy2mhT?tO|y*qJa(Jxhp^BReJL?1?~k>#!Czic5;DQrK0jSRE|U@cs1}xiE;$H zK19AL16d%U^B+L%jzkCLe>1#gCb**4M$JZ{1p!uy+`==HEENZq85Sfis~Ua^U+@&% zHWtcJrGm!IwkpX0ny(k7iO&5#-mFZ@QMl3PQ^S|qEpckf@ONFU$* zlm^$wJ|=>)BPlN8X1NV5GMM!1{zBD8!agqLT|pLX5iHW4P)^c(Ps#jum1jYa&uE}n z^8<+d(VqP48hoxp-L4Fqwzo;Zz0BrxvXUSN%|cNRJnC$?ysSCB5pENow+>ikrWF{1$SlxHjb zj_9BZJjY2><*}x~@I}t8{Uz8uz8eb=7VkEdx6qyC{rj~Dwk-iDKU~vAi9LB*Fo!Gz)q5zV8fCbt-QPkbX#9Q&#clILyReg?R>Y+mDTVAwY+Q z$SKF>kl*P@$7k1+1>((SAW^%A6Y!*AiS40{8;5cmTExqlVKAa$n|DNwFC1Pki7ZC; zt16}ihQNP}flnArP?re*3sl5^yhiczdg%pInQpHEi+1T+rePz5AE_+u*{N_4Ib&Ey zY-vO_zbRa^5b0+5qJT$gVvaRqeX*2fgu`V#)ivO4eo6dop>41949Rc9hA2rF-I>{5 zqI>_Pcf3Sf0c#mH>I(}OCFDW;H66D zRj}1L8n?%XxDQha;W)9!ivjO_y(My^ygzh!;fJw`u^F#AB6rJZ&)kKl5lPnJ0_dBd z%n2wyLc9=c7U;I%PfZ7*8y~n>CBYq-a1e&9_^ApSW&@fsEy*$f)8AdmLRD8Hy)Pgj zgkeTHd0)_lpQ6{((B#D7B(a@e)?};zV;tq};xB#9NIQN&F1pbclOJ?MJ<jZY(cN z+SmvSql7@}Y~~7S6NNIwlk*or(z8onL-$!LA>w8>lgJc#n;2^pYHli%c>>K(;_bPy z>M0b%LlFC;npE%>OrdQl)ik*%Y+cohbnWf~#)oW~C*&RE)zBiH0UT^*+*Kzv)Tjon z)@$S)qE_iI`py)}$rc>?&<(J3(UaXKQFcbc>Z2ZIMsnFcaX{x`3xMY5@epit(U}k; z?J;WC;}dbg&fr+gM-PU&h^ym;_Q;V}fc>%yP)EzWMPuDk@31i?16&wB9bE2;x-k;I44n?*) z_)BG{@e2MO06@B+ZS?F|X}$?_&0$%UDf^l6?G)b^h-0q%;zgdRZ;aFU<<}qe2K19u1K3MmDa^>w6LNb4OkBne z1JFz#lEp8*5kxi-Is$`tC5Vodnvx|W0l)q7yN6L`*AhsDfb< z9priPRjF}M6w?o5+!4A%mSIbfWkq}n6Lc?F7!FkzNICq26ribd%<>EYly~92i8vhZ z`XqZ|MXRrV-qAiPP{Pc>VxT=Nf%Fyfp~ZWAHKD+P4`^7k zQ3BQXi1VQsKW_pby}!d~r03t!HJW6l;iRZd-N(cmT9UM+M`ij)OeJ=^%NE6+o7#-t+%XRHt|`eEuPMR#3M8zYm^2o2v}B>i7F-(4IanSorFgWPCeU_X7A zae4{eB^)t64Qg%i!zpGQTK6=&@$j0C!$VKn;5w}gEx`Y15q)|XZ$@oozR3r3_2NL;ypT8hW3nJ7sk9aF9pws*z9t~Ws5%#wJ?p@yTgV;; zKbd{cqzZt0SMsnQ-jR=Fu*^UP!_E7oP61;tLu~Oq;&W&;m)!%GRt42yaxD*oJ1TkaStgV0fB)o8&yB!O5NyoSN&Q7Yke(qAWd~{j*}>;nwqW~1 z<9s(#@sV%H@H{&Wv0i2{!?(g^1M6O7QflT2KAIz?5A8R(3lRsXGz+ zka{i#GDhx+XhJg#wWvL_h^?HGZ|R##^N9DZUL6A5(*nY6mvevKFj57(M=S-}`H87Z zhZ~RN1XC)tnr6NXL?X=-Wbq8d-dqy!_>l%@Jo@NoW_+=iah4Fw0;2JtXLN2Z3IWkS zbrL|1`Y-*Pe;PGwD=_5~!y+*)-A(_yi^jwgIR&avk`D|jmb`z=t?2kQ*;jbf zGMm&9l~^k*Ua6Qan8AKtzUdhYzs*J?k;h?d{UWF}2PiYvpQr?U+?yFxpDy9Z+6Yx`Arj0)bq#8&w%B z0KiU8S=#L_5fI8(TVs(dipPnfV{U*~3!`%O1F30PFfN^VeHI1c+?hmNzFKBT{Aou_ zqr5NnyU~i&mqAl(H(%vE%Wt@X61846nyWT*rqHp5Z3bE{h}pI-9FOo|#9ZQ|F*lTb zVbFCLO-6U(Ig~6){KfpEu0>)tJefvFR6*Lzls*(z2g=sVDKa~CsQB}ka-)M*X13&g z@yvfheJ#5_k3>bcEbMutA;1MYPY?Tr^~a5Xm(5l?Li6t2hf{3_gRDiuYEEDUA{MLm zVJCO)`O#l|I{-QmGI2MpQ(|-?Vj`loxv*L#nJn%?+|1GKsThd2J#X->5m}eD6sibt z+vwf~GCn=%Bi_cKiGfC4mBk;MQI@q2U2{;z+T_=ZmB9vb1&hgKiw!GcN$#tTz=j5u zbRzy&qv#LM9O))SHgHkX`5J?gHY_uw=5Tq0QD;*n&iE){XNKS!Ab_n0M6(oWBy>Kn zOpO)Cmx~oRIFgCzi_0RxA0B9hvh0(a0mg+*YvK{mRrs0&F!xbnrK?4IT9K;-NK5BM zJ7;=QfTo)@!f{l%MBu1!`V!|P$pBwA@g!()iP8)#!iXT7k0J9&O8g7<&6M>~{JC>X7YPVdp`fN-Q<+(za>x)qnVA2fw zD#OkITeOdwu9)h^g!@0|>0L$N(rrvymrX>CuZO^q1K@pl z^CBjN2wbN{H2RuzfQLJ##h!mFS}0b7GINeQFD)|nhNkenOOvcfaN*oNDx z*)>rJ*DF4J8;nWS><4mdt5ddy+Jtp2e5XF91q`z6#Q{VC4bZa%QtuuKbsbbVT&33fxj6U5Ci$dKP=yMv z??sY>v1MGXeB;d2@QR#-j)->CL6;fikA92}eZ6tQaL)`q_h7}AL~6HKRi_pABrbQi)6;* z3@RFXnmCiQ&KV-9hWbF;gPklD>Qgy_unnucIDCGnqB@QhlLTIra4KF2s2vPm?InR{ zYI{<7)R_*LGthFh;q^1SKZ$eU)c>-IZjOPsv438#%$j` zdPqu(8>Hg8fT>>!dYJK4O}H7kaniMqwbPMFJMC*n=yi_&4#GT#-H=Dbvr9OjNJ!L_ z_6frxa{;cvLTA63iIWa^tjjIj4GDww$1w$3ri)i5HBx4tTHE&!m2U`5KXu(FNF7wI z&P3xqa^n|XV4`zc5pPdVNNL~>@cMqkv;0gc^%NM8VS#`Og2d3*RL5w3kHTsh8tGa& zi@}SvP)JqNK^FQ;FKX@pYoc?zjfJ@V?~|*T+h;gbH@>i1_gRViJ$zkPR?{LGQxtjm?KM)}=3Q!dsfy`y{Fz)Yi%GQ* zhCOv8Gw)DJM5=|6Dd_`j0~n-`1^x+RB(VdMQx(TV$m*#R-p% z)C(iYqnwU2{@IW?jU@A`S0N3Z%px3w1WDvRPae zBnW56cA#kA{a0L5-TS6EpvBIV{U^+?&`4i+cHL3lN{7m)A@0xfb0oDE$=F>A298L`9|*a#hYz z-z%Q(wvaOMASkV~lDQ(tP{D;hf~V@h=iCJ}#4%>IrD>)jPsFJ#yLF@qtpr_gQQjt? z7Rg5rY&ax7=q|@%aoD-Ei@HEy5b_BK?kkHF|7IYIIo3MP_H5CA1f=0yzG?(zKRB7o}qBv`Rg z-7sD>rv{!|c22Wru`P-wu`pnV6q+LLZL(4SPa!O3K%3hNRx6?o&OS~2$f#Z*(2&kq z#pfO-H0P$#DbX#nw8}X_U=OCLNYt7W2I?m2o|z#}I}i@?Pq(9taoFJBGdV8ri1Kz@ z<%Z(ZCdZeajdCCGMc4&2*#$;-Z45rEXB>lQv|f#}|7|~o?-!nZ@Wz6nyeG4rNe9+S z_3#ghL2 z28Utwy7^%R!>8JzU3 zg@$%o+33q@rFDMJ!Ff7q&E+^Skc|7J;?@FB)LEA6DZ#BUugz`e%ae(xfH`Fi~$_&^q1nT{qQahCx;JXjn z5=Il$mQnL)gx7eCd2@=k=^mZK#1oXsV&VOxUAYZtK!FI|$myulC`Ac_QXJ@$Lc`^R>l&qMUYx|icrV0L6IDVyi#4?Nc3ZLN zk0U{uP>HZYfh>W=Eip?sNlYMpCxqJWubL)JOR7EN$i9BM-Qz%M8@A8EV|}dwK=| zThuq(4SszDCI(=VSPH>@%g~>6j0uZ0Q=8i&M=s=PLLaUCNw7#-=T&GDG5{PSSE|@9 zJ&5vRK6Ox?q0(~__rz){pxn~nk&b~wY38pg=VB7JA00K4&7OmNQ;JRAIs}GRwM>M? zStBRkp!ZM((5NJAK5TP=+ujtQkcm+kBu%kIay0=G8XCuG!YDhd&%`^o&;eE!XdNpM zj%!6z;s>OE1V82hbi(=#$cTRl4(=wYUxAU*Aad?7En@*-wF1A`Tbla8YVx;~u-WRn zS^gcRpY~Sr2ak?uUbkEI%E6yFdNd(EZfF{9MG_bU(>fzvXQinV$VIgGr|Fhv31V5m ze4gaO8psBj;De)Xeb|P+sF9fxuBR5;mW+moKpMInZLlkAH%SvK2pU{-d{$MU2U)Z^ zrjX_Hoo`uofiDrpmIkohRMhm|XAU<9G1Q87DiL<-bvOY!WaVV5aU2v&luam1IkyTB2`q%9Dh4e2)ZVWE zN$TEnjVT0vi6X^<=xA$D7rMCb7icA#9}Ev1ap?g<5Pzt5>B@M=PLx~dGi|CN7e9yGmg#i)+UP90<7mOMHuhTEhg#=ID{ zGp>}8rL(57mjc}qc-of&%QgC!oIm=Z)P_xAkgk18=Jw{^e%)AM%1)(|2jen&_C(gYNfo+=AUC%pE&3Ifnz)a;R<%A z1SL_i1D&MLS$VFs%KP$)*S!%c6JKX)J*oqLqPk)j@N zP}YceY9m2+QeZX~LM&99!Ukpyl4--Z+E@)Ox+buL!l;BCj-F~n*q0dK>$C%hx{V&C z%<|`7FW(>yD*uLj2VpP;391x|o2NSlhMPQXkwv@@5Q1xk6T2`-)dGF+MF!|cn`R({ z6%$fa1$q*T?hRQmPe;wWp|A+09{NQLP*R9=i#)7FWqjtOgzQg%g4@R-2A64YJZutY z75uPf+D6N_#LBZ=NH1_;*5R5XIyYg`Ub)589u}bYToWOv9C1HI_x2~XS2o!xwxqy? z$t1BtN#=33%cUl3c@-hh4{NrE7bD_;GTzbBL6p(KY$##z9hoG(G?dt7g0HzIk_y|8 zf99zLTd6DSmHEeBPf`FX)sc~jYZDqne`H*6>E5GhaV_U=#mD#H%T?eZEs&#fhgr?| z;2&FFk5wB;DYJ7RRYfGQ<(iT?Qp{RJ=B@ANUsl6jf%!kmv8V049-Bc_iUa0)#LXLp zQiM^;3xh=eqpd0kGWaecWfaj%Q-{&iGzjWEw*#}un)Xb)?^p$r^6!A5q=mmY@~Nbs z6_VNMpR77MI~2h>qZ(~Yge?7J>~$%YlJyu8H#-@Q_t(d7-jqGRTKTxVZ*{8-v)AX+^Xr=3u0nL+@8s3=VSrF<| zwJ;TZrTBPkv~>n*?#v{k+2rF%e|`}%UgD;};dQHm+$Pq@f9&QR@+*FIghQ@2`#YhF zCB)wbPOkJ=W7zZE0Lpe3;uR0U8n7ftQ=OlCE*)JB*Wmy&1hH9x@|qMwl{}bUw4CSB zA(MR}=Q%R1z|uApnHm3QN^?_UJVjUw`h;-d*hAT2kyfM<@xwsBl36&fSuUv%vBhCg4Ni{0R&Dt_^TOOqixs3&C!)EA4l{rWB_pyQze7fATsM_0v}yxUS7}7ZJ_djpti_e0W0ph}kbD$u7UkZuXIpf& zAa^m&da)%6BuE67%YoJjWQC9t2P>CIIuD@r`}*dwDQV&aR!g<#C>5!M0XmdeuE^g^ z=C8c8ZtwoZA*O%=tng@jKcaC84%w|Gz#@n%CdbVtC79&L6kzk=*1JbCva^PD>SbD! zwVOohDyCWxc!_sRHi(HI3@q*J5=(N$9?oTtU^3hFDw*tm=k~Zwy#3&x1iwFK1ha?% z=or@-vQEb}($dEHu@nX+e;oD--kM7JT(oyb&}~O zZFQ@Wm=7!ZSv1#%sCrzve&Op{I0}@aj$}C8XjOQrLY4>*c$f*N65U2p>l7^};#U(u z#c0a`aHnr=vN$9(oCeva*PysoOiED0`1$((NF`ZdTR&T(!4)t|ljw!Tj}!aX%(6X(RrzqFyy?eYR+DI`|M~ zQ$q8(ZqO|NT;WGic9g2=h#UsqGi04ZZ)CoR8WzKRT7x+Ch$0(;>;5;$SWdH9Bqa72?eIXkYt`~LwjZ_#30$eaMcr{F=rm*dz~iQ##c z3?1_cjGybRrV`j%LXb+r`Qy&#A%^gNq-@BMSWlUWE@xFI2%-H%f!DDJiS(n?Tg zQL_7mC+cEwPW$Z3L=`|o9x)H#u&=a?%3}*Kj`atP$WjePp+vGsp5Kpe0H*?ac0dIz zL!Gg2jieSw1UR%#Awm%ptiZ-w^<9~tqKyYRq!@u1H&PIDbJV^O{t+c@0v zaGHb9)SCpV)&@c9p&Ge8jnQ+f?K=hh6%(<%Q*a=7u`KyiI!g+uiOvaI`K_>sv^dP0UyGe> zR*6~ms3!tTyaNLgK`#7AW7)UA8$r4F_6!9xA%+gX-wdFX&d{}`eyGrpa0u-M=!@se zTvF~riiH32@L=Z><+EI$@s6L1n?bA2k~CsOCNledm=xoAc@=h<>rj^&M0eC#N}T%H z-x#FmhH$~S;lm!6x#Dg?YR-4w6I&EYNILIMof6VFEC^v%DY_rkrQOaH&}8OeE@~fx z{i?zz9(JgS7K-}PKsI4);F{ay*}#fBeV7k{2cTu_BlNG4xN>mVr;ifXSCI9ZDWpU4t3n?-HilrX)rTYofG(@OY<0lW% z{Ho_90ov(nj-h+WGN?4YK_+xidOM;HeR3QBoy|ud2CNZg8YWPTaInj(-?vB6{`%Dp zn`EZ6T~Ic|BiE1}`_~=lHxzcP49LPKF4kSZrZgU9C*l%Pg9abElJDG%5U=nN^J6It z(Ij#V&Z6*h?Z+FVGl2Ve%ujs%zMI|!-A_nRwX0KEr$a;z9Zs(YD{flci=kBa0^X#1 z#|4C@r`RzH9ph}^qWTX(l?8P2Nx*mLe?IFOgj#ynQc$vy5sX7nT}Q8R%>oXW6fbj};Pp zL#!W8umndSfncMu-98OFtTJ8SreY4+t5=(Sn57^rjA82KRMy+H7k_YR_Lxg8lUxL% zTqI%fp)^xq?!5-BKo5m4$|1nOKH`>lf(r@ z?dMoVupR6W)-X5RrzZ}S8_;z-?Ue&i^Z%C#oB(o`^dv+GTndKiUl-NWi#O~d=k_g7FxMBh|#jI?<+9)=5q4OB>O~9zYYiWU9 ze5l*`UNvS ztoETH+5Qnc!Hr#hR)CoCG{{TyY2@L|A!4W(*G28I-P(X^p(i7BE7szOsO!4?=;jx7!>DO~oQ5~3h*mj1-*xEON6!mh3J=9F1UN3u z4ky|ciG?7VI?*wt)x;2VzX~*CV!TS{aG**;3JXupccN4ZC}UkHsDL*E^5X42=C~ob zMi)Mb1Yj8P!lHCi&{d>|XM42jX!7h;Bu|pCvp6~!56f>VbY_f)up*O~80OS~ zHX_|88uoVdGc!bx-u5pP>(}L8Tn*`=BgUYRLHHGeDXSV7sT?{&^6kR6)DzP8Xl}Xl zzEt1j0}D++9Cq|zF$$1jiMBqDs6F6OW5fQF3Ql=3V$|ZSckoGyA@a4Tx--m7B(}eE zK2+zG&U}@kL|;8I9>skjZjnSZ_b**dOW3vDU!~K24`)EpBJjMsaEKbJ9E8%HT+^Dx zfD0*i0)u3E3p#^_^h*R3(NxpnLJF}eUYOYVR!;!Pzoh)0Wbd(Z`VC_AucSVWfg#IZ+teA5JfM}|of(MV* zZ`;Sz6rm!qhLHma5E^!234|<~AW{@S#UbUIK|_%K$~bshYwj29V1c5`6bj%D%ZW^H zsW%a&hqy^+3pyl*`ZB0|vFY*`DJGKvFqb${h#@`w6uW9}v(WX8A+$ICSeMU)384?- zKsBidI@orN{_Cg)lMQo%y~vS@s523L)PLNRcf;yE=6WWoX-*(N4fRd|%5@#et|x?| z(Cpm_u7PhDm$mzniZ?&fhA(1&YyYL-DsJ{yYAQ`7^`GsC_}yJHkpK%fA%GOOGt+2J zLJ6vNk0_x^j|h_o69-t9GqvvS4*=Ok%OA|FiDDR;15VzFE}plgNqYmYXB!D}L_u?a zSbFC;7{&vl*V}{%U(r)1#zU}nRu2}se3wR1Kl*K2^WYAb!=rlDhm1oxk`0_D-yK6#V)@*LekhvLDH~&KyxkzX`k8Vo;m52e&QbbfYJ4H(kOa=jHQ7BM}>! z#w5}!uw~{fvbQ-TM>0m5u`LrR{$YvzY$33Zlg`gA9NaM)x_mY{^LJH}%6+#2wwM*R zuwc8D;?C9-W2|e6M|sOjdW9=uu8Y#a0;5+4MatVNOFW1(&q*ir8{mXXWeV}?2oQ(r zxpZfTQ6Feb4S`*NenS}qIC)_if>OQs4@KXoJ)-(XI=Q7#aV0Am@V1tL;M3y$P2JQ>a}cEe%Q zuB~c}0BwRu<}KA(qk$hYV#*J*IN^DPztT5xKsIUBo7`JCn_0y{xfVSZw9@B=(8Vg3 zc&PeHOwtocG$j~7P%S`PWfs3-_zc8joTXe(V<^ZUd^H>Mt}Nxpsju>pYNu<1VXe+1 zF9R;|lni?dC_Pg{hmaSHfg0^VQ)5&X>k~{u-9TLP8XK&=Se3n@ZD?IvlLrjkqHy7@ z!sk<*xV4;lGE-{+FuP{?$88^9^vjIwSyvjBW4@p!-G*T&w)qIgSiw5sLWqkgZ$v9! z@w^^h_Phxzg&Dt=EC{&-gUm34*#I?*Ozs~gxzBnqDWUC52zP)V8fKya*dO=xtD7No z-w&2q#-^Gk1R$!)K_Jlp2W3Q_nE?Q0a9b)iZ~gMfd~6pL7k=zMXojGoodI-6{G*2g zW&nLRlU+-uAMGZ&SmS=+t5HH+K9YwQb<`hv#17rc>>tzffG5oBuz=kcFL38riq+~= z=16QTs{Bk2pkR7t6-5xYe@!G?0_07h7UyP3%e6Tc*1Rrad>mVaO)*!v zf}bZjz5vtGl;N+&RIk@I@!5n_YCncWgCue2Aff2{DRT_thM}n0ndEyXr;f|-v08qD z;Qfd{g%fl_h;6T9L00)$I|L}Ejo(-pqF(&%6U`(Y(!taXQ&<>xAXWgZBwifm?XatW zZ=>x@+3M{C!K(F(pU*{ZWKxz7GB(-NmV2pEFDE(>_{MpbPjLkkz`II~m0l847v{}C z*d}3;)^t6rdeeaTQ)Nl7A=h4Ly!1==rIv^)prRE1sL9xo-XX-QdJ!#$K}`1{NluV``r!fAy}fVE#*(&A`iPap z*Kmj+Nd_b@1p>lkEP=e3c*m~a<$Oq4-Kq?$PfLQlP4~l5c`zsd<^%RZs_qq5MT12q zvx^gf4tV@3NQF=#yKlTRAY88qX`^v{FE4kdaeZ*!l-0~MFz85;n3Zzu6c0QjVDFDrAt!$3?A1vq@gR00TH`6bA%F zmu)fK$L`fOeUtTcZfwZ^yAjk-10piJFwpsFp*k(xiO%DP_^pyAmpsKxWOA#~H}v_( zF;#?>O@w(13Yx)N!LCq%*ea! zK4^%w0Dl@*Mcz%P*JF1u$eM?L)2Eg1sFVuyGH$@K(pFxBO2;4n_*l~bZvHjqE}?xE zfyfpkw^>moTKjJ4Uy&H!{rqs6XQdmJ*)saUV3fY%xSwz&#&y~pD)UWyvH=>Od zgb$(&rFt$IY2Plv-!m^z)gs|&X;}Gertg45Fk;A$X<-FJn+rQjDb1)H8~UTxtKF#( zrAZ2e@;0kmT}%T_n6S9^^i+^Ngo;+028utY^WNfO>MrM|EN zyqPM>q_SbA3df99hH(oqUT3LWyzA_n1&q75GaIX`&W9FWY>p@E@3)AmguwYd0t#HR zm&?s8Kbgppl&2vSOGs+TnVJ3dRPu|BaNKyT=O*F{AZOwMIt>`|hXd6iu%!wJD5MdK z>r@C@MTZ1cK0>7>Q)K+$6QSk`xP0bnbn%iF^lGC{#29Gk|4u-OmSZ=Y{DDrR#hcmK zJ2ZH9y9+N&K!PJvR~&7U(P)&N5EqXzYbtAV0&Rkj|5myjehn=+P#~spfEZ19NKpx^ zxs~DChwwt|P-_XAQ-B^`Rd9xecbb_h|73yhhf)8s$@WKIT^MigwFcxjEmXCNi_Z>R z3b<`IlUraYF-iB;q>B`)jV}iFSjJ!uO?B5^mt|IMFk3c#m^2Ueqb-FLhO_aE5YEWT z(@;(Z%XbXDO`S68g^EEp)_r6rD%S}3&#daOU+f33;S za%%w}IG0$&d%FvFk@W^)`jY2>l!>bwf?*`85yD_t2I1hTDHNnN0K0`7#mVTS7kS*V z;>q%)v`&@<5ZWZ=6(@fDNo)^;UptT90pL6QoG|)x-9{{PEV0%Fu*+x~p~t{RDk`;- z`>x{_S%HFHlZZ!Ys6eKOKWt#I@#At#3JjqaTL`*hy5&S8J3)ts0aJnjHpA_7+5_)8 zPnWY)5`av}MUz6z761LWH;fF;r1Qw#_o^1E@e6czay4AE(?%7MPgDtjKIXl zm~?4k2@k6N>F^SVewLzN&tWr+Ab|sR(}+f>Lwn7}y=AO*8Wt@s&xjKTNL+hfbRz?I zGg3}=ij!;lS)3QbU@{DA`=vL=RIf$>(S;VCF$$#PXFUhXhqT)vVBE&3>-QV8KC6%i z`q@OeY6@x>mQL10%peASp`&`x#TdyfJkktj?B)|RP`Re9} zodQm*HJ+m2+Lm5KnV%n6VS_6|I08k`L}E$u0G&Sb<(%U%{liX*ReEe;USz};dV3f| zLI%$}pnve`GCnK?8SCRdGnrD5P$9vCnaC=F$c0aqCRBb&6@POs7`l?so?=I=Z_Xn! zgkQ3N;WX4uNPN!7s>4F_n(l^*et?CFFL&G3l2x7Oh>_q&f3kQEUU*j4vYC`Tpw8NX z7h@IX`pL!tLtFE%R)j{aKRRKvSMR1UWS`5H&7~@!gp`o|%($LY3R^`TMf%36-Ve0w zkW~1U(V3s}6f=c^R(u(Ez<$x8@v34)Gj(a~l0||Q9(Ii`)<<&idNozAbg%3e6J=eo z6lJk`s`wpUU`!YoUQoIDwfyFT#8wlhzPsrw<%tn&ue57pj*&^F8)cM){P?KGDP z^l|7^q6h3)1!?c93G>Yz3s6!mVkUt$B;LJaSI7h^dOJ<6=bdDuveIHL@!f59Wm z$j=B0=lGKml>Hmg+>mgfi;p_EMHRx_vrvXR)VX&8@;7+nq=T%qIs(T03cVMC2?pBr z+)B2RwaBJci0NBZhXIos|4Tu2gLh5pAM6KeAoT!b|OA~V?| z+1?r;hMJaCHpjLL|LjO#EJZ{LJc9G6VnLgj-vtq$bqNGUU>7EPJ#DSNE8-DD0Qnj5 zR5`sTho3ioez(Bq-e3owD)`c5i{L&h^brJ!9EYbe0~df@Ph@ECh>R1j_D^t)j7eO= zVVI}z0@WJ(;NCWFaGu4ZeRjeN0^)zlqVS$+JM{J{KUMHDOyj7$iM~7KZ0?&929ytdK}n?95^OWg1i_Fr zurnWA-!V0sMYa8bp8wPFK8=v@);2_%DmWXaKkGfihT4bALP6+{aBdJE%P|M3O)Pu@ z9c%`mEOqDiIBW^!2|QNN4HgR!CO{z{#&`-f9M;TaH5Byy_ES`<$G+zfmdVY;#O17_ z;oQHH-I=Q$r!Rt~(s#!!tH=GUW{x)?ovE`1IO%T5=vW7qq%SWrcXozWYwCM(e@Ov* z4cPsK{TNr-SWw(Bx4m(%ByC|ziac{v;88QavOl%Za4K`dfcx8Jgg(GL=}lL={( zz=7um>g6mETt16rMxxtcl-QgfTtdA4J5L+;THpmphbor*IXiD(K(nZ&6dFv~$UYnkh*IN-Y!d8zNd_ck{QgLfmz0%$#%Xp$RW zZM|9VdaSM_1}IDPD39kEr0t#>@zlu8<_(2RT7*+VHeLaL$cJY)o&p37J`{Ka9SOk0 zAa{?}&SH$}NWGK>TD}LviXAzT1zNgs^ufO0LL;KI0$e{7cKaD)f=>k9HA<0 z%3ysRq0NZ;l^^H@qa_Z*$=5R}ehn;|u)T!0qQwRoIVolwb+8U==DbUxRXz632u^n5=9^{ip#p(U`U@ybs!e0|thGz>ewpf7T4lv9#2Tv3*UzquCJA9Jp7YiN#4ckU9jZ~VOubx4e<2z=CM1cE8J`ca-A_HAnai}aH3ew3SO@706uvh$ zr#W$gvSNl$tL6O^;Yw*!$3@~HrPfR79@a-;l;>i3gH1b1ccwL%z)t80OoXcApfQtx z*jYN)vxM5xSSEwaQo*$DD2C+}@bSyuQvtPrA~h=F`}n@Pi6~`a?N9QAZ9>H&xUocE;O~3X^ek-?%63nYw%7d1)n$dn3MnTn@W}gewj-mU9M${?jzy$?fNDXwd z&y=T@&@(wC^KWxKX+C0C8j*468gS{Jq2Dd;`Y(-fpY9yYXJ_j{*5*`n;@$;mVb`p| z^rJ(f(NJ2#?rP(+GNZteWPnP6?CCtG3AtsTf|#KnR&P4?7Ec+0ZV%S}q&XzzN?Rp3 zK}!6g9L2f#K6-8fO@G;}_KJT^?{lm_?$Pya&&t~zF=mwNo zA#o&ov;XPJ+~VFr(VAaSu*9aY$_k)Vz;`9Xdb77+o@8*-8qW55jrJ9YkP*}ad<$+F z05*#%xgfwy`#-pNy5D8H>L|1_RsDJOZf_&oNVNu@F_(EH_AVX`U!Dj^6+Qj6K`f^U8z4#3AZqWK9KJ zk;1fEha?vz?i|Kt^e|#_KdOo0CD_soC1_<8Lg>(9myVjGYqwHYS9T9Wz9nx>eN45$ z_5F-ebj^&$IshHkGRJj)8_>+aD*>?Ji%r>umwg`E5HqWpk_6U<7TyY=kyAQe=I@{o z_piO5$79NL(U!C1aYg8aHWL(m(2a=Ohf;BBOWs9n$lU>xJJ=sOt;-p*0sn# z`r#`@v&hhRet2$has|!$HO-z5EuDl91kXCWH2=iVqz$&{9)&oR^wW~L7-Kywof$WebW^5kg+IxopYLzjEiDL6F?l5iPd+r zpv|x%>k^VMp3Xg{6j1`{^{DLsvzpWN|K5I@ZZ0{QV6S9}yEqjR(TjmHA-p9me zv(|ZfZ`VA?&S-orl7a%GjMoWtXRn)Q_2`wl8r-tTp95=1;M(2+ek~pVqAq9gnZ=LU zAUyLms7t+I)kkAtluFFlp$O9#*vTXRwII>Z>EDf?vp}Q%gWgu#I90 z>f4t>Iz&R8(3H6rbJWHWd#meoAp#{~$S|$F!+z@>pWTOz4UBsORvOnd^gV`Gozs|a z9gliqotB(wPa@x5tH4O0dF&Gn=sAKr|NK`L^q=TI>6?67vt_iZnQgm>isHqW1-5cW za=m2%m9cC01SXg0KfpiMEwF0NBsXU|Bq?+llS1A znYpCQ%= zwMS;nk#AkT#>m$e8C#{XDKfT1zDDV5h>Y!!uNm^SLcT`G*94ihK)wO;?T>GMeCy*I zAK&))njYWsXn4%p9kXV~tkp4VbbM`&Z*qK#;~N~`-uULmw>G}9@okN7YJ5xM8yerv z_%`XA8Q;qIM#i@>z9#8wVq66+j4`)v%y(lN7-DXnnD4}V@y&~GU3}x>+ZNxn_?E>t zEWTaw&5CbTe52yq6yK!y7R5IxzCH2HiEmAOW8%WJC8lahOx2Q@sv$8|J7TJ4#8fvO zm@0#Ot%zA8;xAho;=Bmar3EoIAjTHyxIh})qp|%kHXp{;!`OJZEw{rsMbOxE(6Xgx zeY|RmzB&5V=o_Ofw=T<0mnGMVZxyUmjJ+~eim@qy6&l4@D8@c97EGP^Ht}WRyTn)} zW=&#NB*sh9_lU0%-y*(5bcnAI-vTi<(pX4iAC3KCtPf**7|X-h9Y!?O;m*|2nQ5by z7-cjzhp~&s;xP7xu{MmYVJr<}6^)%?oXeT13|FGYaAgWZ6MbJ`bz#;PW@Ta46=qdo zRz$NXLuO53EDB>!7<*`}p(|1gU6D%YigYQO>H=e`uRPU3M~3M^Drjt=v4FTxU68)( z(RWlL_0MT=WG(|HN*FLv`YyN-ozz)yA(~w&%MFsxO?cZ)SBf>j$&8nbm_? zJD8P&u^W74^PT#x`KtM*`J(xr8Ea;2nHQDJSPjNz@WtSJ!K_kW3udig)-hwne8apd zn6F>PdKuegESIla#%dXxWmXDionTf8W{uzr!K@F=>cH0qzB2H2fw2mFP2h{b_kdRc znPrv~%yNQRN-&FRG`k2sA(-U@mkw+x8@LoD17{}}_);qHnZTDAU7fL9om*Gu1+LCg zM<)@uIC;P)mMc-VzP$3K0kbS%mITbw%By6}x;Z(($yw?|m|dKuE`)pGKzP#RGw)6I z;IJgJWdK%=ipdMS+&DOwr0Qp60B@Yq%zAZ|l29u<`ShjJ2dh3`QfZS@ zzC;hQse>~dB-3}@2CFeQH9IzWQ@3tvrki@wsR@9}rO9hdHs)%)n7*aVO3K(#W))@D zP`;piKlys{?c~eJCSxy+wKP_fv8hZZvtlyqC9_&Gi^?)`8Go4)|8R4i;S(bl2b*-Ch}7$oth#t_K>fJj4k9VA!7#_E6CVD z#sV_-kFkD??PDw-WA_-V$Jji^;xYD)v388DV=NtG=NK!;*EqhyG4_qIZhWmv(>A_r zd|hL#8e`KKi^kY9#!eb*#@I5(k}-CSv69A$F*b~`V2u6Z>&3T=FBjh}zFK^<_+s%_ z9HUX=W=#??YcbrRTX*QDJCsArN+D($#F#*g8EH&NpO0qw!z_K6We>CD;qK%P6OcN5 zI-0do!_ciWbe^GXROr?f`np2NXv`dP(JXNo^M+Yz1EE_-Xs08TH4M6SgT8K1(lDl? zF=rT4hB0Fp6NWJp%0tdv8E0080I137&#n9Ob$`Zker}zg@BA!v zCbUGeBbX%!pH$bQTi2tVu1B+ONH|xed^0QETnYKXPf=)GpV?fMZe5j*x+-OxFFlx* z9Xy{~$LA@>=Nb0gx;@|RNe+I>4Ngz8IXyX*Yd+P?GR-W}%o@w(xpjF4;PT{|t4cFh zHI~D3>+pPsC(GQO-OQ3qYB0+ThDr>E$_s`{siD$>p{CF=R8}y{F~15_b?d6mt6J(v zNHL#bZiEE$<(FA{`Rww^<#WrYmRW$tr~#2eh#+E=8Ih3@kW_)&UXl zEhS`<%3fpKbj(o=vgO%{KNnHm&*407+27U|+>U3-_M!v4{tO4;(dp3hu4PBa4X4dR zj(vV&UY@~6c0j$cbe`O1z*IzL?JDQG8}o9ah3iJ^t*hW43hSI=hb zWLY3z`IB{;MtEP~-z6I9AX1)1hCU22+mYNk4#+SziGRDp`#oPLp#DLWT6a5Fi)|)e zO(d^S7x4;q382ZeWzr#YkI{b_keR7u)@NkMbF@Cggcb-01ONrjrrJ$}2u`U6&%4p; zq}@(_9b&thCG+*Q>?oX)uqsY9|C^1>2f6?wcU~XtW+OxR?DdJp}8=$nhSIpIM&*XBcMx z9zv(A;V@u4hZTMaGoXCObUyyGII!sJO6k9lr7P{8=D3Rly_xZcuRHfV2z6|f!^}P0 zdm{)cNX$rpVXld`(V|E$BWF@Wa>H&C^z*aKSL`NPaTSn>XrLvV7y7WWoTgy-;KHv1 zTio$5|Krz2LfAQbp~Ym@Ai*AWX}9!cIxwG+a?7UZr|b@_t3V|2{uo zIEV2KB02lM_1u-Kt>A~hkl{97Doq$60002z1^@s-1_1!Ji2wk+00sc2?EnB64gvrJ L00000vFehKRQv3D literal 0 HcmV?d00001 diff --git a/tests/golden/WBV2-P1215-000/manifest.json b/tests/golden/WBV2-P1215-000/manifest.json new file mode 100644 index 000000000..a065601cb --- /dev/null +++ b/tests/golden/WBV2-P1215-000/manifest.json @@ -0,0 +1,50 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1215-000", + "parentTask": "WBV2-P1214-001", + "operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "MODULE_EXECUTION_QUEUE_BRIDGE", + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1214-001/manifest.json", + "sha256": "c219451b5a1f675c8b5d852feef3c4053285b1c5b46a218c054d9dd0c794fc1a" + }, + "plan": { + "path": "tests/golden/WBV2-P1215-000/module-execution-plan.json", + "sha256": "77c00ad906bd9b13a7beb6d8f391ef62d16257e864d2fd1955ff70ccdb68a8b7" + }, + "report": { + "path": "tests/golden/WBV2-P1215-000/successor-authorization-report.json", + "sha256": "b38d056bfa6ac0d46839cfec35857de6bff2527323386f778a2012018f466de8" + }, + "status": { + "path": "docs/status/WBV2-P1215-000.md", + "sha256": "d26583703e84ea5e4b9f7202e41a2c91d617d485cc875e8bc7288d6a757c1f6b" + } + }, + "assertions": { + "sourceBackedSuccessor": true, + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchSize": 5, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 748, + "dynamicUnverifiedUnits": 2997, + "boundUnitDelta": 0, + "fullHistoricalReproduction": false + }, + "nextTask": "WBV2-P1215-001" +} diff --git a/tests/golden/WBV2-P1215-000/module-execution-plan.json b/tests/golden/WBV2-P1215-000/module-execution-plan.json new file mode 100644 index 000000000..27198b907 --- /dev/null +++ b/tests/golden/WBV2-P1215-000/module-execution-plan.json @@ -0,0 +1,18382 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_MODULE_EXECUTION_P1215", + "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 + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1171-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "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_levels.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.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-c7c1993f19c6c688.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-P1172-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "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_normalize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_file_output.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_pixelate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_plane_track_deform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_posterize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_convert.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_to_bw.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_render_layers.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-bf66c685c7c6fd95.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-P1173-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "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_relative_to_pixel.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rotate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scale.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scene_time.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_separate_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_strip_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_set_alpha.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_split.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-a1b966b1af421537.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-P1174-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "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_stabilize_2d.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_string_to_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch_view.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_time_curve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_tone_map.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_track_position.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_translate.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-8f71e517e24622f2.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-P1175-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "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_vector_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.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-4c3e128e97498ba4.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1176-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1177-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1178-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1179-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1180-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1181-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1182-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1183-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1184-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1185-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1186-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1187-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1188-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bone_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bounding_box.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_camera_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0f87459df8986017.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1189-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_connected.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_collection_children.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_edge.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-447074d84f4807db.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1190-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cube_grid_topology.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1191-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_curve_of_point.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_bezier_segment.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_circle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-71424076a2a8f339.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1192-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadrilateral.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadratic_bezier.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_set_handle_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_spiral.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1193-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curves_to_grease_pencil.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1194-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8f6105d06959322c.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1195-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1196-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edges_to_face_groups.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1197-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_average.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1198-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_filter_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6581c99986be795f.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1199-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_geometry_to_instance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_attribute_names.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_bundle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-240d704df4420718.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1200-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_component.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_dial.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_linear.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_transform.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1201-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grease_pencil_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_advect.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_clip.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_curl.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_dilate_erode.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1202-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_divergence.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_gradient.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_mean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1203-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_median.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_prune.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_voxelize.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1204-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_csv.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_obj.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_ply.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_stl.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1205-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_text.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_vdb.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_of_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1206-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_collection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_edge_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_font.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-150a227b3433d301.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1207-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_id.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_bounds.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_reference.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1208-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_scale.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_angle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1209-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_area.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_neighbors.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e28f27c297406a24.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1210-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_island.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_vertex_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_layer_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1211-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_align_rotation_to_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axes_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_combine_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_euler_to_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1212-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_find_in_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_format_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_bool.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1213-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_menu.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_special_characters.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1214-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_match_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_determinant.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1215-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.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 + } + } + }, + { + "id": "WBV2-P1171-000", + "phase": "1171", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1170-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1171", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1171-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-P1171-001", + "phase": "1171", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1171-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1171-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-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "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_levels.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.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-c7c1993f19c6c688.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": [ + "CompositorNodeLevels type is read from Blender Main", + "CompositorNodeLumaMatte type is read from Blender Main", + "CompositorNodeMapUV type is read from Blender Main", + "CompositorNodeMask type is read from Blender Main", + "CompositorNodeMaskToSDF type is read from Blender Main", + "CompositorNodeMovieClip type is read from Blender Main", + "CompositorNodeMovieDistortion type is read from Blender Main", + "CompositorNodeNormal 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-P1171-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1171-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend WBV2_BATCH_TYPES='[\"CompositorNodeLevels\",\"CompositorNodeLumaMatte\",\"CompositorNodeMapUV\",\"CompositorNodeMask\",\"CompositorNodeMaskToSDF\",\"CompositorNodeMovieClip\",\"CompositorNodeMovieDistortion\",\"CompositorNodeNormal\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeLevels\",\"node:CompositorNodeLumaMatte\",\"node:CompositorNodeMapUV\",\"node:CompositorNodeMask\",\"node:CompositorNodeMaskToSDF\",\"node:CompositorNodeMovieClip\",\"node:CompositorNodeMovieDistortion\",\"node:CompositorNodeNormal\"]' 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-P1171-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1172-000", + "phase": "1172", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1171-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1172", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1172-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-P1172-001", + "phase": "1172", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1172-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1172-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-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "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_normalize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_file_output.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_pixelate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_plane_track_deform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_posterize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_convert.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_to_bw.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_render_layers.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-bf66c685c7c6fd95.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": [ + "CompositorNodeNormalize type is read from Blender Main", + "CompositorNodeOutputFile type is read from Blender Main", + "CompositorNodePixelate type is read from Blender Main", + "CompositorNodePlaneTrackDeform type is read from Blender Main", + "CompositorNodePosterize type is read from Blender Main", + "CompositorNodePremulKey type is read from Blender Main", + "CompositorNodeRGBToBW type is read from Blender Main", + "CompositorNodeRLayers 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-P1172-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1172-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-bf66c685c7c6fd95.blend WBV2_BATCH_TYPES='[\"CompositorNodeNormalize\",\"CompositorNodeOutputFile\",\"CompositorNodePixelate\",\"CompositorNodePlaneTrackDeform\",\"CompositorNodePosterize\",\"CompositorNodePremulKey\",\"CompositorNodeRGBToBW\",\"CompositorNodeRLayers\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeNormalize\",\"node:CompositorNodeOutputFile\",\"node:CompositorNodePixelate\",\"node:CompositorNodePlaneTrackDeform\",\"node:CompositorNodePosterize\",\"node:CompositorNodePremulKey\",\"node:CompositorNodeRGBToBW\",\"node:CompositorNodeRLayers\"]' 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-P1172-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1173-000", + "phase": "1173", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1172-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1173", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1173-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-P1173-001", + "phase": "1173", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1173-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1173-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-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "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_relative_to_pixel.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rotate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scale.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scene_time.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_separate_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_strip_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_set_alpha.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_split.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-a1b966b1af421537.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": [ + "CompositorNodeRelativeToPixel type is read from Blender Main", + "CompositorNodeRotate type is read from Blender Main", + "CompositorNodeScale type is read from Blender Main", + "CompositorNodeSceneTime type is read from Blender Main", + "CompositorNodeSeparateColor type is read from Blender Main", + "CompositorNodeSequencerStripInfo type is read from Blender Main", + "CompositorNodeSetAlpha type is read from Blender Main", + "CompositorNodeSplit 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-P1173-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1173-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-a1b966b1af421537.blend WBV2_BATCH_TYPES='[\"CompositorNodeRelativeToPixel\",\"CompositorNodeRotate\",\"CompositorNodeScale\",\"CompositorNodeSceneTime\",\"CompositorNodeSeparateColor\",\"CompositorNodeSequencerStripInfo\",\"CompositorNodeSetAlpha\",\"CompositorNodeSplit\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeRelativeToPixel\",\"node:CompositorNodeRotate\",\"node:CompositorNodeScale\",\"node:CompositorNodeSceneTime\",\"node:CompositorNodeSeparateColor\",\"node:CompositorNodeSequencerStripInfo\",\"node:CompositorNodeSetAlpha\",\"node:CompositorNodeSplit\"]' 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-P1173-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1174-000", + "phase": "1174", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1173-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1174", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1174-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-P1174-001", + "phase": "1174", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1174-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1174-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-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "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_stabilize_2d.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_string_to_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch_view.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_time_curve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_tone_map.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_track_position.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_translate.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-8f71e517e24622f2.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": [ + "CompositorNodeStabilize type is read from Blender Main", + "CompositorNodeStringToImage type is read from Blender Main", + "CompositorNodeSwitch type is read from Blender Main", + "CompositorNodeSwitchView type is read from Blender Main", + "CompositorNodeTime type is read from Blender Main", + "CompositorNodeTonemap type is read from Blender Main", + "CompositorNodeTrackPos type is read from Blender Main", + "CompositorNodeTranslate 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-P1174-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1174-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-8f71e517e24622f2.blend WBV2_BATCH_TYPES='[\"CompositorNodeStabilize\",\"CompositorNodeStringToImage\",\"CompositorNodeSwitch\",\"CompositorNodeSwitchView\",\"CompositorNodeTime\",\"CompositorNodeTonemap\",\"CompositorNodeTrackPos\",\"CompositorNodeTranslate\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeStabilize\",\"node:CompositorNodeStringToImage\",\"node:CompositorNodeSwitch\",\"node:CompositorNodeSwitchView\",\"node:CompositorNodeTime\",\"node:CompositorNodeTonemap\",\"node:CompositorNodeTrackPos\",\"node:CompositorNodeTranslate\"]' 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-P1174-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1175-000", + "phase": "1175", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1174-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1175", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1175-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-P1175-001", + "phase": "1175", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1175-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1175-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-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "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_vector_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.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-4c3e128e97498ba4.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": [ + "CompositorNodeVecBlur type is read from Blender Main", + "CompositorNodeZcombine 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-P1175-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1175-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend WBV2_BATCH_TYPES='[\"CompositorNodeVecBlur\",\"CompositorNodeZcombine\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeVecBlur\",\"node:CompositorNodeZcombine\"]' 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-P1175-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1176-000", + "phase": "1176", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1175-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1176", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1176-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-P1176-001", + "phase": "1176", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1176-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1176-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1176-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1176-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1176-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1177-000", + "phase": "1177", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1176-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1177", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1177-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-P1177-001", + "phase": "1177", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1177-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1177-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1177-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1177-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1177-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1178-000", + "phase": "1178", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1177-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1178", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1178-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-P1178-001", + "phase": "1178", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1178-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1178-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1178-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1178-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1178-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1179-000", + "phase": "1179", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1178-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1179", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1179-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-P1179-001", + "phase": "1179", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1179-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1179-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1179-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1179-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1179-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1180-000", + "phase": "1180", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1179-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1180", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1180-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-P1180-001", + "phase": "1180", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1180-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1180-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1180-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1180-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1180-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1181-000", + "phase": "1181", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1180-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1181", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1181-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-P1181-001", + "phase": "1181", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1181-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1181-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1181-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1181-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1181-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1182-000", + "phase": "1182", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1181-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1182", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1182-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-P1182-001", + "phase": "1182", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1182-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1182-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1182-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1182-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1182-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1183-000", + "phase": "1183", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1182-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1183", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1183-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-P1183-001", + "phase": "1183", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1183-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1183-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1183-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1183-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1183-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1184-000", + "phase": "1184", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1183-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1184", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1184-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-P1184-001", + "phase": "1184", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1184-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1184-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1184-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1184-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1184-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1185-000", + "phase": "1185", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1184-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1185", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1185-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-P1185-001", + "phase": "1185", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1185-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1185-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1185-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1185-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1185-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1186-000", + "phase": "1186", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1185-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1186", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1186-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-P1186-001", + "phase": "1186", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1186-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1186-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1186-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1186-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1186-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1187-000", + "phase": "1187", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1186-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1187", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1187-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-P1187-001", + "phase": "1187", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1187-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1187-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1187-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1187-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1187-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1188-000", + "phase": "1188", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1187-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1188", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1188-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-P1188-001", + "phase": "1188", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1188-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1188-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bone_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bounding_box.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_camera_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0f87459df8986017.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": [ + "GeometryNodeBoneInfo type is read from Blender Main", + "GeometryNodeBoundBox type is read from Blender Main", + "GeometryNodeCameraInfo type is read from Blender Main", + "GeometryNodeCaptureAttribute type is read from Blender Main", + "GeometryNodeClosureToList 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-P1188-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1188-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0f87459df8986017.blend WBV2_BATCH_TYPES='[\"GeometryNodeBoneInfo\",\"GeometryNodeBoundBox\",\"GeometryNodeCameraInfo\",\"GeometryNodeCaptureAttribute\",\"GeometryNodeClosureToList\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeBoneInfo\",\"node:GeometryNodeBoundBox\",\"node:GeometryNodeCameraInfo\",\"node:GeometryNodeCaptureAttribute\",\"node:GeometryNodeClosureToList\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1188-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1189-000", + "phase": "1189", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1188-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1189", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1189-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-P1189-001", + "phase": "1189", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1189-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1189-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_connected.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_collection_children.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_edge.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-447074d84f4807db.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": [ + "GeometryNodeClusterByConnected type is read from Blender Main", + "GeometryNodeClusterByDistance type is read from Blender Main", + "GeometryNodeCollectionChildren type is read from Blender Main", + "GeometryNodeConvexHull type is read from Blender Main", + "GeometryNodeCornersOfEdge 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-P1189-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1189-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-447074d84f4807db.blend WBV2_BATCH_TYPES='[\"GeometryNodeClusterByConnected\",\"GeometryNodeClusterByDistance\",\"GeometryNodeCollectionChildren\",\"GeometryNodeConvexHull\",\"GeometryNodeCornersOfEdge\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeClusterByConnected\",\"node:GeometryNodeClusterByDistance\",\"node:GeometryNodeCollectionChildren\",\"node:GeometryNodeConvexHull\",\"node:GeometryNodeCornersOfEdge\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1189-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1190-000", + "phase": "1190", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1189-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1190", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1190-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-P1190-001", + "phase": "1190", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1190-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1190-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cube_grid_topology.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.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": [ + "GeometryNodeCornersOfFace type is read from Blender Main", + "GeometryNodeCornersOfVertex type is read from Blender Main", + "GeometryNodeCubeGridTopology type is read from Blender Main", + "GeometryNodeCurveArc type is read from Blender Main", + "GeometryNodeCurveEndpointSelection 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-P1190-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1190-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.blend WBV2_BATCH_TYPES='[\"GeometryNodeCornersOfFace\",\"GeometryNodeCornersOfVertex\",\"GeometryNodeCubeGridTopology\",\"GeometryNodeCurveArc\",\"GeometryNodeCurveEndpointSelection\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCornersOfFace\",\"node:GeometryNodeCornersOfVertex\",\"node:GeometryNodeCubeGridTopology\",\"node:GeometryNodeCurveArc\",\"node:GeometryNodeCurveEndpointSelection\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1190-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1191-000", + "phase": "1191", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1190-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1191", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1191-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-P1191-001", + "phase": "1191", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1191-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1191-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_curve_of_point.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_bezier_segment.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_circle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-71424076a2a8f339.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": [ + "GeometryNodeCurveHandleTypeSelection type is read from Blender Main", + "GeometryNodeCurveLength type is read from Blender Main", + "GeometryNodeCurveOfPoint type is read from Blender Main", + "GeometryNodeCurvePrimitiveBezierSegment type is read from Blender Main", + "GeometryNodeCurvePrimitiveCircle 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-P1191-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1191-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-71424076a2a8f339.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurveHandleTypeSelection\",\"GeometryNodeCurveLength\",\"GeometryNodeCurveOfPoint\",\"GeometryNodeCurvePrimitiveBezierSegment\",\"GeometryNodeCurvePrimitiveCircle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurveHandleTypeSelection\",\"node:GeometryNodeCurveLength\",\"node:GeometryNodeCurveOfPoint\",\"node:GeometryNodeCurvePrimitiveBezierSegment\",\"node:GeometryNodeCurvePrimitiveCircle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1191-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1192-000", + "phase": "1192", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1191-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1192", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1192-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-P1192-001", + "phase": "1192", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1192-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1192-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadrilateral.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadratic_bezier.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_set_handle_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_spiral.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.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": [ + "GeometryNodeCurvePrimitiveLine type is read from Blender Main", + "GeometryNodeCurvePrimitiveQuadrilateral type is read from Blender Main", + "GeometryNodeCurveQuadraticBezier type is read from Blender Main", + "GeometryNodeCurveSetHandles type is read from Blender Main", + "GeometryNodeCurveSpiral 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-P1192-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1192-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurvePrimitiveLine\",\"GeometryNodeCurvePrimitiveQuadrilateral\",\"GeometryNodeCurveQuadraticBezier\",\"GeometryNodeCurveSetHandles\",\"GeometryNodeCurveSpiral\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurvePrimitiveLine\",\"node:GeometryNodeCurvePrimitiveQuadrilateral\",\"node:GeometryNodeCurveQuadraticBezier\",\"node:GeometryNodeCurveSetHandles\",\"node:GeometryNodeCurveSpiral\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1192-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1193-000", + "phase": "1193", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1192-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1193", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1193-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-P1193-001", + "phase": "1193", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1193-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1193-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curves_to_grease_pencil.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.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": [ + "GeometryNodeCurveSplineType type is read from Blender Main", + "GeometryNodeCurveStar type is read from Blender Main", + "GeometryNodeCurveToMesh type is read from Blender Main", + "GeometryNodeCurveToPoints type is read from Blender Main", + "GeometryNodeCurvesToGreasePencil 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-P1193-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1193-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurveSplineType\",\"GeometryNodeCurveStar\",\"GeometryNodeCurveToMesh\",\"GeometryNodeCurveToPoints\",\"GeometryNodeCurvesToGreasePencil\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurveSplineType\",\"node:GeometryNodeCurveStar\",\"node:GeometryNodeCurveToMesh\",\"node:GeometryNodeCurveToPoints\",\"node:GeometryNodeCurvesToGreasePencil\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1193-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1194-000", + "phase": "1194", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1193-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1194", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1194-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-P1194-001", + "phase": "1194", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1194-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1194-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8f6105d06959322c.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": [ + "GeometryNodeDeformCurvesOnSurface type is read from Blender Main", + "GeometryNodeDeleteGeometry type is read from Blender Main", + "GeometryNodeDistributePointsInGrid type is read from Blender Main", + "GeometryNodeDistributePointsInVolume type is read from Blender Main", + "GeometryNodeDistributePointsOnFaces 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-P1194-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1194-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-8f6105d06959322c.blend WBV2_BATCH_TYPES='[\"GeometryNodeDeformCurvesOnSurface\",\"GeometryNodeDeleteGeometry\",\"GeometryNodeDistributePointsInGrid\",\"GeometryNodeDistributePointsInVolume\",\"GeometryNodeDistributePointsOnFaces\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeDeformCurvesOnSurface\",\"node:GeometryNodeDeleteGeometry\",\"node:GeometryNodeDistributePointsInGrid\",\"node:GeometryNodeDistributePointsInVolume\",\"node:GeometryNodeDistributePointsOnFaces\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1194-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1195-000", + "phase": "1195", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1194-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1195", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1195-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-P1195-001", + "phase": "1195", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1195-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1195-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.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": [ + "GeometryNodeDualMesh type is read from Blender Main", + "GeometryNodeDuplicateElements type is read from Blender Main", + "GeometryNodeEdgePathsToCurves type is read from Blender Main", + "GeometryNodeEdgePathsToSelection type is read from Blender Main", + "GeometryNodeEdgesOfCorner 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-P1195-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1195-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.blend WBV2_BATCH_TYPES='[\"GeometryNodeDualMesh\",\"GeometryNodeDuplicateElements\",\"GeometryNodeEdgePathsToCurves\",\"GeometryNodeEdgePathsToSelection\",\"GeometryNodeEdgesOfCorner\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeDualMesh\",\"node:GeometryNodeDuplicateElements\",\"node:GeometryNodeEdgePathsToCurves\",\"node:GeometryNodeEdgePathsToSelection\",\"node:GeometryNodeEdgesOfCorner\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1195-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1196-000", + "phase": "1196", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1195-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1196", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1196-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-P1196-001", + "phase": "1196", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1196-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1196-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edges_to_face_groups.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.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": [ + "GeometryNodeEdgesOfVertex type is read from Blender Main", + "GeometryNodeEdgesToFaceGroups type is read from Blender Main", + "GeometryNodeExtrudeMesh type is read from Blender Main", + "GeometryNodeFaceOfCorner type is read from Blender Main", + "GeometryNodeFieldAtIndex 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-P1196-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1196-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.blend WBV2_BATCH_TYPES='[\"GeometryNodeEdgesOfVertex\",\"GeometryNodeEdgesToFaceGroups\",\"GeometryNodeExtrudeMesh\",\"GeometryNodeFaceOfCorner\",\"GeometryNodeFieldAtIndex\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeEdgesOfVertex\",\"node:GeometryNodeEdgesToFaceGroups\",\"node:GeometryNodeExtrudeMesh\",\"node:GeometryNodeFaceOfCorner\",\"node:GeometryNodeFieldAtIndex\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1196-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1197-000", + "phase": "1197", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1196-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1197", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1197-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-P1197-001", + "phase": "1197", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1197-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1197-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_average.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.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": [ + "GeometryNodeFieldAverage type is read from Blender Main", + "GeometryNodeFieldMinAndMax type is read from Blender Main", + "GeometryNodeFieldOnDomain type is read from Blender Main", + "GeometryNodeFieldToGrid type is read from Blender Main", + "GeometryNodeFieldToList 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-P1197-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1197-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.blend WBV2_BATCH_TYPES='[\"GeometryNodeFieldAverage\",\"GeometryNodeFieldMinAndMax\",\"GeometryNodeFieldOnDomain\",\"GeometryNodeFieldToGrid\",\"GeometryNodeFieldToList\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeFieldAverage\",\"node:GeometryNodeFieldMinAndMax\",\"node:GeometryNodeFieldOnDomain\",\"node:GeometryNodeFieldToGrid\",\"node:GeometryNodeFieldToList\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1197-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1198-000", + "phase": "1198", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1197-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1198", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1198-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-P1198-001", + "phase": "1198", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1198-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1198-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_filter_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6581c99986be795f.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": [ + "GeometryNodeFieldVariance type is read from Blender Main", + "GeometryNodeFillCurve type is read from Blender Main", + "GeometryNodeFilletCurve type is read from Blender Main", + "GeometryNodeFilterList type is read from Blender Main", + "GeometryNodeFlipFaces 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-P1198-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1198-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6581c99986be795f.blend WBV2_BATCH_TYPES='[\"GeometryNodeFieldVariance\",\"GeometryNodeFillCurve\",\"GeometryNodeFilletCurve\",\"GeometryNodeFilterList\",\"GeometryNodeFlipFaces\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeFieldVariance\",\"node:GeometryNodeFillCurve\",\"node:GeometryNodeFilletCurve\",\"node:GeometryNodeFilterList\",\"node:GeometryNodeFlipFaces\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1198-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1199-000", + "phase": "1199", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1198-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1199", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1199-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-P1199-001", + "phase": "1199", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1199-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1199-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_geometry_to_instance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_attribute_names.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_bundle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-240d704df4420718.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": [ + "GeometryNodeForeachGeometryElementInput type is read from Blender Main", + "GeometryNodeForeachGeometryElementOutput type is read from Blender Main", + "GeometryNodeGeometryToInstance type is read from Blender Main", + "GeometryNodeGetAttributeNames type is read from Blender Main", + "GeometryNodeGetGeometryBundle 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-P1199-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1199-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-240d704df4420718.blend WBV2_BATCH_TYPES='[\"GeometryNodeForeachGeometryElementInput\",\"GeometryNodeForeachGeometryElementOutput\",\"GeometryNodeGeometryToInstance\",\"GeometryNodeGetAttributeNames\",\"GeometryNodeGetGeometryBundle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeForeachGeometryElementInput\",\"node:GeometryNodeForeachGeometryElementOutput\",\"node:GeometryNodeGeometryToInstance\",\"node:GeometryNodeGetAttributeNames\",\"node:GeometryNodeGetGeometryBundle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1199-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1200-000", + "phase": "1200", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1199-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1200", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1200-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-P1200-001", + "phase": "1200", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1200-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1200-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_component.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_dial.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_linear.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_transform.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.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": [ + "GeometryNodeGetGeometryComponent type is read from Blender Main", + "GeometryNodeGetNamedGrid type is read from Blender Main", + "GeometryNodeGizmoDial type is read from Blender Main", + "GeometryNodeGizmoLinear type is read from Blender Main", + "GeometryNodeGizmoTransform 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-P1200-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1200-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.blend WBV2_BATCH_TYPES='[\"GeometryNodeGetGeometryComponent\",\"GeometryNodeGetNamedGrid\",\"GeometryNodeGizmoDial\",\"GeometryNodeGizmoLinear\",\"GeometryNodeGizmoTransform\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGetGeometryComponent\",\"node:GeometryNodeGetNamedGrid\",\"node:GeometryNodeGizmoDial\",\"node:GeometryNodeGizmoLinear\",\"node:GeometryNodeGizmoTransform\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1200-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1201-000", + "phase": "1201", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1200-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1201", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1201-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-P1201-001", + "phase": "1201", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1201-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1201-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grease_pencil_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_advect.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_clip.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_curl.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_dilate_erode.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.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": [ + "GeometryNodeGreasePencilToCurves type is read from Blender Main", + "GeometryNodeGridAdvect type is read from Blender Main", + "GeometryNodeGridClip type is read from Blender Main", + "GeometryNodeGridCurl type is read from Blender Main", + "GeometryNodeGridDilateAndErode 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-P1201-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1201-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.blend WBV2_BATCH_TYPES='[\"GeometryNodeGreasePencilToCurves\",\"GeometryNodeGridAdvect\",\"GeometryNodeGridClip\",\"GeometryNodeGridCurl\",\"GeometryNodeGridDilateAndErode\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGreasePencilToCurves\",\"node:GeometryNodeGridAdvect\",\"node:GeometryNodeGridClip\",\"node:GeometryNodeGridCurl\",\"node:GeometryNodeGridDilateAndErode\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1201-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1202-000", + "phase": "1202", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1201-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1202", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1202-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-P1202-001", + "phase": "1202", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1202-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1202-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_divergence.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_gradient.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_mean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.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": [ + "GeometryNodeGridDivergence type is read from Blender Main", + "GeometryNodeGridGradient type is read from Blender Main", + "GeometryNodeGridInfo type is read from Blender Main", + "GeometryNodeGridLaplacian type is read from Blender Main", + "GeometryNodeGridMean 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-P1202-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1202-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.blend WBV2_BATCH_TYPES='[\"GeometryNodeGridDivergence\",\"GeometryNodeGridGradient\",\"GeometryNodeGridInfo\",\"GeometryNodeGridLaplacian\",\"GeometryNodeGridMean\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGridDivergence\",\"node:GeometryNodeGridGradient\",\"node:GeometryNodeGridInfo\",\"node:GeometryNodeGridLaplacian\",\"node:GeometryNodeGridMean\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1202-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1203-000", + "phase": "1203", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1202-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1203", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1203-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-P1203-001", + "phase": "1203", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1203-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1203-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_median.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_prune.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_voxelize.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.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": [ + "GeometryNodeGridMedian type is read from Blender Main", + "GeometryNodeGridPrune type is read from Blender Main", + "GeometryNodeGridToMesh type is read from Blender Main", + "GeometryNodeGridToPoints type is read from Blender Main", + "GeometryNodeGridVoxelize 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-P1203-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1203-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.blend WBV2_BATCH_TYPES='[\"GeometryNodeGridMedian\",\"GeometryNodeGridPrune\",\"GeometryNodeGridToMesh\",\"GeometryNodeGridToPoints\",\"GeometryNodeGridVoxelize\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGridMedian\",\"node:GeometryNodeGridPrune\",\"node:GeometryNodeGridToMesh\",\"node:GeometryNodeGridToPoints\",\"node:GeometryNodeGridVoxelize\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1203-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1204-000", + "phase": "1204", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1203-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1204", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1204-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-P1204-001", + "phase": "1204", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1204-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1204-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_csv.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_obj.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_ply.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_stl.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.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": [ + "GeometryNodeImageTexture type is read from Blender Main", + "GeometryNodeImportCSV type is read from Blender Main", + "GeometryNodeImportOBJ type is read from Blender Main", + "GeometryNodeImportPLY type is read from Blender Main", + "GeometryNodeImportSTL 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-P1204-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1204-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.blend WBV2_BATCH_TYPES='[\"GeometryNodeImageTexture\",\"GeometryNodeImportCSV\",\"GeometryNodeImportOBJ\",\"GeometryNodeImportPLY\",\"GeometryNodeImportSTL\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeImageTexture\",\"node:GeometryNodeImportCSV\",\"node:GeometryNodeImportOBJ\",\"node:GeometryNodeImportPLY\",\"node:GeometryNodeImportSTL\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1204-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1205-000", + "phase": "1205", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1204-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1205", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1205-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-P1205-001", + "phase": "1205", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1205-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1205-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_text.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_vdb.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_of_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.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": [ + "GeometryNodeImportText type is read from Blender Main", + "GeometryNodeImportVDB type is read from Blender Main", + "GeometryNodeIndexOfNearest type is read from Blender Main", + "GeometryNodeIndexSwitch type is read from Blender Main", + "GeometryNodeInputActiveCamera 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-P1205-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1205-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.blend WBV2_BATCH_TYPES='[\"GeometryNodeImportText\",\"GeometryNodeImportVDB\",\"GeometryNodeIndexOfNearest\",\"GeometryNodeIndexSwitch\",\"GeometryNodeInputActiveCamera\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeImportText\",\"node:GeometryNodeImportVDB\",\"node:GeometryNodeIndexOfNearest\",\"node:GeometryNodeIndexSwitch\",\"node:GeometryNodeInputActiveCamera\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1205-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1206-000", + "phase": "1206", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1205-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1206", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1206-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-P1206-001", + "phase": "1206", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1206-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1206-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_collection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_edge_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_font.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-150a227b3433d301.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": [ + "GeometryNodeInputCollection type is read from Blender Main", + "GeometryNodeInputCurveHandlePositions type is read from Blender Main", + "GeometryNodeInputCurveTilt type is read from Blender Main", + "GeometryNodeInputEdgeSmooth type is read from Blender Main", + "GeometryNodeInputFont 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-P1206-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1206-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-150a227b3433d301.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputCollection\",\"GeometryNodeInputCurveHandlePositions\",\"GeometryNodeInputCurveTilt\",\"GeometryNodeInputEdgeSmooth\",\"GeometryNodeInputFont\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputCollection\",\"node:GeometryNodeInputCurveHandlePositions\",\"node:GeometryNodeInputCurveTilt\",\"node:GeometryNodeInputEdgeSmooth\",\"node:GeometryNodeInputFont\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1206-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1207-000", + "phase": "1207", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1206-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1207", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1207-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-P1207-001", + "phase": "1207", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1207-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1207-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_id.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_bounds.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_reference.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.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": [ + "GeometryNodeInputID type is read from Blender Main", + "GeometryNodeInputImage type is read from Blender Main", + "GeometryNodeInputIndex type is read from Blender Main", + "GeometryNodeInputInstanceBounds type is read from Blender Main", + "GeometryNodeInputInstanceReference 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-P1207-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1207-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputID\",\"GeometryNodeInputImage\",\"GeometryNodeInputIndex\",\"GeometryNodeInputInstanceBounds\",\"GeometryNodeInputInstanceReference\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputID\",\"node:GeometryNodeInputImage\",\"node:GeometryNodeInputIndex\",\"node:GeometryNodeInputInstanceBounds\",\"node:GeometryNodeInputInstanceReference\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1207-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1208-000", + "phase": "1208", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1207-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1208", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1208-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-P1208-001", + "phase": "1208", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1208-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1208-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_scale.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_angle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.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": [ + "GeometryNodeInputInstanceRotation type is read from Blender Main", + "GeometryNodeInputInstanceScale type is read from Blender Main", + "GeometryNodeInputMaterial type is read from Blender Main", + "GeometryNodeInputMaterialIndex type is read from Blender Main", + "GeometryNodeInputMeshEdgeAngle 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-P1208-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1208-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputInstanceRotation\",\"GeometryNodeInputInstanceScale\",\"GeometryNodeInputMaterial\",\"GeometryNodeInputMaterialIndex\",\"GeometryNodeInputMeshEdgeAngle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputInstanceRotation\",\"node:GeometryNodeInputInstanceScale\",\"node:GeometryNodeInputMaterial\",\"node:GeometryNodeInputMaterialIndex\",\"node:GeometryNodeInputMeshEdgeAngle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1208-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1209-000", + "phase": "1209", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1208-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1209", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1209-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-P1209-001", + "phase": "1209", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1209-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1209-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_area.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_neighbors.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e28f27c297406a24.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": [ + "GeometryNodeInputMeshEdgeNeighbors type is read from Blender Main", + "GeometryNodeInputMeshEdgeVertices type is read from Blender Main", + "GeometryNodeInputMeshFaceArea type is read from Blender Main", + "GeometryNodeInputMeshFaceIsPlanar type is read from Blender Main", + "GeometryNodeInputMeshFaceNeighbors 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-P1209-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1209-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e28f27c297406a24.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputMeshEdgeNeighbors\",\"GeometryNodeInputMeshEdgeVertices\",\"GeometryNodeInputMeshFaceArea\",\"GeometryNodeInputMeshFaceIsPlanar\",\"GeometryNodeInputMeshFaceNeighbors\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputMeshEdgeNeighbors\",\"node:GeometryNodeInputMeshEdgeVertices\",\"node:GeometryNodeInputMeshFaceArea\",\"node:GeometryNodeInputMeshFaceIsPlanar\",\"node:GeometryNodeInputMeshFaceNeighbors\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1209-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1210-000", + "phase": "1210", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1209-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1210", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1210-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-P1210-001", + "phase": "1210", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1210-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1210-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_island.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_vertex_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_layer_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.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": [ + "GeometryNodeInputMeshIsland type is read from Blender Main", + "GeometryNodeInputMeshVertexNeighbors type is read from Blender Main", + "GeometryNodeInputNamedAttribute type is read from Blender Main", + "GeometryNodeInputNamedLayerSelection type is read from Blender Main", + "GeometryNodeInputNormal 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-P1210-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1210-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputMeshIsland\",\"GeometryNodeInputMeshVertexNeighbors\",\"GeometryNodeInputNamedAttribute\",\"GeometryNodeInputNamedLayerSelection\",\"GeometryNodeInputNormal\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputMeshIsland\",\"node:GeometryNodeInputMeshVertexNeighbors\",\"node:GeometryNodeInputNamedAttribute\",\"node:GeometryNodeInputNamedLayerSelection\",\"node:GeometryNodeInputNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1210-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1211-000", + "phase": "1211", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1210-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1211", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1211-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-P1211-001", + "phase": "1211", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1211-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1211-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_align_rotation_to_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axes_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_combine_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_euler_to_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.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": [ + "FunctionNodeAlignRotationToVector type is read from Blender Main", + "FunctionNodeAxesToRotation type is read from Blender Main", + "FunctionNodeAxisAngleToRotation type is read from Blender Main", + "FunctionNodeCombineMatrix type is read from Blender Main", + "FunctionNodeEulerToRotation 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-P1211-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1211-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.blend WBV2_BATCH_TYPES='[\"FunctionNodeAlignRotationToVector\",\"FunctionNodeAxesToRotation\",\"FunctionNodeAxisAngleToRotation\",\"FunctionNodeCombineMatrix\",\"FunctionNodeEulerToRotation\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeAlignRotationToVector\",\"node:FunctionNodeAxesToRotation\",\"node:FunctionNodeAxisAngleToRotation\",\"node:FunctionNodeCombineMatrix\",\"node:FunctionNodeEulerToRotation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1211-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1212-000", + "phase": "1212", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1211-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1212", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1212-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-P1212-001", + "phase": "1212", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1212-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1212-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_find_in_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_format_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_bool.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.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": [ + "FunctionNodeFindInString type is read from Blender Main", + "FunctionNodeFormatString type is read from Blender Main", + "FunctionNodeInputBool type is read from Blender Main", + "FunctionNodeInputInt type is read from Blender Main", + "FunctionNodeInputIntVector 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-P1212-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1212-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.blend WBV2_BATCH_TYPES='[\"FunctionNodeFindInString\",\"FunctionNodeFormatString\",\"FunctionNodeInputBool\",\"FunctionNodeInputInt\",\"FunctionNodeInputIntVector\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeFindInString\",\"node:FunctionNodeFormatString\",\"node:FunctionNodeInputBool\",\"node:FunctionNodeInputInt\",\"node:FunctionNodeInputIntVector\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1212-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1213-000", + "phase": "1213", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1212-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1213", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1213-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-P1213-001", + "phase": "1213", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1213-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1213-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_menu.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_special_characters.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.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": [ + "FunctionNodeInputMenu type is read from Blender Main", + "FunctionNodeInputRotation type is read from Blender Main", + "FunctionNodeInputSpecialCharacters type is read from Blender Main", + "FunctionNodeInputString type is read from Blender Main", + "FunctionNodeInputVector 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-P1213-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1213-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.blend WBV2_BATCH_TYPES='[\"FunctionNodeInputMenu\",\"FunctionNodeInputRotation\",\"FunctionNodeInputSpecialCharacters\",\"FunctionNodeInputString\",\"FunctionNodeInputVector\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeInputMenu\",\"node:FunctionNodeInputRotation\",\"node:FunctionNodeInputSpecialCharacters\",\"node:FunctionNodeInputString\",\"node:FunctionNodeInputVector\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1213-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1214-000", + "phase": "1214", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1213-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1214", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1214-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-P1214-001", + "phase": "1214", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1214-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1214-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_match_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_determinant.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.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": [ + "FunctionNodeInvertMatrix type is read from Blender Main", + "FunctionNodeInvertRotation type is read from Blender Main", + "FunctionNodeMatchString type is read from Blender Main", + "FunctionNodeMatrixDeterminant type is read from Blender Main", + "FunctionNodeMatrixMultiply 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-P1214-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1214-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.blend WBV2_BATCH_TYPES='[\"FunctionNodeInvertMatrix\",\"FunctionNodeInvertRotation\",\"FunctionNodeMatchString\",\"FunctionNodeMatrixDeterminant\",\"FunctionNodeMatrixMultiply\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeInvertMatrix\",\"node:FunctionNodeInvertRotation\",\"node:FunctionNodeMatchString\",\"node:FunctionNodeMatrixDeterminant\",\"node:FunctionNodeMatrixMultiply\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1214-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1215-000", + "phase": "1215", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1214-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1215", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1215-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-P1215-001", + "phase": "1215", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1215-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1215-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.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": [ + "FunctionNodeProjectPoint type is read from Blender Main", + "FunctionNodeQuaternionToRotation type is read from Blender Main", + "FunctionNodeReplaceString type is read from Blender Main", + "FunctionNodeReverseString type is read from Blender Main", + "FunctionNodeRotateRotation 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-P1215-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1215-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend WBV2_BATCH_TYPES='[\"FunctionNodeProjectPoint\",\"FunctionNodeQuaternionToRotation\",\"FunctionNodeReplaceString\",\"FunctionNodeReverseString\",\"FunctionNodeRotateRotation\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeProjectPoint\",\"node:FunctionNodeQuaternionToRotation\",\"node:FunctionNodeReplaceString\",\"node:FunctionNodeReverseString\",\"node:FunctionNodeRotateRotation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1215-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + } + ] +} diff --git a/tests/golden/WBV2-P1215-001/geometry-node-reader-production.json b/tests/golden/WBV2-P1215-001/geometry-node-reader-production.json new file mode 100644 index 000000000..10926d52e --- /dev/null +++ b/tests/golden/WBV2-P1215-001/geometry-node-reader-production.json @@ -0,0 +1,43 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1215-001", + "operation": "GEOMETRY_NODE_MAIN_READER_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend", + "fixtureSha256": "395edcd8cfdcba57552bf96ae34cab0862824495099baf1e47a8815eac1d93c8", + "sourceUnits": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "expectedTypes": [ + "FunctionNodeProjectPoint", + "FunctionNodeQuaternionToRotation", + "FunctionNodeReplaceString", + "FunctionNodeReverseString", + "FunctionNodeRotateRotation" + ], + "graphNames": [ + "WBV2 Geometry Batch" + ], + "nodeTypes": [ + "NodeGroupOutput", + "NodeGroupInput", + "FunctionNodeQuaternionToRotation", + "FunctionNodeProjectPoint", + "FunctionNodeRotateRotation", + "FunctionNodeReverseString", + "FunctionNodeReplaceString" + ], + "nodeCount": 7, + "linkCount": 0, + "defaultCount": 16, + "unsupportedPreserved": false, + "stable": true, + "hashes": [ + "14461b14e14306ac56d421f9a1d504345f795d9441423223cda5f9a3dca2a8f9" + ] +} diff --git a/tests/golden/WBV2-P1215-001/manifest.json b/tests/golden/WBV2-P1215-001/manifest.json new file mode 100644 index 000000000..6ebab2f48 --- /dev/null +++ b/tests/golden/WBV2-P1215-001/manifest.json @@ -0,0 +1,116 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1215-001", + "parentTask": "WBV2-P1215-000", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "taskClass": "MODULE", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "BLENDER_WEB_FUNCTION_MODULE", + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1215-000/manifest.json", + "sha256": "7987671569e78cfbec0a7b8a2c4cba073b4f479f024ccf0303a9ce9ee8606962" + }, + "source1": { + "path": "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "sha256": "621d76ce12874e259779702067f7a7647f43493569053cf13ccb98725ea1a2db" + }, + "source2": { + "path": "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "sha256": "ed42cf3afdaf9630e64ecced43d99a8b5effe83d5b0bd3b86d6396ebf4317da8" + }, + "source3": { + "path": "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "sha256": "df8499927d23296764fb9d91315cb8333ce746bab8cc4e1c05a46093bce4d7a0" + }, + "source4": { + "path": "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "sha256": "bdd9932b56b35d76939b91218efa8384a264011195067a0d4e1b1c8bfe3783e7" + }, + "source5": { + "path": "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "sha256": "1dfd4d1932d753f5a37702164d38cd2173f4fe7c185f46cf0da5b8a48b61031e" + }, + "source6": { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "sha256": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "source7": { + "path": "web/tests/e2e/geometry-node-main-reader.spec.ts", + "sha256": "066e205d7a329fe96b4a344f052034790563447edd8d9eb25afd730618a26f84" + }, + "source8": { + "path": "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend", + "sha256": "395edcd8cfdcba57552bf96ae34cab0862824495099baf1e47a8815eac1d93c8" + }, + "source9": { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "sha256": "66fc59cba55a8c17d398b74d12ea4a9f09746c0f30c40f579c44aa34956e3072" + }, + "evidence1": { + "path": "tests/golden/WBV2-P1215-001/geometry-node-reader-production.json", + "sha256": "4f0abb32228bb5ba6d720f1b49bc1e9d0bfe2f13cc912be3650b4f3ed3b05eec" + }, + "moduleReceipt": { + "path": "tests/golden/WBV2-P1215-001/module-receipt.json", + "sha256": "6ed99d3045db19ebcc8a17899d16fbaf4e92d4bf67f310b55dd806c7bea2a844" + }, + "status": { + "path": "docs/status/WBV2-P1215-001.md", + "sha256": "e43bd966fa6ad84d7636a5d7220ccbabb76c32553aa6865a862ca27e7dce3d8d" + }, + "log": { + "path": "tests/golden/WBV2-P1215-001/module-run.log", + "sha256": "adde39a2122ccc8c96b06ca8d1e101bd87b42fa88a12eb66773b4c5acfb22361" + }, + "plan": { + "path": "tests/golden/WBV2-P1215-000/module-execution-plan.json", + "sha256": "669ee8b4e5fc8d67ca74887e8ca16d100db30f9ecbf6530f3a0827911db1610f" + }, + "taskContext": { + "path": "tests/golden/WBV2-P1215-001/task-context.json", + "sha256": "61ec27071c9fcb90351d58f94d5c37d28c700a2706313942e2f8cafe9ce7e928" + } + }, + "assertions": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "sourceBacked": true, + "positiveCases": 7, + "negativeCases": 3, + "recoveryCases": 3, + "commandCount": 4, + "reusedReceiptCount": 1, + "sourceUnchanged": true, + "fullFamilyParity": false, + "dynamicInventoryPath": "tests/golden/WBV2/dynamic-inventory.json", + "dynamicSourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 753, + "dynamicUnverifiedUnits": 2992, + "planningEstimate": 5200, + "historicalInventoryTotal": 6900, + "historicalEffectiveCompleted": 290, + "historicalEffectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1215-001/module-receipt.json b/tests/golden/WBV2-P1215-001/module-receipt.json new file mode 100644 index 000000000..c743e911b --- /dev/null +++ b/tests/golden/WBV2-P1215-001/module-receipt.json @@ -0,0 +1,154 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1215-001", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16, + "commandCount": 4, + "readCommandCount": 0, + "withinBudget": true + }, + "status": "PASS", + "source": { + "paths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "auditedPaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp" + ], + "before": { + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc": "621d76ce12874e259779702067f7a7647f43493569053cf13ccb98725ea1a2db", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc": "ed42cf3afdaf9630e64ecced43d99a8b5effe83d5b0bd3b86d6396ebf4317da8", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc": "df8499927d23296764fb9d91315cb8333ce746bab8cc4e1c05a46093bce4d7a0", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc": "bdd9932b56b35d76939b91218efa8384a264011195067a0d4e1b1c8bfe3783e7", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc": "1dfd4d1932d753f5a37702164d38cd2173f4fe7c185f46cf0da5b8a48b61031e", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "after": { + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc": "621d76ce12874e259779702067f7a7647f43493569053cf13ccb98725ea1a2db", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc": "ed42cf3afdaf9630e64ecced43d99a8b5effe83d5b0bd3b86d6396ebf4317da8", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc": "df8499927d23296764fb9d91315cb8333ce746bab8cc4e1c05a46093bce4d7a0", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc": "bdd9932b56b35d76939b91218efa8384a264011195067a0d4e1b1c8bfe3783e7", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc": "1dfd4d1932d753f5a37702164d38cd2173f4fe7c185f46cf0da5b8a48b61031e", + "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": [ + "FunctionNodeProjectPoint type is read from Blender Main", + "FunctionNodeQuaternionToRotation type is read from Blender Main", + "FunctionNodeReplaceString type is read from Blender Main", + "FunctionNodeReverseString type is read from Blender Main", + "FunctionNodeRotateRotation 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": 147 + }, + { + "command": "npm --prefix web run typecheck", + "exitCode": 0, + "durationMs": 3368 + }, + { + "command": "npm --prefix web run build", + "exitCode": 0, + "durationMs": 3946 + }, + { + "command": "WBV2_BATCH_TASK=WBV2-P1215-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1215-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend WBV2_BATCH_TYPES='[\"FunctionNodeProjectPoint\",\"FunctionNodeQuaternionToRotation\",\"FunctionNodeReplaceString\",\"FunctionNodeReverseString\",\"FunctionNodeRotateRotation\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeProjectPoint\",\"node:FunctionNodeQuaternionToRotation\",\"node:FunctionNodeReplaceString\",\"node:FunctionNodeReverseString\",\"node:FunctionNodeRotateRotation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts", + "exitCode": 0, + "durationMs": 2615 + } + ], + "verification": { + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "chromiumOnly": true, + "fullFamilyParity": false + }, + "efficiency": { + "existingEvidenceReused": false, + "skippedCommands": 0, + "totalDurationMs": 10076, + "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": "9beee2b1a146cdbc6dd49f4cc3873f2d0f51ae9baebbb3cbec13f25fe9815d2d", + "sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "unitCount": 3745, + "planningEstimate": 5200, + "hardTarget": false, + "verifiedUnits": 753, + "unverifiedUnits": 2992 + } + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1215-001/module-run.log b/tests/golden/WBV2-P1215-001/module-run.log new file mode 100644 index 000000000..dd79ef354 --- /dev/null +++ b/tests/golden/WBV2-P1215-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 484ms +[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-P1215-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1215-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend WBV2_BATCH_TYPES='["FunctionNodeProjectPoint","FunctionNodeQuaternionToRotation","FunctionNodeReplaceString","FunctionNodeReverseString","FunctionNodeRotateRotation"]' WBV2_BATCH_UNITS='["node:FunctionNodeProjectPoint","node:FunctionNodeQuaternionToRotation","node:FunctionNodeReplaceString","node:FunctionNodeReverseString","node:FunctionNodeRotateRotation"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts + +> blender-web-editor@0.1.0-rc.1 test:e2e +> playwright test --config playwright.config.ts --workers=1 tests/e2e/geometry-node-main-reader.spec.ts + + +Running 1 test using 1 worker + + ✓ 1 tests/e2e/geometry-node-main-reader.spec.ts:14:1 › M10-01 production Worker preserves Main Geometry Node topology across save and reopen (1.5s) + + 1 passed (2.3s) +[WebServer] (node:1292140) 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:1292194) 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-P1215-001/task-context.json b/tests/golden/WBV2-P1215-001/task-context.json new file mode 100644 index 000000000..317379a55 --- /dev/null +++ b/tests/golden/WBV2-P1215-001/task-context.json @@ -0,0 +1,217 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1215-001", + "parentTask": "WBV2-P1215-000", + "status": "in_progress", + "goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 FunctionNodeProjectPoint, FunctionNodeQuaternionToRotation, FunctionNodeReplaceString, FunctionNodeReverseString, FunctionNodeRotateRotation 的真实 modifier/RNA 元数据。", + "scope": { + "gap": "capability:AUTO_GEOMETRY_NATIVE_NODE_READER", + "ownerFamily": "NODES", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P1215-001 --write" + ], + "inputPaths": [], + "inputMetadata": { + "docs/EXECUTION_QUEUE.md": { + "path": "docs/EXECUTION_QUEUE.md", + "exists": true, + "bytes": 4030, + "mtime_ns": "1788480125677919763", + "sha256": "d6f8c5d79bf2fe420848957d793c158fe5d3ea1daa5d49a59f733b710efe4edb" + }, + "docs/tasks/WBV2-P1215-001.md": { + "path": "docs/tasks/WBV2-P1215-001.md", + "exists": true, + "bytes": 2721, + "mtime_ns": "1788480115124506212", + "sha256": "47f1e0bd7014a04c4e0cdcd844202e30ef22682afc894257c9ef95136b6c4676" + }, + "tests/golden/WBV2-P1215-000/manifest.json": { + "path": "tests/golden/WBV2-P1215-000/manifest.json", + "exists": true, + "bytes": 1694, + "mtime_ns": "1788480115125177722", + "sha256": "7987671569e78cfbec0a7b8a2c4cba073b4f479f024ccf0303a9ce9ee8606962" + }, + "docs/status/WBV2-P1215-000.md": { + "path": "docs/status/WBV2-P1215-000.md", + "exists": true, + "bytes": 364, + "mtime_ns": "1788480115124670988", + "sha256": "d26583703e84ea5e4b9f7202e41a2c91d617d485cc875e8bc7288d6a757c1f6b" + } + }, + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 1095, + "contextRemainingTokens": 272 + }, + "source": { + "bytes": 8809, + "tokens": 2204 + }, + "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-geometry-0a8d3bb55b10e188.blend", + "bytes": 97900, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/geometry-node-main-reader.spec.ts", + "bytes": 3789, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1215-001/module-receipt.json", + "bytes": 7511, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1215-001/modifier-reader-batch-production.json", + "bytes": null, + "reason": "MISSING_PATH" + }, + { + "path": "tests/golden/WBV2-P1215-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P1215-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-P1215-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P1215-000/manifest.json", + "parentStatus": "docs/status/WBV2-P1215-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P1215-001.md", + "tests/golden/WBV2-P1215-000/manifest.json", + "docs/status/WBV2-P1215-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-P1215-000", + "parentTask": "WBV2-P1214-001", + "status": "done", + "nextTask": "WBV2-P1215-001", + "artifactCount": 4 + }, + "statusSummary": [ + "# WBV2-P1215-000 status", + "- task: `WBV2-P1215-000`; parent: `WBV2-P1214-001`; status: `done`", + "- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed", + "- source-backed batch authorized: `AUTO_GEOMETRY_NATIVE_NODE_READER` (5 units)", + "- dynamic inventory: `3745` units; verified `748`; unverified `2997`; bound delta `0`", + "- nextTask: `WBV2-P1215-001`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 2721, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 49, + "taskTokens": 681 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 4030, + "lines": 58, + "tokens": 1008 + }, + { + "path": "docs/tasks/WBV2-P1215-001.md", + "bytes": 2721, + "lines": 49, + "tokens": 681 + }, + { + "path": "tests/golden/WBV2-P1215-000/manifest.json", + "bytes": 1694, + "lines": 51, + "tokens": 424 + }, + { + "path": "docs/status/WBV2-P1215-000.md", + "bytes": 364, + "lines": 8, + "tokens": 91 + } + ], + "sourceTokens": 2204, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 2204, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3228, + "serializedContextTokens": 684, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index ed792441e..b257900b3 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -207,3 +207,5 @@ {"id":"WBV2-P1213-001","gapId":"AUTO_GEOMETRY_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1213","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-P1214-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1214","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} {"id":"WBV2-P1214-001","gapId":"AUTO_GEOMETRY_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1214","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-P1215-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1215","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} +{"id":"WBV2-P1215-001","gapId":"AUTO_GEOMETRY_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1215","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 9e1ffeabd..c1e3d0427 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-P1214-000/module-execution-plan.json","sha256":"027bf2ce485947022d7869269954d310bf6d3e41dc916834691571dfb51af431"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"602ffd40bcb1a7ec4fd9a83506147813eaffdead6ba5222904ce1b863d0cd3e2"},"taskCount":209,"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":"WBV2-P1171-000"},"WBV2-P1171-000":{"line":121,"offset":43379,"length":303,"previous":"WBV2-P1170-001","next":"WBV2-P1171-001"},"WBV2-P1171-001":{"line":122,"offset":43682,"length":366,"previous":"WBV2-P1171-000","next":"WBV2-P1172-000"},"WBV2-P1172-000":{"line":123,"offset":44048,"length":303,"previous":"WBV2-P1171-001","next":"WBV2-P1172-001"},"WBV2-P1172-001":{"line":124,"offset":44351,"length":366,"previous":"WBV2-P1172-000","next":"WBV2-P1173-000"},"WBV2-P1173-000":{"line":125,"offset":44717,"length":303,"previous":"WBV2-P1172-001","next":"WBV2-P1173-001"},"WBV2-P1173-001":{"line":126,"offset":45020,"length":366,"previous":"WBV2-P1173-000","next":"WBV2-P1174-000"},"WBV2-P1174-000":{"line":127,"offset":45386,"length":303,"previous":"WBV2-P1173-001","next":"WBV2-P1174-001"},"WBV2-P1174-001":{"line":128,"offset":45689,"length":366,"previous":"WBV2-P1174-000","next":"WBV2-P1175-000"},"WBV2-P1175-000":{"line":129,"offset":46055,"length":303,"previous":"WBV2-P1174-001","next":"WBV2-P1175-001"},"WBV2-P1175-001":{"line":130,"offset":46358,"length":366,"previous":"WBV2-P1175-000","next":"WBV2-P1176-000"},"WBV2-P1176-000":{"line":131,"offset":46724,"length":303,"previous":"WBV2-P1175-001","next":"WBV2-P1176-001"},"WBV2-P1176-001":{"line":132,"offset":47027,"length":364,"previous":"WBV2-P1176-000","next":"WBV2-P1177-000"},"WBV2-P1177-000":{"line":133,"offset":47391,"length":303,"previous":"WBV2-P1176-001","next":"WBV2-P1177-001"},"WBV2-P1177-001":{"line":134,"offset":47694,"length":364,"previous":"WBV2-P1177-000","next":"WBV2-P1178-000"},"WBV2-P1178-000":{"line":135,"offset":48058,"length":303,"previous":"WBV2-P1177-001","next":"WBV2-P1178-001"},"WBV2-P1178-001":{"line":136,"offset":48361,"length":364,"previous":"WBV2-P1178-000","next":"WBV2-P1179-000"},"WBV2-P1179-000":{"line":137,"offset":48725,"length":303,"previous":"WBV2-P1178-001","next":"WBV2-P1179-001"},"WBV2-P1179-001":{"line":138,"offset":49028,"length":364,"previous":"WBV2-P1179-000","next":"WBV2-P1180-000"},"WBV2-P1180-000":{"line":139,"offset":49392,"length":303,"previous":"WBV2-P1179-001","next":"WBV2-P1180-001"},"WBV2-P1180-001":{"line":140,"offset":49695,"length":364,"previous":"WBV2-P1180-000","next":"WBV2-P1181-000"},"WBV2-P1181-000":{"line":141,"offset":50059,"length":303,"previous":"WBV2-P1180-001","next":"WBV2-P1181-001"},"WBV2-P1181-001":{"line":142,"offset":50362,"length":364,"previous":"WBV2-P1181-000","next":"WBV2-P1182-000"},"WBV2-P1182-000":{"line":143,"offset":50726,"length":303,"previous":"WBV2-P1181-001","next":"WBV2-P1182-001"},"WBV2-P1182-001":{"line":144,"offset":51029,"length":364,"previous":"WBV2-P1182-000","next":"WBV2-P1183-000"},"WBV2-P1183-000":{"line":145,"offset":51393,"length":303,"previous":"WBV2-P1182-001","next":"WBV2-P1183-001"},"WBV2-P1183-001":{"line":146,"offset":51696,"length":364,"previous":"WBV2-P1183-000","next":"WBV2-P1184-000"},"WBV2-P1184-000":{"line":147,"offset":52060,"length":303,"previous":"WBV2-P1183-001","next":"WBV2-P1184-001"},"WBV2-P1184-001":{"line":148,"offset":52363,"length":364,"previous":"WBV2-P1184-000","next":"WBV2-P1185-000"},"WBV2-P1185-000":{"line":149,"offset":52727,"length":303,"previous":"WBV2-P1184-001","next":"WBV2-P1185-001"},"WBV2-P1185-001":{"line":150,"offset":53030,"length":364,"previous":"WBV2-P1185-000","next":"WBV2-P1186-000"},"WBV2-P1186-000":{"line":151,"offset":53394,"length":303,"previous":"WBV2-P1185-001","next":"WBV2-P1186-001"},"WBV2-P1186-001":{"line":152,"offset":53697,"length":364,"previous":"WBV2-P1186-000","next":"WBV2-P1187-000"},"WBV2-P1187-000":{"line":153,"offset":54061,"length":303,"previous":"WBV2-P1186-001","next":"WBV2-P1187-001"},"WBV2-P1187-001":{"line":154,"offset":54364,"length":364,"previous":"WBV2-P1187-000","next":"WBV2-P1188-000"},"WBV2-P1188-000":{"line":155,"offset":54728,"length":303,"previous":"WBV2-P1187-001","next":"WBV2-P1188-001"},"WBV2-P1188-001":{"line":156,"offset":55031,"length":364,"previous":"WBV2-P1188-000","next":"WBV2-P1189-000"},"WBV2-P1189-000":{"line":157,"offset":55395,"length":303,"previous":"WBV2-P1188-001","next":"WBV2-P1189-001"},"WBV2-P1189-001":{"line":158,"offset":55698,"length":364,"previous":"WBV2-P1189-000","next":"WBV2-P1190-000"},"WBV2-P1190-000":{"line":159,"offset":56062,"length":303,"previous":"WBV2-P1189-001","next":"WBV2-P1190-001"},"WBV2-P1190-001":{"line":160,"offset":56365,"length":364,"previous":"WBV2-P1190-000","next":"WBV2-P1191-000"},"WBV2-P1191-000":{"line":161,"offset":56729,"length":303,"previous":"WBV2-P1190-001","next":"WBV2-P1191-001"},"WBV2-P1191-001":{"line":162,"offset":57032,"length":364,"previous":"WBV2-P1191-000","next":"WBV2-P1192-000"},"WBV2-P1192-000":{"line":163,"offset":57396,"length":303,"previous":"WBV2-P1191-001","next":"WBV2-P1192-001"},"WBV2-P1192-001":{"line":164,"offset":57699,"length":364,"previous":"WBV2-P1192-000","next":"WBV2-P1193-000"},"WBV2-P1193-000":{"line":165,"offset":58063,"length":303,"previous":"WBV2-P1192-001","next":"WBV2-P1193-001"},"WBV2-P1193-001":{"line":166,"offset":58366,"length":364,"previous":"WBV2-P1193-000","next":"WBV2-P1194-000"},"WBV2-P1194-000":{"line":167,"offset":58730,"length":303,"previous":"WBV2-P1193-001","next":"WBV2-P1194-001"},"WBV2-P1194-001":{"line":168,"offset":59033,"length":364,"previous":"WBV2-P1194-000","next":"WBV2-P1195-000"},"WBV2-P1195-000":{"line":169,"offset":59397,"length":303,"previous":"WBV2-P1194-001","next":"WBV2-P1195-001"},"WBV2-P1195-001":{"line":170,"offset":59700,"length":364,"previous":"WBV2-P1195-000","next":"WBV2-P1196-000"},"WBV2-P1196-000":{"line":171,"offset":60064,"length":303,"previous":"WBV2-P1195-001","next":"WBV2-P1196-001"},"WBV2-P1196-001":{"line":172,"offset":60367,"length":364,"previous":"WBV2-P1196-000","next":"WBV2-P1197-000"},"WBV2-P1197-000":{"line":173,"offset":60731,"length":303,"previous":"WBV2-P1196-001","next":"WBV2-P1197-001"},"WBV2-P1197-001":{"line":174,"offset":61034,"length":364,"previous":"WBV2-P1197-000","next":"WBV2-P1198-000"},"WBV2-P1198-000":{"line":175,"offset":61398,"length":303,"previous":"WBV2-P1197-001","next":"WBV2-P1198-001"},"WBV2-P1198-001":{"line":176,"offset":61701,"length":364,"previous":"WBV2-P1198-000","next":"WBV2-P1199-000"},"WBV2-P1199-000":{"line":177,"offset":62065,"length":303,"previous":"WBV2-P1198-001","next":"WBV2-P1199-001"},"WBV2-P1199-001":{"line":178,"offset":62368,"length":364,"previous":"WBV2-P1199-000","next":"WBV2-P1200-000"},"WBV2-P1200-000":{"line":179,"offset":62732,"length":303,"previous":"WBV2-P1199-001","next":"WBV2-P1200-001"},"WBV2-P1200-001":{"line":180,"offset":63035,"length":364,"previous":"WBV2-P1200-000","next":"WBV2-P1201-000"},"WBV2-P1201-000":{"line":181,"offset":63399,"length":303,"previous":"WBV2-P1200-001","next":"WBV2-P1201-001"},"WBV2-P1201-001":{"line":182,"offset":63702,"length":364,"previous":"WBV2-P1201-000","next":"WBV2-P1202-000"},"WBV2-P1202-000":{"line":183,"offset":64066,"length":303,"previous":"WBV2-P1201-001","next":"WBV2-P1202-001"},"WBV2-P1202-001":{"line":184,"offset":64369,"length":364,"previous":"WBV2-P1202-000","next":"WBV2-P1203-000"},"WBV2-P1203-000":{"line":185,"offset":64733,"length":303,"previous":"WBV2-P1202-001","next":"WBV2-P1203-001"},"WBV2-P1203-001":{"line":186,"offset":65036,"length":364,"previous":"WBV2-P1203-000","next":"WBV2-P1204-000"},"WBV2-P1204-000":{"line":187,"offset":65400,"length":303,"previous":"WBV2-P1203-001","next":"WBV2-P1204-001"},"WBV2-P1204-001":{"line":188,"offset":65703,"length":364,"previous":"WBV2-P1204-000","next":"WBV2-P1205-000"},"WBV2-P1205-000":{"line":189,"offset":66067,"length":303,"previous":"WBV2-P1204-001","next":"WBV2-P1205-001"},"WBV2-P1205-001":{"line":190,"offset":66370,"length":364,"previous":"WBV2-P1205-000","next":"WBV2-P1206-000"},"WBV2-P1206-000":{"line":191,"offset":66734,"length":303,"previous":"WBV2-P1205-001","next":"WBV2-P1206-001"},"WBV2-P1206-001":{"line":192,"offset":67037,"length":364,"previous":"WBV2-P1206-000","next":"WBV2-P1207-000"},"WBV2-P1207-000":{"line":193,"offset":67401,"length":303,"previous":"WBV2-P1206-001","next":"WBV2-P1207-001"},"WBV2-P1207-001":{"line":194,"offset":67704,"length":364,"previous":"WBV2-P1207-000","next":"WBV2-P1208-000"},"WBV2-P1208-000":{"line":195,"offset":68068,"length":303,"previous":"WBV2-P1207-001","next":"WBV2-P1208-001"},"WBV2-P1208-001":{"line":196,"offset":68371,"length":364,"previous":"WBV2-P1208-000","next":"WBV2-P1209-000"},"WBV2-P1209-000":{"line":197,"offset":68735,"length":303,"previous":"WBV2-P1208-001","next":"WBV2-P1209-001"},"WBV2-P1209-001":{"line":198,"offset":69038,"length":364,"previous":"WBV2-P1209-000","next":"WBV2-P1210-000"},"WBV2-P1210-000":{"line":199,"offset":69402,"length":303,"previous":"WBV2-P1209-001","next":"WBV2-P1210-001"},"WBV2-P1210-001":{"line":200,"offset":69705,"length":364,"previous":"WBV2-P1210-000","next":"WBV2-P1211-000"},"WBV2-P1211-000":{"line":201,"offset":70069,"length":303,"previous":"WBV2-P1210-001","next":"WBV2-P1211-001"},"WBV2-P1211-001":{"line":202,"offset":70372,"length":364,"previous":"WBV2-P1211-000","next":"WBV2-P1212-000"},"WBV2-P1212-000":{"line":203,"offset":70736,"length":303,"previous":"WBV2-P1211-001","next":"WBV2-P1212-001"},"WBV2-P1212-001":{"line":204,"offset":71039,"length":364,"previous":"WBV2-P1212-000","next":"WBV2-P1213-000"},"WBV2-P1213-000":{"line":205,"offset":71403,"length":303,"previous":"WBV2-P1212-001","next":"WBV2-P1213-001"},"WBV2-P1213-001":{"line":206,"offset":71706,"length":364,"previous":"WBV2-P1213-000","next":"WBV2-P1214-000"},"WBV2-P1214-000":{"line":207,"offset":72070,"length":303,"previous":"WBV2-P1213-001","next":"WBV2-P1214-001"},"WBV2-P1214-001":{"line":208,"offset":72373,"length":364,"previous":"WBV2-P1214-000","next":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1215-000/module-execution-plan.json","sha256":"669ee8b4e5fc8d67ca74887e8ca16d100db30f9ecbf6530f3a0827911db1610f"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"84651087b4eed8cfd2deb374f6421ad842f8e6af942b7f492552021be8d3147e"},"taskCount":211,"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":"WBV2-P1171-000"},"WBV2-P1171-000":{"line":121,"offset":43379,"length":303,"previous":"WBV2-P1170-001","next":"WBV2-P1171-001"},"WBV2-P1171-001":{"line":122,"offset":43682,"length":366,"previous":"WBV2-P1171-000","next":"WBV2-P1172-000"},"WBV2-P1172-000":{"line":123,"offset":44048,"length":303,"previous":"WBV2-P1171-001","next":"WBV2-P1172-001"},"WBV2-P1172-001":{"line":124,"offset":44351,"length":366,"previous":"WBV2-P1172-000","next":"WBV2-P1173-000"},"WBV2-P1173-000":{"line":125,"offset":44717,"length":303,"previous":"WBV2-P1172-001","next":"WBV2-P1173-001"},"WBV2-P1173-001":{"line":126,"offset":45020,"length":366,"previous":"WBV2-P1173-000","next":"WBV2-P1174-000"},"WBV2-P1174-000":{"line":127,"offset":45386,"length":303,"previous":"WBV2-P1173-001","next":"WBV2-P1174-001"},"WBV2-P1174-001":{"line":128,"offset":45689,"length":366,"previous":"WBV2-P1174-000","next":"WBV2-P1175-000"},"WBV2-P1175-000":{"line":129,"offset":46055,"length":303,"previous":"WBV2-P1174-001","next":"WBV2-P1175-001"},"WBV2-P1175-001":{"line":130,"offset":46358,"length":366,"previous":"WBV2-P1175-000","next":"WBV2-P1176-000"},"WBV2-P1176-000":{"line":131,"offset":46724,"length":303,"previous":"WBV2-P1175-001","next":"WBV2-P1176-001"},"WBV2-P1176-001":{"line":132,"offset":47027,"length":364,"previous":"WBV2-P1176-000","next":"WBV2-P1177-000"},"WBV2-P1177-000":{"line":133,"offset":47391,"length":303,"previous":"WBV2-P1176-001","next":"WBV2-P1177-001"},"WBV2-P1177-001":{"line":134,"offset":47694,"length":364,"previous":"WBV2-P1177-000","next":"WBV2-P1178-000"},"WBV2-P1178-000":{"line":135,"offset":48058,"length":303,"previous":"WBV2-P1177-001","next":"WBV2-P1178-001"},"WBV2-P1178-001":{"line":136,"offset":48361,"length":364,"previous":"WBV2-P1178-000","next":"WBV2-P1179-000"},"WBV2-P1179-000":{"line":137,"offset":48725,"length":303,"previous":"WBV2-P1178-001","next":"WBV2-P1179-001"},"WBV2-P1179-001":{"line":138,"offset":49028,"length":364,"previous":"WBV2-P1179-000","next":"WBV2-P1180-000"},"WBV2-P1180-000":{"line":139,"offset":49392,"length":303,"previous":"WBV2-P1179-001","next":"WBV2-P1180-001"},"WBV2-P1180-001":{"line":140,"offset":49695,"length":364,"previous":"WBV2-P1180-000","next":"WBV2-P1181-000"},"WBV2-P1181-000":{"line":141,"offset":50059,"length":303,"previous":"WBV2-P1180-001","next":"WBV2-P1181-001"},"WBV2-P1181-001":{"line":142,"offset":50362,"length":364,"previous":"WBV2-P1181-000","next":"WBV2-P1182-000"},"WBV2-P1182-000":{"line":143,"offset":50726,"length":303,"previous":"WBV2-P1181-001","next":"WBV2-P1182-001"},"WBV2-P1182-001":{"line":144,"offset":51029,"length":364,"previous":"WBV2-P1182-000","next":"WBV2-P1183-000"},"WBV2-P1183-000":{"line":145,"offset":51393,"length":303,"previous":"WBV2-P1182-001","next":"WBV2-P1183-001"},"WBV2-P1183-001":{"line":146,"offset":51696,"length":364,"previous":"WBV2-P1183-000","next":"WBV2-P1184-000"},"WBV2-P1184-000":{"line":147,"offset":52060,"length":303,"previous":"WBV2-P1183-001","next":"WBV2-P1184-001"},"WBV2-P1184-001":{"line":148,"offset":52363,"length":364,"previous":"WBV2-P1184-000","next":"WBV2-P1185-000"},"WBV2-P1185-000":{"line":149,"offset":52727,"length":303,"previous":"WBV2-P1184-001","next":"WBV2-P1185-001"},"WBV2-P1185-001":{"line":150,"offset":53030,"length":364,"previous":"WBV2-P1185-000","next":"WBV2-P1186-000"},"WBV2-P1186-000":{"line":151,"offset":53394,"length":303,"previous":"WBV2-P1185-001","next":"WBV2-P1186-001"},"WBV2-P1186-001":{"line":152,"offset":53697,"length":364,"previous":"WBV2-P1186-000","next":"WBV2-P1187-000"},"WBV2-P1187-000":{"line":153,"offset":54061,"length":303,"previous":"WBV2-P1186-001","next":"WBV2-P1187-001"},"WBV2-P1187-001":{"line":154,"offset":54364,"length":364,"previous":"WBV2-P1187-000","next":"WBV2-P1188-000"},"WBV2-P1188-000":{"line":155,"offset":54728,"length":303,"previous":"WBV2-P1187-001","next":"WBV2-P1188-001"},"WBV2-P1188-001":{"line":156,"offset":55031,"length":364,"previous":"WBV2-P1188-000","next":"WBV2-P1189-000"},"WBV2-P1189-000":{"line":157,"offset":55395,"length":303,"previous":"WBV2-P1188-001","next":"WBV2-P1189-001"},"WBV2-P1189-001":{"line":158,"offset":55698,"length":364,"previous":"WBV2-P1189-000","next":"WBV2-P1190-000"},"WBV2-P1190-000":{"line":159,"offset":56062,"length":303,"previous":"WBV2-P1189-001","next":"WBV2-P1190-001"},"WBV2-P1190-001":{"line":160,"offset":56365,"length":364,"previous":"WBV2-P1190-000","next":"WBV2-P1191-000"},"WBV2-P1191-000":{"line":161,"offset":56729,"length":303,"previous":"WBV2-P1190-001","next":"WBV2-P1191-001"},"WBV2-P1191-001":{"line":162,"offset":57032,"length":364,"previous":"WBV2-P1191-000","next":"WBV2-P1192-000"},"WBV2-P1192-000":{"line":163,"offset":57396,"length":303,"previous":"WBV2-P1191-001","next":"WBV2-P1192-001"},"WBV2-P1192-001":{"line":164,"offset":57699,"length":364,"previous":"WBV2-P1192-000","next":"WBV2-P1193-000"},"WBV2-P1193-000":{"line":165,"offset":58063,"length":303,"previous":"WBV2-P1192-001","next":"WBV2-P1193-001"},"WBV2-P1193-001":{"line":166,"offset":58366,"length":364,"previous":"WBV2-P1193-000","next":"WBV2-P1194-000"},"WBV2-P1194-000":{"line":167,"offset":58730,"length":303,"previous":"WBV2-P1193-001","next":"WBV2-P1194-001"},"WBV2-P1194-001":{"line":168,"offset":59033,"length":364,"previous":"WBV2-P1194-000","next":"WBV2-P1195-000"},"WBV2-P1195-000":{"line":169,"offset":59397,"length":303,"previous":"WBV2-P1194-001","next":"WBV2-P1195-001"},"WBV2-P1195-001":{"line":170,"offset":59700,"length":364,"previous":"WBV2-P1195-000","next":"WBV2-P1196-000"},"WBV2-P1196-000":{"line":171,"offset":60064,"length":303,"previous":"WBV2-P1195-001","next":"WBV2-P1196-001"},"WBV2-P1196-001":{"line":172,"offset":60367,"length":364,"previous":"WBV2-P1196-000","next":"WBV2-P1197-000"},"WBV2-P1197-000":{"line":173,"offset":60731,"length":303,"previous":"WBV2-P1196-001","next":"WBV2-P1197-001"},"WBV2-P1197-001":{"line":174,"offset":61034,"length":364,"previous":"WBV2-P1197-000","next":"WBV2-P1198-000"},"WBV2-P1198-000":{"line":175,"offset":61398,"length":303,"previous":"WBV2-P1197-001","next":"WBV2-P1198-001"},"WBV2-P1198-001":{"line":176,"offset":61701,"length":364,"previous":"WBV2-P1198-000","next":"WBV2-P1199-000"},"WBV2-P1199-000":{"line":177,"offset":62065,"length":303,"previous":"WBV2-P1198-001","next":"WBV2-P1199-001"},"WBV2-P1199-001":{"line":178,"offset":62368,"length":364,"previous":"WBV2-P1199-000","next":"WBV2-P1200-000"},"WBV2-P1200-000":{"line":179,"offset":62732,"length":303,"previous":"WBV2-P1199-001","next":"WBV2-P1200-001"},"WBV2-P1200-001":{"line":180,"offset":63035,"length":364,"previous":"WBV2-P1200-000","next":"WBV2-P1201-000"},"WBV2-P1201-000":{"line":181,"offset":63399,"length":303,"previous":"WBV2-P1200-001","next":"WBV2-P1201-001"},"WBV2-P1201-001":{"line":182,"offset":63702,"length":364,"previous":"WBV2-P1201-000","next":"WBV2-P1202-000"},"WBV2-P1202-000":{"line":183,"offset":64066,"length":303,"previous":"WBV2-P1201-001","next":"WBV2-P1202-001"},"WBV2-P1202-001":{"line":184,"offset":64369,"length":364,"previous":"WBV2-P1202-000","next":"WBV2-P1203-000"},"WBV2-P1203-000":{"line":185,"offset":64733,"length":303,"previous":"WBV2-P1202-001","next":"WBV2-P1203-001"},"WBV2-P1203-001":{"line":186,"offset":65036,"length":364,"previous":"WBV2-P1203-000","next":"WBV2-P1204-000"},"WBV2-P1204-000":{"line":187,"offset":65400,"length":303,"previous":"WBV2-P1203-001","next":"WBV2-P1204-001"},"WBV2-P1204-001":{"line":188,"offset":65703,"length":364,"previous":"WBV2-P1204-000","next":"WBV2-P1205-000"},"WBV2-P1205-000":{"line":189,"offset":66067,"length":303,"previous":"WBV2-P1204-001","next":"WBV2-P1205-001"},"WBV2-P1205-001":{"line":190,"offset":66370,"length":364,"previous":"WBV2-P1205-000","next":"WBV2-P1206-000"},"WBV2-P1206-000":{"line":191,"offset":66734,"length":303,"previous":"WBV2-P1205-001","next":"WBV2-P1206-001"},"WBV2-P1206-001":{"line":192,"offset":67037,"length":364,"previous":"WBV2-P1206-000","next":"WBV2-P1207-000"},"WBV2-P1207-000":{"line":193,"offset":67401,"length":303,"previous":"WBV2-P1206-001","next":"WBV2-P1207-001"},"WBV2-P1207-001":{"line":194,"offset":67704,"length":364,"previous":"WBV2-P1207-000","next":"WBV2-P1208-000"},"WBV2-P1208-000":{"line":195,"offset":68068,"length":303,"previous":"WBV2-P1207-001","next":"WBV2-P1208-001"},"WBV2-P1208-001":{"line":196,"offset":68371,"length":364,"previous":"WBV2-P1208-000","next":"WBV2-P1209-000"},"WBV2-P1209-000":{"line":197,"offset":68735,"length":303,"previous":"WBV2-P1208-001","next":"WBV2-P1209-001"},"WBV2-P1209-001":{"line":198,"offset":69038,"length":364,"previous":"WBV2-P1209-000","next":"WBV2-P1210-000"},"WBV2-P1210-000":{"line":199,"offset":69402,"length":303,"previous":"WBV2-P1209-001","next":"WBV2-P1210-001"},"WBV2-P1210-001":{"line":200,"offset":69705,"length":364,"previous":"WBV2-P1210-000","next":"WBV2-P1211-000"},"WBV2-P1211-000":{"line":201,"offset":70069,"length":303,"previous":"WBV2-P1210-001","next":"WBV2-P1211-001"},"WBV2-P1211-001":{"line":202,"offset":70372,"length":364,"previous":"WBV2-P1211-000","next":"WBV2-P1212-000"},"WBV2-P1212-000":{"line":203,"offset":70736,"length":303,"previous":"WBV2-P1211-001","next":"WBV2-P1212-001"},"WBV2-P1212-001":{"line":204,"offset":71039,"length":364,"previous":"WBV2-P1212-000","next":"WBV2-P1213-000"},"WBV2-P1213-000":{"line":205,"offset":71403,"length":303,"previous":"WBV2-P1212-001","next":"WBV2-P1213-001"},"WBV2-P1213-001":{"line":206,"offset":71706,"length":364,"previous":"WBV2-P1213-000","next":"WBV2-P1214-000"},"WBV2-P1214-000":{"line":207,"offset":72070,"length":303,"previous":"WBV2-P1213-001","next":"WBV2-P1214-001"},"WBV2-P1214-001":{"line":208,"offset":72373,"length":364,"previous":"WBV2-P1214-000","next":"WBV2-P1215-000"},"WBV2-P1215-000":{"line":209,"offset":72737,"length":303,"previous":"WBV2-P1214-001","next":"WBV2-P1215-001"},"WBV2-P1215-001":{"line":210,"offset":73040,"length":364,"previous":"WBV2-P1215-000","next":null}}}