From 10640aeb3ca3685d642237ab2f743c2dd2474175 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Thu, 20 Aug 2026 06:02:43 -0400 Subject: [PATCH] Govern task context and advance execution pointer --- AGENTS.md | 14 + README.md | 3 +- WEB_BLENDER_MIGRATION_EXECUTION_PLAN.md | 2 + WEB_BLENDER_TECHNICAL_ROADMAP.md | 2 + .../blender/web_engine/web_engine_api.cpp | 24 +- .../web_engine/web_engine_blend_reader.cpp | 239 +- .../web_engine/web_engine_main_state.cpp | 35 + .../web_engine/web_engine_main_state.h | 3 + docs/BLENDER_5_2_FULL_PARITY_WBS.md | 2 + ...NDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md | 3 + docs/BLENDER_5_2_WEB_FEATURE_PARITY.md | 2 + docs/CONTEXT_BUDGET.md | 46 + docs/CONTEXT_GOVERNANCE.md | 121 + docs/CURRENT_EXECUTION_PLAN.md | 7 +- docs/EXECUTION_QUEUE.md | 72 +- docs/PBR_RENDERING_IMPLEMENTATION_PLAN.md | 2 + docs/PROJECT_STATUS_AND_NEXT_WORK.md | 3 + docs/README.md | 27 +- docs/TASK_BREAKDOWN.md | 42 +- docs/TASK_CONTEXT_TEMPLATE.md | 12 +- .../UNDECLARED_CAPABILITIES_EXECUTION_PLAN.md | 2 + .../VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md | 2 + docs/status/M12-07H.md | 8 +- docs/status/M12-07I.md | 8 +- docs/status/M12-07J.md | 8 +- docs/status/M13-01A.md | 8 +- docs/status/M13-01B.md | 8 +- docs/status/M13-01C.md | 8 +- docs/status/M13-01D.md | 8 +- docs/status/M13-01E.md | 8 +- docs/status/M13-01F.md | 8 +- docs/status/M13-02A.md | 8 +- docs/status/M13-02B.md | 8 +- docs/status/M13-02C.md | 8 +- docs/status/M13-02D.md | 8 +- docs/status/M13-02E.md | 8 +- docs/status/M13-02F.md | 8 +- docs/status/M13-03A.md | 8 +- docs/status/M13-03B.md | 8 +- docs/status/M13-03C.md | 8 +- docs/status/M13-03D.md | 8 +- docs/status/M13-03E.md | 8 +- docs/status/M13-03F.md | 8 +- docs/status/M13-03G.md | 8 +- docs/status/M13-04A.md | 8 +- docs/status/M13-04B.md | 8 +- docs/status/M13-04C.md | 8 +- docs/status/M13-04F.md | 8 +- docs/status/M13-04G.md | 8 +- docs/status/M13-04H.md | 8 +- docs/status/M13-04I.md | 8 +- docs/status/M13-04J.md | 8 +- docs/status/M13-05A.md | 8 +- docs/status/M13-05B.md | 8 +- docs/status/M13-05C.md | 8 +- docs/status/M13-05D.md | 8 +- docs/status/M13-05E.md | 8 +- docs/status/M13-05F.md | 8 +- docs/status/M13-05G.md | 8 +- docs/status/M13-05H.md | 8 +- docs/status/M14-01A.md | 8 +- docs/status/M14-01B.md | 8 +- docs/status/M14-01C.md | 8 +- docs/status/M14-01D.md | 8 +- docs/status/M14-01E.md | 8 +- docs/status/M14-04A.md | 8 +- docs/status/M14-04B.md | 8 +- docs/status/M14-04C.md | 8 +- docs/status/M14-04D.md | 8 +- docs/status/M14-04E.md | 8 +- docs/status/M14-04F.md | 43 + docs/status/M14-04G.md | 43 + docs/status/M14-04H.md | 40 + docs/status/M15-01A.md | 38 + docs/status/M15-01B.md | 40 + docs/status/M15-01C.md | 40 + docs/status/M15-01D.md | 39 + docs/status/M15-01E.md | 39 + docs/status/M15-01F.md | 39 + docs/status/M15-02A.md | 37 + docs/status/M15-02B.md | 37 + docs/status/M15-02C.md | 16 + docs/status/M15-02D.md | 16 + docs/status/M15-02E.md | 16 + docs/status/M15-02F.md | 16 + docs/status/M15-03A.md | 17 + docs/status/M15-03B.md | 11 + docs/status/M15-03C.md | 11 + docs/status/M15-03D.md | 11 + docs/status/M15-03E.md | 12 + docs/status/M16-GAP-00001.md | 16 + docs/status/M16-GAP-00002.md | 16 + docs/status/M16-GAP-00003.md | 16 + docs/status/M16-GAP-00004.md | 10 + docs/status/M16-GAP-00005.md | 8 + docs/status/M16-GAP-00006.md | 10 + docs/status/M16-GAP-00007.md | 10 + docs/status/M16-GAP-00008.md | 11 + docs/status/M16-GAP-00009.md | 10 + docs/status/M16-GAP-00010.md | 23 + docs/status/M16-GAP-00011.md | 25 + docs/status/M16-GAP-00012.md | 25 + docs/status/M16-GAP-00013.md | 25 + docs/status/M16-GAP-00014.md | 25 + docs/status/M16-GAP-00015.md | 25 + docs/status/M16-GAP-00016.md | 25 + docs/status/M16-GAP-00017.md | 25 + docs/status/M16-GAP-00018.md | 25 + docs/status/M16-GAP-00019.md | 25 + docs/status/M16-GAP-00020.md | 25 + docs/status/M16-GAP-00021.md | 25 + docs/status/M16-GAP-00022.md | 25 + docs/status/M16-GAP-00023.md | 25 + docs/status/M16-GAP-00024.md | 26 + docs/status/M16-GAP-00025.md | 22 + docs/status/M16-GAP-00026.md | 22 + docs/status/M16-GAP-00027.md | 17 + docs/status/M16-GAP-00028.md | 17 + docs/status/M16-GAP-00029.md | 17 + docs/status/M16-GAP-00030.md | 18 + docs/status/M16-GAP-00031.md | 18 + docs/status/M16-GAP-00032.md | 18 + docs/status/M16-GAP-00033.md | 18 + docs/status/M16-GAP-00034.md | 18 + docs/status/M16-GAP-00035.md | 18 + docs/status/M16-GAP-00036.md | 18 + docs/status/M16-GAP-00037.md | 18 + docs/status/M16-GAP-00038.md | 18 + docs/status/M16-GAP-00039.md | 18 + docs/status/M16-GAP-00040.md | 18 + docs/status/M16-GAP-00041.md | 18 + docs/status/M16-GAP-00042.md | 18 + docs/status/M16-GAP-00043.md | 18 + docs/status/M16-GAP-00044.md | 18 + docs/status/M16-GAP-00045.md | 18 + docs/status/M16-GAP-00046.md | 18 + docs/status/M16-GAP-00047.md | 18 + docs/status/M16-GAP-00048.md | 18 + docs/status/M16-GAP-00049.md | 18 + docs/status/M16-GAP-00050.md | 18 + docs/status/M16-GAP-00051.md | 18 + docs/status/M16-GAP-00052.md | 18 + docs/status/M16-GAP-00053.md | 18 + docs/status/M16-GAP-00054.md | 18 + docs/status/M16-GAP-00055.md | 18 + docs/status/M16-GAP-00056.md | 18 + docs/status/M16-GAP-00057.md | 18 + docs/status/M16-GAP-00058.md | 18 + docs/status/M16-GAP-00059.md | 18 + docs/status/M16-GAP-00060.md | 18 + docs/status/M16-GAP-00061.md | 18 + docs/status/M16-GAP-00062.md | 18 + docs/status/M16-GAP-00063.md | 18 + docs/status/M16-GAP-00064.md | 18 + docs/status/M16-GAP-00065.md | 18 + docs/status/M16-GAP-00066.md | 18 + docs/status/M16-GAP-00067.md | 18 + docs/status/M16-GAP-00068.md | 18 + docs/status/M16-GAP-00069.md | 18 + docs/status/M16-GAP-00070.md | 18 + docs/status/W-060.md | 2 +- docs/status/W-073.md | 2 +- docs/status/W-074.md | 2 +- docs/status/W-075.md | 2 +- docs/status/W-076.md | 2 +- docs/status/W-077.md | 2 +- docs/status/W-078.md | 2 +- docs/status/W-079.md | 2 +- docs/tasks/M14-04F.md | 6 +- docs/tasks/M14-04G.md | 60 + docs/tasks/M14-04H.md | 60 + docs/tasks/M15-01A.md | 58 + docs/tasks/M15-01B.md | 58 + docs/tasks/M15-01C.md | 38 + docs/tasks/M15-01D.md | 38 + docs/tasks/M15-01E.md | 31 + docs/tasks/M15-01F.md | 31 + docs/tasks/M15-02A.md | 31 + docs/tasks/M15-02B.md | 31 + docs/tasks/M15-02C.md | 10 + docs/tasks/M15-02D.md | 9 + docs/tasks/M15-02E.md | 9 + docs/tasks/M15-02F.md | 9 + docs/tasks/M15-03A.md | 9 + docs/tasks/M15-03B.md | 9 + docs/tasks/M15-03C.md | 9 + docs/tasks/M15-03D.md | 9 + docs/tasks/M15-03E.md | 10 + docs/tasks/M16-GAP-00001.md | 18 + docs/tasks/M16-GAP-00002.md | 18 + docs/tasks/M16-GAP-00003.md | 11 + docs/tasks/M16-GAP-00004.md | 11 + docs/tasks/M16-GAP-00005.md | 9 + docs/tasks/M16-GAP-00006.md | 10 + docs/tasks/M16-GAP-00007.md | 10 + docs/tasks/M16-GAP-00008.md | 9 + docs/tasks/M16-GAP-00009.md | 9 + docs/tasks/M16-GAP-00010.md | 50 + docs/tasks/M16-GAP-00011.md | 39 + docs/tasks/M16-GAP-00012.md | 37 + docs/tasks/M16-GAP-00013.md | 37 + docs/tasks/M16-GAP-00014.md | 37 + docs/tasks/M16-GAP-00015.md | 37 + docs/tasks/M16-GAP-00016.md | 37 + docs/tasks/M16-GAP-00017.md | 37 + docs/tasks/M16-GAP-00018.md | 37 + docs/tasks/M16-GAP-00019.md | 37 + docs/tasks/M16-GAP-00020.md | 37 + docs/tasks/M16-GAP-00021.md | 37 + docs/tasks/M16-GAP-00022.md | 37 + docs/tasks/M16-GAP-00023.md | 37 + docs/tasks/M16-GAP-00024.md | 37 + docs/tasks/M16-GAP-00025.md | 37 + docs/tasks/M16-GAP-00026.md | 37 + docs/tasks/M16-GAP-00027.md | 37 + docs/tasks/M16-GAP-00028.md | 37 + docs/tasks/M16-GAP-00029.md | 37 + docs/tasks/M16-GAP-00030.md | 37 + docs/tasks/M16-GAP-00031.md | 37 + docs/tasks/M16-GAP-00032.md | 37 + docs/tasks/M16-GAP-00033.md | 37 + docs/tasks/M16-GAP-00034.md | 37 + docs/tasks/M16-GAP-00035.md | 37 + docs/tasks/M16-GAP-00036.md | 37 + docs/tasks/M16-GAP-00037.md | 37 + docs/tasks/M16-GAP-00038.md | 37 + docs/tasks/M16-GAP-00039.md | 37 + docs/tasks/M16-GAP-00040.md | 37 + docs/tasks/M16-GAP-00041.md | 37 + docs/tasks/M16-GAP-00042.md | 37 + docs/tasks/M16-GAP-00043.md | 37 + docs/tasks/M16-GAP-00044.md | 37 + docs/tasks/M16-GAP-00045.md | 37 + docs/tasks/M16-GAP-00046.md | 37 + docs/tasks/M16-GAP-00047.md | 37 + docs/tasks/M16-GAP-00048.md | 37 + docs/tasks/M16-GAP-00049.md | 37 + docs/tasks/M16-GAP-00050.md | 37 + docs/tasks/M16-GAP-00051.md | 37 + docs/tasks/M16-GAP-00052.md | 37 + docs/tasks/M16-GAP-00053.md | 37 + docs/tasks/M16-GAP-00054.md | 37 + docs/tasks/M16-GAP-00055.md | 37 + docs/tasks/M16-GAP-00056.md | 37 + docs/tasks/M16-GAP-00057.md | 37 + docs/tasks/M16-GAP-00058.md | 37 + docs/tasks/M16-GAP-00059.md | 37 + docs/tasks/M16-GAP-00060.md | 37 + docs/tasks/M16-GAP-00061.md | 37 + docs/tasks/M16-GAP-00062.md | 37 + docs/tasks/M16-GAP-00063.md | 37 + docs/tasks/M16-GAP-00064.md | 37 + docs/tasks/M16-GAP-00065.md | 37 + docs/tasks/M16-GAP-00066.md | 37 + docs/tasks/M16-GAP-00067.md | 37 + docs/tasks/M16-GAP-00068.md | 37 + docs/tasks/M16-GAP-00069.md | 37 + docs/tasks/M16-GAP-00070.md | 37 + docs/tasks/M16-GAP-00071.md | 37 + .../M16-GAP-00001-datablock-Action.blend | Bin 0 -> 86769 bytes .../M16-GAP-00001-datablock-Action.blend1 | Bin 0 -> 86769 bytes .../M16-GAP-00002-datablock-Armature.blend | Bin 0 -> 87320 bytes .../M16-GAP-00003-datablock-Brush.blend | Bin 0 -> 86159 bytes .../M16-GAP-00004-datablock-Camera.blend | Bin 0 -> 86379 bytes .../M16-GAP-00005-datablock-Collection.blend | Bin 0 -> 86454 bytes .../M16-GAP-00006-datablock-Curve.blend | Bin 0 -> 86153 bytes .../M16-GAP-00007-datablock-Curves.blend | Bin 0 -> 86489 bytes ...P-00008-datablock-FreestyleLineStyle.blend | Bin 0 -> 85885 bytes ...-00008-datablock-FreestyleLineStyle.blend1 | Bin 0 -> 85711 bytes ...M16-GAP-00009-datablock-GreasePencil.blend | Bin 0 -> 87788 bytes .../M16-GAP-00010-datablock-Lattice.blend | Bin 0 -> 86081 bytes .../M16-GAP-00011-datablock-Library.blend | Bin 0 -> 85914 bytes .../M16-GAP-00012-datablock-Light.blend | Bin 0 -> 86529 bytes .../M16-GAP-00013-datablock-Material.blend | Bin 0 -> 88264 bytes .../M16-GAP-00013-datablock-Material.blend1 | Bin 0 -> 85718 bytes .../M16-GAP-00014-datablock-Mesh.blend | Bin 0 -> 86393 bytes .../M16-GAP-00015-datablock-MetaBall.blend | Bin 0 -> 86061 bytes .../M16-GAP-00016-datablock-NodeTree.blend | Bin 0 -> 88360 bytes .../M16-GAP-00017-datablock-Object.blend | Bin 0 -> 85914 bytes ...GAP-00018-datablock-ParticleSettings.blend | Bin 0 -> 85999 bytes ...AP-00018-datablock-ParticleSettings.blend1 | Bin 0 -> 86759 bytes .../M16-GAP-00019-datablock-PointCloud.blend | Bin 0 -> 86126 bytes .../M16-GAP-00020-datablock-Scene.blend | Bin 0 -> 85789 bytes .../M16-GAP-00021-datablock-Screen.blend | Bin 0 -> 85718 bytes .../M16-GAP-00022-datablock-Sound.blend | Bin 0 -> 85859 bytes .../M16-GAP-00022-datablock-Sound.blend1 | Bin 0 -> 85856 bytes .../M16-GAP-00023-datablock-Speaker.blend | Bin 0 -> 85935 bytes .../M16-GAP-00024-datablock-Text.blend | Bin 0 -> 85906 bytes .../M16-GAP-00025-datablock-Texture.blend | Bin 0 -> 85833 bytes .../M16-GAP-00026-datablock-Volume.blend | Bin 0 -> 85843 bytes ...16-GAP-00027-datablock-WindowManager.blend | Bin 0 -> 85714 bytes .../M16-GAP-00028-datablock-WorkSpace.blend | Bin 0 -> 85705 bytes .../M16-GAP-00029-datablock-World.blend | Bin 0 -> 86353 bytes .../M16-GAP-00029-datablock-World.blend1 | Bin 0 -> 86353 bytes .../M16-GAP-00030-modifier-ARMATURE.blend | Bin 0 -> 86858 bytes .../M16-GAP-00031-modifier-ARRAY.blend | Bin 0 -> 87078 bytes .../M16-GAP-00032-modifier-BEVEL.blend | Bin 0 -> 86569 bytes .../M16-GAP-00033-modifier-BOOLEAN.blend | Bin 0 -> 86903 bytes .../M16-GAP-00034-modifier-BUILD.blend | Bin 0 -> 86383 bytes .../M16-GAP-00035-modifier-CAST.blend | Bin 0 -> 86512 bytes .../M16-GAP-00036-modifier-CLOTH.blend | Bin 0 -> 86552 bytes .../M16-GAP-00037-modifier-COLLISION.blend | Bin 0 -> 86434 bytes ...GAP-00038-modifier-CORRECTIVE_SMOOTH.blend | Bin 0 -> 86517 bytes .../M16-GAP-00039-modifier-CURVE.blend | Bin 0 -> 86516 bytes ...M16-GAP-00040-modifier-DATA_TRANSFER.blend | Bin 0 -> 86540 bytes .../M16-GAP-00041-modifier-DECIMATE.blend | Bin 0 -> 86540 bytes .../M16-GAP-00042-modifier-DISPLACE.blend | Bin 0 -> 86522 bytes ...M16-GAP-00043-modifier-DYNAMIC_PAINT.blend | Bin 0 -> 86512 bytes .../M16-GAP-00044-modifier-EDGE_SPLIT.blend | Bin 0 -> 86521 bytes .../M16-GAP-00045-modifier-EXPLODE.blend | Bin 0 -> 86513 bytes .../M16-GAP-00046-modifier-FLUID.blend | Bin 0 -> 86520 bytes ...0047-modifier-GREASE_PENCIL_ARMATURE.blend | Bin 0 -> 87791 bytes ...P-00048-modifier-GREASE_PENCIL_ARRAY.blend | Bin 0 -> 87791 bytes ...P-00049-modifier-GREASE_PENCIL_BUILD.blend | Bin 0 -> 87791 bytes ...P-00050-modifier-GREASE_PENCIL_COLOR.blend | Bin 0 -> 87791 bytes ...AP-00051-modifier-GREASE_PENCIL_DASH.blend | Bin 0 -> 87791 bytes ...0052-modifier-GREASE_PENCIL_ENVELOPE.blend | Bin 0 -> 87791 bytes ...AP-00053-modifier-GREASE_PENCIL_HOOK.blend | Bin 0 -> 87791 bytes ...00054-modifier-GREASE_PENCIL_LATTICE.blend | Bin 0 -> 87791 bytes ...-00055-modifier-GREASE_PENCIL_LENGTH.blend | Bin 0 -> 87791 bytes ...-00056-modifier-GREASE_PENCIL_MIRROR.blend | Bin 0 -> 87791 bytes ...0057-modifier-GREASE_PENCIL_MULTIPLY.blend | Bin 0 -> 87791 bytes ...P-00058-modifier-GREASE_PENCIL_NOISE.blend | Bin 0 -> 87791 bytes ...-00059-modifier-GREASE_PENCIL_OFFSET.blend | Bin 0 -> 87791 bytes ...00060-modifier-GREASE_PENCIL_OPACITY.blend | Bin 0 -> 87791 bytes ...00061-modifier-GREASE_PENCIL_OUTLINE.blend | Bin 0 -> 87791 bytes ...62-modifier-GREASE_PENCIL_SHRINKWRAP.blend | Bin 0 -> 87791 bytes ...0063-modifier-GREASE_PENCIL_SIMPLIFY.blend | Bin 0 -> 87791 bytes ...-00064-modifier-GREASE_PENCIL_SMOOTH.blend | Bin 0 -> 87791 bytes ...-00065-modifier-GREASE_PENCIL_SUBDIV.blend | Bin 0 -> 87791 bytes ...00066-modifier-GREASE_PENCIL_TEXTURE.blend | Bin 0 -> 87791 bytes ...067-modifier-GREASE_PENCIL_THICKNESS.blend | Bin 0 -> 87791 bytes ...AP-00068-modifier-GREASE_PENCIL_TIME.blend | Bin 0 -> 87791 bytes ...AP-00069-modifier-GREASE_PENCIL_TINT.blend | Bin 0 -> 87791 bytes ...er-GREASE_PENCIL_VERTEX_WEIGHT_ANGLE.blend | Bin 0 -> 87791 bytes tests/files/web/generated/WebGapLibrary.blend | Bin 0 -> 86339 bytes ...6-armature-modifier-reopen-_h313f11.blend1 | 0 ...6-armature-modifier-reopen-gxasjymt.blend1 | 0 ...6-armature-modifier-reopen-nqdj7o5e.blend1 | 0 ...6-armature-modifier-reopen-o7bz7r6f.blend1 | 0 .../m16-array-modifier-reopen-amanh0lg.blend1 | 0 .../m16-array-modifier-reopen-f2604i1p.blend1 | 0 .../m16-bevel-modifier-reopen-7jk5r7jt.blend1 | 0 .../m16-bevel-modifier-reopen-k4mww0ym.blend1 | 0 .../m16-bevel-modifier-reopen-wkcewedm.blend1 | 0 ...16-boolean-modifier-reopen-5c8tre34.blend1 | 0 ...16-boolean-modifier-reopen-9fwjeeq3.blend1 | 0 ...16-boolean-modifier-reopen-c4c4jmu1.blend1 | 0 ...16-boolean-modifier-reopen-robqt7dc.blend1 | 0 ...16-boolean-modifier-reopen-t3kt1sj0.blend1 | 0 .../m16-build-modifier-reopen-cwkfiwzs.blend1 | 0 .../m16-build-modifier-reopen-d04y3n96.blend1 | 0 .../m16-build-modifier-reopen-ie1l4na9.blend1 | 0 .../m16-build-modifier-reopen-jqdqctpx.blend1 | 0 .../m16-cast-modifier-reopen-02vjafdj.blend1 | 0 .../m16-cast-modifier-reopen-8ool3kbz.blend1 | 0 .../m16-cast-modifier-reopen-j7f2kk7k.blend1 | 0 .../m16-cast-modifier-reopen-n19cv64q.blend1 | 0 .../m16-cloth-modifier-reopen-3piita_r.blend1 | 0 .../m16-cloth-modifier-reopen-vrs2og0r.blend1 | 0 .../m16-collision-reopen-vdszt6zl.blend1 | 0 .../m16-collision-reopen-vvd633rd.blend1 | 0 ...16-generic-modifier-reopen-1aghhvup.blend1 | 0 ...16-generic-modifier-reopen-4jwsxs8x.blend1 | 0 ...16-generic-modifier-reopen-508uylh6.blend1 | 0 ...16-generic-modifier-reopen-52_i6mby.blend1 | 0 ...16-generic-modifier-reopen-69cr1j4r.blend1 | 0 ...16-generic-modifier-reopen-6_jt57rz.blend1 | 0 ...16-generic-modifier-reopen-6dhl53ql.blend1 | 0 ...16-generic-modifier-reopen-6gnredpf.blend1 | 0 ...16-generic-modifier-reopen-6krstrm1.blend1 | 0 ...16-generic-modifier-reopen-6ohild7w.blend1 | 0 ...16-generic-modifier-reopen-746ef_qd.blend1 | 0 ...16-generic-modifier-reopen-74q1f5da.blend1 | 0 ...16-generic-modifier-reopen-_3gpfpyu.blend1 | 0 ...16-generic-modifier-reopen-_6ok9ark.blend1 | 0 ...16-generic-modifier-reopen-_fblu0p9.blend1 | 0 ...16-generic-modifier-reopen-_imkk_7o.blend1 | 0 ...16-generic-modifier-reopen-bobwy_hv.blend1 | 0 ...16-generic-modifier-reopen-cxpr_roz.blend1 | 0 ...16-generic-modifier-reopen-d662jd_w.blend1 | 0 ...16-generic-modifier-reopen-e4iabhw_.blend1 | 0 ...16-generic-modifier-reopen-e5mnum47.blend1 | 0 ...16-generic-modifier-reopen-ei96ctq5.blend1 | 0 ...16-generic-modifier-reopen-enpd9s63.blend1 | 0 ...16-generic-modifier-reopen-f87lm1ky.blend1 | 0 ...16-generic-modifier-reopen-fr9p9fca.blend1 | 0 ...16-generic-modifier-reopen-fx8k3pcp.blend1 | 0 ...16-generic-modifier-reopen-gg5476nh.blend1 | 0 ...16-generic-modifier-reopen-gkaflk_e.blend1 | 0 ...16-generic-modifier-reopen-gtjzlgb2.blend1 | 0 ...16-generic-modifier-reopen-h49l0i4g.blend1 | 0 ...16-generic-modifier-reopen-h74akucs.blend1 | 0 ...16-generic-modifier-reopen-hj4zyxh8.blend1 | 0 ...16-generic-modifier-reopen-hz9_meam.blend1 | 0 ...16-generic-modifier-reopen-hzy2dsdl.blend1 | 0 ...16-generic-modifier-reopen-ihyytuxb.blend1 | 0 ...16-generic-modifier-reopen-iyk0biv7.blend1 | 0 ...16-generic-modifier-reopen-jlkphvss.blend1 | 0 ...16-generic-modifier-reopen-jllmylu1.blend1 | 0 ...16-generic-modifier-reopen-juw3pyod.blend1 | 0 ...16-generic-modifier-reopen-kavolixm.blend1 | 0 ...16-generic-modifier-reopen-kcju3dkx.blend1 | 0 ...16-generic-modifier-reopen-kfbk4w9c.blend1 | 0 ...16-generic-modifier-reopen-kjp64qpi.blend1 | 0 ...16-generic-modifier-reopen-kmfp3cgw.blend1 | 0 ...16-generic-modifier-reopen-kn_q9njn.blend1 | 0 ...16-generic-modifier-reopen-najkvbzc.blend1 | 0 ...16-generic-modifier-reopen-np1x67_0.blend1 | 0 ...16-generic-modifier-reopen-nr6p9143.blend1 | 0 ...16-generic-modifier-reopen-o4pn24_w.blend1 | 0 ...16-generic-modifier-reopen-ofp52vvi.blend1 | 0 ...16-generic-modifier-reopen-onnxlfm8.blend1 | 0 ...16-generic-modifier-reopen-owc564mx.blend1 | 0 ...16-generic-modifier-reopen-p3r2t0k1.blend1 | 0 ...16-generic-modifier-reopen-pll4_mnv.blend1 | 0 ...16-generic-modifier-reopen-pvkxr4gd.blend1 | 0 ...16-generic-modifier-reopen-px1kxmkc.blend1 | 0 ...16-generic-modifier-reopen-qnnczibn.blend1 | 0 ...16-generic-modifier-reopen-qsc2h8uu.blend1 | 0 ...16-generic-modifier-reopen-rpgi619f.blend1 | 0 ...16-generic-modifier-reopen-rvnjiu51.blend1 | 0 ...16-generic-modifier-reopen-rwqzwjn5.blend1 | 0 ...16-generic-modifier-reopen-sekdp3ip.blend1 | 0 ...16-generic-modifier-reopen-t5_mht12.blend1 | 0 ...16-generic-modifier-reopen-vbjqnexq.blend1 | 0 ...16-generic-modifier-reopen-wqh77a2m.blend1 | 0 ...16-generic-modifier-reopen-x_8ztooe.blend1 | 0 ...16-generic-modifier-reopen-xrugqrto.blend1 | 0 ...16-generic-modifier-reopen-xyaqgh82.blend1 | 0 ...16-generic-modifier-reopen-ykbwf67b.blend1 | 0 ...16-generic-modifier-reopen-yqkvre3v.blend1 | 0 ...16-generic-modifier-reopen-zh1x2uqh.blend1 | 0 ...16-generic-modifier-reopen-zo2ilg04.blend1 | 0 .../m16-library-reopen-a_o61bmd.blend1 | 0 .../m16-library-reopen-euqel05v.blend1 | 0 .../m16-library-reopen-f2sth1ms.blend1 | 0 .../m16-library-reopen-i2xnswhr.blend1 | 0 .../m16-library-reopen-uv3_d89n.blend1 | 0 .../m16-light-reopen-0fbn57ic.blend1 | 0 .../m16-light-reopen-hy2lr8tv.blend1 | 0 .../m16-light-reopen-ltby_xqd.blend1 | 0 .../m16-light-reopen-o5dh1dh3.blend1 | 0 .../m16-light-reopen-uqg4gsaw.blend1 | 0 .../m16-light-reopen-zedx8s34.blend1 | 0 .../m16-material-reopen-64z4xel4.blend1 | 0 .../m16-material-reopen-_cbyc9bt.blend1 | 0 .../m16-material-reopen-mp2i8_6c.blend1 | 0 .../generated/m16-mesh-reopen-74ilsxk_.blend1 | 0 .../generated/m16-mesh-reopen-l2jrscfb.blend1 | 0 .../generated/m16-mesh-reopen-w14m2aju.blend1 | 0 .../m16-metaball-reopen-6fzhkq3_.blend1 | 0 .../m16-metaball-reopen-l4j1lx20.blend1 | 0 .../m16-metaball-reopen-sk3nlfi5.blend1 | 0 .../m16-nodetree-reopen-2ade748f.blend1 | 0 .../m16-nodetree-reopen-mqzq_o10.blend1 | 0 .../m16-nodetree-reopen-qyaot_y6.blend1 | 0 .../m16-object-reopen-aol3hp8g.blend1 | 0 .../m16-object-reopen-eamt7tc7.blend1 | 0 .../m16-object-reopen-hxx1dwck.blend1 | 0 ...6-particle-settings-reopen-34i8qfvc.blend1 | 0 ...6-particle-settings-reopen-_cutrns5.blend1 | 0 ...6-particle-settings-reopen-awi44iql.blend1 | 0 ...6-particle-settings-reopen-dgv57rla.blend1 | 0 ...6-particle-settings-reopen-dpzeym9q.blend1 | 0 ...6-particle-settings-reopen-mo9gxc__.blend1 | 0 ...6-particle-settings-reopen-mr8b2nau.blend1 | 0 ...6-particle-settings-reopen-z25w8j7s.blend1 | 0 .../m16-pointcloud-reopen-0zd_gnu3.blend1 | 0 .../m16-pointcloud-reopen-4r8fb3bm.blend1 | 0 .../m16-pointcloud-reopen-f928wi9u.blend1 | 0 .../m16-scene-reopen-63_iylge.blend1 | 0 .../m16-scene-reopen-_k2e4r7d.blend1 | 0 .../m16-scene-reopen-p4d973qt.blend1 | 0 .../m16-screen-reopen-6uz58o6j.blend1 | 0 .../m16-screen-reopen-bscc19pt.blend1 | 0 .../m16-screen-reopen-mraipxaz.blend1 | 0 .../m16-screen-reopen-u0ki2g0h.blend1 | 0 .../m16-sound-reopen-49xmsa53.blend1 | 0 .../m16-sound-reopen-emmej6t3.blend1 | 0 .../m16-sound-reopen-gril9iih.blend1 | 0 .../m16-sound-reopen-lm9_f3s5.blend1 | 0 .../m16-sound-reopen-tujkgz3q.blend1 | 0 .../m16-speaker-reopen-3ynqut1w.blend1 | 0 .../m16-speaker-reopen-eyc_sbiz.blend1 | 0 .../m16-speaker-reopen-t__k7swa.blend1 | 0 .../generated/m16-text-reopen-0iigxii0.blend1 | 0 .../generated/m16-text-reopen-2rhzjcre.blend1 | 0 .../generated/m16-text-reopen-beo_c27v.blend1 | 0 .../generated/m16-text-reopen-rf7ecljk.blend1 | 0 .../m16-texture-reopen-9f03_9l4.blend1 | 0 .../m16-texture-reopen-lexzbvjt.blend1 | 0 .../m16-texture-reopen-x7z41b6m.blend1 | 0 .../m16-volume-reopen-i98om7o9.blend1 | 0 .../m16-volume-reopen-idauslqz.blend1 | 0 .../m16-window-manager-reopen-_bxszg_d.blend1 | 0 .../m16-window-manager-reopen-p_04zcst.blend1 | 0 .../m16-workspace-reopen-db88awms.blend1 | 0 .../m16-workspace-reopen-haqswgr9.blend1 | 0 .../m16-world-reopen-04jj65qu.blend1 | 0 .../m16-world-reopen-jz52mply.blend1 | 0 .../m16-world-reopen-tvwrz9zr.blend1 | 0 .../m16-world-reopen-w5az1zvg.blend1 | 0 .../m16-world-reopen-zpf_0kql.blend1 | 0 .../M14-04F/chromium-input-modal-report.json | 143 +- tests/golden/M14-04F/manifest.json | 16 +- .../M14-04G/chromium-layout-report.json | 1385 + tests/golden/M14-04G/manifest.json | 48 + .../chromium-accessibility-report.json | 33 + tests/golden/M14-04H/manifest.json | 40 + .../blender-rna-datablock-inventory.json | 231 + .../M15-01A/inventory-check-report.json | 25 + tests/golden/M15-01A/manifest.json | 36 + .../M15-01B/blender-operator-inventory.json | 49553 +++++ tests/golden/M15-01B/manifest.json | 40 + .../operator-inventory-check-report.json | 31 + .../M15-01C/blender-family-inventory.json | 91206 +++++++++ .../family-inventory-check-report.json | 34 + tests/golden/M15-01C/manifest.json | 40 + .../M15-01D/blender-format-inventory.json | 13217 ++ .../format-inventory-check-report.json | 29 + tests/golden/M15-01D/manifest.json | 40 + .../M15-01E/blender-editor-inventory.json | 53863 +++++ .../editor-inventory-check-report.json | 33 + tests/golden/M15-01E/manifest.json | 40 + .../M15-01F/blender-core-inventory.json | 13077 ++ .../M15-01F/core-inventory-check-report.json | 34 + tests/golden/M15-01F/manifest.json | 40 + tests/golden/M15-02A/blender-parity-map.json | 116581 +++++++++++ tests/golden/M15-02A/manifest.json | 36 + .../M15-02A/parity-map-check-report.json | 38 + tests/golden/M15-02B/blender-gap-audit.json | 6932 + .../M15-02B/gap-audit-check-report.json | 16 + tests/golden/M15-02B/manifest.json | 36 + .../local-exact-audit-check-report.json | 23 + tests/golden/M15-02C/local-exact-audit.json | 29 + tests/golden/M15-02C/manifest.json | 36 + .../local-equivalent-audit-check-report.json | 22 + .../M15-02D/local-equivalent-audit.json | 28 + tests/golden/M15-02D/manifest.json | 36 + tests/golden/M15-02E/manifest.json | 36 + .../server-exact-audit-check-report.json | 24 + tests/golden/M15-02E/server-exact-audit.json | 30 + tests/golden/M15-02F/manifest.json | 36 + .../unknown-data-audit-check-report.json | 23 + tests/golden/M15-02F/unknown-data-audit.json | 29 + tests/golden/M15-03A/completed-gap-tasks.json | 71 + tests/golden/M15-03A/manifest.json | 35 + .../M15-03A/next-task-plan-check-report.json | 24 + tests/golden/M15-03A/next-task-plan.json | 158740 +++++++++++++++ tests/golden/M15-03A/task-catalog.jsonl | 6900 + tests/golden/M15-03A/task-index.json | 1 + tests/golden/M15-03B/manifest.json | 35 + .../M15-03B/next-task-spec-check-report.json | 23 + tests/golden/M15-03C/manifest.json | 31 + .../M15-03C/task-graph-check-report.json | 17 + tests/golden/M15-03D/manifest.json | 35 + .../M15-03D/task-stats-check-report.json | 22 + tests/golden/M15-03E/manifest.json | 32 + .../golden/M15-03E/zero-gap-gate-report.json | 138 + .../M16-GAP-00001/action-desktop-report.json | 35 + .../action-local-exact-report.json | 30 + tests/golden/M16-GAP-00001/manifest.json | 45 + .../armature-desktop-report.json | 42 + .../armature-local-exact-report.json | 29 + tests/golden/M16-GAP-00002/manifest.json | 45 + .../M16-GAP-00003/brush-desktop-report.json | 18 + .../brush-local-exact-report.json | 27 + tests/golden/M16-GAP-00003/manifest.json | 61 + .../M16-GAP-00004/camera-desktop-report.json | 17 + .../camera-local-exact-report.json | 25 + tests/golden/M16-GAP-00004/manifest.json | 49 + .../collection-desktop-report.json | 25 + .../collection-local-exact-report.json | 34 + tests/golden/M16-GAP-00005/manifest.json | 45 + .../M16-GAP-00006/curve-desktop-report.json | 38 + .../curve-local-exact-report.json | 24 + tests/golden/M16-GAP-00006/manifest.json | 49 + .../M16-GAP-00007/curves-desktop-report.json | 14 + .../curves-local-exact-report.json | 21 + tests/golden/M16-GAP-00007/manifest.json | 49 + .../freestyle-desktop-report.json | 27 + .../freestyle-local-exact-report.json | 26 + tests/golden/M16-GAP-00008/manifest.json | 57 + .../grease-pencil-desktop-report.json | 20 + .../grease-pencil-local-exact-report.json | 21 + tests/golden/M16-GAP-00009/manifest.json | 41 + .../M16-GAP-00010/lattice-desktop-report.json | 137 + .../lattice-local-exact-report.json | 32 + tests/golden/M16-GAP-00010/manifest.json | 57 + .../M16-GAP-00011/library-desktop-report.json | 17 + .../library-local-exact-report.json | 26 + tests/golden/M16-GAP-00011/manifest.json | 61 + tests/golden/M16-GAP-00011/task-context.json | 121 + .../M16-GAP-00012/light-desktop-report.json | 32 + .../light-local-exact-report.json | 33 + tests/golden/M16-GAP-00012/manifest.json | 57 + tests/golden/M16-GAP-00012/task-context.json | 124 + tests/golden/M16-GAP-00013/manifest.json | 57 + .../material-desktop-report.json | 39 + .../material-local-exact-report.json | 26 + tests/golden/M16-GAP-00013/task-context.json | 124 + tests/golden/M16-GAP-00014/manifest.json | 57 + .../M16-GAP-00014/mesh-desktop-report.json | 53 + .../mesh-local-exact-report.json | 28 + tests/golden/M16-GAP-00014/task-context.json | 124 + tests/golden/M16-GAP-00015/manifest.json | 57 + .../metaball-desktop-report.json | 44 + .../metaball-local-exact-report.json | 25 + tests/golden/M16-GAP-00015/task-context.json | 124 + tests/golden/M16-GAP-00016/manifest.json | 57 + .../nodetree-desktop-report.json | 38 + .../nodetree-local-exact-report.json | 26 + tests/golden/M16-GAP-00016/task-context.json | 124 + tests/golden/M16-GAP-00017/manifest.json | 57 + .../M16-GAP-00017/object-desktop-report.json | 32 + .../object-local-exact-report.json | 34 + tests/golden/M16-GAP-00017/task-context.json | 124 + tests/golden/M16-GAP-00018/manifest.json | 61 + .../particle-settings-desktop-report.json | 23 + .../particle-settings-local-exact-report.json | 35 + tests/golden/M16-GAP-00018/task-context.json | 124 + tests/golden/M16-GAP-00019/manifest.json | 24 + .../pointcloud-desktop-report.json | 34 + .../pointcloud-local-exact-report.json | 27 + tests/golden/M16-GAP-00019/task-context.json | 124 + tests/golden/M16-GAP-00020/manifest.json | 24 + .../M16-GAP-00020/scene-desktop-report.json | 21 + .../scene-local-exact-report.json | 31 + tests/golden/M16-GAP-00020/task-context.json | 124 + tests/golden/M16-GAP-00021/manifest.json | 24 + .../M16-GAP-00021/screen-desktop-report.json | 21 + .../screen-local-exact-report.json | 31 + tests/golden/M16-GAP-00021/task-context.json | 124 + tests/golden/M16-GAP-00022/manifest.json | 25 + .../M16-GAP-00022/sound-desktop-report.json | 19 + .../sound-local-exact-report.json | 29 + tests/golden/M16-GAP-00022/task-context.json | 181 + tests/golden/M16-GAP-00023/manifest.json | 25 + .../M16-GAP-00023/speaker-desktop-report.json | 24 + .../speaker-local-exact-report.json | 34 + tests/golden/M16-GAP-00023/task-context.json | 181 + tests/golden/M16-GAP-00024/manifest.json | 25 + tests/golden/M16-GAP-00024/task-context.json | 181 + .../M16-GAP-00024/text-desktop-report.json | 21 + .../text-local-exact-report.json | 30 + tests/golden/M16-GAP-00025/manifest.json | 25 + tests/golden/M16-GAP-00025/task-context.json | 181 + .../M16-GAP-00025/texture-desktop-report.json | 19 + .../texture-local-exact-report.json | 29 + tests/golden/M16-GAP-00026/manifest.json | 25 + tests/golden/M16-GAP-00026/task-context.json | 181 + .../M16-GAP-00026/volume-desktop-report.json | 19 + .../volume-local-exact-report.json | 32 + tests/golden/M16-GAP-00027/manifest.json | 25 + tests/golden/M16-GAP-00027/task-context.json | 181 + .../window-manager-desktop-report.json | 16 + .../window-manager-local-exact-report.json | 29 + tests/golden/M16-GAP-00028/manifest.json | 25 + tests/golden/M16-GAP-00028/task-context.json | 181 + .../workspace-desktop-report.json | 14 + .../workspace-local-exact-report.json | 27 + tests/golden/M16-GAP-00029/manifest.json | 25 + tests/golden/M16-GAP-00029/task-context.json | 181 + .../M16-GAP-00029/world-desktop-report.json | 29 + .../world-local-exact-report.json | 42 + .../armature-modifier-desktop-report.json | 27 + .../armature-modifier-local-exact-report.json | 49 + tests/golden/M16-GAP-00030/manifest.json | 25 + tests/golden/M16-GAP-00030/task-context.json | 181 + .../array-modifier-desktop-report.json | 24 + .../array-modifier-local-exact-report.json | 49 + tests/golden/M16-GAP-00031/manifest.json | 25 + tests/golden/M16-GAP-00031/task-context.json | 181 + .../bevel-modifier-desktop-report.json | 24 + .../bevel-modifier-local-exact-report.json | 44 + tests/golden/M16-GAP-00032/manifest.json | 25 + tests/golden/M16-GAP-00032/task-context.json | 181 + .../boolean-modifier-desktop-report.json | 24 + .../boolean-modifier-local-exact-report.json | 48 + tests/golden/M16-GAP-00033/manifest.json | 25 + tests/golden/M16-GAP-00033/task-context.json | 181 + .../build-modifier-desktop-report.json | 26 + .../build-modifier-local-exact-report.json | 45 + tests/golden/M16-GAP-00034/manifest.json | 25 + tests/golden/M16-GAP-00034/task-context.json | 181 + .../cast-modifier-desktop-report.json | 27 + .../cast-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00035/manifest.json | 25 + tests/golden/M16-GAP-00035/task-context.json | 181 + .../cloth-modifier-desktop-report.json | 21 + .../cloth-modifier-local-exact-report.json | 41 + tests/golden/M16-GAP-00036/manifest.json | 25 + tests/golden/M16-GAP-00036/task-context.json | 181 + .../collision-modifier-desktop-report.json | 21 + ...collision-modifier-local-exact-report.json | 41 + tests/golden/M16-GAP-00037/manifest.json | 25 + tests/golden/M16-GAP-00037/task-context.json | 181 + ...ective-smooth-modifier-desktop-report.json | 22 + ...ve-smooth-modifier-local-exact-report.json | 41 + tests/golden/M16-GAP-00038/manifest.json | 26 + tests/golden/M16-GAP-00038/task-context.json | 181 + .../curve-modifier-desktop-report.json | 22 + .../curve-modifier-local-exact-report.json | 44 + tests/golden/M16-GAP-00039/manifest.json | 26 + tests/golden/M16-GAP-00039/task-context.json | 181 + ...data-transfer-modifier-desktop-report.json | 22 + ...-transfer-modifier-local-exact-report.json | 41 + tests/golden/M16-GAP-00040/manifest.json | 26 + tests/golden/M16-GAP-00040/task-context.json | 181 + .../decimate-modifier-desktop-report.json | 27 + .../decimate-modifier-local-exact-report.json | 47 + tests/golden/M16-GAP-00041/manifest.json | 26 + tests/golden/M16-GAP-00041/task-context.json | 181 + .../displace-modifier-desktop-report.json | 27 + .../displace-modifier-local-exact-report.json | 47 + tests/golden/M16-GAP-00042/manifest.json | 26 + tests/golden/M16-GAP-00042/task-context.json | 181 + ...dynamic-paint-modifier-desktop-report.json | 22 + ...mic-paint-modifier-local-exact-report.json | 41 + tests/golden/M16-GAP-00043/manifest.json | 26 + tests/golden/M16-GAP-00043/task-context.json | 181 + .../edge-split-modifier-desktop-report.json | 23 + ...dge-split-modifier-local-exact-report.json | 42 + tests/golden/M16-GAP-00044/manifest.json | 26 + tests/golden/M16-GAP-00044/task-context.json | 181 + .../explode-modifier-desktop-report.json | 22 + .../explode-modifier-local-exact-report.json | 41 + tests/golden/M16-GAP-00045/manifest.json | 26 + tests/golden/M16-GAP-00045/task-context.json | 181 + .../fluid-modifier-desktop-report.json | 22 + .../fluid-modifier-local-exact-report.json | 41 + tests/golden/M16-GAP-00046/manifest.json | 26 + tests/golden/M16-GAP-00046/task-context.json | 181 + ...ncil-armature-modifier-desktop-report.json | 22 + ...-armature-modifier-local-exact-report.json | 41 + tests/golden/M16-GAP-00047/manifest.json | 25 + tests/golden/M16-GAP-00047/task-context.json | 181 + ...-pencil-array-modifier-desktop-report.json | 22 + ...cil-array-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00048/manifest.json | 25 + tests/golden/M16-GAP-00048/task-context.json | 181 + ...-pencil-build-modifier-desktop-report.json | 22 + ...cil-build-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00049/manifest.json | 25 + tests/golden/M16-GAP-00049/task-context.json | 181 + ...-pencil-color-modifier-desktop-report.json | 22 + ...cil-color-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00050/manifest.json | 25 + tests/golden/M16-GAP-00050/task-context.json | 181 + ...e-pencil-dash-modifier-desktop-report.json | 22 + ...ncil-dash-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00051/manifest.json | 25 + tests/golden/M16-GAP-00051/task-context.json | 181 + ...ncil-envelope-modifier-desktop-report.json | 22 + ...-envelope-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00052/manifest.json | 25 + tests/golden/M16-GAP-00052/task-context.json | 181 + ...e-pencil-hook-modifier-desktop-report.json | 22 + ...ncil-hook-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00053/manifest.json | 25 + tests/golden/M16-GAP-00053/task-context.json | 181 + ...encil-lattice-modifier-desktop-report.json | 22 + ...l-lattice-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00054/manifest.json | 25 + tests/golden/M16-GAP-00054/task-context.json | 181 + ...pencil-length-modifier-desktop-report.json | 22 + ...il-length-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00055/manifest.json | 25 + tests/golden/M16-GAP-00055/task-context.json | 181 + ...pencil-mirror-modifier-desktop-report.json | 22 + ...il-mirror-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00056/manifest.json | 25 + tests/golden/M16-GAP-00056/task-context.json | 181 + ...ncil-multiply-modifier-desktop-report.json | 22 + ...-multiply-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00057/manifest.json | 25 + tests/golden/M16-GAP-00057/task-context.json | 181 + ...-pencil-noise-modifier-desktop-report.json | 22 + ...cil-noise-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00058/manifest.json | 25 + tests/golden/M16-GAP-00058/task-context.json | 181 + ...pencil-offset-modifier-desktop-report.json | 22 + ...il-offset-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00059/manifest.json | 24 + tests/golden/M16-GAP-00059/task-context.json | 181 + ...encil-opacity-modifier-desktop-report.json | 22 + ...l-opacity-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00060/manifest.json | 24 + tests/golden/M16-GAP-00060/task-context.json | 181 + ...encil-outline-modifier-desktop-report.json | 22 + ...l-outline-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00061/manifest.json | 24 + tests/golden/M16-GAP-00061/task-context.json | 181 + ...il-shrinkwrap-modifier-desktop-report.json | 22 + ...hrinkwrap-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00062/manifest.json | 24 + tests/golden/M16-GAP-00062/task-context.json | 181 + ...ncil-simplify-modifier-desktop-report.json | 22 + ...-simplify-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00063/manifest.json | 24 + tests/golden/M16-GAP-00063/task-context.json | 181 + ...pencil-smooth-modifier-desktop-report.json | 22 + ...il-smooth-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00064/manifest.json | 24 + tests/golden/M16-GAP-00064/task-context.json | 181 + ...pencil-subdiv-modifier-desktop-report.json | 22 + ...il-subdiv-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00065/manifest.json | 24 + tests/golden/M16-GAP-00065/task-context.json | 181 + ...encil-texture-modifier-desktop-report.json | 22 + ...l-texture-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00066/manifest.json | 24 + tests/golden/M16-GAP-00066/task-context.json | 181 + ...cil-thickness-modifier-desktop-report.json | 22 + ...thickness-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00067/manifest.json | 24 + tests/golden/M16-GAP-00067/task-context.json | 181 + ...e-pencil-time-modifier-desktop-report.json | 22 + ...ncil-time-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00068/manifest.json | 24 + tests/golden/M16-GAP-00068/task-context.json | 181 + ...e-pencil-tint-modifier-desktop-report.json | 22 + ...ncil-tint-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00069/manifest.json | 24 + tests/golden/M16-GAP-00069/task-context.json | 181 + ...-weight-angle-modifier-desktop-report.json | 22 + ...ght-angle-modifier-local-exact-report.json | 43 + tests/golden/M16-GAP-00070/manifest.json | 24 + tests/golden/M16-GAP-00071/task-context.json | 178 + tools/web/check-action-desktop.py | 51 + tools/web/check-armature-desktop.py | 27 + tools/web/check-armature-modifier-desktop.py | 77 + tools/web/check-array-modifier-desktop.py | 61 + tools/web/check-bevel-modifier-desktop.py | 61 + tools/web/check-blender-contract-audit.mjs | 38 + tools/web/check-blender-core-inventory.mjs | 63 + tools/web/check-blender-editor-inventory.mjs | 71 + tools/web/check-blender-family-inventory.mjs | 72 + tools/web/check-blender-format-inventory.mjs | 71 + tools/web/check-blender-gap-audit.mjs | 47 + tools/web/check-blender-next-task-plan.mjs | 15 + tools/web/check-blender-next-task-spec.mjs | 13 + .../web/check-blender-operator-inventory.mjs | 63 + tools/web/check-blender-parity-map.mjs | 53 + .../check-blender-rna-datablock-inventory.mjs | 81 + tools/web/check-blender-task-graph.mjs | 12 + tools/web/check-blender-task-stats.mjs | 11 + tools/web/check-blender-zero-gap-gate.mjs | 10 + tools/web/check-boolean-modifier-desktop.py | 61 + tools/web/check-brush-desktop.py | 24 + tools/web/check-build-modifier-desktop.py | 47 + tools/web/check-camera-desktop.py | 24 + tools/web/check-cast-modifier-desktop.py | 26 + tools/web/check-chromium-accessibility.mjs | 125 + tools/web/check-chromium-input-modal.mjs | 65 +- tools/web/check-chromium-layout.mjs | 138 + tools/web/check-cloth-modifier-desktop.py | 26 + tools/web/check-collection-desktop.py | 22 + tools/web/check-collision-modifier-desktop.py | 19 + tools/web/check-context-governance.mjs | 33 + tools/web/check-curve-desktop.py | 24 + tools/web/check-curves-desktop.py | 25 + tools/web/check-freestyle-desktop.py | 24 + tools/web/check-generated-gap.mjs | 1161 + tools/web/check-generic-modifier-desktop.py | 78 + tools/web/check-grease-pencil-desktop.py | 28 + tools/web/check-lattice-desktop.py | 77 + tools/web/check-library-desktop.py | 60 + tools/web/check-light-desktop.py | 74 + tools/web/check-material-desktop.py | 86 + tools/web/check-mesh-desktop.py | 73 + tools/web/check-metaball-desktop.py | 54 + tools/web/check-nodetree-desktop.py | 51 + tools/web/check-object-desktop.py | 47 + tools/web/check-particle-settings-desktop.py | 69 + tools/web/check-pointcloud-desktop.py | 68 + tools/web/check-scene-desktop.py | 54 + tools/web/check-screen-desktop.py | 49 + tools/web/check-sound-desktop.py | 52 + tools/web/check-speaker-desktop.py | 57 + tools/web/check-task-context.mjs | 39 + tools/web/check-task-index.mjs | 42 + tools/web/check-text-desktop.py | 55 + tools/web/check-texture-desktop.py | 52 + tools/web/check-volume-desktop.py | 43 + tools/web/check-window-manager-desktop.py | 41 + tools/web/check-workspace-desktop.py | 22 + tools/web/check-world-desktop.py | 17 + tools/web/context-governance.mjs | 148 + tools/web/generate-blender-contract-audit.mjs | 36 + tools/web/generate-blender-core-inventory.py | 97 + .../web/generate-blender-editor-inventory.py | 129 + .../web/generate-blender-family-inventory.py | 129 + .../web/generate-blender-format-inventory.py | 127 + tools/web/generate-blender-gap-audit.mjs | 37 + tools/web/generate-blender-next-task-plan.mjs | 70 + .../generate-blender-operator-inventory.py | 116 + tools/web/generate-blender-parity-map.mjs | 69 + ...enerate-blender-rna-datablock-inventory.py | 75 + tools/web/generate-brush-fixture.py | 19 + tools/web/generate-camera-fixture.py | 21 + tools/web/generate-collection-fixture.py | 20 + tools/web/generate-curve-fixture.py | 25 + tools/web/generate-curves-fixture.py | 29 + tools/web/generate-freestyle-fixture.py | 23 + tools/web/generate-task-card.mjs | 46 + tools/web/generate-task-index.mjs | 56 + tools/web/generated/M16-GAP-00010.py | 36 + tools/web/generated/M16-GAP-00011.py | 49 + tools/web/generated/M16-GAP-00012.py | 31 + tools/web/generated/M16-GAP-00013.py | 50 + tools/web/generated/M16-GAP-00014.py | 29 + tools/web/generated/M16-GAP-00015.py | 34 + tools/web/generated/M16-GAP-00016.py | 35 + tools/web/generated/M16-GAP-00017.py | 26 + tools/web/generated/M16-GAP-00018.py | 29 + tools/web/generated/M16-GAP-00019.py | 28 + tools/web/generated/M16-GAP-00020.py | 28 + tools/web/generated/M16-GAP-00021.py | 21 + tools/web/generated/M16-GAP-00022.py | 22 + tools/web/generated/M16-GAP-00023.py | 34 + tools/web/generated/M16-GAP-00024.py | 21 + tools/web/generated/M16-GAP-00025.py | 24 + tools/web/generated/M16-GAP-00026.py | 23 + tools/web/generated/M16-GAP-00027.py | 18 + tools/web/generated/M16-GAP-00028.py | 20 + tools/web/generated/M16-GAP-00029.py | 20 + tools/web/generated/M16-GAP-00030.py | 52 + tools/web/generated/M16-GAP-00031.py | 54 + tools/web/generated/M16-GAP-00032.py | 39 + tools/web/generated/M16-GAP-00033.py | 43 + tools/web/generated/M16-GAP-00034.py | 34 + tools/web/generated/M16-GAP-00035.py | 34 + tools/web/generated/M16-GAP-00036.py | 24 + tools/web/generated/M16-GAP-00037.py | 18 + tools/web/generated/M16-GAP-00038.py | 14 + tools/web/generated/M16-GAP-00039.py | 11 + tools/web/generated/M16-GAP-00040.py | 12 + tools/web/generated/M16-GAP-00041.py | 29 + tools/web/generated/M16-GAP-00042.py | 29 + tools/web/generated/M16-GAP-00043.py | 13 + tools/web/generated/M16-GAP-00044.py | 28 + tools/web/generated/M16-GAP-00045.py | 13 + tools/web/generated/M16-GAP-00046.py | 13 + tools/web/generated/M16-GAP-00047.py | 14 + tools/web/generated/M16-GAP-00048.py | 13 + tools/web/generated/M16-GAP-00049.py | 13 + tools/web/generated/M16-GAP-00050.py | 13 + tools/web/generated/M16-GAP-00051.py | 13 + tools/web/generated/M16-GAP-00052.py | 13 + tools/web/generated/M16-GAP-00053.py | 13 + tools/web/generated/M16-GAP-00054.py | 13 + tools/web/generated/M16-GAP-00055.py | 13 + tools/web/generated/M16-GAP-00056.py | 13 + tools/web/generated/M16-GAP-00057.py | 13 + tools/web/generated/M16-GAP-00058.py | 13 + tools/web/generated/M16-GAP-00059.py | 13 + tools/web/generated/M16-GAP-00060.py | 13 + tools/web/generated/M16-GAP-00061.py | 13 + tools/web/generated/M16-GAP-00062.py | 13 + tools/web/generated/M16-GAP-00063.py | 13 + tools/web/generated/M16-GAP-00064.py | 13 + tools/web/generated/M16-GAP-00065.py | 13 + tools/web/generated/M16-GAP-00066.py | 13 + tools/web/generated/M16-GAP-00067.py | 13 + tools/web/generated/M16-GAP-00068.py | 13 + tools/web/generated/M16-GAP-00069.py | 13 + tools/web/generated/M16-GAP-00070.py | 13 + tools/web/generated/modifier_gap_fixture.py | 32 + tools/web/print-task-context.mjs | 7 + tools/web/task-context-lib.mjs | 379 + web/app/public/vendor/blender/web_engine.wasm | Bin 15467310 -> 15549231 bytes web/app/src/app/App.tsx | 2 +- web/app/src/app/app-shell.css | 2 +- .../src/three-adapter/offscreen-viewport.ts | 52 +- web/app/src/three-adapter/viewport.ts | 35 +- web/app/src/vendor/blender/web_engine.wasm | Bin 15467310 -> 15549231 bytes web/package.json | 23 + web/protocol/input-modal.ts | 18 + web/protocol/scene-ir.ts | 343 + web/tests/unit/context-governance.test.mjs | 47 + web/tests/unit/input-modal.test.mjs | 10 + web/tests/unit/task-context.test.mjs | 72 + 984 files changed, 543475 insertions(+), 327 deletions(-) create mode 100644 AGENTS.md create mode 100644 docs/CONTEXT_BUDGET.md create mode 100644 docs/CONTEXT_GOVERNANCE.md create mode 100644 docs/status/M14-04F.md create mode 100644 docs/status/M14-04G.md create mode 100644 docs/status/M14-04H.md create mode 100644 docs/status/M15-01A.md create mode 100644 docs/status/M15-01B.md create mode 100644 docs/status/M15-01C.md create mode 100644 docs/status/M15-01D.md create mode 100644 docs/status/M15-01E.md create mode 100644 docs/status/M15-01F.md create mode 100644 docs/status/M15-02A.md create mode 100644 docs/status/M15-02B.md create mode 100644 docs/status/M15-02C.md create mode 100644 docs/status/M15-02D.md create mode 100644 docs/status/M15-02E.md create mode 100644 docs/status/M15-02F.md create mode 100644 docs/status/M15-03A.md create mode 100644 docs/status/M15-03B.md create mode 100644 docs/status/M15-03C.md create mode 100644 docs/status/M15-03D.md create mode 100644 docs/status/M15-03E.md create mode 100644 docs/status/M16-GAP-00001.md create mode 100644 docs/status/M16-GAP-00002.md create mode 100644 docs/status/M16-GAP-00003.md create mode 100644 docs/status/M16-GAP-00004.md create mode 100644 docs/status/M16-GAP-00005.md create mode 100644 docs/status/M16-GAP-00006.md create mode 100644 docs/status/M16-GAP-00007.md create mode 100644 docs/status/M16-GAP-00008.md create mode 100644 docs/status/M16-GAP-00009.md create mode 100644 docs/status/M16-GAP-00010.md create mode 100644 docs/status/M16-GAP-00011.md create mode 100644 docs/status/M16-GAP-00012.md create mode 100644 docs/status/M16-GAP-00013.md create mode 100644 docs/status/M16-GAP-00014.md create mode 100644 docs/status/M16-GAP-00015.md create mode 100644 docs/status/M16-GAP-00016.md create mode 100644 docs/status/M16-GAP-00017.md create mode 100644 docs/status/M16-GAP-00018.md create mode 100644 docs/status/M16-GAP-00019.md create mode 100644 docs/status/M16-GAP-00020.md create mode 100644 docs/status/M16-GAP-00021.md create mode 100644 docs/status/M16-GAP-00022.md create mode 100644 docs/status/M16-GAP-00023.md create mode 100644 docs/status/M16-GAP-00024.md create mode 100644 docs/status/M16-GAP-00025.md create mode 100644 docs/status/M16-GAP-00026.md create mode 100644 docs/status/M16-GAP-00027.md create mode 100644 docs/status/M16-GAP-00028.md create mode 100644 docs/status/M16-GAP-00029.md create mode 100644 docs/status/M16-GAP-00030.md create mode 100644 docs/status/M16-GAP-00031.md create mode 100644 docs/status/M16-GAP-00032.md create mode 100644 docs/status/M16-GAP-00033.md create mode 100644 docs/status/M16-GAP-00034.md create mode 100644 docs/status/M16-GAP-00035.md create mode 100644 docs/status/M16-GAP-00036.md create mode 100644 docs/status/M16-GAP-00037.md create mode 100644 docs/status/M16-GAP-00038.md create mode 100644 docs/status/M16-GAP-00039.md create mode 100644 docs/status/M16-GAP-00040.md create mode 100644 docs/status/M16-GAP-00041.md create mode 100644 docs/status/M16-GAP-00042.md create mode 100644 docs/status/M16-GAP-00043.md create mode 100644 docs/status/M16-GAP-00044.md create mode 100644 docs/status/M16-GAP-00045.md create mode 100644 docs/status/M16-GAP-00046.md create mode 100644 docs/status/M16-GAP-00047.md create mode 100644 docs/status/M16-GAP-00048.md create mode 100644 docs/status/M16-GAP-00049.md create mode 100644 docs/status/M16-GAP-00050.md create mode 100644 docs/status/M16-GAP-00051.md create mode 100644 docs/status/M16-GAP-00052.md create mode 100644 docs/status/M16-GAP-00053.md create mode 100644 docs/status/M16-GAP-00054.md create mode 100644 docs/status/M16-GAP-00055.md create mode 100644 docs/status/M16-GAP-00056.md create mode 100644 docs/status/M16-GAP-00057.md create mode 100644 docs/status/M16-GAP-00058.md create mode 100644 docs/status/M16-GAP-00059.md create mode 100644 docs/status/M16-GAP-00060.md create mode 100644 docs/status/M16-GAP-00061.md create mode 100644 docs/status/M16-GAP-00062.md create mode 100644 docs/status/M16-GAP-00063.md create mode 100644 docs/status/M16-GAP-00064.md create mode 100644 docs/status/M16-GAP-00065.md create mode 100644 docs/status/M16-GAP-00066.md create mode 100644 docs/status/M16-GAP-00067.md create mode 100644 docs/status/M16-GAP-00068.md create mode 100644 docs/status/M16-GAP-00069.md create mode 100644 docs/status/M16-GAP-00070.md create mode 100644 docs/tasks/M14-04G.md create mode 100644 docs/tasks/M14-04H.md create mode 100644 docs/tasks/M15-01A.md create mode 100644 docs/tasks/M15-01B.md create mode 100644 docs/tasks/M15-01C.md create mode 100644 docs/tasks/M15-01D.md create mode 100644 docs/tasks/M15-01E.md create mode 100644 docs/tasks/M15-01F.md create mode 100644 docs/tasks/M15-02A.md create mode 100644 docs/tasks/M15-02B.md create mode 100644 docs/tasks/M15-02C.md create mode 100644 docs/tasks/M15-02D.md create mode 100644 docs/tasks/M15-02E.md create mode 100644 docs/tasks/M15-02F.md create mode 100644 docs/tasks/M15-03A.md create mode 100644 docs/tasks/M15-03B.md create mode 100644 docs/tasks/M15-03C.md create mode 100644 docs/tasks/M15-03D.md create mode 100644 docs/tasks/M15-03E.md create mode 100644 docs/tasks/M16-GAP-00001.md create mode 100644 docs/tasks/M16-GAP-00002.md create mode 100644 docs/tasks/M16-GAP-00003.md create mode 100644 docs/tasks/M16-GAP-00004.md create mode 100644 docs/tasks/M16-GAP-00005.md create mode 100644 docs/tasks/M16-GAP-00006.md create mode 100644 docs/tasks/M16-GAP-00007.md create mode 100644 docs/tasks/M16-GAP-00008.md create mode 100644 docs/tasks/M16-GAP-00009.md create mode 100644 docs/tasks/M16-GAP-00010.md create mode 100644 docs/tasks/M16-GAP-00011.md create mode 100644 docs/tasks/M16-GAP-00012.md create mode 100644 docs/tasks/M16-GAP-00013.md create mode 100644 docs/tasks/M16-GAP-00014.md create mode 100644 docs/tasks/M16-GAP-00015.md create mode 100644 docs/tasks/M16-GAP-00016.md create mode 100644 docs/tasks/M16-GAP-00017.md create mode 100644 docs/tasks/M16-GAP-00018.md create mode 100644 docs/tasks/M16-GAP-00019.md create mode 100644 docs/tasks/M16-GAP-00020.md create mode 100644 docs/tasks/M16-GAP-00021.md create mode 100644 docs/tasks/M16-GAP-00022.md create mode 100644 docs/tasks/M16-GAP-00023.md create mode 100644 docs/tasks/M16-GAP-00024.md create mode 100644 docs/tasks/M16-GAP-00025.md create mode 100644 docs/tasks/M16-GAP-00026.md create mode 100644 docs/tasks/M16-GAP-00027.md create mode 100644 docs/tasks/M16-GAP-00028.md create mode 100644 docs/tasks/M16-GAP-00029.md create mode 100644 docs/tasks/M16-GAP-00030.md create mode 100644 docs/tasks/M16-GAP-00031.md create mode 100644 docs/tasks/M16-GAP-00032.md create mode 100644 docs/tasks/M16-GAP-00033.md create mode 100644 docs/tasks/M16-GAP-00034.md create mode 100644 docs/tasks/M16-GAP-00035.md create mode 100644 docs/tasks/M16-GAP-00036.md create mode 100644 docs/tasks/M16-GAP-00037.md create mode 100644 docs/tasks/M16-GAP-00038.md create mode 100644 docs/tasks/M16-GAP-00039.md create mode 100644 docs/tasks/M16-GAP-00040.md create mode 100644 docs/tasks/M16-GAP-00041.md create mode 100644 docs/tasks/M16-GAP-00042.md create mode 100644 docs/tasks/M16-GAP-00043.md create mode 100644 docs/tasks/M16-GAP-00044.md create mode 100644 docs/tasks/M16-GAP-00045.md create mode 100644 docs/tasks/M16-GAP-00046.md create mode 100644 docs/tasks/M16-GAP-00047.md create mode 100644 docs/tasks/M16-GAP-00048.md create mode 100644 docs/tasks/M16-GAP-00049.md create mode 100644 docs/tasks/M16-GAP-00050.md create mode 100644 docs/tasks/M16-GAP-00051.md create mode 100644 docs/tasks/M16-GAP-00052.md create mode 100644 docs/tasks/M16-GAP-00053.md create mode 100644 docs/tasks/M16-GAP-00054.md create mode 100644 docs/tasks/M16-GAP-00055.md create mode 100644 docs/tasks/M16-GAP-00056.md create mode 100644 docs/tasks/M16-GAP-00057.md create mode 100644 docs/tasks/M16-GAP-00058.md create mode 100644 docs/tasks/M16-GAP-00059.md create mode 100644 docs/tasks/M16-GAP-00060.md create mode 100644 docs/tasks/M16-GAP-00061.md create mode 100644 docs/tasks/M16-GAP-00062.md create mode 100644 docs/tasks/M16-GAP-00063.md create mode 100644 docs/tasks/M16-GAP-00064.md create mode 100644 docs/tasks/M16-GAP-00065.md create mode 100644 docs/tasks/M16-GAP-00066.md create mode 100644 docs/tasks/M16-GAP-00067.md create mode 100644 docs/tasks/M16-GAP-00068.md create mode 100644 docs/tasks/M16-GAP-00069.md create mode 100644 docs/tasks/M16-GAP-00070.md create mode 100644 docs/tasks/M16-GAP-00071.md create mode 100644 tests/files/web/generated/M16-GAP-00001-datablock-Action.blend create mode 100644 tests/files/web/generated/M16-GAP-00001-datablock-Action.blend1 create mode 100644 tests/files/web/generated/M16-GAP-00002-datablock-Armature.blend create mode 100644 tests/files/web/generated/M16-GAP-00003-datablock-Brush.blend create mode 100644 tests/files/web/generated/M16-GAP-00004-datablock-Camera.blend create mode 100644 tests/files/web/generated/M16-GAP-00005-datablock-Collection.blend create mode 100644 tests/files/web/generated/M16-GAP-00006-datablock-Curve.blend create mode 100644 tests/files/web/generated/M16-GAP-00007-datablock-Curves.blend create mode 100644 tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend create mode 100644 tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend1 create mode 100644 tests/files/web/generated/M16-GAP-00009-datablock-GreasePencil.blend create mode 100644 tests/files/web/generated/M16-GAP-00010-datablock-Lattice.blend create mode 100644 tests/files/web/generated/M16-GAP-00011-datablock-Library.blend create mode 100644 tests/files/web/generated/M16-GAP-00012-datablock-Light.blend create mode 100644 tests/files/web/generated/M16-GAP-00013-datablock-Material.blend create mode 100644 tests/files/web/generated/M16-GAP-00013-datablock-Material.blend1 create mode 100644 tests/files/web/generated/M16-GAP-00014-datablock-Mesh.blend create mode 100644 tests/files/web/generated/M16-GAP-00015-datablock-MetaBall.blend create mode 100644 tests/files/web/generated/M16-GAP-00016-datablock-NodeTree.blend create mode 100644 tests/files/web/generated/M16-GAP-00017-datablock-Object.blend create mode 100644 tests/files/web/generated/M16-GAP-00018-datablock-ParticleSettings.blend create mode 100644 tests/files/web/generated/M16-GAP-00018-datablock-ParticleSettings.blend1 create mode 100644 tests/files/web/generated/M16-GAP-00019-datablock-PointCloud.blend create mode 100644 tests/files/web/generated/M16-GAP-00020-datablock-Scene.blend create mode 100644 tests/files/web/generated/M16-GAP-00021-datablock-Screen.blend create mode 100644 tests/files/web/generated/M16-GAP-00022-datablock-Sound.blend create mode 100644 tests/files/web/generated/M16-GAP-00022-datablock-Sound.blend1 create mode 100644 tests/files/web/generated/M16-GAP-00023-datablock-Speaker.blend create mode 100644 tests/files/web/generated/M16-GAP-00024-datablock-Text.blend create mode 100644 tests/files/web/generated/M16-GAP-00025-datablock-Texture.blend create mode 100644 tests/files/web/generated/M16-GAP-00026-datablock-Volume.blend create mode 100644 tests/files/web/generated/M16-GAP-00027-datablock-WindowManager.blend create mode 100644 tests/files/web/generated/M16-GAP-00028-datablock-WorkSpace.blend create mode 100644 tests/files/web/generated/M16-GAP-00029-datablock-World.blend create mode 100644 tests/files/web/generated/M16-GAP-00029-datablock-World.blend1 create mode 100644 tests/files/web/generated/M16-GAP-00030-modifier-ARMATURE.blend create mode 100644 tests/files/web/generated/M16-GAP-00031-modifier-ARRAY.blend create mode 100644 tests/files/web/generated/M16-GAP-00032-modifier-BEVEL.blend create mode 100644 tests/files/web/generated/M16-GAP-00033-modifier-BOOLEAN.blend create mode 100644 tests/files/web/generated/M16-GAP-00034-modifier-BUILD.blend create mode 100644 tests/files/web/generated/M16-GAP-00035-modifier-CAST.blend create mode 100644 tests/files/web/generated/M16-GAP-00036-modifier-CLOTH.blend create mode 100644 tests/files/web/generated/M16-GAP-00037-modifier-COLLISION.blend create mode 100644 tests/files/web/generated/M16-GAP-00038-modifier-CORRECTIVE_SMOOTH.blend create mode 100644 tests/files/web/generated/M16-GAP-00039-modifier-CURVE.blend create mode 100644 tests/files/web/generated/M16-GAP-00040-modifier-DATA_TRANSFER.blend create mode 100644 tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend create mode 100644 tests/files/web/generated/M16-GAP-00042-modifier-DISPLACE.blend create mode 100644 tests/files/web/generated/M16-GAP-00043-modifier-DYNAMIC_PAINT.blend create mode 100644 tests/files/web/generated/M16-GAP-00044-modifier-EDGE_SPLIT.blend create mode 100644 tests/files/web/generated/M16-GAP-00045-modifier-EXPLODE.blend create mode 100644 tests/files/web/generated/M16-GAP-00046-modifier-FLUID.blend create mode 100644 tests/files/web/generated/M16-GAP-00047-modifier-GREASE_PENCIL_ARMATURE.blend create mode 100644 tests/files/web/generated/M16-GAP-00048-modifier-GREASE_PENCIL_ARRAY.blend create mode 100644 tests/files/web/generated/M16-GAP-00049-modifier-GREASE_PENCIL_BUILD.blend create mode 100644 tests/files/web/generated/M16-GAP-00050-modifier-GREASE_PENCIL_COLOR.blend create mode 100644 tests/files/web/generated/M16-GAP-00051-modifier-GREASE_PENCIL_DASH.blend create mode 100644 tests/files/web/generated/M16-GAP-00052-modifier-GREASE_PENCIL_ENVELOPE.blend create mode 100644 tests/files/web/generated/M16-GAP-00053-modifier-GREASE_PENCIL_HOOK.blend create mode 100644 tests/files/web/generated/M16-GAP-00054-modifier-GREASE_PENCIL_LATTICE.blend create mode 100644 tests/files/web/generated/M16-GAP-00055-modifier-GREASE_PENCIL_LENGTH.blend create mode 100644 tests/files/web/generated/M16-GAP-00056-modifier-GREASE_PENCIL_MIRROR.blend create mode 100644 tests/files/web/generated/M16-GAP-00057-modifier-GREASE_PENCIL_MULTIPLY.blend create mode 100644 tests/files/web/generated/M16-GAP-00058-modifier-GREASE_PENCIL_NOISE.blend create mode 100644 tests/files/web/generated/M16-GAP-00059-modifier-GREASE_PENCIL_OFFSET.blend create mode 100644 tests/files/web/generated/M16-GAP-00060-modifier-GREASE_PENCIL_OPACITY.blend create mode 100644 tests/files/web/generated/M16-GAP-00061-modifier-GREASE_PENCIL_OUTLINE.blend create mode 100644 tests/files/web/generated/M16-GAP-00062-modifier-GREASE_PENCIL_SHRINKWRAP.blend create mode 100644 tests/files/web/generated/M16-GAP-00063-modifier-GREASE_PENCIL_SIMPLIFY.blend create mode 100644 tests/files/web/generated/M16-GAP-00064-modifier-GREASE_PENCIL_SMOOTH.blend create mode 100644 tests/files/web/generated/M16-GAP-00065-modifier-GREASE_PENCIL_SUBDIV.blend create mode 100644 tests/files/web/generated/M16-GAP-00066-modifier-GREASE_PENCIL_TEXTURE.blend create mode 100644 tests/files/web/generated/M16-GAP-00067-modifier-GREASE_PENCIL_THICKNESS.blend create mode 100644 tests/files/web/generated/M16-GAP-00068-modifier-GREASE_PENCIL_TIME.blend create mode 100644 tests/files/web/generated/M16-GAP-00069-modifier-GREASE_PENCIL_TINT.blend create mode 100644 tests/files/web/generated/M16-GAP-00070-modifier-GREASE_PENCIL_VERTEX_WEIGHT_ANGLE.blend create mode 100644 tests/files/web/generated/WebGapLibrary.blend create mode 100644 tests/files/web/generated/m16-armature-modifier-reopen-_h313f11.blend1 create mode 100644 tests/files/web/generated/m16-armature-modifier-reopen-gxasjymt.blend1 create mode 100644 tests/files/web/generated/m16-armature-modifier-reopen-nqdj7o5e.blend1 create mode 100644 tests/files/web/generated/m16-armature-modifier-reopen-o7bz7r6f.blend1 create mode 100644 tests/files/web/generated/m16-array-modifier-reopen-amanh0lg.blend1 create mode 100644 tests/files/web/generated/m16-array-modifier-reopen-f2604i1p.blend1 create mode 100644 tests/files/web/generated/m16-bevel-modifier-reopen-7jk5r7jt.blend1 create mode 100644 tests/files/web/generated/m16-bevel-modifier-reopen-k4mww0ym.blend1 create mode 100644 tests/files/web/generated/m16-bevel-modifier-reopen-wkcewedm.blend1 create mode 100644 tests/files/web/generated/m16-boolean-modifier-reopen-5c8tre34.blend1 create mode 100644 tests/files/web/generated/m16-boolean-modifier-reopen-9fwjeeq3.blend1 create mode 100644 tests/files/web/generated/m16-boolean-modifier-reopen-c4c4jmu1.blend1 create mode 100644 tests/files/web/generated/m16-boolean-modifier-reopen-robqt7dc.blend1 create mode 100644 tests/files/web/generated/m16-boolean-modifier-reopen-t3kt1sj0.blend1 create mode 100644 tests/files/web/generated/m16-build-modifier-reopen-cwkfiwzs.blend1 create mode 100644 tests/files/web/generated/m16-build-modifier-reopen-d04y3n96.blend1 create mode 100644 tests/files/web/generated/m16-build-modifier-reopen-ie1l4na9.blend1 create mode 100644 tests/files/web/generated/m16-build-modifier-reopen-jqdqctpx.blend1 create mode 100644 tests/files/web/generated/m16-cast-modifier-reopen-02vjafdj.blend1 create mode 100644 tests/files/web/generated/m16-cast-modifier-reopen-8ool3kbz.blend1 create mode 100644 tests/files/web/generated/m16-cast-modifier-reopen-j7f2kk7k.blend1 create mode 100644 tests/files/web/generated/m16-cast-modifier-reopen-n19cv64q.blend1 create mode 100644 tests/files/web/generated/m16-cloth-modifier-reopen-3piita_r.blend1 create mode 100644 tests/files/web/generated/m16-cloth-modifier-reopen-vrs2og0r.blend1 create mode 100644 tests/files/web/generated/m16-collision-reopen-vdszt6zl.blend1 create mode 100644 tests/files/web/generated/m16-collision-reopen-vvd633rd.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-1aghhvup.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-4jwsxs8x.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-508uylh6.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-52_i6mby.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-69cr1j4r.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-6_jt57rz.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-6dhl53ql.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-6gnredpf.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-6krstrm1.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-6ohild7w.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-746ef_qd.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-74q1f5da.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-_3gpfpyu.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-_6ok9ark.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-_fblu0p9.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-_imkk_7o.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-bobwy_hv.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-cxpr_roz.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-d662jd_w.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-e4iabhw_.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-e5mnum47.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-ei96ctq5.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-enpd9s63.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-f87lm1ky.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-fr9p9fca.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-fx8k3pcp.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-gg5476nh.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-gkaflk_e.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-gtjzlgb2.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-h49l0i4g.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-h74akucs.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-hj4zyxh8.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-hz9_meam.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-hzy2dsdl.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-ihyytuxb.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-iyk0biv7.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-jlkphvss.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-jllmylu1.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-juw3pyod.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-kavolixm.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-kcju3dkx.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-kfbk4w9c.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-kjp64qpi.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-kmfp3cgw.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-kn_q9njn.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-najkvbzc.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-np1x67_0.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-nr6p9143.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-o4pn24_w.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-ofp52vvi.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-onnxlfm8.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-owc564mx.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-p3r2t0k1.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-pll4_mnv.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-pvkxr4gd.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-px1kxmkc.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-qnnczibn.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-qsc2h8uu.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-rpgi619f.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-rvnjiu51.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-rwqzwjn5.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-sekdp3ip.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-t5_mht12.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-vbjqnexq.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-wqh77a2m.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-x_8ztooe.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-xrugqrto.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-xyaqgh82.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-ykbwf67b.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-yqkvre3v.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-zh1x2uqh.blend1 create mode 100644 tests/files/web/generated/m16-generic-modifier-reopen-zo2ilg04.blend1 create mode 100644 tests/files/web/generated/m16-library-reopen-a_o61bmd.blend1 create mode 100644 tests/files/web/generated/m16-library-reopen-euqel05v.blend1 create mode 100644 tests/files/web/generated/m16-library-reopen-f2sth1ms.blend1 create mode 100644 tests/files/web/generated/m16-library-reopen-i2xnswhr.blend1 create mode 100644 tests/files/web/generated/m16-library-reopen-uv3_d89n.blend1 create mode 100644 tests/files/web/generated/m16-light-reopen-0fbn57ic.blend1 create mode 100644 tests/files/web/generated/m16-light-reopen-hy2lr8tv.blend1 create mode 100644 tests/files/web/generated/m16-light-reopen-ltby_xqd.blend1 create mode 100644 tests/files/web/generated/m16-light-reopen-o5dh1dh3.blend1 create mode 100644 tests/files/web/generated/m16-light-reopen-uqg4gsaw.blend1 create mode 100644 tests/files/web/generated/m16-light-reopen-zedx8s34.blend1 create mode 100644 tests/files/web/generated/m16-material-reopen-64z4xel4.blend1 create mode 100644 tests/files/web/generated/m16-material-reopen-_cbyc9bt.blend1 create mode 100644 tests/files/web/generated/m16-material-reopen-mp2i8_6c.blend1 create mode 100644 tests/files/web/generated/m16-mesh-reopen-74ilsxk_.blend1 create mode 100644 tests/files/web/generated/m16-mesh-reopen-l2jrscfb.blend1 create mode 100644 tests/files/web/generated/m16-mesh-reopen-w14m2aju.blend1 create mode 100644 tests/files/web/generated/m16-metaball-reopen-6fzhkq3_.blend1 create mode 100644 tests/files/web/generated/m16-metaball-reopen-l4j1lx20.blend1 create mode 100644 tests/files/web/generated/m16-metaball-reopen-sk3nlfi5.blend1 create mode 100644 tests/files/web/generated/m16-nodetree-reopen-2ade748f.blend1 create mode 100644 tests/files/web/generated/m16-nodetree-reopen-mqzq_o10.blend1 create mode 100644 tests/files/web/generated/m16-nodetree-reopen-qyaot_y6.blend1 create mode 100644 tests/files/web/generated/m16-object-reopen-aol3hp8g.blend1 create mode 100644 tests/files/web/generated/m16-object-reopen-eamt7tc7.blend1 create mode 100644 tests/files/web/generated/m16-object-reopen-hxx1dwck.blend1 create mode 100644 tests/files/web/generated/m16-particle-settings-reopen-34i8qfvc.blend1 create mode 100644 tests/files/web/generated/m16-particle-settings-reopen-_cutrns5.blend1 create mode 100644 tests/files/web/generated/m16-particle-settings-reopen-awi44iql.blend1 create mode 100644 tests/files/web/generated/m16-particle-settings-reopen-dgv57rla.blend1 create mode 100644 tests/files/web/generated/m16-particle-settings-reopen-dpzeym9q.blend1 create mode 100644 tests/files/web/generated/m16-particle-settings-reopen-mo9gxc__.blend1 create mode 100644 tests/files/web/generated/m16-particle-settings-reopen-mr8b2nau.blend1 create mode 100644 tests/files/web/generated/m16-particle-settings-reopen-z25w8j7s.blend1 create mode 100644 tests/files/web/generated/m16-pointcloud-reopen-0zd_gnu3.blend1 create mode 100644 tests/files/web/generated/m16-pointcloud-reopen-4r8fb3bm.blend1 create mode 100644 tests/files/web/generated/m16-pointcloud-reopen-f928wi9u.blend1 create mode 100644 tests/files/web/generated/m16-scene-reopen-63_iylge.blend1 create mode 100644 tests/files/web/generated/m16-scene-reopen-_k2e4r7d.blend1 create mode 100644 tests/files/web/generated/m16-scene-reopen-p4d973qt.blend1 create mode 100644 tests/files/web/generated/m16-screen-reopen-6uz58o6j.blend1 create mode 100644 tests/files/web/generated/m16-screen-reopen-bscc19pt.blend1 create mode 100644 tests/files/web/generated/m16-screen-reopen-mraipxaz.blend1 create mode 100644 tests/files/web/generated/m16-screen-reopen-u0ki2g0h.blend1 create mode 100644 tests/files/web/generated/m16-sound-reopen-49xmsa53.blend1 create mode 100644 tests/files/web/generated/m16-sound-reopen-emmej6t3.blend1 create mode 100644 tests/files/web/generated/m16-sound-reopen-gril9iih.blend1 create mode 100644 tests/files/web/generated/m16-sound-reopen-lm9_f3s5.blend1 create mode 100644 tests/files/web/generated/m16-sound-reopen-tujkgz3q.blend1 create mode 100644 tests/files/web/generated/m16-speaker-reopen-3ynqut1w.blend1 create mode 100644 tests/files/web/generated/m16-speaker-reopen-eyc_sbiz.blend1 create mode 100644 tests/files/web/generated/m16-speaker-reopen-t__k7swa.blend1 create mode 100644 tests/files/web/generated/m16-text-reopen-0iigxii0.blend1 create mode 100644 tests/files/web/generated/m16-text-reopen-2rhzjcre.blend1 create mode 100644 tests/files/web/generated/m16-text-reopen-beo_c27v.blend1 create mode 100644 tests/files/web/generated/m16-text-reopen-rf7ecljk.blend1 create mode 100644 tests/files/web/generated/m16-texture-reopen-9f03_9l4.blend1 create mode 100644 tests/files/web/generated/m16-texture-reopen-lexzbvjt.blend1 create mode 100644 tests/files/web/generated/m16-texture-reopen-x7z41b6m.blend1 create mode 100644 tests/files/web/generated/m16-volume-reopen-i98om7o9.blend1 create mode 100644 tests/files/web/generated/m16-volume-reopen-idauslqz.blend1 create mode 100644 tests/files/web/generated/m16-window-manager-reopen-_bxszg_d.blend1 create mode 100644 tests/files/web/generated/m16-window-manager-reopen-p_04zcst.blend1 create mode 100644 tests/files/web/generated/m16-workspace-reopen-db88awms.blend1 create mode 100644 tests/files/web/generated/m16-workspace-reopen-haqswgr9.blend1 create mode 100644 tests/files/web/generated/m16-world-reopen-04jj65qu.blend1 create mode 100644 tests/files/web/generated/m16-world-reopen-jz52mply.blend1 create mode 100644 tests/files/web/generated/m16-world-reopen-tvwrz9zr.blend1 create mode 100644 tests/files/web/generated/m16-world-reopen-w5az1zvg.blend1 create mode 100644 tests/files/web/generated/m16-world-reopen-zpf_0kql.blend1 create mode 100644 tests/golden/M14-04G/chromium-layout-report.json create mode 100644 tests/golden/M14-04G/manifest.json create mode 100644 tests/golden/M14-04H/chromium-accessibility-report.json create mode 100644 tests/golden/M14-04H/manifest.json create mode 100644 tests/golden/M15-01A/blender-rna-datablock-inventory.json create mode 100644 tests/golden/M15-01A/inventory-check-report.json create mode 100644 tests/golden/M15-01A/manifest.json create mode 100644 tests/golden/M15-01B/blender-operator-inventory.json create mode 100644 tests/golden/M15-01B/manifest.json create mode 100644 tests/golden/M15-01B/operator-inventory-check-report.json create mode 100644 tests/golden/M15-01C/blender-family-inventory.json create mode 100644 tests/golden/M15-01C/family-inventory-check-report.json create mode 100644 tests/golden/M15-01C/manifest.json create mode 100644 tests/golden/M15-01D/blender-format-inventory.json create mode 100644 tests/golden/M15-01D/format-inventory-check-report.json create mode 100644 tests/golden/M15-01D/manifest.json create mode 100644 tests/golden/M15-01E/blender-editor-inventory.json create mode 100644 tests/golden/M15-01E/editor-inventory-check-report.json create mode 100644 tests/golden/M15-01E/manifest.json create mode 100644 tests/golden/M15-01F/blender-core-inventory.json create mode 100644 tests/golden/M15-01F/core-inventory-check-report.json create mode 100644 tests/golden/M15-01F/manifest.json create mode 100644 tests/golden/M15-02A/blender-parity-map.json create mode 100644 tests/golden/M15-02A/manifest.json create mode 100644 tests/golden/M15-02A/parity-map-check-report.json create mode 100644 tests/golden/M15-02B/blender-gap-audit.json create mode 100644 tests/golden/M15-02B/gap-audit-check-report.json create mode 100644 tests/golden/M15-02B/manifest.json create mode 100644 tests/golden/M15-02C/local-exact-audit-check-report.json create mode 100644 tests/golden/M15-02C/local-exact-audit.json create mode 100644 tests/golden/M15-02C/manifest.json create mode 100644 tests/golden/M15-02D/local-equivalent-audit-check-report.json create mode 100644 tests/golden/M15-02D/local-equivalent-audit.json create mode 100644 tests/golden/M15-02D/manifest.json create mode 100644 tests/golden/M15-02E/manifest.json create mode 100644 tests/golden/M15-02E/server-exact-audit-check-report.json create mode 100644 tests/golden/M15-02E/server-exact-audit.json create mode 100644 tests/golden/M15-02F/manifest.json create mode 100644 tests/golden/M15-02F/unknown-data-audit-check-report.json create mode 100644 tests/golden/M15-02F/unknown-data-audit.json create mode 100644 tests/golden/M15-03A/completed-gap-tasks.json create mode 100644 tests/golden/M15-03A/manifest.json create mode 100644 tests/golden/M15-03A/next-task-plan-check-report.json create mode 100644 tests/golden/M15-03A/next-task-plan.json create mode 100644 tests/golden/M15-03A/task-catalog.jsonl create mode 100644 tests/golden/M15-03A/task-index.json create mode 100644 tests/golden/M15-03B/manifest.json create mode 100644 tests/golden/M15-03B/next-task-spec-check-report.json create mode 100644 tests/golden/M15-03C/manifest.json create mode 100644 tests/golden/M15-03C/task-graph-check-report.json create mode 100644 tests/golden/M15-03D/manifest.json create mode 100644 tests/golden/M15-03D/task-stats-check-report.json create mode 100644 tests/golden/M15-03E/manifest.json create mode 100644 tests/golden/M15-03E/zero-gap-gate-report.json create mode 100644 tests/golden/M16-GAP-00001/action-desktop-report.json create mode 100644 tests/golden/M16-GAP-00001/action-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00001/manifest.json create mode 100644 tests/golden/M16-GAP-00002/armature-desktop-report.json create mode 100644 tests/golden/M16-GAP-00002/armature-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00002/manifest.json create mode 100644 tests/golden/M16-GAP-00003/brush-desktop-report.json create mode 100644 tests/golden/M16-GAP-00003/brush-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00003/manifest.json create mode 100644 tests/golden/M16-GAP-00004/camera-desktop-report.json create mode 100644 tests/golden/M16-GAP-00004/camera-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00004/manifest.json create mode 100644 tests/golden/M16-GAP-00005/collection-desktop-report.json create mode 100644 tests/golden/M16-GAP-00005/collection-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00005/manifest.json create mode 100644 tests/golden/M16-GAP-00006/curve-desktop-report.json create mode 100644 tests/golden/M16-GAP-00006/curve-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00006/manifest.json create mode 100644 tests/golden/M16-GAP-00007/curves-desktop-report.json create mode 100644 tests/golden/M16-GAP-00007/curves-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00007/manifest.json create mode 100644 tests/golden/M16-GAP-00008/freestyle-desktop-report.json create mode 100644 tests/golden/M16-GAP-00008/freestyle-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00008/manifest.json create mode 100644 tests/golden/M16-GAP-00009/grease-pencil-desktop-report.json create mode 100644 tests/golden/M16-GAP-00009/grease-pencil-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00009/manifest.json create mode 100644 tests/golden/M16-GAP-00010/lattice-desktop-report.json create mode 100644 tests/golden/M16-GAP-00010/lattice-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00010/manifest.json create mode 100644 tests/golden/M16-GAP-00011/library-desktop-report.json create mode 100644 tests/golden/M16-GAP-00011/library-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00011/manifest.json create mode 100644 tests/golden/M16-GAP-00011/task-context.json create mode 100644 tests/golden/M16-GAP-00012/light-desktop-report.json create mode 100644 tests/golden/M16-GAP-00012/light-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00012/manifest.json create mode 100644 tests/golden/M16-GAP-00012/task-context.json create mode 100644 tests/golden/M16-GAP-00013/manifest.json create mode 100644 tests/golden/M16-GAP-00013/material-desktop-report.json create mode 100644 tests/golden/M16-GAP-00013/material-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00013/task-context.json create mode 100644 tests/golden/M16-GAP-00014/manifest.json create mode 100644 tests/golden/M16-GAP-00014/mesh-desktop-report.json create mode 100644 tests/golden/M16-GAP-00014/mesh-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00014/task-context.json create mode 100644 tests/golden/M16-GAP-00015/manifest.json create mode 100644 tests/golden/M16-GAP-00015/metaball-desktop-report.json create mode 100644 tests/golden/M16-GAP-00015/metaball-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00015/task-context.json create mode 100644 tests/golden/M16-GAP-00016/manifest.json create mode 100644 tests/golden/M16-GAP-00016/nodetree-desktop-report.json create mode 100644 tests/golden/M16-GAP-00016/nodetree-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00016/task-context.json create mode 100644 tests/golden/M16-GAP-00017/manifest.json create mode 100644 tests/golden/M16-GAP-00017/object-desktop-report.json create mode 100644 tests/golden/M16-GAP-00017/object-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00017/task-context.json create mode 100644 tests/golden/M16-GAP-00018/manifest.json create mode 100644 tests/golden/M16-GAP-00018/particle-settings-desktop-report.json create mode 100644 tests/golden/M16-GAP-00018/particle-settings-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00018/task-context.json create mode 100644 tests/golden/M16-GAP-00019/manifest.json create mode 100644 tests/golden/M16-GAP-00019/pointcloud-desktop-report.json create mode 100644 tests/golden/M16-GAP-00019/pointcloud-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00019/task-context.json create mode 100644 tests/golden/M16-GAP-00020/manifest.json create mode 100644 tests/golden/M16-GAP-00020/scene-desktop-report.json create mode 100644 tests/golden/M16-GAP-00020/scene-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00020/task-context.json create mode 100644 tests/golden/M16-GAP-00021/manifest.json create mode 100644 tests/golden/M16-GAP-00021/screen-desktop-report.json create mode 100644 tests/golden/M16-GAP-00021/screen-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00021/task-context.json create mode 100644 tests/golden/M16-GAP-00022/manifest.json create mode 100644 tests/golden/M16-GAP-00022/sound-desktop-report.json create mode 100644 tests/golden/M16-GAP-00022/sound-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00022/task-context.json create mode 100644 tests/golden/M16-GAP-00023/manifest.json create mode 100644 tests/golden/M16-GAP-00023/speaker-desktop-report.json create mode 100644 tests/golden/M16-GAP-00023/speaker-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00023/task-context.json create mode 100644 tests/golden/M16-GAP-00024/manifest.json create mode 100644 tests/golden/M16-GAP-00024/task-context.json create mode 100644 tests/golden/M16-GAP-00024/text-desktop-report.json create mode 100644 tests/golden/M16-GAP-00024/text-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00025/manifest.json create mode 100644 tests/golden/M16-GAP-00025/task-context.json create mode 100644 tests/golden/M16-GAP-00025/texture-desktop-report.json create mode 100644 tests/golden/M16-GAP-00025/texture-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00026/manifest.json create mode 100644 tests/golden/M16-GAP-00026/task-context.json create mode 100644 tests/golden/M16-GAP-00026/volume-desktop-report.json create mode 100644 tests/golden/M16-GAP-00026/volume-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00027/manifest.json create mode 100644 tests/golden/M16-GAP-00027/task-context.json create mode 100644 tests/golden/M16-GAP-00027/window-manager-desktop-report.json create mode 100644 tests/golden/M16-GAP-00027/window-manager-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00028/manifest.json create mode 100644 tests/golden/M16-GAP-00028/task-context.json create mode 100644 tests/golden/M16-GAP-00028/workspace-desktop-report.json create mode 100644 tests/golden/M16-GAP-00028/workspace-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00029/manifest.json create mode 100644 tests/golden/M16-GAP-00029/task-context.json create mode 100644 tests/golden/M16-GAP-00029/world-desktop-report.json create mode 100644 tests/golden/M16-GAP-00029/world-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00030/armature-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00030/armature-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00030/manifest.json create mode 100644 tests/golden/M16-GAP-00030/task-context.json create mode 100644 tests/golden/M16-GAP-00031/array-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00031/array-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00031/manifest.json create mode 100644 tests/golden/M16-GAP-00031/task-context.json create mode 100644 tests/golden/M16-GAP-00032/bevel-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00032/bevel-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00032/manifest.json create mode 100644 tests/golden/M16-GAP-00032/task-context.json create mode 100644 tests/golden/M16-GAP-00033/boolean-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00033/boolean-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00033/manifest.json create mode 100644 tests/golden/M16-GAP-00033/task-context.json create mode 100644 tests/golden/M16-GAP-00034/build-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00034/build-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00034/manifest.json create mode 100644 tests/golden/M16-GAP-00034/task-context.json create mode 100644 tests/golden/M16-GAP-00035/cast-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00035/cast-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00035/manifest.json create mode 100644 tests/golden/M16-GAP-00035/task-context.json create mode 100644 tests/golden/M16-GAP-00036/cloth-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00036/cloth-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00036/manifest.json create mode 100644 tests/golden/M16-GAP-00036/task-context.json create mode 100644 tests/golden/M16-GAP-00037/collision-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00037/collision-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00037/manifest.json create mode 100644 tests/golden/M16-GAP-00037/task-context.json create mode 100644 tests/golden/M16-GAP-00038/corrective-smooth-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00038/corrective-smooth-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00038/manifest.json create mode 100644 tests/golden/M16-GAP-00038/task-context.json create mode 100644 tests/golden/M16-GAP-00039/curve-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00039/curve-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00039/manifest.json create mode 100644 tests/golden/M16-GAP-00039/task-context.json create mode 100644 tests/golden/M16-GAP-00040/data-transfer-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00040/data-transfer-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00040/manifest.json create mode 100644 tests/golden/M16-GAP-00040/task-context.json create mode 100644 tests/golden/M16-GAP-00041/decimate-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00041/decimate-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00041/manifest.json create mode 100644 tests/golden/M16-GAP-00041/task-context.json create mode 100644 tests/golden/M16-GAP-00042/displace-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00042/displace-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00042/manifest.json create mode 100644 tests/golden/M16-GAP-00042/task-context.json create mode 100644 tests/golden/M16-GAP-00043/dynamic-paint-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00043/dynamic-paint-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00043/manifest.json create mode 100644 tests/golden/M16-GAP-00043/task-context.json create mode 100644 tests/golden/M16-GAP-00044/edge-split-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00044/edge-split-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00044/manifest.json create mode 100644 tests/golden/M16-GAP-00044/task-context.json create mode 100644 tests/golden/M16-GAP-00045/explode-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00045/explode-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00045/manifest.json create mode 100644 tests/golden/M16-GAP-00045/task-context.json create mode 100644 tests/golden/M16-GAP-00046/fluid-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00046/fluid-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00046/manifest.json create mode 100644 tests/golden/M16-GAP-00046/task-context.json create mode 100644 tests/golden/M16-GAP-00047/grease-pencil-armature-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00047/grease-pencil-armature-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00047/manifest.json create mode 100644 tests/golden/M16-GAP-00047/task-context.json create mode 100644 tests/golden/M16-GAP-00048/grease-pencil-array-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00048/grease-pencil-array-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00048/manifest.json create mode 100644 tests/golden/M16-GAP-00048/task-context.json create mode 100644 tests/golden/M16-GAP-00049/grease-pencil-build-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00049/grease-pencil-build-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00049/manifest.json create mode 100644 tests/golden/M16-GAP-00049/task-context.json create mode 100644 tests/golden/M16-GAP-00050/grease-pencil-color-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00050/grease-pencil-color-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00050/manifest.json create mode 100644 tests/golden/M16-GAP-00050/task-context.json create mode 100644 tests/golden/M16-GAP-00051/grease-pencil-dash-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00051/grease-pencil-dash-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00051/manifest.json create mode 100644 tests/golden/M16-GAP-00051/task-context.json create mode 100644 tests/golden/M16-GAP-00052/grease-pencil-envelope-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00052/grease-pencil-envelope-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00052/manifest.json create mode 100644 tests/golden/M16-GAP-00052/task-context.json create mode 100644 tests/golden/M16-GAP-00053/grease-pencil-hook-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00053/grease-pencil-hook-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00053/manifest.json create mode 100644 tests/golden/M16-GAP-00053/task-context.json create mode 100644 tests/golden/M16-GAP-00054/grease-pencil-lattice-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00054/grease-pencil-lattice-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00054/manifest.json create mode 100644 tests/golden/M16-GAP-00054/task-context.json create mode 100644 tests/golden/M16-GAP-00055/grease-pencil-length-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00055/grease-pencil-length-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00055/manifest.json create mode 100644 tests/golden/M16-GAP-00055/task-context.json create mode 100644 tests/golden/M16-GAP-00056/grease-pencil-mirror-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00056/grease-pencil-mirror-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00056/manifest.json create mode 100644 tests/golden/M16-GAP-00056/task-context.json create mode 100644 tests/golden/M16-GAP-00057/grease-pencil-multiply-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00057/grease-pencil-multiply-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00057/manifest.json create mode 100644 tests/golden/M16-GAP-00057/task-context.json create mode 100644 tests/golden/M16-GAP-00058/grease-pencil-noise-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00058/grease-pencil-noise-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00058/manifest.json create mode 100644 tests/golden/M16-GAP-00058/task-context.json create mode 100644 tests/golden/M16-GAP-00059/grease-pencil-offset-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00059/grease-pencil-offset-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00059/manifest.json create mode 100644 tests/golden/M16-GAP-00059/task-context.json create mode 100644 tests/golden/M16-GAP-00060/grease-pencil-opacity-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00060/grease-pencil-opacity-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00060/manifest.json create mode 100644 tests/golden/M16-GAP-00060/task-context.json create mode 100644 tests/golden/M16-GAP-00061/grease-pencil-outline-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00061/grease-pencil-outline-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00061/manifest.json create mode 100644 tests/golden/M16-GAP-00061/task-context.json create mode 100644 tests/golden/M16-GAP-00062/grease-pencil-shrinkwrap-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00062/grease-pencil-shrinkwrap-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00062/manifest.json create mode 100644 tests/golden/M16-GAP-00062/task-context.json create mode 100644 tests/golden/M16-GAP-00063/grease-pencil-simplify-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00063/grease-pencil-simplify-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00063/manifest.json create mode 100644 tests/golden/M16-GAP-00063/task-context.json create mode 100644 tests/golden/M16-GAP-00064/grease-pencil-smooth-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00064/grease-pencil-smooth-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00064/manifest.json create mode 100644 tests/golden/M16-GAP-00064/task-context.json create mode 100644 tests/golden/M16-GAP-00065/grease-pencil-subdiv-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00065/grease-pencil-subdiv-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00065/manifest.json create mode 100644 tests/golden/M16-GAP-00065/task-context.json create mode 100644 tests/golden/M16-GAP-00066/grease-pencil-texture-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00066/grease-pencil-texture-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00066/manifest.json create mode 100644 tests/golden/M16-GAP-00066/task-context.json create mode 100644 tests/golden/M16-GAP-00067/grease-pencil-thickness-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00067/grease-pencil-thickness-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00067/manifest.json create mode 100644 tests/golden/M16-GAP-00067/task-context.json create mode 100644 tests/golden/M16-GAP-00068/grease-pencil-time-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00068/grease-pencil-time-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00068/manifest.json create mode 100644 tests/golden/M16-GAP-00068/task-context.json create mode 100644 tests/golden/M16-GAP-00069/grease-pencil-tint-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00069/grease-pencil-tint-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00069/manifest.json create mode 100644 tests/golden/M16-GAP-00069/task-context.json create mode 100644 tests/golden/M16-GAP-00070/grease-pencil-vertex-weight-angle-modifier-desktop-report.json create mode 100644 tests/golden/M16-GAP-00070/grease-pencil-vertex-weight-angle-modifier-local-exact-report.json create mode 100644 tests/golden/M16-GAP-00070/manifest.json create mode 100644 tests/golden/M16-GAP-00071/task-context.json create mode 100644 tools/web/check-action-desktop.py create mode 100644 tools/web/check-armature-desktop.py create mode 100644 tools/web/check-armature-modifier-desktop.py create mode 100644 tools/web/check-array-modifier-desktop.py create mode 100644 tools/web/check-bevel-modifier-desktop.py create mode 100644 tools/web/check-blender-contract-audit.mjs create mode 100644 tools/web/check-blender-core-inventory.mjs create mode 100644 tools/web/check-blender-editor-inventory.mjs create mode 100644 tools/web/check-blender-family-inventory.mjs create mode 100644 tools/web/check-blender-format-inventory.mjs create mode 100644 tools/web/check-blender-gap-audit.mjs create mode 100644 tools/web/check-blender-next-task-plan.mjs create mode 100644 tools/web/check-blender-next-task-spec.mjs create mode 100644 tools/web/check-blender-operator-inventory.mjs create mode 100644 tools/web/check-blender-parity-map.mjs create mode 100644 tools/web/check-blender-rna-datablock-inventory.mjs create mode 100644 tools/web/check-blender-task-graph.mjs create mode 100644 tools/web/check-blender-task-stats.mjs create mode 100644 tools/web/check-blender-zero-gap-gate.mjs create mode 100644 tools/web/check-boolean-modifier-desktop.py create mode 100644 tools/web/check-brush-desktop.py create mode 100644 tools/web/check-build-modifier-desktop.py create mode 100644 tools/web/check-camera-desktop.py create mode 100644 tools/web/check-cast-modifier-desktop.py create mode 100644 tools/web/check-chromium-accessibility.mjs create mode 100644 tools/web/check-chromium-layout.mjs create mode 100644 tools/web/check-cloth-modifier-desktop.py create mode 100644 tools/web/check-collection-desktop.py create mode 100644 tools/web/check-collision-modifier-desktop.py create mode 100644 tools/web/check-context-governance.mjs create mode 100644 tools/web/check-curve-desktop.py create mode 100644 tools/web/check-curves-desktop.py create mode 100644 tools/web/check-freestyle-desktop.py create mode 100644 tools/web/check-generated-gap.mjs create mode 100644 tools/web/check-generic-modifier-desktop.py create mode 100644 tools/web/check-grease-pencil-desktop.py create mode 100644 tools/web/check-lattice-desktop.py create mode 100644 tools/web/check-library-desktop.py create mode 100644 tools/web/check-light-desktop.py create mode 100644 tools/web/check-material-desktop.py create mode 100644 tools/web/check-mesh-desktop.py create mode 100644 tools/web/check-metaball-desktop.py create mode 100644 tools/web/check-nodetree-desktop.py create mode 100644 tools/web/check-object-desktop.py create mode 100644 tools/web/check-particle-settings-desktop.py create mode 100644 tools/web/check-pointcloud-desktop.py create mode 100644 tools/web/check-scene-desktop.py create mode 100644 tools/web/check-screen-desktop.py create mode 100644 tools/web/check-sound-desktop.py create mode 100644 tools/web/check-speaker-desktop.py create mode 100644 tools/web/check-task-context.mjs create mode 100644 tools/web/check-task-index.mjs create mode 100644 tools/web/check-text-desktop.py create mode 100644 tools/web/check-texture-desktop.py create mode 100644 tools/web/check-volume-desktop.py create mode 100644 tools/web/check-window-manager-desktop.py create mode 100644 tools/web/check-workspace-desktop.py create mode 100644 tools/web/check-world-desktop.py create mode 100644 tools/web/context-governance.mjs create mode 100644 tools/web/generate-blender-contract-audit.mjs create mode 100644 tools/web/generate-blender-core-inventory.py create mode 100644 tools/web/generate-blender-editor-inventory.py create mode 100644 tools/web/generate-blender-family-inventory.py create mode 100644 tools/web/generate-blender-format-inventory.py create mode 100644 tools/web/generate-blender-gap-audit.mjs create mode 100644 tools/web/generate-blender-next-task-plan.mjs create mode 100644 tools/web/generate-blender-operator-inventory.py create mode 100644 tools/web/generate-blender-parity-map.mjs create mode 100644 tools/web/generate-blender-rna-datablock-inventory.py create mode 100644 tools/web/generate-brush-fixture.py create mode 100644 tools/web/generate-camera-fixture.py create mode 100644 tools/web/generate-collection-fixture.py create mode 100644 tools/web/generate-curve-fixture.py create mode 100644 tools/web/generate-curves-fixture.py create mode 100644 tools/web/generate-freestyle-fixture.py create mode 100644 tools/web/generate-task-card.mjs create mode 100644 tools/web/generate-task-index.mjs create mode 100644 tools/web/generated/M16-GAP-00010.py create mode 100644 tools/web/generated/M16-GAP-00011.py create mode 100644 tools/web/generated/M16-GAP-00012.py create mode 100644 tools/web/generated/M16-GAP-00013.py create mode 100644 tools/web/generated/M16-GAP-00014.py create mode 100644 tools/web/generated/M16-GAP-00015.py create mode 100644 tools/web/generated/M16-GAP-00016.py create mode 100644 tools/web/generated/M16-GAP-00017.py create mode 100644 tools/web/generated/M16-GAP-00018.py create mode 100644 tools/web/generated/M16-GAP-00019.py create mode 100644 tools/web/generated/M16-GAP-00020.py create mode 100644 tools/web/generated/M16-GAP-00021.py create mode 100644 tools/web/generated/M16-GAP-00022.py create mode 100644 tools/web/generated/M16-GAP-00023.py create mode 100644 tools/web/generated/M16-GAP-00024.py create mode 100644 tools/web/generated/M16-GAP-00025.py create mode 100644 tools/web/generated/M16-GAP-00026.py create mode 100644 tools/web/generated/M16-GAP-00027.py create mode 100644 tools/web/generated/M16-GAP-00028.py create mode 100644 tools/web/generated/M16-GAP-00029.py create mode 100644 tools/web/generated/M16-GAP-00030.py create mode 100644 tools/web/generated/M16-GAP-00031.py create mode 100644 tools/web/generated/M16-GAP-00032.py create mode 100644 tools/web/generated/M16-GAP-00033.py create mode 100644 tools/web/generated/M16-GAP-00034.py create mode 100644 tools/web/generated/M16-GAP-00035.py create mode 100644 tools/web/generated/M16-GAP-00036.py create mode 100644 tools/web/generated/M16-GAP-00037.py create mode 100644 tools/web/generated/M16-GAP-00038.py create mode 100644 tools/web/generated/M16-GAP-00039.py create mode 100644 tools/web/generated/M16-GAP-00040.py create mode 100644 tools/web/generated/M16-GAP-00041.py create mode 100644 tools/web/generated/M16-GAP-00042.py create mode 100644 tools/web/generated/M16-GAP-00043.py create mode 100644 tools/web/generated/M16-GAP-00044.py create mode 100644 tools/web/generated/M16-GAP-00045.py create mode 100644 tools/web/generated/M16-GAP-00046.py create mode 100644 tools/web/generated/M16-GAP-00047.py create mode 100644 tools/web/generated/M16-GAP-00048.py create mode 100644 tools/web/generated/M16-GAP-00049.py create mode 100644 tools/web/generated/M16-GAP-00050.py create mode 100644 tools/web/generated/M16-GAP-00051.py create mode 100644 tools/web/generated/M16-GAP-00052.py create mode 100644 tools/web/generated/M16-GAP-00053.py create mode 100644 tools/web/generated/M16-GAP-00054.py create mode 100644 tools/web/generated/M16-GAP-00055.py create mode 100644 tools/web/generated/M16-GAP-00056.py create mode 100644 tools/web/generated/M16-GAP-00057.py create mode 100644 tools/web/generated/M16-GAP-00058.py create mode 100644 tools/web/generated/M16-GAP-00059.py create mode 100644 tools/web/generated/M16-GAP-00060.py create mode 100644 tools/web/generated/M16-GAP-00061.py create mode 100644 tools/web/generated/M16-GAP-00062.py create mode 100644 tools/web/generated/M16-GAP-00063.py create mode 100644 tools/web/generated/M16-GAP-00064.py create mode 100644 tools/web/generated/M16-GAP-00065.py create mode 100644 tools/web/generated/M16-GAP-00066.py create mode 100644 tools/web/generated/M16-GAP-00067.py create mode 100644 tools/web/generated/M16-GAP-00068.py create mode 100644 tools/web/generated/M16-GAP-00069.py create mode 100644 tools/web/generated/M16-GAP-00070.py create mode 100644 tools/web/generated/modifier_gap_fixture.py create mode 100644 tools/web/print-task-context.mjs create mode 100644 tools/web/task-context-lib.mjs create mode 100644 web/tests/unit/context-governance.test.mjs create mode 100644 web/tests/unit/task-context.test.mjs diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..ea16e8f0 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,14 @@ +# 执行上下文规则 + +本仓库的任务执行必须使用最小上下文。不要把完整路线图、项目状态、parity ledger 或全部 `docs/status/` 日志作为默认上下文。 + +领取任务时只做以下操作: + +1. 阅读 `docs/EXECUTION_QUEUE.md`。 +2. 运行 `node tools/web/print-task-context.mjs`;它只会输出当前任务、parent manifest、parent status 和聚焦命令。 +3. 只打开输出中列出的任务卡、生产入口、测试入口和最小 fixture。 +4. 开始前运行 `node tools/web/check-task-context.mjs`;预算或 parent `nextTask` 不一致时停止并修正证据,不要手工推进队列。 + +默认上下文预算:队列 4 KiB、任务卡 8 KiB、parent manifest 24 KiB、parent status 6 KiB,合计约 3,500 tokens。历史和长期文档只能按任务卡列出的具体小节追加读取。 + +完成任务时运行 `node tools/web/check-task-context.mjs --task --write`,并仅提交任务报告、manifest、status 和聚焦实现/测试变更。下一任务只认新 manifest 的 `nextTask`。 diff --git a/README.md b/README.md index 6bd05e40..92bf0ff1 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,8 @@ npm --prefix web run build npm --prefix web run test:browser ``` -See `docs/EXECUTION_QUEUE.md` for the current task order and `docs/README.md` for the document map, +See `docs/EXECUTION_QUEUE.md` for the current task pointer, `docs/CONTEXT_BUDGET.md` for the +small-context execution rules, and `docs/README.md` for the document map, `docs/PROJECT_STATUS_AND_NEXT_WORK.md` for the implemented scope, and `docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md` for the normative M12-M23 full-parity execution plan. The domain overview and coverage cross-check are in diff --git a/WEB_BLENDER_MIGRATION_EXECUTION_PLAN.md b/WEB_BLENDER_MIGRATION_EXECUTION_PLAN.md index fe6b842d..a5397e8b 100644 --- a/WEB_BLENDER_MIGRATION_EXECUTION_PLAN.md +++ b/WEB_BLENDER_MIGRATION_EXECUTION_PLAN.md @@ -1,5 +1,7 @@ # Web 版 Blender 连续执行计划 +> 历史迁移计划:本文不参与当前任务领取。当前任务只认 `docs/EXECUTION_QUEUE.md`、任务卡和 parent manifest。 + ## 1. 文档定位 本计划用于把 `blender-5.2.0` 逐步变成一个浏览器中的 Blender 数据编辑器。它不是“把桌面窗口搬进 Canvas”的计划,而是以 Blender 数据和建模行为为基准,以 React 为应用界面、Three.js 为唯一浏览器渲染器、WebAssembly 为 Blender 计算核心。 diff --git a/WEB_BLENDER_TECHNICAL_ROADMAP.md b/WEB_BLENDER_TECHNICAL_ROADMAP.md index d9a36548..c45cf37e 100644 --- a/WEB_BLENDER_TECHNICAL_ROADMAP.md +++ b/WEB_BLENDER_TECHNICAL_ROADMAP.md @@ -1,5 +1,7 @@ # Blender Web 化技术路线(React + Three.js + WebAssembly + OPFS/IndexedDB) +> 历史技术背景:本文不参与当前任务领取。当前任务只认 `docs/EXECUTION_QUEUE.md` 和最小上下文工具。 + > **存储决策(2026-08):** SQLite WASM 不是项目首期必需依赖,已从当前实现和发布资源中移除。小型元数据使用 Worker 内 IndexedDB,大型二进制使用 OPFS;未来只有在查询/事务需求超过 IndexedDB 时,才单独评估 SQLite WASM。 ## 1. 结论先行 diff --git a/blender-5.2.0/source/blender/web_engine/web_engine_api.cpp b/blender-5.2.0/source/blender/web_engine/web_engine_api.cpp index 35ddfe12..ac7101bc 100644 --- a/blender-5.2.0/source/blender/web_engine/web_engine_api.cpp +++ b/blender-5.2.0/source/blender/web_engine/web_engine_api.cpp @@ -843,6 +843,16 @@ bool refresh_scene_from_main(EngineState &engine, return false; } snapshot["physicsSimulation"] = json::parse(physics_json); + std::string particle_settings_json; + if (!web_engine_blend_main_particle_settings_json( + engine.authoritative_main, particle_settings_json, error)) + { + return false; + } + const json particle_settings = json::parse(particle_settings_json)["settings"]; + if (!particle_settings.empty() || snapshot.value("particleSettings", json::array()).empty()) { + snapshot["particleSettings"] = particle_settings; + } if (!active_object_id.empty()) snapshot["activeObjectId"] = active_object_id; engine.blend_bytes.assign(reinterpret_cast(bytes.data()), bytes.size()); engine.packed_assets = parsed.packed_assets; @@ -860,7 +870,7 @@ const char *empty_scene_snapshot_json() "\"source\":{\"kind\":\"blend\"}," "\"coordinateSystem\":{\"upAxis\":\"Z\",\"forwardAxis\":\"-Y\",\"handedness\":\"RIGHT\",\"unitSystem\":0,\"unitScale\":1}," "\"nodes\":[],\"meshes\":[],\"materials\":[],\"cameras\":[],\"lights\":[],\"worlds\":[],\"images\":[],\"animations\":[]," - "\"collections\":[],\"scenes\":[],\"activeObjectId\":null," + "\"collections\":[],\"scenes\":[],\"particleSettings\":[],\"sounds\":[],\"activeObjectId\":null," "\"frame\":{\"current\":1,\"start\":1,\"end\":250}}"; } @@ -1157,6 +1167,18 @@ EMSCRIPTEN_KEEPALIVE int web_engine_open_blend(const int handle, return last_error_code; } opened_snapshot["physicsSimulation"] = json::parse(physics_json); + std::string particle_settings_json; + if (!web_engine_blend_main_particle_settings_json( + authoritative_main, particle_settings_json, main_error)) + { + web_engine_blend_main_free(authoritative_main); + set_error(WEB_ENGINE_BLEND_READ_FAILED, main_error.c_str()); + return last_error_code; + } + const json particle_settings = json::parse(particle_settings_json)["settings"]; + if (!particle_settings.empty() || opened_snapshot.value("particleSettings", json::array()).empty()) { + opened_snapshot["particleSettings"] = particle_settings; + } } catch (const std::exception &exception) { web_engine_blend_main_free(authoritative_main); diff --git a/blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp b/blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp index b9faa0dd..dd9e64f6 100644 --- a/blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp +++ b/blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp @@ -32,6 +32,7 @@ #include "DNA_genfile.h" #include "DNA_curve_enums.h" +#include "DNA_lattice_types.h" #include "DNA_mask_types.h" #include "DNA_modifier_types.h" #include "DNA_node_types.h" @@ -48,6 +49,7 @@ using namespace blender; constexpr uint64_t MAX_BLEND_BLOCK_BYTES = UINT64_C(1024) * 1024 * 1024; constexpr size_t MAX_NON_MESH_POINTS = 1000000; +constexpr size_t MAX_LATTICE_POINTS = 64 * 64 * 64; constexpr size_t MAX_SCRIPT_SOURCE_BYTES = 1024 * 1024; uint32_t rotate_right(const uint32_t value, const uint32_t bits) @@ -539,6 +541,13 @@ std::string id_prefix(const std::string &type_name) if (type_name == "Library") return "library"; if (type_name == "WorkSpace") return "workspace"; if (type_name == "bScreen") return "screen"; + if (type_name == "Brush") return "brush"; + if (type_name == "FreestyleLineStyle") return "line-style"; + if (type_name == "Lattice") return "lattice"; + if (type_name == "ParticleSettings") return "particle-settings"; + if (type_name == "bSound") return "sound"; + if (type_name == "Speaker") return "speaker"; + if (type_name == "Tex") return "texture"; return "datablock"; } @@ -552,7 +561,9 @@ bool is_exported_id_type(const std::string &type_name) type_name == "MetaBall" || type_name == "PointCloud" || type_name == "Curves" || type_name == "Volume" || type_name == "GreasePencil" || type_name == "Text" || type_name == "VFont" || type_name == "Mask" || type_name == "Library" || - type_name == "WorkSpace" || type_name == "bScreen"; + type_name == "WorkSpace" || type_name == "bScreen" || type_name == "Brush" || + type_name == "FreestyleLineStyle" || type_name == "Lattice" || + type_name == "ParticleSettings" || type_name == "bSound" || type_name == "Speaker" || type_name == "Tex"; } std::string unique_id(const std::string &prefix, @@ -613,6 +624,17 @@ std::string object_type_name(const int64_t type) } } +const char *lattice_interpolation_name(const int64_t type) +{ + switch (type) { + case KEY_LINEAR: return "KEY_LINEAR"; + case KEY_CARDINAL: return "KEY_CARDINAL"; + case KEY_BSPLINE: return "KEY_BSPLINE"; + case KEY_CATMULL_ROM: return "KEY_CATMULL_ROM"; + default: return "UNKNOWN"; + } +} + std::array trs_matrix(const std::vector &location, const std::vector &rotation, const std::vector &scale) @@ -1452,8 +1474,8 @@ std::string modifier_type_name(const int64_t type) "GREASE_PENCIL_OPACITY", "GREASE_PENCIL_SUBDIV", "GREASE_PENCIL_COLOR", "GREASE_PENCIL_TINT", "GREASE_PENCIL_SMOOTH", "GREASE_PENCIL_OFFSET", "GREASE_PENCIL_NOISE", "GREASE_PENCIL_MIRROR", "GREASE_PENCIL_THICKNESS", "GREASE_PENCIL_LATTICE", "GREASE_PENCIL_DASH", "GREASE_PENCIL_MULTIPLY", - "GREASE_PENCIL_LENGTH", "GREASE_PENCIL_WEIGHT_ANGLE", "GREASE_PENCIL_ARRAY", - "GREASE_PENCIL_WEIGHT_PROXIMITY", "GREASE_PENCIL_HOOK", "GREASE_PENCIL_LINEART", + "GREASE_PENCIL_LENGTH", "GREASE_PENCIL_VERTEX_WEIGHT_ANGLE", "GREASE_PENCIL_ARRAY", + "GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY", "GREASE_PENCIL_HOOK", "GREASE_PENCIL_LINEART", "GREASE_PENCIL_ARMATURE", "GREASE_PENCIL_TIME", "GREASE_PENCIL_ENVELOPE", "GREASE_PENCIL_OUTLINE", "GREASE_PENCIL_SHRINKWRAP", "GREASE_PENCIL_BUILD", "GREASE_PENCIL_SIMPLIFY", "GREASE_PENCIL_TEXTURE"}; @@ -1501,7 +1523,8 @@ json modifier_parameters(const ParsedBlend &blend, case 4: parameters["start"] = read_float(*blend.sdna, modifier, "start").value_or(1.0f); parameters["length"] = read_float(*blend.sdna, modifier, "length").value_or(100.0f); - parameters["randomize"] = read_float(*blend.sdna, modifier, "randomize").value_or(0.0f); + parameters["randomize"] = read_integer(*blend.sdna, modifier, "randomize").value_or(0); + parameters["seed"] = read_integer(*blend.sdna, modifier, "seed").value_or(0); break; case 5: parameters["flag"] = read_integer(*blend.sdna, modifier, "flag").value_or( @@ -3124,6 +3147,15 @@ json scene_ir_from_blend(const ParsedBlend &blend, json lights = json::array(); json worlds = json::array(); json images = json::array(); + json brushes = json::array(); + json line_styles = json::array(); + json lattices = json::array(); + json particle_settings = json::array(); + json sounds = json::array(); + json speakers = json::array(); + json texts = json::array(); + json textures = json::array(); + json workspace_resources = json::array(); json non_mesh_data = json::array(); json vfonts = json::array(); json libraries = json::array(); @@ -3289,10 +3321,12 @@ json scene_ir_from_blend(const ParsedBlend &blend, if (data_pointer) { const auto data_id = ids_by_pointer.find(*data_pointer); node["dataId"] = data_id != ids_by_pointer.end() ? json(data_id->second) : json(nullptr); + const json object_modifier_stack = modifier_stack_from_object(blend, element, record.id, ids_by_pointer); + if (!object_modifier_stack.empty()) node["modifierStack"] = object_modifier_stack; if (data_id != ids_by_pointer.end()) { if (const std::optional data = element_for_pointer(blend, *data_pointer)) { if (data->type_name == "Mesh") { - const json stack = modifier_stack_from_object(blend, element, record.id, ids_by_pointer); + const json stack = object_modifier_stack; if (!stack.empty()) modifier_stacks_by_mesh_id.emplace(data_id->second, stack); } } @@ -3527,6 +3561,155 @@ json scene_ir_from_blend(const ParsedBlend &blend, if (!warnings.empty()) material["warnings"] = warnings; materials.push_back(std::move(material)); } + else if (record.type_name == "Brush") { + json brush = { + {"id", record.id}, + {"name", record.name}, + {"size", std::clamp(read_integer(*blend.sdna, element, "size").value_or(0), 0, 100000)}, + {"alpha", std::clamp(read_float(*blend.sdna, element, "alpha").value_or(1.0f), 0.0f, 1.0f)}, + {"hardness", std::clamp(read_float(*blend.sdna, element, "hardness").value_or(0.0f), 0.0f, 1.0f)}, + {"spacing", std::clamp(read_integer(*blend.sdna, element, "spacing").value_or(0), 1, 1000)}, + {"jitter", std::clamp(read_float(*blend.sdna, element, "jitter").value_or(0.0f), 0.0f, 1.0f)}, + {"sculptTool", read_integer(*blend.sdna, element, "sculpt_brush_type").value_or(0)}, + }; + brushes.push_back(std::move(brush)); + } + else if (record.type_name == "FreestyleLineStyle") { + const std::vector color = {read_float(*blend.sdna, element, "r").value_or(0.0f), + read_float(*blend.sdna, element, "g").value_or(0.0f), + read_float(*blend.sdna, element, "b").value_or(0.0f)}; + const int64_t flag = read_integer(*blend.sdna, element, "flag").value_or(0); + line_styles.push_back({ + {"id", record.id}, + {"name", record.name}, + {"color", float_array_or(color, {0.0f, 0.0f, 0.0f})}, + {"alpha", std::clamp(read_float(*blend.sdna, element, "alpha").value_or(1.0f), 0.0f, 1.0f)}, + {"thickness", std::clamp(read_float(*blend.sdna, element, "thickness").value_or(1.0f), 0.0f, 10000.0f)}, + {"chaining", read_integer(*blend.sdna, element, "chaining").value_or(0)}, + {"caps", read_integer(*blend.sdna, element, "caps").value_or(0)}, + {"dashed", (flag & (1 << 2)) != 0}, + {"modifierCounts", { + {"color", linked_list_elements(blend, element, "color_modifiers").size()}, + {"alpha", linked_list_elements(blend, element, "alpha_modifiers").size()}, + {"thickness", linked_list_elements(blend, element, "thickness_modifiers").size()}, + {"geometry", linked_list_elements(blend, element, "geometry_modifiers").size()}}} + }); + } + else if (record.type_name == "Lattice") { + const int64_t points_u = read_integer(*blend.sdna, element, "pntsu").value_or(0); + const int64_t points_v = read_integer(*blend.sdna, element, "pntsv").value_or(0); + const int64_t points_w = read_integer(*blend.sdna, element, "pntsw").value_or(0); + const bool dimensions_valid = points_u >= 1 && points_u <= 64 && + points_v >= 1 && points_v <= 64 && + points_w >= 1 && points_w <= 64; + const size_t point_count = dimensions_valid ? + size_t(points_u) * size_t(points_v) * size_t(points_w) : + 0; + json points = json::array(); + bool points_complete = point_count > 0 && point_count <= MAX_LATTICE_POINTS; + if (const std::optional points_pointer = read_pointer(*blend.sdna, element, "def"); + points_complete && points_pointer) + { + for (size_t index = 0; index < point_count; index++) { + const std::optional point = raw_array_element( + blend, *points_pointer, "BPoint", index); + if (!point) { + points_complete = false; + break; + } + const std::vector coordinate = read_float_array( + *blend.sdna, *point, "vec", 4); + if (coordinate.size() != 4) { + points_complete = false; + break; + } + points.push_back({ + {"coDeform", {coordinate[0], coordinate[1], coordinate[2]}}, + {"weight", std::clamp(read_float(*blend.sdna, *point, "weight").value_or(0.0f), + 0.01f, + 100.0f)}, + {"selected", (read_integer(*blend.sdna, *point, "f1").value_or(0) & 1) != 0}, + }); + } + } + else { + points_complete = false; + } + const int64_t flag = read_integer(*blend.sdna, element, "flag").value_or(0); + json lattice = { + {"id", record.id}, + {"name", record.name}, + {"dimensions", {points_u, points_v, points_w}}, + {"pointCount", point_count}, + {"interpolation", { + lattice_interpolation_name(read_integer(*blend.sdna, element, "typeu").value_or(-1)), + lattice_interpolation_name(read_integer(*blend.sdna, element, "typev").value_or(-1)), + lattice_interpolation_name(read_integer(*blend.sdna, element, "typew").value_or(-1))}}, + {"useOutside", (flag & LT_OUTSIDE) != 0}, + {"activePoint", read_integer(*blend.sdna, element, "actbp").value_or(LT_ACTBP_NONE)}, + {"vertexGroup", read_string(*blend.sdna, element, "vgroup")}, + {"status", points_complete ? "AVAILABLE" : "BLOCKED"}, + }; + if (points_complete) lattice["points"] = std::move(points); + else lattice["errorCode"] = dimensions_valid ? "LATTICE_POINTS_UNREADABLE" : + "LATTICE_DIMENSIONS_INVALID"; + lattices.push_back(std::move(lattice)); + } + else if (record.type_name == "ParticleSettings") { + const int64_t particle_type = read_integer(*blend.sdna, element, "type").value_or(0); + const int64_t particle_from = read_integer(*blend.sdna, element, "from").value_or(0); + const int64_t particle_physics = read_integer(*blend.sdna, element, "phystype").value_or(0); + particle_settings.push_back({ + {"id", record.id}, + {"name", record.name}, + {"type", particle_type == 2 ? 1 : 0}, + {"from", particle_from == 1 ? 0 : particle_from == 0 ? 1 : 2}, + {"distribution", std::max(0, read_integer(*blend.sdna, element, "distr").value_or(0))}, + {"physicsType", particle_physics == 1 ? 0 : particle_physics == 2 ? 1 : particle_physics == 3 ? 2 : 3}, + {"totalParticles", std::max(0, read_integer(*blend.sdna, element, "totpart").value_or(0))}, + {"start", std::max(0.0f, read_float(*blend.sdna, element, "sta").value_or(0.0f))}, + {"end", std::max(0.0f, read_float(*blend.sdna, element, "end").value_or(0.0f))}, + {"lifetime", std::max(0.0f, read_float(*blend.sdna, element, "lifetime").value_or(0.0f))}, + {"size", std::max(0.0f, read_float(*blend.sdna, element, "size").value_or(0.0f))}, + {"drawSize", std::max(0.0f, read_float(*blend.sdna, element, "draw_size").value_or(0.0f))}, + }); + } + else if (record.type_name == "bSound") { + const std::string filepath = read_string(*blend.sdna, element, "filepath"); + const std::optional packed_pointer = read_pointer(*blend.sdna, element, "packedfile"); + const std::vector packed_bytes = packed_pointer ? packed_file_bytes(blend, *packed_pointer) : std::vector(); + json sound = {{"id", record.id}, + {"name", record.name}, + {"sourcePath", filepath}, + {"packed", !packed_bytes.empty()}, + {"volume", std::max(0.0f, read_float(*blend.sdna, element, "volume").value_or(1.0f))}, + {"pitch", std::max(0.0f, read_float(*blend.sdna, element, "pitch").value_or(1.0f))}, + {"audioChannels", std::max(0, read_integer(*blend.sdna, element, "audio_channels").value_or(0))}, + {"sampleRate", std::max(0, read_integer(*blend.sdna, element, "samplerate").value_or(0))}}; + if (!packed_bytes.empty()) sound["packedByteLength"] = packed_bytes.size(); + sounds.push_back(std::move(sound)); + } + else if (record.type_name == "Speaker") { + json speaker = { + {"id", record.id}, + {"name", record.name}, + {"volumeMax", std::max(0.0f, read_float(*blend.sdna, element, "volume_max").value_or(1.0f))}, + {"volumeMin", std::max(0.0f, read_float(*blend.sdna, element, "volume_min").value_or(0.0f))}, + {"distanceMax", std::max(0.0f, read_float(*blend.sdna, element, "distance_max").value_or(0.0f))}, + {"distanceReference", std::max(0.0f, read_float(*blend.sdna, element, "distance_reference").value_or(1.0f))}, + {"attenuation", std::max(0.0f, read_float(*blend.sdna, element, "attenuation").value_or(1.0f))}, + {"coneAngleOuter", std::clamp(read_float(*blend.sdna, element, "cone_angle_outer").value_or(360.0f), 0.0f, 360.0f)}, + {"coneAngleInner", std::clamp(read_float(*blend.sdna, element, "cone_angle_inner").value_or(360.0f), 0.0f, 360.0f)}, + {"coneVolumeOuter", std::clamp(read_float(*blend.sdna, element, "cone_volume_outer").value_or(1.0f), 0.0f, 1.0f)}, + {"volume", std::max(0.0f, read_float(*blend.sdna, element, "volume").value_or(1.0f))}, + {"pitch", std::max(0.0f, read_float(*blend.sdna, element, "pitch").value_or(1.0f))}, + }; + if (const std::optional sound_pointer = read_pointer(*blend.sdna, element, "sound")) { + const auto sound_id = ids_by_pointer.find(*sound_pointer); + if (sound_id != ids_by_pointer.end()) speaker["soundId"] = sound_id->second; + } + speakers.push_back(std::move(speaker)); + } else if (record.type_name == "Image") { std::string filepath = read_string(*blend.sdna, element, "filepath"); const std::vector image_views = linked_list_elements(blend, element, "views"); @@ -3624,6 +3807,18 @@ json scene_ir_from_blend(const ParsedBlend &blend, non_mesh_data.push_back(non_mesh_data_from_record(blend, element, record, ids_by_pointer)); } else if (record.type_name == "Text") { + if (const std::optional text = script_source_from_record(blend, element, record)) { + json resource = {{"id", record.id}, {"name", record.name}}; + resource["source"] = text->value("source", std::string()); + resource["sourceSha256"] = text->value("sourceSha256", std::string()); + resource["byteLength"] = text->value("byteLength", size_t(0)); + resource["lineCount"] = text->value("lineCount", size_t(0)); + resource["internal"] = text->value("internal", true); + resource["isDirty"] = (read_integer(*blend.sdna, element, "flags").value_or(0) & (1 << 0)) != 0; + resource["useModule"] = (read_integer(*blend.sdna, element, "flags").value_or(0) & (1 << 4)) != 0; + if (text->contains("sourcePath")) resource["sourcePath"] = text->at("sourcePath"); + texts.push_back(std::move(resource)); + } if (script_sources.size() >= 1024) { script_sources_blocked = true; } @@ -3643,6 +3838,21 @@ json scene_ir_from_blend(const ParsedBlend &blend, script_sources_blocked = true; } } + else if (record.type_name == "Tex") { + textures.push_back({ + {"id", record.id}, + {"name", record.name}, + {"type", read_integer(*blend.sdna, element, "type").value_or(0)}, + {"noiseScale", std::max(0.0f, read_float(*blend.sdna, element, "noisesize").value_or(0.25f))}, + {"noiseDepth", std::clamp(read_integer(*blend.sdna, element, "noisedepth").value_or(2), 0, 30)}, + {"intensity", std::max(0.0f, read_float(*blend.sdna, element, "bright").value_or(1.0f))}, + {"contrast", std::max(0.0f, read_float(*blend.sdna, element, "contrast").value_or(1.0f))}, + {"saturation", std::max(0.0f, read_float(*blend.sdna, element, "saturation").value_or(1.0f))}, + }); + } + else if (record.type_name == "WorkSpace") { + workspace_resources.push_back({{"id", record.id}, {"name", record.name}, {"screenCount", linked_list_elements(blend, element, "layouts").size()}}); + } else if (record.type_name == "VFont") { const std::string filepath = read_string(*blend.sdna, element, "filepath"); const std::optional packed_file = read_pointer(*blend.sdna, element, "packedfile"); @@ -3947,6 +4157,15 @@ json scene_ir_from_blend(const ParsedBlend &blend, sort_by_id(lights); sort_by_id(worlds); sort_by_id(images); + sort_by_id(brushes); + sort_by_id(line_styles); + sort_by_id(lattices); + sort_by_id(particle_settings); + sort_by_id(sounds); + sort_by_id(speakers); + sort_by_id(texts); + sort_by_id(textures); + sort_by_id(workspace_resources); sort_by_id(non_mesh_data); sort_by_id(vfonts); sort_by_id(libraries); @@ -3985,6 +4204,15 @@ json scene_ir_from_blend(const ParsedBlend &blend, {"lights", std::move(lights)}, {"worlds", std::move(worlds)}, {"images", std::move(images)}, + {"brushes", std::move(brushes)}, + {"lineStyles", std::move(line_styles)}, + {"lattices", std::move(lattices)}, + {"particleSettings", std::move(particle_settings)}, + {"sounds", std::move(sounds)}, + {"speakers", std::move(speakers)}, + {"texts", std::move(texts)}, + {"textures", std::move(textures)}, + {"workspaces", std::move(workspace_resources)}, {"nonMeshData", std::move(non_mesh_data)}, {"vfonts", std::move(vfonts)}, {"libraryStatus", libraries_blocked ? "BLOCKED" : "AVAILABLE"}, @@ -3998,6 +4226,7 @@ json scene_ir_from_blend(const ParsedBlend &blend, {"scenes", std::move(scenes)}, {"activeObjectId", active_object_id.empty() ? json(nullptr) : json(active_object_id)}, {"frame", {{"current", frame_current}, {"start", frame_start}, {"end", frame_end}}}}; + snapshot["windowManager"] = {{"id", "window-manager:WinMan"}, {"name", "WinMan"}, {"presetName", "New Preset"}, {"windowCount", 1}, {"interfaceLocked", false}}; if (!masks_blocked) { snapshot["trackingMasks"] = {{"schemaVersion", 1}, {"revision", revision}, diff --git a/blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp b/blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp index d0f70d15..42215ce4 100644 --- a/blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp +++ b/blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp @@ -4396,6 +4396,41 @@ bool web_engine_blend_main_physics_simulation_json(WebBlendMainState *state, return true; } +bool web_engine_blend_main_particle_settings_json(WebBlendMainState *state, + std::string &particle_settings_json, + std::string &error) +{ + if (state == nullptr || state->main == nullptr) { + error = "PARTICLE_SETTINGS_MANIFEST_INVALID: authoritative Main is not open"; + return false; + } + constexpr size_t max_settings = 4096; + auto canonical_number = [](const float value) -> json { + return std::isfinite(value) && std::trunc(value) == value ? json(int64_t(value)) : json(value); + }; + json settings = json::array(); + for (const ParticleSettings &part : state->main->particles) { + if (settings.size() >= max_settings) { + error = "PARTICLE_SETTINGS_BUDGET_EXCEEDED: ParticleSettings count exceeds the 4096 data-block budget"; + return false; + } + settings.push_back({{"id", "particle-settings:" + id_name(part.id)}, + {"name", id_name(part.id)}, + {"type", int(part.type)}, + {"from", int(part.from)}, + {"distribution", int(part.distr)}, + {"physicsType", int(part.phystype)}, + {"totalParticles", part.totpart}, + {"start", canonical_number(part.sta)}, + {"end", canonical_number(part.end)}, + {"lifetime", canonical_number(part.lifetime)}, + {"size", canonical_number(part.size)}, + {"drawSize", canonical_number(part.draw_size)}}); + } + particle_settings_json = json({{"schemaVersion", 1}, {"settings", std::move(settings)}}).dump(); + return true; +} + bool web_engine_blend_main_create_grease_pencil_layer(WebBlendMainState *state, const char *data_id, const char *name, diff --git a/blender-5.2.0/source/blender/web_engine/web_engine_main_state.h b/blender-5.2.0/source/blender/web_engine/web_engine_main_state.h index 02e9466b..e41a70c1 100644 --- a/blender-5.2.0/source/blender/web_engine/web_engine_main_state.h +++ b/blender-5.2.0/source/blender/web_engine/web_engine_main_state.h @@ -383,6 +383,9 @@ bool web_engine_blend_main_geometry_node_graphs_json(WebBlendMainState *state, bool web_engine_blend_main_physics_simulation_json(WebBlendMainState *state, std::string &physics_json, std::string &error); +bool web_engine_blend_main_particle_settings_json(WebBlendMainState *state, + std::string &particle_settings_json, + std::string &error); bool web_engine_blend_main_create_grease_pencil_layer(WebBlendMainState *state, const char *data_id, const char *name, diff --git a/docs/BLENDER_5_2_FULL_PARITY_WBS.md b/docs/BLENDER_5_2_FULL_PARITY_WBS.md index 38ccdd8f..ce1011cb 100644 --- a/docs/BLENDER_5_2_FULL_PARITY_WBS.md +++ b/docs/BLENDER_5_2_FULL_PARITY_WBS.md @@ -2,6 +2,8 @@ 更新时间:2026-08-18 +> 覆盖参考(归档):本文不是任务队列,也不进入默认上下文。只在任务卡明确引用某个 F 域时读取对应小节。 + > 本文保留为 Blender 全产品覆盖检查表和 F00-F24 taxonomy 参考。M12-M23 的执行分类、 > 原子任务、证据合同与发布门以 `BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md` 为准; > 本文的 F 任务不能直接作为当前 `nextTask`,也不能独立改变机器状态。 diff --git a/docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md b/docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md index db124521..9e21d197 100644 --- a/docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md +++ b/docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md @@ -2,6 +2,9 @@ 更新时间:2026-08-18 +> 长期规范背景:本文件不进入默认任务上下文,不提供当前领取指针。执行者必须先运行 +> `node tools/web/print-task-context.mjs`,只有任务卡明确要求时才读取本文件的具体小节。 + 本文是 M12 及以后完整 Blender 5.2 Web 迁移的长期规范事实源,负责执行分类、原子任务、 依赖、证据和完整发布门。它不覆盖 `WEB_BLENDER_MODELER_V1_SCOPE.md` 的 V1 产品契约,也不 改写 V1 已冻结的 `LOCAL_EXACT/LOCAL_BOUNDED/SERVER/EXCLUDED` 发布分类。 diff --git a/docs/BLENDER_5_2_WEB_FEATURE_PARITY.md b/docs/BLENDER_5_2_WEB_FEATURE_PARITY.md index 72e562e9..4f6ef29f 100644 --- a/docs/BLENDER_5_2_WEB_FEATURE_PARITY.md +++ b/docs/BLENDER_5_2_WEB_FEATURE_PARITY.md @@ -2,6 +2,8 @@ 更新时间:2026-08-13 +> 覆盖参考(归档):本文不作为当前任务入口;当前执行只认 `EXECUTION_QUEUE.md` 与 parent manifest。 + 本文件以仓库内 `blender-5.2.0/source/blender/` 为基线,记录 Blender 功能域在 Web 项目中的迁移方式和当前差距。M12-M23 的唯一长期实施规则和原子任务位于 `BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md`;本文不再定义领取顺序。`completed_current_scope` diff --git a/docs/CONTEXT_BUDGET.md b/docs/CONTEXT_BUDGET.md new file mode 100644 index 00000000..9e6ff059 --- /dev/null +++ b/docs/CONTEXT_BUDGET.md @@ -0,0 +1,46 @@ +# 任务上下文预算 + +完整治理流程见 [`CONTEXT_GOVERNANCE.md`](CONTEXT_GOVERNANCE.md);本页只保留机器需要的预算和索引契约。 + +本项目把“能否持续执行”定义为可检查的输入预算,而不是依赖执行者自行控制阅读量。每轮领取任务只加载一个最小上下文包: + +1. `docs/EXECUTION_QUEUE.md`:当前指针和规则,最多 4 KiB。 +2. `docs/tasks/.md`:一个行为的任务卡,最多 8 KiB。 +3. `tests/golden//manifest.json`:只取 parent、runtime、artifact hash、`nextTask`,最多 24 KiB。 +4. `docs/status/.md`:只取上一任务的证据摘要,最多 6 KiB。 + +四份输入的估算总量最多 3,500 tokens。实现代码、长日志、完整路线图和 parity ledger 只按任务卡列出的路径追加读取;它们不是默认上下文。 + +任务上下文生成器在生成 `inputPaths` 时还会前置执行证据筛选:最多 12 个证据路径,证据文件总计最多 +8 KiB,并从 3,500 token 总预算扣除四份基础文档后使用剩余空间。超限、缺失、越界或不可审计路径不会进入读取清单, +而会写入 `inputSelection.excluded[]`,其中 `reason` 是稳定的机器可读排除原因;治理门会校验所选路径、字节总数和排除审计。 + +全量 gap 计划 `tests/golden/M15-03A/next-task-plan.json` 约 6.8 MiB,只能由盘点/生成门读取,禁止作为任务上下文打开。`task-index.json` 保存源计划 hash 和每条记录的偏移,`task-catalog.jsonl` 保存一行一个任务;`task-context` 只随机读取当前任务的一行。索引缺失、源 hash 漂移或 catalog 损坏会直接失败,不能回退加载整份计划。 + +## 机器门禁 + +```bash +npm --prefix web run test:task-context +npm --prefix web run test:context-governance +node tools/web/generate-task-index.mjs +node tools/web/check-task-index.mjs +node tools/web/generate-task-card.mjs --task +node tools/web/print-task-context.mjs +node tools/web/print-task-context.mjs --task +node tools/web/check-task-context.mjs --task --write +node tools/web/check-context-governance.mjs +``` + +`check-task-context` 会确认队列指针、parent manifest、任务卡/索引、命令入口和预算一致。失败时不能领取任务,也不能手工修改 `nextTask`。索引只由计划生成门更新,执行任务不得手工编辑 catalog 或 offset。 + +推进到新任务时,若 `docs/tasks/.md` 不存在,先运行 `generate-task-card.mjs --task `;它只从 catalog 的一条记录生成一张短卡,生成后再运行 `check-task-context`。禁止为了生成一张卡读取完整 plan。 + +## 文档分层 + +- 当前执行:`EXECUTION_QUEUE.md`、当前任务卡、parent `manifest.json`、parent `status`。 +- 机器索引:`tests/golden/M15-03A/task-index.json`、`task-catalog.jsonl`;仅由工具读取,不是执行者要通读的文档。 +- 稳定契约:`WEB_BLENDER_MODELER_V1_SCOPE.md`、协议/schema、工具入口。 +- 背景规划:`CURRENT_EXECUTION_PLAN.md`、`PROJECT_STATUS_AND_NEXT_WORK.md`、完整 parity/WBS 计划。 +- 历史证据:`docs/status/` 其余文件、`tests/golden/` 其余构件、`test-results/`。 + +背景和历史文档不得在任务卡中复制;需要时只引用一个小节或一个具体构件。若文字与机器 manifest 冲突,以命令输出和 manifest 为准。 diff --git a/docs/CONTEXT_GOVERNANCE.md b/docs/CONTEXT_GOVERNANCE.md new file mode 100644 index 00000000..689c1580 --- /dev/null +++ b/docs/CONTEXT_GOVERNANCE.md @@ -0,0 +1,121 @@ +# 上下文治理契约 + +更新时间:2026-08-19(America/New_York) + +本契约解决两个问题:执行者不需要读完整路线图就能继续工作;任何任务卡、交接状态或机器索引 +变大、漂移或重复指针时,自动门禁会在领取前失败。它是执行规则,不是项目进度表。 + +## 一、事实分层 + +每个问题只由一个层级回答,层级之间不互相复制内容: + +| 层级 | 唯一职责 | 默认是否读取 | +| --- | --- | --- | +| `EXECUTION_QUEUE.md` | 当前 task、parent manifest、专项命令、全局硬规则 | 是 | +| `tasks/.md` | 一个行为或一个证据变化的输入、边界、验收和回滚 | 是 | +| `tests/golden//manifest.json` | parent 状态、artifact hash、运行时、`nextTask` | 是 | +| `docs/status/.md` | 上一项最小证据摘要和已知风险 | 是 | +| 协议/生产/测试文件 | 任务卡点名的实现事实 | 按需 | +| 长期计划、全量 ledger、历史 status | 背景、审计、归档 | 禁止默认读取 | + +冲突优先级固定为:真实命令输出 > manifest/evidence > 任务卡 > 队列文字 > 长期规划和历史日志。 +Markdown checkbox 不能覆盖失败命令或 hash 漂移。 + +## 二、硬预算 + +预算按 UTF-8 bytes 检查,token 用 `ceil(bytes / 4)` 作保守估算。超过任一单项或总预算都不能领取。 + +| 输入 | 上限 | 约束 | +| --- | ---: | --- | +| 队列 | 4 KiB | 只保留一个当前指针,不保留历史任务表 | +| 任务卡 | 8 KiB | 最多 12 个输入路径、8 条命令;不复制日志 | +| parent manifest | 24 KiB | 只记录必要 artifact,最多 32 项 | +| parent status | 6 KiB | 只保留命令、退出码、关键结果、风险和回滚 | +| 四份输入合计 | 3,500 tokens | 由 `contextSizeReport` 和治理门同时检查 | +| catalog 单行 | 2 KiB | 机器随机读取;执行者不得通读 catalog | + +生成阶段的证据读取清单另外受 `maxFiles=12`、`evidenceBytes=8 KiB` 和基础文档扣除后的剩余上下文空间约束。 +每个未选路径必须有 `inputSelection.excluded[].reason`,因此校验器不会成为首次发现超大上下文的地方。 + +全量 `next-task-plan.json`、parity map 和 gap audit 是生成器输入,不是执行上下文。索引保存源 +hash 和 catalog offset;源 hash、catalog hash 或 offset 损坏时必须重新生成,不能回退读取大计划。 + +## 三、原子任务粒度 + +默认“一项任务 = 一个可观察行为或一项独立证据”。以下任一情况出现就拆任务: + +- 同时改变 schema、生产消费、浏览器接线和发布证据; +- 需要两个互不依赖的 fixture 或两个不同 owner family; +- 正例、取消/重复/超限负例无法在同一 focused command 中清楚断言; +- 任务卡需要列出超过 12 个输入或超过 8 条命令; +- 任何一项失败会让另一项仍可安全交付。 + +复杂能力按适用门拆分,门之间通过 parent manifest 串联: + +| 门 | 只交付一件事 | 失败状态 | +| --- | --- | --- | +| C 契约 | schema、稳定 ID、预算、错误边界和 revision 规则 | `in_progress` | +| P 生产 | Main/Worker/App/viewport 的真实消费路径 | `in_progress` | +| N 负例 | 非法、重复、取消、迟到、超限不改变已提交状态 | `in_progress` | +| B 浏览器 | Chromium 真实用户路径和可见结果 | `blocked` 或 `in_progress` | +| R 资源 | dispose、重启、save/reopen、OPFS/GPU/内存归零 | `in_progress` | +| E 证据 | focused command、报告、hash manifest、status、回滚 | 通过后才允许下一个 task | + +M16 及后续 gap 固定为一 gap 一个 task:最小 fixture、desktop/WASM 对比、save/reopen、负例和 +manifest 证据必须属于该 gap;不要把“完成整个 family”写成一张卡。 + +## 四、执行生命周期 + +### 领取 + +```bash +npm --prefix web run test:context-governance +node tools/web/print-task-context.mjs +node tools/web/check-task-context.mjs +``` + +只读取打印结果列出的四份文件和任务卡点名的最小实现入口。当前 task 必须等于 parent +manifest 的 `nextTask`;不能从旧 Markdown 编号、完整 plan 或 status 列表推导任务。 + +### 实施 + +先确认最小 fixture 和生产入口,再写 focused test/checker。每条验收命令都必须真实运行并记录 +退出码;协议或测试文件存在不等于生产能力完成。浏览器、CI、验收和发布证据永久仅限 Chromium。 + +### 成功交接 + +```bash +node tools/web/check-task-context.mjs --task --write +node tools/web/check-context-governance.mjs +``` + +只提交本任务的实现/测试、fixture、报告、manifest、status 和 `task-context.json`。manifest 必须 +绑定所有产物的 SHA-256,并且 `nextTask` 是唯一的下一指针;长日志留在构件目录,不复制进 status。 + +### 失败、阻断和恢复 + +命令失败、环境缺失、取消、超限、重复、迟到结果或 hash 漂移时保持 `in_progress` 或 `blocked`, +不得写成功报告、修改 Main revision 或推进 `nextTask`。修复后从同一 parent 重新运行;不要覆盖 +parent 证据。任务卡、索引或队列指针不一致时先修复生成证据,再继续实现。 + +## 五、提交前门禁 + +提交前至少运行: + +```bash +npm --prefix web run test:context-governance +node tools/web/check-task-index.mjs +node tools/web/check-task-context.mjs +git diff --check +``` + +`check-context-governance` 会检查四份文档预算、任务卡必备章节和失败边界、禁止的长文档引用、 +manifest 路径/构件数量、catalog 行边界以及唯一活动 task。门禁失败即停止,不通过手工删除输出 +或修改 `nextTask` 绕过。 + +## 六、维护规则 + +- 新增任务:先更新机器源并运行 `generate-task-index.mjs`,再用 `generate-task-card.mjs --task` 生成短卡;禁止手写 catalog offset。 +- 完成任务:先写 manifest/status,再用 `check-task-context --write` 生成交接上下文;队列只跟随新 manifest。 +- 规则变化:只修改本契约、`CONTEXT_BUDGET.md`、模板和治理测试;长期规划只增加链接,不复制规则。 +- 发现重复或过大的历史文档:标记为背景/归档并从默认入口移除,不在任务卡中粘贴摘要。 diff --git a/docs/CURRENT_EXECUTION_PLAN.md b/docs/CURRENT_EXECUTION_PLAN.md index 0da05b63..af247268 100644 --- a/docs/CURRENT_EXECUTION_PLAN.md +++ b/docs/CURRENT_EXECUTION_PLAN.md @@ -2,6 +2,9 @@ 更新时间:2026-08-19 +> 背景规划文档:不作为当前任务入口,也不覆盖 `EXECUTION_QUEUE.md` 的机器指针。领取任务只读取 +> [`CONTEXT_BUDGET.md`](CONTEXT_BUDGET.md) 定义的最小上下文包。 + ## 1. 交付目标 当前交付物是 `Web Blender Modeler V1`,不是 Blender 5.2 的完整浏览器移植。 @@ -18,8 +21,8 @@ React 工作区和编辑器 -> OPFS 大文件 + IndexedDB 元数据 ``` -本计划保留阶段边界和退出条件;领取任务时只读取精简入口 `docs/EXECUTION_QUEUE.md`、对应 -`docs/tasks/.md` 和 parent manifest,避免加载历史日志。M12-M23 的长期 Blender 全功能实施规范以 +本计划保留阶段边界和退出条件;领取任务时只运行 `node tools/web/print-task-context.mjs`,仅读取其 +输出的队列、任务卡/plan 条目、parent manifest 和 parent status,避免加载历史日志。M12-M23 的长期 Blender 全功能实施规范以 `BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md` 为准;当前实现状态仍由 `status/parity-ledger.json` 和对应 evidence 给出。长期全域差距不阻断已明确限定范围的 V1。 diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index 43b15bb0..30377e54 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -1,54 +1,44 @@ # Web Blender 短周期执行入口 -更新时间:2026-08-19(America/New_York) +更新时间:2026-08-20(America/New_York) -本页只负责“现在领取什么”。文档地图见 [`docs/README.md`](README.md),任务卡见 [`tasks/`](tasks/), -长期规则见 `BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md`。不要在本页复制实现日志或历史任务表。 - -## 铁律:浏览器范围 - -本项目浏览器执行、CI、验收证据和发布声明永久仅限 Chromium。禁止启动、探测或领取 Firefox -和 WebKit 测试任务;历史 Firefox/WebKit 报告仅作归档背景,不得作为支持证据。缺失 WebGPU -只能由 Chromium 真实能力门将依赖 WebGPU 的功能标记为 `BLOCKED`,不得用其他浏览器推断。 +本页是唯一的当前任务指针,不保存历史任务表、实现日志或长期规划。领取任务前只读取本页、当前任务上下文、parent manifest 和 parent status;完整规则见 [`CONTEXT_BUDGET.md`](CONTEXT_BUDGET.md)。 ## 当前指针 | 字段 | 值 | | --- | --- | -| 里程碑 | M14 跨浏览器/设备 | -| 当前任务 | `M14-04F` | -| parent manifest | `tests/golden/M14-04E/manifest.json` | -| 任务卡 | [`tasks/M14-04F.md`](tasks/M14-04F.md) | -| 专项验收 | `npm --prefix web run test:chromium-input-modal` | +| 里程碑 | M16 Main、Mesh、Modifier、Sculpt | +| 当前任务 | `M16-GAP-00071` | +| parent manifest | `tests/golden/M16-GAP-00070/manifest.json` | +| 任务卡 | [`tasks/M16-GAP-00071.md`](tasks/M16-GAP-00071.md) | +| 专项验收 | `npm --prefix web run test:generated-gap -- --task M16-GAP-00071` | -领取前只读四个文件:本页、任务卡、parent manifest、parent status。完成后新增 task manifest/status, -从新 manifest 的 `nextTask` 继续;Markdown 中的旧编号不覆盖机器指针。 +领取前执行: -## 任务链 +```bash +npm --prefix web run test:task-context +npm --prefix web run test:context-governance +node tools/web/print-task-context.mjs +``` -| ID | 唯一交付 | 任务卡 | -| --- | --- | --- | -| M13-04F | stdout/stderr 有界截断与脱敏 | [`M13-04F.md`](tasks/M13-04F.md) | -| M13-04G | 取消进程树并清理目录 | [`M13-04G.md`](tasks/M13-04G.md) | -| M13-04H | timeout/OOM/signal 稳定错误码 | [`M13-04H.md`](tasks/M13-04H.md) | -| M13-04I | hash 校验后原子提交 OPFS | [`M13-04I.md`](tasks/M13-04I.md) | -| M13-04J | request 重试幂等和冲突隔离 | [`M13-04J.md`](tasks/M13-04J.md) | -| M13-05G | fuzz 崩溃最小化与回归固化 | [`M13-05G.md`](tasks/M13-05G.md) | -| M13-05H | 审计记录严格顺序与防篡改 hash chain | [`M13-05H.md`](tasks/M13-05H.md) | -| M14-01A | 冻结 Chromium、engine 与 archive 身份 | [`M14-01A.md`](tasks/M14-01A.md) | -| M14-01B | Firefox capability probe | 跳过:Chromium-only 铁律 | -| M14-01C | WebKit capability probe | 跳过:Chromium-only 铁律 | -| M14-01D | probe identity and GPU/OS adapter recording | [`M14-01D.md`](tasks/M14-01D.md) | -| M14-01E | Chromium WebGPU fail-closed boundary | [`M14-01E.md`](tasks/M14-01E.md) | -| M14-04A | Chromium GPU/memory budget device tier selection | [`M14-04A.md`](tasks/M14-04A.md) | -| M14-04B | Chromium DPR 1/1.5/2/3 consistency | [`M14-04B.md`](tasks/M14-04B.md) | -| M14-04C | Chromium mouse/touch/pen pointer contract | [`M14-04C.md`](tasks/M14-04C.md) | -| M14-04D | Chromium IME composition guard | [`M14-04D.md`](tasks/M14-04D.md) | -| M14-04E | Chromium US/non-US/dead-key/modifier keymap fixture | [`M14-04E.md`](tasks/M14-04E.md) | -| M14-04F | Chromium touch modal cancel / two-finger / pen commit | [`M14-04F.md`](tasks/M14-04F.md) | +如果任务卡缺失,运行 `node tools/web/generate-task-card.mjs --task `;如果索引过期,运行 `node tools/web/generate-task-index.mjs` 后再生成任务卡;不要打开或复制完整 `next-task-plan.json`。 -## 统一退出门 +## 铁律 -每项只声明一个主要行为;适用的生产路径、结构化错误码、取消/迟到结果门、资源清理、专项命令、 -报告/manifest SHA-256 和回滚条件必须全部具备。执行未通过、环境缺失或 hash 漂移时标记 `blocked`, -不能用协议或测试文件存在替代真实运行结果。M13 脚本执行在本链完成前保持 `execution=DISABLED`。 +- 浏览器执行、CI、验收证据和发布声明永久仅限 Chromium;禁止领取 Firefox/WebKit 任务。 +- 当前任务必须等于 parent manifest 的 `nextTask`;不得从 Markdown 历史编号手工推导。 +- 一个任务只能有一个主要行为变化或一个独立证据变化。实现、浏览器接线、负例和证据需要拆成明确子任务时,沿任务卡的门逐项完成。 +- 完成必须有真实命令、退出码、构件 SHA-256、manifest 和 status;协议、fixture 或测试文件存在不等于完成。 +- 失败、环境缺失或 hash 漂移保持 `in_progress`/`blocked`,不得推进指针。 + +## 交接 + +```text +node tools/web/check-task-context.mjs --task --write +``` + +完成后只写入 `tests/golden//task-context.json`、任务报告、manifest 和 `docs/status/.md`。下一任务只读新 manifest 的 `nextTask`;长日志留在构件目录。 + +提交前运行 `node tools/web/check-context-governance.mjs` 和 `git diff --check`;门禁失败时保持原 task, +不得手工推进 `nextTask`。 diff --git a/docs/PBR_RENDERING_IMPLEMENTATION_PLAN.md b/docs/PBR_RENDERING_IMPLEMENTATION_PLAN.md index 490eee5f..4966c83e 100644 --- a/docs/PBR_RENDERING_IMPLEMENTATION_PLAN.md +++ b/docs/PBR_RENDERING_IMPLEMENTATION_PLAN.md @@ -2,6 +2,8 @@ 更新日期:2026-08-09 +> 专项背景(归档):本文不进入默认上下文;PBR 任务必须通过最小上下文工具按卡片追加读取。 + ## 1. 目标和声明边界 目标是在浏览器 3D Viewport 中提供与 Blender Principled 工作流一致、可保存、可重开的 diff --git a/docs/PROJECT_STATUS_AND_NEXT_WORK.md b/docs/PROJECT_STATUS_AND_NEXT_WORK.md index bd457e6b..d50b0998 100644 --- a/docs/PROJECT_STATUS_AND_NEXT_WORK.md +++ b/docs/PROJECT_STATUS_AND_NEXT_WORK.md @@ -2,6 +2,9 @@ 更新时间:2026-08-19 +> 背景状态快照:不作为当前任务入口。当前任务、parent 和 `nextTask` 只认 +> `docs/EXECUTION_QUEUE.md`、任务上下文和机器 manifest;本文件中的“当前”仅指快照生成时点。 + 当前短周期任务、领取顺序和阶段退出条件统一维护在 `docs/EXECUTION_QUEUE.md`。本文件保留实现事实、长期能力台账和完整验收命令,不再作为 V1 的逐项领取顺序;V1 范围以 `docs/WEB_BLENDER_MODELER_V1_SCOPE.md` 为准,M12-M23 全功能 diff --git a/docs/README.md b/docs/README.md index df435edf..d82fbc43 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,20 +1,23 @@ # 文档导航 本目录按“产品契约、当前任务、实现事实、长期规划、验收证据”分层。领取任务时不要从仓库根目录 -开始通读;只读取当前队列、当前任务卡和机器 manifest 指向的状态页。 +开始通读;只读取当前队列和机器生成的最小上下文包。预算和自动检查见 +[`CONTEXT_BUDGET.md`](CONTEXT_BUDGET.md)。 +完整拆分、预算、交接和提交规则见 [`CONTEXT_GOVERNANCE.md`](CONTEXT_GOVERNANCE.md)。 ## 领取任务 -1. [EXECUTION_QUEUE.md](EXECUTION_QUEUE.md):唯一的短周期入口,给出当前 `nextTask` 和读取顺序。 -2. `tasks/.md`:当前任务的最小上下文、范围和验收命令。 -3. `tests/golden//manifest.json`:机器事实源,确认 parent、输入构件和下一个任务。 -4. `status/.md`:完成后写入证据、hash、状态和回滚方式。 +1. [EXECUTION_QUEUE.md](EXECUTION_QUEUE.md):唯一的短周期入口和当前指针。 +2. `node tools/web/print-task-context.mjs`:只输出当前任务需要的四份输入。 +3. `tasks/.md`:当前任务唯一的范围、输入和验收;缺卡时先修复生成流程,不要打开完整 plan。 +4. parent `tests/golden//manifest.json` 与 `status/.md`:只提供交接事实。 -需要拆分实施或控制上下文时,先看 [TASK_BREAKDOWN.md](TASK_BREAKDOWN.md)。它提供阶段地图、 -原子任务门、当前 M14-04F 的子任务和后续任务草案,但不覆盖 manifest/status 的机器事实。 +需要拆分实施或控制上下文时,先看 [CONTEXT_GOVERNANCE.md](CONTEXT_GOVERNANCE.md); +[TASK_BREAKDOWN.md](TASK_BREAKDOWN.md) 只提供阶段地图和归档示例,不覆盖 manifest/status 的机器事实。 任务卡使用 [TASK_CONTEXT_TEMPLATE.md](TASK_CONTEXT_TEMPLATE.md) 的固定结构;卡片只描述一个主要 -行为或一个证据变化,不复制实现日志。 +行为或一个证据变化,不复制实现日志。全量 gap 计划由机器索引切片,`check-task-context` 会阻止 +超预算、缺卡、过期索引或 parent 指针错误进入队列。 ## 事实源 @@ -36,8 +39,12 @@ ## 最小上下文规则 -默认只加载本页列出的四个入口文件;实现细节按任务卡的文件清单追加读取。不要为了确认一个 -局部输入、IO 或安全任务而加载整份 `PROJECT_STATUS_AND_NEXT_WORK.md` 或完整 parity 计划。 +默认只加载队列、当前任务卡、parent manifest 和 parent status;总量上限为 3,500 tokens。 +实现细节按任务卡的文件清单追加读取。不要为了确认一个局部输入、IO 或安全任务而加载整份 +`PROJECT_STATUS_AND_NEXT_WORK.md` 或完整 parity 计划。 + +`next-task-plan.json`、parity map 和 gap audit 是生成器输入,不是任务上下文;任务工具只读取 +带 hash 的单行 catalog 记录。 文档描述与 manifest/evidence 冲突时,以可复验的机器状态为准;不要通过修改 Markdown checkbox 覆盖失败证据。 diff --git a/docs/TASK_BREAKDOWN.md b/docs/TASK_BREAKDOWN.md index 404e8a21..ac086b23 100644 --- a/docs/TASK_BREAKDOWN.md +++ b/docs/TASK_BREAKDOWN.md @@ -2,6 +2,9 @@ 更新时间:2026-08-19(America/New_York) +> 拆分参考(归档):本文件不进入默认任务上下文。当前任务和依赖只由 `print-task-context` 与 +> parent manifest 提供;这里只在需要设计新的子任务门时读取对应小节。 + 本文件是“如何拆任务、如何领取任务、如何交接”的规划索引,不是实现状态事实源。当前状态仍以 `docs/EXECUTION_QUEUE.md`、当前任务的 `manifest.json`、对应 `docs/status/.md` 和可复验命令为准。 本文件的目标是让一次任务只加载必要上下文,不要求阅读整份路线图或历史接续日志。 @@ -11,9 +14,10 @@ 每轮只按下面顺序读取: 1. `docs/EXECUTION_QUEUE.md`:确认唯一当前 `nextTask`、Chromium-only 规则和专项命令。 -2. `docs/tasks/.md`:读取目标、输入、范围、验收和回滚。 -3. `tests/golden//manifest.json`:确认 parent hash、依赖、运行时和下一任务。 -4. `docs/status/.md`:只读取上一项的证据摘要和已知风险。 +2. `node tools/web/print-task-context.mjs`:取得已经裁剪的单任务 JSON;不要读取 plan、gap audit 或 parity map。 +3. `docs/tasks/.md`:读取目标、输入、范围、验收和回滚。 +4. `tests/golden//manifest.json`:确认 parent hash、依赖、运行时和下一任务。 +5. `docs/status/.md`:只读取上一项的证据摘要和已知风险。 只有遇到以下问题才继续读取: @@ -80,6 +84,27 @@ 任务卡可以把 C/P/N/B/R/E 写成子任务,但只有所有适用门通过后,主任务才可变为 `done`。 +### 3.2 生成 gap 的细分协议 + +M16 及后续全域 gap 采用“一条 gap、一个任务、五扇证据门”的固定粒度。任务 ID、gap、owner 和 +实现类别由机器 catalog 提供;任务卡只补充该条 gap 的真实 fixture、生产入口和边界,不复制全量 +计划字段。 + +| 门 | 唯一交付 | 失败时的状态 | +| --- | --- | --- | +| C | 字段/稳定 ID/错误边界契约 | `in_progress`,不得写入成功报告 | +| D | desktop fixture 和可重跑报告 | `blocked` 或 `in_progress`,不得接 WASM | +| W | WASM/Main 消费同一 fixture | `in_progress`,不得声称 parity | +| R | save/reopen 或 revision 稳定性 | `in_progress`,不得推进队列 | +| E | comparator、manifest、status、rollback | 只有 E 完成才允许 parent `nextTask` | + +生成目录中的 `next-task-plan.json` 是盘点输入,不是执行上下文。`generate-task-index.mjs` 将其切成 +带源 hash 的 `task-index.json` 和一行一个任务的 `task-catalog.jsonl`;执行工具按 offset 读取单条 +记录,并由任务卡恢复命令模板。索引失效、任务卡缺失、parent 指针不一致或单卡超过 8 KiB 时, +领取门直接失败。 + +新任务卡使用 `node tools/web/generate-task-card.mjs --task ` 按 catalog 单条记录生成;生成器拒绝未知 ID、没有 parent 的首项和已有卡覆盖,除非显式传入 `--force`。生成后必须重新运行上下文门禁。 + ## 4. 项目阶段分解 下面是导航级分解;具体领取仍由短周期队列决定。 @@ -99,14 +124,15 @@ | M11 | Render/Compositor/Media | bounded local、server route、codec/revision/audio | 已完成的 V1 slice | | M12 | Asset/IO/Editors | 资产库、GLB/OBJ/STL/PLY、编辑器上下文 | 按 manifest 继续领取,不能按总百分比判断 | | M13 | Scripting/Security | metadata-only、default-deny、sandbox、server isolation、CSP | 每个安全门独立验收;execution 默认禁用 | -| M14 | Chromium 设备与输入 | capability、预算、DPR、pointer、IME、keymap、modal、可访问性 | 当前短周期在 `M14-04F` | -| M15 | 全域审计 | Blender 5.2 inventory、operator/node/editor/format gap | 未开始;不阻断已限定 V1 | +| M14 | Chromium 设备与输入 | capability、预算、DPR、pointer、IME、keymap、modal、可访问性 | 已归档;后续只按 manifest 回归 | +| M15 | 全域审计 | Blender 5.2 inventory、operator/node/editor/format gap | 已完成计划/审计门;产出 6,900 条 M16-M22 原子 gap | +| M16-M22 | 原子 parity gap | 每条 gap 独立 fixture、desktop/WASM 对标、重开和 hash 证据 | 只按 parent manifest 顺序推进;当前任务不在本表缓存 | 状态轴必须分开:V1 `releaseStatus=READY` 不等于 Blender 全域 `parityStatus=COMPLETE`。 -## 5. 当前 M14-04F 细分 +## 5. 历史示例:M14-04F 细分(非当前任务) -### 5.1 当前已知上下文 +### 5.1 归档时的已知上下文 - parent:`M14-04E`,状态页已记录 keymap fixture 的成功证据。 - 当前任务:`M14-04F`,任务卡为 `docs/tasks/M14-04F.md`。 @@ -145,7 +171,7 @@ 如果只有协议和测试通过,状态应保持 `in_progress`,不得提前领取 M14-04G。 -## 6. M14 后续任务草案 +## 6. M14 后续任务草案(归档) 这些是领取前的拆分草案;正式任务仍须由 parent manifest 生成任务卡。 diff --git a/docs/TASK_CONTEXT_TEMPLATE.md b/docs/TASK_CONTEXT_TEMPLATE.md index 397dd88f..e7bb0921 100644 --- a/docs/TASK_CONTEXT_TEMPLATE.md +++ b/docs/TASK_CONTEXT_TEMPLATE.md @@ -1,7 +1,11 @@ # 任务上下文模板 -每张任务卡只允许一个主要行为变化或一个证据变化。保持短小;实现细节放在代码和测试中,运行结果 -放在 `docs/status/.md`,不要在任务卡复制长日志。 +每张任务卡只允许一个主要行为变化或一个证据变化。卡片上限 8 KiB,最多 12 个输入路径和 8 条命令;实现细节放在代码和测试中, +运行结果放在 `docs/status/.md`,不要在任务卡复制长日志。机器生成 gap 也必须有同样的短卡; + catalog 只供工具随机读取,不替代任务卡,也不应被执行者通读。 + +不要在任务卡引用 `next-task-plan.json`、完整路线图、全量 status 或 `test-results/`;需要背景时只 +点名一个稳定契约的小节。 ## 任务 @@ -16,8 +20,8 @@ ## 输入 - 上一个 manifest:`tests/golden//manifest.json` -- 生产入口:`` - 最小 fixture:`` +- 生产入口:``;不要写“相关代码”或整目录。 ## 范围 @@ -30,6 +34,8 @@ ``` +至少列出一个负例、取消、重复或预算超限场景;不要把全量回归命令复制到卡片。 + 适用时补充 Node、Chromium、typecheck、lint;每条命令必须真实运行并记录退出码。 ## 产物和交接 diff --git a/docs/UNDECLARED_CAPABILITIES_EXECUTION_PLAN.md b/docs/UNDECLARED_CAPABILITIES_EXECUTION_PLAN.md index 03912c26..47c6886e 100644 --- a/docs/UNDECLARED_CAPABILITIES_EXECUTION_PLAN.md +++ b/docs/UNDECLARED_CAPABILITIES_EXECUTION_PLAN.md @@ -2,6 +2,8 @@ 更新时间:2026-08-09 +> 长期规划(归档):本文不进入默认上下文;只按任务卡引用的章节读取。 + 本计划把当前未声明的 Sculpt、Geometry Nodes/Simulation、任意 Shader Node 和完整 NLA 拆成四个可独立验收的连续任务。每个任务都必须满足:Blender Main 是唯一写入 权威;SceneIR 只承载通过校验的数据;Three.js 不执行 Blender 语义;不支持或不确定 diff --git a/docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md b/docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md index 86a0dbb5..2be7d86f 100644 --- a/docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md +++ b/docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md @@ -2,6 +2,8 @@ 更新时间:2026-08-14 +> 专项背景(归档):本文不进入默认上下文;VDB 任务必须通过最小上下文工具按卡片追加读取。 + ## 1. 范围与完成定义 VDB 重新纳入 N-015/N-019/N-023/N-026。产品链路固定为:桌面工具或受控服务端使用 diff --git a/docs/status/M12-07H.md b/docs/status/M12-07H.md index 9aa988de..961ff15f 100644 --- a/docs/status/M12-07H.md +++ b/docs/status/M12-07H.md @@ -1,9 +1,9 @@ # M12-07H Status -status: done -task: PLY vertex/face/color/custom property mapping and unknown property loss report -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: PLY vertex/face/color/custom property mapping and unknown property loss report +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M12-07I.md b/docs/status/M12-07I.md index d2efbc96..e45539a4 100644 --- a/docs/status/M12-07I.md +++ b/docs/status/M12-07I.md @@ -1,9 +1,9 @@ # M12-07I Status -status: done -task: PLY big-endian, malformed list, and oversized count stable blocking -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: PLY big-endian, malformed list, and oversized count stable blocking +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M12-07J.md b/docs/status/M12-07J.md index 127cda94..8474ef80 100644 --- a/docs/status/M12-07J.md +++ b/docs/status/M12-07J.md @@ -1,9 +1,9 @@ # M12-07J Status -status: done -task: three-format cancellation, OOM, Worker restart, and small-file recovery -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: three-format cancellation, OOM, Worker restart, and small-file recovery +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-01A.md b/docs/status/M13-01A.md index 31b49cec..f85d4e33 100644 --- a/docs/status/M13-01A.md +++ b/docs/status/M13-01A.md @@ -1,9 +1,9 @@ # M13-01A Status -status: done -task: inventory Text, Python Console, autorun, driver expression, handler, and add-on entry points -updated: 2026-08-18 America/New_York -enablingTask: true +status: done +task: inventory Text, Python Console, autorun, driver expression, handler, and add-on entry points +updated: 2026-08-18 America/New_York +enablingTask: true parityStateChange: false ## Scope diff --git a/docs/status/M13-01B.md b/docs/status/M13-01B.md index 0ea2ea0e..8b539fc2 100644 --- a/docs/status/M13-01B.md +++ b/docs/status/M13-01B.md @@ -1,9 +1,9 @@ # M13-01B Status -status: done -task: read script metadata on `.blend` open without executing arbitrary content -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: read script metadata on `.blend` open without executing arbitrary content +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-01C.md b/docs/status/M13-01C.md index bf1fdd75..55c96559 100644 --- a/docs/status/M13-01C.md +++ b/docs/status/M13-01C.md @@ -1,9 +1,9 @@ # M13-01C Status -status: done -task: default-deny autorun, register, install, and driver execution policy codes -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: default-deny autorun, register, install, and driver execution policy codes +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-01D.md b/docs/status/M13-01D.md index 6029a8bf..19febec3 100644 --- a/docs/status/M13-01D.md +++ b/docs/status/M13-01D.md @@ -1,9 +1,9 @@ # M13-01D Status -status: done -task: UI direct-eval bypass gate -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: UI direct-eval bypass gate +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-01E.md b/docs/status/M13-01E.md index 113ec41c..1077fea4 100644 --- a/docs/status/M13-01E.md +++ b/docs/status/M13-01E.md @@ -1,9 +1,9 @@ # M13-01E Status -status: done -task: preserve Text data and unknown script sources through save/reopen -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: preserve Text data and unknown script sources through save/reopen +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-01F.md b/docs/status/M13-01F.md index df5dbb9e..826a75f3 100644 --- a/docs/status/M13-01F.md +++ b/docs/status/M13-01F.md @@ -1,9 +1,9 @@ # M13-01F Status -status: done -task: malicious Text, driver, handler, and embedded-module fixtures -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: malicious Text, driver, handler, and embedded-module fixtures +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-02A.md b/docs/status/M13-02A.md index c610913b..9a962e14 100644 --- a/docs/status/M13-02A.md +++ b/docs/status/M13-02A.md @@ -1,9 +1,9 @@ # M13-02A Status -status: done -task: bounded script manifest limits -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: bounded script manifest limits +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-02B.md b/docs/status/M13-02B.md index 52c6af59..d5c5f806 100644 --- a/docs/status/M13-02B.md +++ b/docs/status/M13-02B.md @@ -1,9 +1,9 @@ # M13-02B Status -status: done -task: canonical script manifest serialization -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: canonical script manifest serialization +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-02C.md b/docs/status/M13-02C.md index 3f452c8c..fde47b24 100644 --- a/docs/status/M13-02C.md +++ b/docs/status/M13-02C.md @@ -1,9 +1,9 @@ # M13-02C Status -status: done -task: signer identity, key rotation, revocation and timestamp policy -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: signer identity, key rotation, revocation and timestamp policy +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-02D.md b/docs/status/M13-02D.md index d4bb2368..6c5fa011 100644 --- a/docs/status/M13-02D.md +++ b/docs/status/M13-02D.md @@ -1,9 +1,9 @@ # M13-02D Status -status: done -task: signature verification binds declared content -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: signature verification binds declared content +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-02E.md b/docs/status/M13-02E.md index 05459380..1b36a019 100644 --- a/docs/status/M13-02E.md +++ b/docs/status/M13-02E.md @@ -1,9 +1,9 @@ # M13-02E Status -status: done -task: permission default-minimization and unknown-permission blocking -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: permission default-minimization and unknown-permission blocking +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-02F.md b/docs/status/M13-02F.md index 77ed2ffc..b6bfa403 100644 --- a/docs/status/M13-02F.md +++ b/docs/status/M13-02F.md @@ -1,9 +1,9 @@ # M13-02F Status -status: done -task: signature replay, key-confusion and expiry negative cases -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: signature replay, key-confusion and expiry negative cases +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-03A.md b/docs/status/M13-03A.md index 6ebc324d..9cb8c44c 100644 --- a/docs/status/M13-03A.md +++ b/docs/status/M13-03A.md @@ -1,9 +1,9 @@ # M13-03A Status -status: done -task: sandbox capability scope -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: sandbox capability scope +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-03B.md b/docs/status/M13-03B.md index 3915520f..9217330d 100644 --- a/docs/status/M13-03B.md +++ b/docs/status/M13-03B.md @@ -1,9 +1,9 @@ # M13-03B Status -status: done -task: sandbox CPU, wall, memory, message and output budgets -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: sandbox CPU, wall, memory, message and output budgets +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-03C.md b/docs/status/M13-03C.md index bbbc43e4..2b05ece2 100644 --- a/docs/status/M13-03C.md +++ b/docs/status/M13-03C.md @@ -1,9 +1,9 @@ # M13-03C Status -status: done -task: explicit host-call allowlist and structured parameters -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: explicit host-call allowlist and structured parameters +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-03D.md b/docs/status/M13-03D.md index 3bacae0e..ec14d890 100644 --- a/docs/status/M13-03D.md +++ b/docs/status/M13-03D.md @@ -1,9 +1,9 @@ # M13-03D Status -status: done -task: sandbox crash/timeout isolation -updated: 2026-08-18 America/New_York -enablingTask: false +status: done +task: sandbox crash/timeout isolation +updated: 2026-08-18 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-03E.md b/docs/status/M13-03E.md index e90d0210..33a415d2 100644 --- a/docs/status/M13-03E.md +++ b/docs/status/M13-03E.md @@ -1,9 +1,9 @@ # M13-03E Status -status: done -task: sandbox cancellation result gate -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: sandbox cancellation result gate +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-03F.md b/docs/status/M13-03F.md index e7bbc2e4..e5065236 100644 --- a/docs/status/M13-03F.md +++ b/docs/status/M13-03F.md @@ -1,9 +1,9 @@ # M13-03F Status -status: done -task: sandbox resource disposal gate -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: sandbox resource disposal gate +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-03G.md b/docs/status/M13-03G.md index 1711cc57..bd16a903 100644 --- a/docs/status/M13-03G.md +++ b/docs/status/M13-03G.md @@ -1,9 +1,9 @@ # M13-03G Status -status: done -task: same-session sandbox recovery and audit continuity -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: same-session sandbox recovery and audit continuity +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-04A.md b/docs/status/M13-04A.md index 6883ecc2..8dda9fe5 100644 --- a/docs/status/M13-04A.md +++ b/docs/status/M13-04A.md @@ -1,9 +1,9 @@ # M13-04A Status -status: done -task: server job one-shot directory -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: server job one-shot directory +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-04B.md b/docs/status/M13-04B.md index c4703d7b..789f3abc 100644 --- a/docs/status/M13-04B.md +++ b/docs/status/M13-04B.md @@ -1,9 +1,9 @@ # M13-04B Status -status: done -task: server source read-only and output isolation -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: server source read-only and output isolation +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-04C.md b/docs/status/M13-04C.md index 2b343f8a..9732a095 100644 --- a/docs/status/M13-04C.md +++ b/docs/status/M13-04C.md @@ -1,9 +1,9 @@ # M13-04C Status -status: done -task: server job resource budget gate -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: server job resource budget gate +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-04F.md b/docs/status/M13-04F.md index 932d5661..ed551ce0 100644 --- a/docs/status/M13-04F.md +++ b/docs/status/M13-04F.md @@ -1,9 +1,9 @@ # M13-04F Status -status: done -task: bounded and redacted server stdout/stderr -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: bounded and redacted server stdout/stderr +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-04G.md b/docs/status/M13-04G.md index 25acfa8f..edd9124d 100644 --- a/docs/status/M13-04G.md +++ b/docs/status/M13-04G.md @@ -1,9 +1,9 @@ # M13-04G Status -status: done -task: server process-tree cancellation -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: server process-tree cancellation +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-04H.md b/docs/status/M13-04H.md index 58d82694..8c095f4b 100644 --- a/docs/status/M13-04H.md +++ b/docs/status/M13-04H.md @@ -1,9 +1,9 @@ # M13-04H Status -status: done -task: stable server process fault codes -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: stable server process fault codes +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-04I.md b/docs/status/M13-04I.md index f32046b6..bf135e16 100644 --- a/docs/status/M13-04I.md +++ b/docs/status/M13-04I.md @@ -1,9 +1,9 @@ # M13-04I Status -status: done -task: server result hash binding and atomic OPFS handoff -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: server result hash binding and atomic OPFS handoff +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-04J.md b/docs/status/M13-04J.md index 0eee3a55..c3f669f8 100644 --- a/docs/status/M13-04J.md +++ b/docs/status/M13-04J.md @@ -1,9 +1,9 @@ # M13-04J Status -status: done -task: server request idempotency and conflict isolation -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: server request idempotency and conflict isolation +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-05A.md b/docs/status/M13-05A.md index 5688fb7d..1377c455 100644 --- a/docs/status/M13-05A.md +++ b/docs/status/M13-05A.md @@ -1,9 +1,9 @@ # M13-05A Status -status: done -task: CSP default-deny policy -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: CSP default-deny policy +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-05B.md b/docs/status/M13-05B.md index 77e16471..ca12cb93 100644 --- a/docs/status/M13-05B.md +++ b/docs/status/M13-05B.md @@ -1,9 +1,9 @@ # M13-05B Status -status: done -task: resource-specific CSP policy -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: resource-specific CSP policy +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-05C.md b/docs/status/M13-05C.md index c7ce0e35..d1b88b96 100644 --- a/docs/status/M13-05C.md +++ b/docs/status/M13-05C.md @@ -1,9 +1,9 @@ # M13-05C Status -status: done -task: production/build/test dependency inventories -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: production/build/test dependency inventories +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Evidence diff --git a/docs/status/M13-05D.md b/docs/status/M13-05D.md index f23dc8e4..ec2b844f 100644 --- a/docs/status/M13-05D.md +++ b/docs/status/M13-05D.md @@ -1,9 +1,9 @@ # M13-05D Status -status: done -task: dependency severity gates and exceptions -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: dependency severity gates and exceptions +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false The severity policy is machine-readable: BLOCKER/HIGH block, MEDIUM requires review and LOW is tracked. diff --git a/docs/status/M13-05E.md b/docs/status/M13-05E.md index 53bcf0e8..c178d757 100644 --- a/docs/status/M13-05E.md +++ b/docs/status/M13-05E.md @@ -1,9 +1,9 @@ # M13-05E Status -status: done -task: SBOM/license/source-offer and archive binding -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: SBOM/license/source-offer and archive binding +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false The supply-chain checker binds SPDX 2.3 to the lockfile and notices hashes, verifies the corresponding diff --git a/docs/status/M13-05F.md b/docs/status/M13-05F.md index 20baa3cb..ecc86bd3 100644 --- a/docs/status/M13-05F.md +++ b/docs/status/M13-05F.md @@ -1,9 +1,9 @@ # M13-05F Status -status: done -task: malicious input matrix -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: malicious input matrix +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false The production blend loader rejected five malformed blend cases. Existing production protocol tests diff --git a/docs/status/M13-05G.md b/docs/status/M13-05G.md index d5e866b9..3334e6cb 100644 --- a/docs/status/M13-05G.md +++ b/docs/status/M13-05G.md @@ -1,9 +1,9 @@ # M13-05G Status -status: done -task: fuzz crash minimization and regression capture -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: fuzz crash minimization and regression capture +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M13-05H.md b/docs/status/M13-05H.md index 42456120..5b1f921b 100644 --- a/docs/status/M13-05H.md +++ b/docs/status/M13-05H.md @@ -1,9 +1,9 @@ # M13-05H Status -status: done -task: script audit record integrity -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: script audit record integrity +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M14-01A.md b/docs/status/M14-01A.md index 6556707d..68a56a87 100644 --- a/docs/status/M14-01A.md +++ b/docs/status/M14-01A.md @@ -1,9 +1,9 @@ # M14-01A Status -status: done -task: Chromium, engine and archive identity freeze -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: Chromium, engine and archive identity freeze +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M14-01B.md b/docs/status/M14-01B.md index 60c6b0db..8c902a1e 100644 --- a/docs/status/M14-01B.md +++ b/docs/status/M14-01B.md @@ -1,9 +1,9 @@ # M14-01B Status -status: done -task: Firefox capability probe -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: Firefox capability probe +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false Firefox `153.0` was probed against the rebuilt production assets with COOP/COEP isolation. WASM, Worker, diff --git a/docs/status/M14-01C.md b/docs/status/M14-01C.md index 5d5dd113..ba37c80c 100644 --- a/docs/status/M14-01C.md +++ b/docs/status/M14-01C.md @@ -1,9 +1,9 @@ # M14-01C Status -status: done -task: WebKit capability probe -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: WebKit capability probe +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false WebKit `26.5` was probed against the rebuilt production assets with COOP/COEP isolation. WASM, Worker, diff --git a/docs/status/M14-01D.md b/docs/status/M14-01D.md index 927dc36c..5a04de93 100644 --- a/docs/status/M14-01D.md +++ b/docs/status/M14-01D.md @@ -1,9 +1,9 @@ # M14-01D Status -status: done -task: probe identity and GPU/OS adapter recording -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: probe identity and GPU/OS adapter recording +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M14-01E.md b/docs/status/M14-01E.md index 28272356..d8bf84dc 100644 --- a/docs/status/M14-01E.md +++ b/docs/status/M14-01E.md @@ -1,9 +1,9 @@ # M14-01E Status -status: done -task: Chromium WebGPU fail-closed boundary -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: Chromium WebGPU fail-closed boundary +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M14-04A.md b/docs/status/M14-04A.md index 88836ffd..c8c597ae 100644 --- a/docs/status/M14-04A.md +++ b/docs/status/M14-04A.md @@ -1,9 +1,9 @@ # M14-04A Status -status: done -task: Chromium GPU/memory budget device tier selection -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: Chromium GPU/memory budget device tier selection +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M14-04B.md b/docs/status/M14-04B.md index 1cc1d6b4..21b44ab6 100644 --- a/docs/status/M14-04B.md +++ b/docs/status/M14-04B.md @@ -1,9 +1,9 @@ # M14-04B Status -status: done -task: Chromium DPR 1/1.5/2/3 canvas and raycast consistency -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: Chromium DPR 1/1.5/2/3 canvas and raycast consistency +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M14-04C.md b/docs/status/M14-04C.md index de878619..d08df8d4 100644 --- a/docs/status/M14-04C.md +++ b/docs/status/M14-04C.md @@ -1,9 +1,9 @@ # M14-04C Status -status: done -task: Chromium mouse/touch/pen pointer identity and cancellation contract -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: Chromium mouse/touch/pen pointer identity and cancellation contract +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M14-04D.md b/docs/status/M14-04D.md index 17617dad..841c05a0 100644 --- a/docs/status/M14-04D.md +++ b/docs/status/M14-04D.md @@ -1,9 +1,9 @@ # M14-04D Status -status: done -task: Chromium IME composition guard for incomplete operators -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: Chromium IME composition guard for incomplete operators +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M14-04E.md b/docs/status/M14-04E.md index 200e3a0d..81362238 100644 --- a/docs/status/M14-04E.md +++ b/docs/status/M14-04E.md @@ -1,9 +1,9 @@ # M14-04E Status -status: done -task: Chromium US/non-US/dead-key/modifier keymap fixture -updated: 2026-08-19 America/New_York -enablingTask: false +status: done +task: Chromium US/non-US/dead-key/modifier keymap fixture +updated: 2026-08-19 America/New_York +enablingTask: false parityStateChange: false ## Scope diff --git a/docs/status/M14-04F.md b/docs/status/M14-04F.md new file mode 100644 index 00000000..333ffdc7 --- /dev/null +++ b/docs/status/M14-04F.md @@ -0,0 +1,43 @@ +# M14-04F Status + +status: done +task: Chromium touch modal cancel, two-finger navigation and pen single commit +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +`InputModalState` is now consumed by both production viewport backends. Touch cancellation clears +the modal without a Main commit, the transition to two active touch pointers increments +`navigationRevision` once, and a pen pointerup increments `mainCommitCount` once. Late pen up/cancel +events do not create another commit. The state is exposed through bounded `data-input-modal-*` +diagnostic attributes for Chromium evidence. + +## Evidence + +- `npm --prefix web run build` passed. +- `npm --prefix web run test:chromium-input-modal` passed: 3 protocol tests plus real Chromium + main-thread and OffscreenCanvas scenarios. +- Checker output: `chromium-input-modal-ok backends=main,offscreen touchCancel=0 twoFingerRevision=1 penCommit=1 execution=DISABLED next=M14-04G`. +- `npm --prefix web run typecheck`, `npm --prefix web run lint` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `b5fbb86d4a6a610b4aa25f8edb9a232aca9675e25fb47b16de98858a2d7f007f` +- checker: `4f813623d9845b73c1a05aeccaf88d8d3b13d48e5fd83c83fa6222e13324e854` +- protocol: `271e4f9e86a6aa4ebe92a43f6ce3d9b42b0931a5d12d9b40a8b4c26b2808cb23` +- unit: `f8105ebb59f3a369b15282a3923bdc47249f7a727794d3a89c29c1523f1aa989` +- main viewport: `e8d97cb59fd4eca3789aeeb35221a70cf47ef048a5665383d809d0efc49f7119` +- offscreen viewport: `4a210ae247d0e29972096da6c206f3457c2238e6061c6eb622f0ce55c6bfd439` +- report: `dc8c386a705c4cd7335eb5f7ea0ec9d61feaae8b9529fdab423ab00898ecf911` +- manifest: `895b460477a8379594ee93043139b9521952638dbd6670b0205eab1896886455` + +## Next Task + +`M14-04G`: Chromium responsive layout no-overlap/no-overflow matrix. + +## Rollback + +Remove the input-modal reducer integration, viewport diagnostics, tests, checker, report, manifest, +package command and this status/task entry; restore `M14-04E` as the queue tail. diff --git a/docs/status/M14-04G.md b/docs/status/M14-04G.md new file mode 100644 index 00000000..8d1c2971 --- /dev/null +++ b/docs/status/M14-04G.md @@ -0,0 +1,43 @@ +# M14-04G Status + +status: done +task: Chromium responsive layout no-overlap/no-overflow matrix +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +The Chromium layout gate now covers main-thread WebGL and OffscreenCanvas Worker viewports at +1440x900, 1280x720, 834x1112 and 390x844 with DPR 1 and 2. It checks root/body horizontal overflow, +layout-band containment, text overflow and app bounds. The mobile breakpoint moved to 900px so the +834px tablet layout hides the desktop menu before it can widen the document. + +## Evidence + +- `npm --prefix web run build` passed. +- `npm --prefix web run test:chromium-layout` passed: 16 real Chromium combinations (2 backends x + 2 DPR values x 4 viewports). +- Checker output: `chromium-layout-ok backends=main,offscreen viewports=4 dpr=1,2 results=16 execution=DISABLED next=M14-04H`. +- `npm --prefix web run typecheck` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `895b460477a8379594ee93043139b9521952638dbd6670b0205eab1896886455` +- checker: `b211b703309e22810c39f85e4801bc5f0690fa682e33cdcb85157bd28ea042c0` +- app: `92d01daecf3f39bc4ac214e4b651ec6feb687bbfbf58c4d3e602a314cdcc664c` +- CSS: `5961164f29e25b461c03201534fe56e32020633cac6c0970e149a58ba9f6e9fc` +- main viewport: `e8d97cb59fd4eca3789aeeb35221a70cf47ef048a5665383d809d0efc49f7119` +- offscreen viewport: `4a210ae247d0e29972096da6c206f3457c2238e6061c6eb622f0ce55c6bfd439` +- reference e2e: `f5de57f570880f823224ebdcddb2be4d59ec414a32641effdaa68dc1f4102f28` +- report: `65b1050217e2343e656d56c4d7893d13f36b5f07008288ea194a101dafbaa0e2` +- manifest: `a5a80cedd824cc4aac27bd2cec39e11560d4cf3207ab947a1abe19c8bb9e053f` + +## Next Task + +`M14-04H`: Chromium keyboard-only, accessible names/roles and focus restoration. + +## Rollback + +Remove the 900px breakpoint change, layout checker, report, manifest, package command and this status/task +entry; restore `M14-04F` as the queue tail. diff --git a/docs/status/M14-04H.md b/docs/status/M14-04H.md new file mode 100644 index 00000000..5709d041 --- /dev/null +++ b/docs/status/M14-04H.md @@ -0,0 +1,40 @@ +# M14-04H Status + +status: done +task: Chromium keyboard-only, accessible names/roles and focus restoration +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +The Chromium keyboard gate runs real main-thread and OffscreenCanvas pages. Tab reaches the File +menu, Enter opens it with menuitem focus, Escape restores the trigger, and F3 opens Operator Search +with Escape restoring its trigger. The checker also scans visible interactive elements for an +accessible name and records the count per backend. + +## Evidence + +- `npm --prefix web run build` passed. +- `npm --prefix web run test:chromium-accessibility` passed for both production backends. +- Checker output: `chromium-accessibility-ok backends=main,offscreen menuFocus=RESTORED operatorSearchFocus=RESTORED names=COMPLETE execution=DISABLED next=M15-01A`. +- `npm --prefix web run typecheck` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `a5a80cedd824cc4aac27bd2cec39e11560d4cf3207ab947a1abe19c8bb9e053f` +- checker: `b39cdef61007e5ac1f2e7686ccdffd42f6b9723b2e93a7bd63e46800c4453ced` +- app: `5861988f3dfbb8c05d36aee3033a72514de53a0cb4ec6f3d832418ef6b5cc8b2` +- CSS: `5961164f29e25b461c03201534fe56e32020633cac6c0970e149a58ba9f6e9fc` +- reference e2e: `e74a53a1f9e9bfea73be8da1de486938d0dcc4718e7585b57bee27a5ce78a978` +- report: `508adab3c6ced83c95bcced36d610c20f2f2fd456637cb79568b4b824d66ead9` +- manifest: `2c4e4323250f3426f610babb42978ba36c48e471729b20b0ce8f3483eb6f899c` + +## Next Task + +`M15-01A`: generate a Blender 5.2 RNA data-block type inventory. + +## Rollback + +Remove the accessibility checker, accessible-name fix, report, manifest, package command and this +status/task entry; restore `M14-04G` as the queue tail. diff --git a/docs/status/M15-01A.md b/docs/status/M15-01A.md new file mode 100644 index 00000000..fbbc885f --- /dev/null +++ b/docs/status/M15-01A.md @@ -0,0 +1,38 @@ +# M15-01A Status + +status: done +task: Blender 5.2 RNA data-block type inventory +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +The pinned Blender 5.2 runtime generated a deterministic RNA inventory from the registered subclasses +of `bpy.types.ID`. The inventory contains 29 unique sorted data-block types, stable parity IDs, the +RNA source anchor and the runtime binary identity. No V1 release or parity status axis changed. + +## Evidence + +- `npm --prefix web run test:blender-rna-inventory` passed after regenerating in a fresh temporary + directory with `build_blender_5.2.0/bin/blender`. +- Checker output: `blender-rna-datablock-inventory-ok count=29 blender=5.2.0 LTS inventory=98e6c2ebc9f62647b43fb06eff178bef02db06516f6ac87048ae81fcf2d8e792 next=M15-01B`. +- `npm --prefix web run typecheck` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `2c4e4323250f3426f610babb42978ba36c48e471729b20b0ce8f3483eb6f899c` +- generator: `2e61a1a8a2e5347d3ee0f8efa5bad74e9823de6e7b0959f505e73c9d96e7037b` +- checker: `43b72286964fcfa1f6beebec786c4f96cf12d5d33c6227754e5b98e2dda668ab` +- inventory: `98e6c2ebc9f62647b43fb06eff178bef02db06516f6ac87048ae81fcf2d8e792` +- runtime binary: `d4483926610484ef9c2ad9241aae1469f934d955ebe791f1920e263e0ba85b82` +- manifest: `21f444610edae75b23a26ef9b94892f07fb056344fbd5e92e232c376454d76cd` + +## Next Task + +`M15-01B`: Blender 5.2 operator idname, poll context and property inventory. + +## Rollback + +Remove the RNA generator, checker, inventory, report, manifest, package command and this status/task +entry; restore `M14-04H` as the queue tail. diff --git a/docs/status/M15-01B.md b/docs/status/M15-01B.md new file mode 100644 index 00000000..2b9700e8 --- /dev/null +++ b/docs/status/M15-01B.md @@ -0,0 +1,40 @@ +# M15-01B Status + +status: done +task: Blender 5.2 operator idname/poll/property inventory +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +The pinned Blender 5.2 runtime generated a deterministic inventory of all registered `bpy.ops` +operators. Each entry records the operator idname, RNA identifier, factory-startup poll result/error, +and sorted RNA property identifiers/types. This is a machine baseline only; it does not claim that +any operator is supported by the web editor. + +## Evidence + +- `npm --prefix web run test:blender-operator-inventory` passed after temporary regeneration. +- Checker output: `blender-operator-inventory-ok count=2486 registered=2486 pollUnknown=0 inventory=dabb774ea808f417a0085528ecc4538bc78f71d06f912a881a9453804597e49a next=M15-01C`. +- Poll distribution: 666 true, 1,820 false, 0 unknown. +- `npm --prefix web run typecheck` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `21f444610edae75b23a26ef9b94892f07fb056344fbd5e92e232c376454d76cd` +- generator: `5928c2df2074d7b530c173baffc4da2bb0bbb50817ab8b2cdb5f6d43e07b1727` +- checker: `dbf4b64c77750809060e6b3a8eaf87cfd67a904f33949ac631b661153b1f6cde` +- inventory: `dabb774ea808f417a0085528ecc4538bc78f71d06f912a881a9453804597e49a` +- report: `800102c010be59ec519d2e204aec4a97350fe7ba0f6729f52a8788f4a9bcde31` +- manifest: `54dec9d2e7a0eacf3b17a06168b0c9c73a1358d0545cbf70d8a8579a9ed6fde5` +- runtime binary: `d4483926610484ef9c2ad9241aae1469f934d955ebe791f1920e263e0ba85b82` + +## Next Task + +`M15-01C`: modifier, constraint, Shader Node, Geometry Node and Compositor Node inventory. + +## Rollback + +Remove the operator generator, checker, inventory, report, manifest, package command and this status +page together. Restore `M15-01A` as the queue tail without changing the data-block inventory. diff --git a/docs/status/M15-01C.md b/docs/status/M15-01C.md new file mode 100644 index 00000000..b15bdc76 --- /dev/null +++ b/docs/status/M15-01C.md @@ -0,0 +1,40 @@ +# M15-01C Status + +status: done +task: Blender 5.2 modifier, constraint and node inventory +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +The pinned Blender 5.2 runtime generated deterministic inventories for the 83 modifier types, +29 constraint types, and 451 registered Shader, Geometry, and Compositor node types. Node entries +include RNA properties sorted by identifier. The inventory is a machine baseline only and does not +claim web parity for any family. + +## Evidence + +- `npm --prefix web run test:blender-family-inventory` passed after temporary regeneration. +- Checker output: `blender-family-inventory-ok modifiers=83 constraints=29 nodes=451 inventory=bb7bbbf64184f326cd17933960800d7d761db6dd3b5f829e322e5ccdb12b8845 next=M15-01D`. +- Node family distribution: Shader 99, Geometry 264, Compositor 88. +- `npm --prefix web run typecheck` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `54dec9d2e7a0eacf3b17a06168b0c9c73a1358d0545cbf70d8a8579a9ed6fde5` +- generator: `2630357cbe6ca7264499621399f1a010d6eb7af8c002283d9d16e65c23955eda` +- checker: `0cf9821bb0f6f691ee1eb5a96d77a78932eeb07565352e65a5ed68844f7c0108` +- inventory: `bb7bbbf64184f326cd17933960800d7d761db6dd3b5f829e322e5ccdb12b8845` +- report: `0ca03907f828feba02df396d3fb9f0cfab791a5be67bd8d768c175a49088bae1` +- manifest: `ae6acf4fa173803fcbd9b4c3cff0a561563e7ddb7abf6985844397d14c8f45dc` +- runtime binary: `d4483926610484ef9c2ad9241aae1469f934d955ebe791f1920e263e0ba85b82` + +## Next Task + +`M15-01D`: sequencer strip/effect, physics family, and import/export inventory. + +## Rollback + +Remove the family generator, checker, inventory, report, manifest, package command and this status +page together. Restore `M15-01B` as the queue tail without changing the operator inventory. diff --git a/docs/status/M15-01D.md b/docs/status/M15-01D.md new file mode 100644 index 00000000..4bc85fd9 --- /dev/null +++ b/docs/status/M15-01D.md @@ -0,0 +1,39 @@ +# M15-01D Status + +status: done +task: Blender 5.2 sequencer, physics and import/export inventory +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +The pinned Blender 5.2 runtime generated deterministic inventories for 24 sequencer strip/effect +types, 65 registered physics RNA data types, and 33 import/export operators. Operator entries retain +poll state and sorted RNA properties. This is a machine baseline only; it does not claim web parity +for sequencer, physics, or file formats. + +## Evidence + +- `npm --prefix web run test:blender-format-inventory` passed after temporary regeneration. +- Checker output: `blender-format-inventory-ok strips=24 physics=65 io=33 inventory=d3892fc6126f2e477db8b7bcb2bc5ac7a77db1049f0165350ccc834d3a151394 next=M15-01E`. +- `npm --prefix web run typecheck` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `ae6acf4fa173803fcbd9b4c3cff0a561563e7ddb7abf6985844397d14c8f45dc` +- generator: `618ceb016bf7ab4251d1c8575bd091ea96aecdd423c1d69eea1082b13a734804` +- checker: `3c22b24561a77058115e6ae1a58af7f0aaea782fab9416e2ce15221c4b91f8e4` +- inventory: `d3892fc6126f2e477db8b7bcb2bc5ac7a77db1049f0165350ccc834d3a151394` +- report: `e345452bda9fa1c054974a34895027c080cf055ced2f24330189edbf9c0d5a5d` +- manifest: `7e67b065ac9ed8522eac3c4aa185487c6af1892619864f3760bd4efa860ab278` +- runtime binary: `d4483926610484ef9c2ad9241aae1469f934d955ebe791f1920e263e0ba85b82` + +## Next Task + +`M15-01E`: editor, space, region, workspace and keymap inventory. + +## Rollback + +Remove the format generator, checker, inventory, report, manifest, package command and this status +page together. Restore `M15-01C` as the queue tail without changing the family inventory. diff --git a/docs/status/M15-01E.md b/docs/status/M15-01E.md new file mode 100644 index 00000000..a580c896 --- /dev/null +++ b/docs/status/M15-01E.md @@ -0,0 +1,39 @@ +# M15-01E Status + +status: done +task: Blender 5.2 editor, space, region, workspace and keymap inventory +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +The pinned Blender 5.2 runtime generated deterministic editor inventories for 19 Area types, 17 +Region types, 19 Space types, 16 concrete Space RNA classes, and 13 Workspace modes. The initialized +factory keyconfig contributes 280 keymaps and 3,228 keymap items, including modal event items with +empty operator ids. This is a machine baseline only and does not claim editor or keymap parity. + +## Evidence + +- `npm --prefix web run test:blender-editor-inventory` passed after temporary regeneration. +- Checker output: `blender-editor-inventory-ok areas=19 regions=17 keymaps=280 items=3228 inventory=6293b5c5bc23c8a73fdde553a5173ac1da25a08c8158af5ec81f4b0f864a5064 next=M15-01F`. +- `npm --prefix web run typecheck` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `7e67b065ac9ed8522eac3c4aa185487c6af1892619864f3760bd4efa860ab278` +- generator: `287c04d7d11068fc28c8aac3a70f12dc6a0631a894c88e4e8d28752e54214274` +- checker: `dd4fe1c82ed6f6d9eff9bb1abd017a1066ec7d95f76867d33a4e76112ed7b754` +- inventory: `6293b5c5bc23c8a73fdde553a5173ac1da25a08c8158af5ec81f4b0f864a5064` +- report: `cc88dd114f215100e28cefc9180e56204bd7694217047e5c6db1e79059966235` +- manifest: `c7e5e5d96c1c36072cbba9de6d30a3c99b03ef341fa376152d961896102e341b` +- runtime binary: `d4483926610484ef9c2ad9241aae1469f934d955ebe791f1920e263e0ba85b82` + +## Next Task + +`M15-01F`: same-level inventory for Main, Scene, Mesh, Depsgraph and existing V1 core slices. + +## Rollback + +Remove the editor generator, checker, inventory, report, manifest, package command and this status +page together. Restore `M15-01D` as the queue tail without changing the format inventory. diff --git a/docs/status/M15-01F.md b/docs/status/M15-01F.md new file mode 100644 index 00000000..929e44b1 --- /dev/null +++ b/docs/status/M15-01F.md @@ -0,0 +1,39 @@ +# M15-01F Status + +status: done +task: Blender 5.2 Main/Scene/Mesh/Depsgraph/core inventory +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +The pinned Blender 5.2 runtime generated a same-level RNA inventory of 108 core classes: Main 39, +Scene 16, Mesh 30, Depsgraph 3, and the existing V1 core slice 20. Each class includes sorted RNA +property metadata. This is a machine inventory and explicitly does not map current web coverage to +full Blender parity. + +## Evidence + +- `npm --prefix web run test:blender-core-inventory` passed after temporary regeneration. +- Checker output: `blender-core-inventory-ok classes=108 main=39 scene=16 mesh=30 depsgraph=3 core=20 inventory=4810abd2f91e580da3f7be70f1583f5cf6b2ecc20a13f0ce09b7484c4393e643 next=M15-02A`. +- `npm --prefix web run typecheck` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `c7e5e5d96c1c36072cbba9de6d30a3c99b03ef341fa376152d961896102e341b` +- generator: `64e6c3590b084ec8906e26f46cab1596211c197251e0c7a81de2f5edbc6dcd43` +- checker: `ca13efc97cd4709b103268be95f6fe9fa824f64a04f51ab678c78158c44979d7` +- inventory: `4810abd2f91e580da3f7be70f1583f5cf6b2ecc20a13f0ce09b7484c4393e643` +- report: `8752644f8956c747c8da14afcd04f73e0a5823713ba98ee08c21cf240ff1f140` +- manifest: `d49a6196cc5f35907e450b2c547be31962ae759a7db3c473586f9d8254f7878f` +- runtime binary: `d4483926610484ef9c2ad9241aae1469f934d955ebe791f1920e263e0ba85b82` + +## Next Task + +`M15-02A`: map each inventoried item to owner family, implementation class, tests and evidence. + +## Rollback + +Remove the core generator, checker, inventory, report, manifest, package command and this status page +together. Restore `M15-01E` as the queue tail without changing the editor inventory. diff --git a/docs/status/M15-02A.md b/docs/status/M15-02A.md new file mode 100644 index 00000000..79238e2f --- /dev/null +++ b/docs/status/M15-02A.md @@ -0,0 +1,37 @@ +# M15-02A Status + +status: done +task: Map inventory entries to owner, implementation class, tests and evidence +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +All 6,900 entries from M15-01A through M15-01F now have unique stable IDs and mappings to one of 20 +owner families, an `INVENTORY_BASELINE` implementation class, the source checker, and the source +manifest. Coverage remains `INVENTORIED_ONLY`; the map does not claim functional implementation. + +## Evidence + +- `npm --prefix web run test:blender-parity-map` passed deterministic regeneration and artifact checks. +- Checker output: `blender-parity-map-ok mapped=6900 families=20 map=f3e757f26e58a4252b6cc2a7f9275428bbe5bf659cc0f0ff6350a147bdf2809c next=M15-02B`. +- `npm --prefix web run typecheck` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `d49a6196cc5f35907e450b2c547be31962ae759a7db3c473586f9d8254f7878f` +- generator: `2430a0eaa408ebba2fe25a1e873989784f8c50fe6dccc6636a07a76e986eb4ca` +- checker: `b5f33d8535c0d72c53979f3a222b0004a48d265706adf5c1f9cad6907c80d092` +- map: `f3e757f26e58a4252b6cc2a7f9275428bbe5bf659cc0f0ff6350a147bdf2809c` +- report: `650a1c37e459bbaf19f20fa7f2be57bcb2ea8dd6ed472726a9ff399d17109132` +- manifest: `9f9e954bd3f00fbc2b18802ed8c7cfce469de8cd0f6bc23e49fa2a89ecb0dcc4` + +## Next Task + +`M15-02B`: detect unmapped, duplicate, summary-only, proxy-only and route-only entries. + +## Rollback + +Remove the map generator, checker, map, report, manifest, package command and this status page. +Restore `M15-01F` as the queue tail without modifying source inventories. diff --git a/docs/status/M15-02B.md b/docs/status/M15-02B.md new file mode 100644 index 00000000..ee3a809e --- /dev/null +++ b/docs/status/M15-02B.md @@ -0,0 +1,37 @@ +# M15-02B Status + +status: done +task: Parity map gap classification audit +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +## Scope + +The map audit checked all 6,900 M15 inventory mappings for missing owner/implementation/test/evidence +bindings and duplicate IDs. It classified every `INVENTORY_BASELINE` entry as `summaryOnly`, while +unmapped, duplicate, proxy-only and route-only counts remain zero. No parity claim was promoted. + +## Evidence + +- `npm --prefix web run test:blender-gap-audit` passed deterministic regeneration and artifact checks. +- Checker output: `blender-gap-audit-ok inventoried=6900 gaps=6900 summaryOnly=6900 next=M15-02C`. +- `npm --prefix web run typecheck` and `git diff --check` passed. + +## Artifact Hashes + +- parent manifest: `9f9e954bd3f00fbc2b18802ed8c7cfce469de8cd0f6bc23e49fa2a89ecb0dcc4` +- generator: `f0f44767cd6e2ce8aab4eed391b7e11fe1ff566cd52b80632c02085af0ec0f35` +- checker: `ebab966ef3edfd5e093d742950352e5f05b7cf04d82ba817812d7afcedccfe98` +- audit: `e976ff40d2f3491a5a57ffcdd0d0c0f0586e57d06984e4a4aa05ba1b36800faa` +- report: `445fe3426a42579334707000e87eaff29bd895d888faf4fab30f1f4bb2666269` +- manifest: `987c780c60cfaa71a728c675ce2c88688b75cb910528c933f84c38fee1360565` + +## Next Task + +`M15-02C`: fail-closed audit for `LOCAL_EXACT` desktop/WASM same-fixture evidence. + +## Rollback + +Remove the gap audit generator, checker, audit, report, manifest, package command and this status +page. Restore `M15-02A` as the queue tail without modifying the parity map. diff --git a/docs/status/M15-02C.md b/docs/status/M15-02C.md new file mode 100644 index 00000000..24b7f303 --- /dev/null +++ b/docs/status/M15-02C.md @@ -0,0 +1,16 @@ +# M15-02C Status + +status: done +task: LOCAL_EXACT fail-closed evidence audit +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +`npm --prefix web run test:blender-local-exact-audit` passed: applicable 0, blocked 0, notApplicable +6,900. No inventory entry was promoted without desktop/WASM same-fixture evidence. + +Artifacts: audit `ab37f60ff9ea4ad99d0f6041de707d92010de81f22a1594dd6dfa4faf6c471cb`, report +`0e5ffaf4fa99e0e58f19fe21ae0d2c7fb465ab487fe84924cda06085a9c6f839`, manifest +`3ecd9906fc18ea695bbf8ffbfb9516a3e4f5b6dae204ca2afcb9a2c47dc6aa2a`. + +Next: `M15-02D`. diff --git a/docs/status/M15-02D.md b/docs/status/M15-02D.md new file mode 100644 index 00000000..acfdbd78 --- /dev/null +++ b/docs/status/M15-02D.md @@ -0,0 +1,16 @@ +# M15-02D Status + +status: done +task: LOCAL_EQUIVALENT fail-closed evidence audit +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +`npm --prefix web run test:blender-local-equivalent-audit` passed: applicable 0, blocked 0, notApplicable +6,900. No Main/save-reopen parity claim exists in the inventory-only map. + +Artifacts: audit `6ffe0a7f076720b120a7b6a3f9bed3b5d4afbba583388df6ac7fb94df64998a2`, report +`8864c360bcdb7c0a191e17ee209a42d762ab980c643e9fecc409d34453c05a9e`, manifest +`f9c2a530dc86563d3c5da71dd28ec6a8009a3549112226ee2cc68d8f49e3c8d0`. + +Next: `M15-02E`. diff --git a/docs/status/M15-02E.md b/docs/status/M15-02E.md new file mode 100644 index 00000000..c39179b8 --- /dev/null +++ b/docs/status/M15-02E.md @@ -0,0 +1,16 @@ +# M15-02E Status + +status: done +task: SERVER_EXACT fail-closed evidence audit +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +`npm --prefix web run test:blender-server-exact-audit` passed: applicable 0, blocked 0, notApplicable +6,900. No server job/cancel/isolation/result-binding claim exists in the inventory-only map. + +Artifacts: audit `2e77b526a90638160ba176bddb84d1028195a588f465475b3a5616854d90368e`, report +`0f641bdf72ad4c97882b0ece84384702f9b83fc23c5b7aca8b555d5fd5206c6c`, manifest +`95110d84f47865412d6d42f618c4bb2f05240bd456109bf72953cc0a888e1382`. + +Next: `M15-02F`. diff --git a/docs/status/M15-02F.md b/docs/status/M15-02F.md new file mode 100644 index 00000000..f5690a05 --- /dev/null +++ b/docs/status/M15-02F.md @@ -0,0 +1,16 @@ +# M15-02F Status + +status: done +task: Unknown-data preservation fail-closed audit +updated: 2026-08-19 America/New_York +enablingTask: false +parityStateChange: false + +`npm --prefix web run test:blender-unknown-data-audit` passed: applicable 0, blocked 0, notApplicable +6,900. No unknown-data save/reload preservation claim exists in the inventory-only map. + +Artifacts: audit `bec8d2444ceaeae3db9d35ce6621129c90df2f15bf950667be6e85b096a72e4f`, report +`e2733f49fa9bd755164519ca9dd46a99b1f41036b8ae4bdb0552487dcec4ab7a`, manifest +`ec3fa17832e5fe335b11bd6c12e873abfd4b19273d8e110de860f04b55e7a7e6`. + +Next: `M15-03A`. diff --git a/docs/status/M15-03A.md b/docs/status/M15-03A.md new file mode 100644 index 00000000..57ff1354 --- /dev/null +++ b/docs/status/M15-03A.md @@ -0,0 +1,17 @@ +# M15-03A Status + +status: done +task: One minimal nextTask per gap +updated: 2026-08-19 America/New_York + +Generated 6,900 unique tasks from the gap audit. The current plan has ten completed tasks, one active +pointer (`M16-GAP-00011`) and 6,889 pending tasks. Per-wave counts are M16 2,667, M17 29, M18 451, +M19 20, M20 89, M21 3,625, M22 19. +`npm --prefix web run test:blender-next-task-plan` passed; plan SHA-256 is +`7c4bf7e384da489d0989d6634576373d961b28f8f64f7dabc649daef198fb2a5`. + +为避免执行者加载 6.8 MiB 的 pretty JSON,已生成 `tests/golden/M15-03A/task-index.json` 和 +`task-catalog.jsonl`。索引绑定上述 plan SHA-256,catalog 每行只保留任务身份字段;上下文工具按 +offset 读取单条记录并由任务卡提供真实命令。索引校验:`node tools/web/check-task-index.mjs`。 + +Next: `M15-03B`. diff --git a/docs/status/M15-03B.md b/docs/status/M15-03B.md new file mode 100644 index 00000000..531c6dd7 --- /dev/null +++ b/docs/status/M15-03B.md @@ -0,0 +1,11 @@ +# M15-03B Status + +status: done +task: nextTask specification audit +updated: 2026-08-19 America/New_York + +All 6,900 tasks contain fixture, desktop command, Web command, comparator and exit criteria; missing +and malformed counts are zero. `npm --prefix web run test:blender-next-task-spec` passed. Report SHA-256: +`1ec2155f7bd4b35811d08dc2d66907f3bb3d2f917f69845cb6d3d3073f6a4417`. + +Next: `M15-03C`. diff --git a/docs/status/M15-03C.md b/docs/status/M15-03C.md new file mode 100644 index 00000000..a4dca48f --- /dev/null +++ b/docs/status/M15-03C.md @@ -0,0 +1,11 @@ +# M15-03C Status + +status: done +task: nextTask dependency graph +updated: 2026-08-19 America/New_York + +The graph has 6,900 nodes, one active task, zero missing dependencies and zero cycles. `npm +--prefix web run test:blender-task-graph` passed. Report SHA-256: +`1d00d33f9780a35110fd200503c4f5b27b7b0b32d076ee8e681465efb70c4c0a`. + +Next: `M15-03D`. diff --git a/docs/status/M15-03D.md b/docs/status/M15-03D.md new file mode 100644 index 00000000..81b7df30 --- /dev/null +++ b/docs/status/M15-03D.md @@ -0,0 +1,11 @@ +# M15-03D Status + +status: done +task: inventoried/completed/blocked/uninventoried statistics +updated: 2026-08-19 America/New_York + +Machine counts are inventoried=6,900, completed=10, blocked=0, uninventoried=0. `npm --prefix web run +test:blender-task-stats` passed. Report SHA-256: +`fbf3e68a8cb40a309d0ca931ab77dc30b8e743ce90e83ab93e8ec2f1013662cf`. + +Next: `M15-03E`. diff --git a/docs/status/M15-03E.md b/docs/status/M15-03E.md new file mode 100644 index 00000000..c4d2a2e8 --- /dev/null +++ b/docs/status/M15-03E.md @@ -0,0 +1,12 @@ +# M15-03E Status + +status: blocked +task: owner family zero-gap closure gate +updated: 2026-08-19 America/New_York + +The fail-closed closure gate reports `BLOCKED`: 20 owner families still have 6,890 remaining tasks. +It preserves the single active pointer `M16-GAP-00011` and does not infer completion from release or +inventory evidence. `npm --prefix web run test:blender-zero-gap-gate` passed the blocked-state contract. +Report SHA-256: `381ea77d9b884b1bdab58bb60df001a26287db80dd9380edb6ae4d64a0a3d969`. + +Next active task: `M16-GAP-00011`. diff --git a/docs/status/M16-GAP-00001.md b/docs/status/M16-GAP-00001.md new file mode 100644 index 00000000..0e4e4fa6 --- /dev/null +++ b/docs/status/M16-GAP-00001.md @@ -0,0 +1,16 @@ +# M16-GAP-00001 Status + +status: done +task: Action data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York +enablingTask: true +parityStateChange: true + +The generated Action fixture was read by Blender 5.2 desktop and the full-Main WASM. Both observed +`action:AnimatedObjectAction:object:AnimatedObject` with three location channels and two keyframes per +channel. Desktop and WASM save/reopen checks were exact; the active pointer advanced to `M16-GAP-00002`. + +Evidence: `npm --prefix web run test:generated-gap -- --task M16-GAP-00001` passed with +`desktop=exact saveReopen=exact`. + +Next task: `M16-GAP-00002` (Armature data-block). diff --git a/docs/status/M16-GAP-00002.md b/docs/status/M16-GAP-00002.md new file mode 100644 index 00000000..cea7000d --- /dev/null +++ b/docs/status/M16-GAP-00002.md @@ -0,0 +1,16 @@ +# M16-GAP-00002 Status + +status: done +task: Armature data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York +enablingTask: true +parityStateChange: true + +The generated Armature fixture was read by Blender 5.2 desktop and full-Main WASM. Both observed +`armature:RiggedArmature` with Root and Tip bones, Tip parented to Root, and mesh skin-weight linkage. +Desktop and WASM save/reopen checks were exact. The active pointer advanced to `M16-GAP-00003`. + +Evidence: `npm --prefix web run test:generated-gap -- --task M16-GAP-00002` passed with +`bones=2 desktop=exact saveReopen=exact`. + +Next task: `M16-GAP-00003` (Brush data-block). diff --git a/docs/status/M16-GAP-00003.md b/docs/status/M16-GAP-00003.md new file mode 100644 index 00000000..03d6dc3a --- /dev/null +++ b/docs/status/M16-GAP-00003.md @@ -0,0 +1,16 @@ +# M16-GAP-00003 Status + +status: done +task: Brush data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York +enablingTask: true +parityStateChange: true + +Added bounded `BrushIR` fields to the native Main reader and optional SceneIR parser field. A real +Blender 5.2 Brush fixture reports `WebGapBrush` size 42, alpha 0.65, hardness 0.8, spacing 17 and +jitter 0.2. Full-Main WASM and desktop match exactly, including save/reopen. + +Evidence: `npm --prefix web run test:generated-gap -- --task M16-GAP-00003` passed with +`brush=brush:WebGapBrush size=42 desktop=exact saveReopen=exact`. + +Next task: `M16-GAP-00004` (Camera data-block). diff --git a/docs/status/M16-GAP-00004.md b/docs/status/M16-GAP-00004.md new file mode 100644 index 00000000..0925a1b0 --- /dev/null +++ b/docs/status/M16-GAP-00004.md @@ -0,0 +1,10 @@ +# M16-GAP-00004 Status + +status: done +task: Camera data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +Blender desktop and full-Main WASM read the same `camera:WebGapCamera` fixture with perspective +projection, 52 mm lens, 0.1 near plane and 2500 far plane. Save/reopen was exact on both paths. + +Next task: `M16-GAP-00005` (Collection data-block). diff --git a/docs/status/M16-GAP-00005.md b/docs/status/M16-GAP-00005.md new file mode 100644 index 00000000..eb0200c0 --- /dev/null +++ b/docs/status/M16-GAP-00005.md @@ -0,0 +1,8 @@ +# M16-GAP-00005 Status + +status: done +task: Collection data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +Desktop and WASM read nested `WebGapCollection` -> `WebGapChild` hierarchy with the collection object +link intact. Save/reopen matched exactly. Next task: `M16-GAP-00006` (Curve data-block). diff --git a/docs/status/M16-GAP-00006.md b/docs/status/M16-GAP-00006.md new file mode 100644 index 00000000..34693baa --- /dev/null +++ b/docs/status/M16-GAP-00006.md @@ -0,0 +1,10 @@ +# M16-GAP-00006 Status + +status: done +task: Curve data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +Desktop and full-Main WASM read the same Bezier Curve fixture: one spline, three points, available +geometry and exact spline offsets. Save/reopen matched the complete non-mesh data record. + +Next task: `M16-GAP-00007` (Curves data-block). diff --git a/docs/status/M16-GAP-00007.md b/docs/status/M16-GAP-00007.md new file mode 100644 index 00000000..24adf11c --- /dev/null +++ b/docs/status/M16-GAP-00007.md @@ -0,0 +1,10 @@ +# M16-GAP-00007 Status + +status: done +task: Curves data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +Desktop and full-Main WASM read the converted Curves data-block with available geometry, four points +and at least one spline. Save/reopen matched the complete nonMeshData record. + +Next task: `M16-GAP-00008` (FreestyleLineStyle data-block). diff --git a/docs/status/M16-GAP-00008.md b/docs/status/M16-GAP-00008.md new file mode 100644 index 00000000..322f701d --- /dev/null +++ b/docs/status/M16-GAP-00008.md @@ -0,0 +1,11 @@ +# M16-GAP-00008 Status + +status: done +task: FreestyleLineStyle data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +Added bounded optional `lineStyles` SceneIR data with name, color, alpha, thickness, chaining/caps, +dashed state and modifier counts. Desktop and full-Main WASM matched the real style fixture and save/ +reopen was exact. This does not claim Freestyle stroke rendering parity. + +Next task: `M16-GAP-00009` (GreasePencil data-block). diff --git a/docs/status/M16-GAP-00009.md b/docs/status/M16-GAP-00009.md new file mode 100644 index 00000000..c33cc7a8 --- /dev/null +++ b/docs/status/M16-GAP-00009.md @@ -0,0 +1,10 @@ +# M16-GAP-00009 Status + +status: done +task: GreasePencil data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +Reused the existing real Grease Pencil Main fixture. Blender desktop and full-Main WASM both observed +GreasePencilData layers/frames, and save/reopen matched exactly. + +Next task: `M16-GAP-00010` (Lattice data-block). diff --git a/docs/status/M16-GAP-00010.md b/docs/status/M16-GAP-00010.md new file mode 100644 index 00000000..70ffdf76 --- /dev/null +++ b/docs/status/M16-GAP-00010.md @@ -0,0 +1,23 @@ +# M16-GAP-00010 Status + +status: done +task: Lattice data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 Lattice data-block dimensions, interpolation, outside flag, vertex group, point deformation, weight and selection. + +evidence: + +- Desktop fixture generated by `tools/web/generated/M16-GAP-00010.py`; Blender 5.2 opened, saved to a fresh file, reopened in a new process and matched exactly. +- WASM/Main opened the same fixture, produced 3x2x2 / 12-point `lattice:WebGapLattice`, and matched the desktop point report exactly. +- WASM save/reopen snapshot matched the pre-save snapshot exactly. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00010` exited 0. +- `cmake --build build_web_blender6 --target web_engine -- -j2` exited 0 after `source tools/web/emscripten-env.sh`; generated runtime assets were installed and hash-bound. + +artifacts: `tests/golden/M16-GAP-00010/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop checker, Web checker, reader, protocol, WASM/JS runtime and both reports. + +knownRisk: This closes one `datablock:Lattice` slice only. Lattice edit operators, lattice modifier evaluation, shape keys, vertex-group weights and all other 6,890 generated gaps remain separate tasks and are not implied complete. + +rollback: remove this task's fixture, checker, reports, manifest and runtime/protocol changes; restore parent `M16-GAP-00009` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00011` diff --git a/docs/status/M16-GAP-00011.md b/docs/status/M16-GAP-00011.md new file mode 100644 index 00000000..d062e46c --- /dev/null +++ b/docs/status/M16-GAP-00011.md @@ -0,0 +1,25 @@ +# M16-GAP-00011 Status + +status: done +task: Library data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 Library metadata for one linked, project-relative source: stable id/name/path, packed state, external-required status, dependency list and read-only contract. + +evidence: + +- `tools/web/generated/M16-GAP-00011.py` generated a real linked-Library fixture from `WebGapLibrary.blend`; the target reopens in Blender desktop. +- Desktop report matched one `library:WebGapLibrary.blend` with `sourcePath=//WebGapLibrary.blend`, unpacked external-required state, empty dependencies and read-only=true after save/reopen. +- WASM/Main opened the same target fixture and matched the desktop identity and path. WASM save/reopen matched the complete `libraries` snapshot exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00011.py -- tests/files/web/generated/M16-GAP-00011-datablock-Library.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00011` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00011` exited 0. + +artifacts: `tests/golden/M16-GAP-00011/manifest.json` contains SHA-256 for the parent manifest, target fixture, source library, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes one `datablock:Library` metadata slice only. Library link/append/override operations, archive management, packing/unpacking and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, source library, checker, reports, manifest, status and context; restore `M16-GAP-00010` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00012` diff --git a/docs/status/M16-GAP-00012.md b/docs/status/M16-GAP-00012.md new file mode 100644 index 00000000..1f534a1c --- /dev/null +++ b/docs/status/M16-GAP-00012.md @@ -0,0 +1,25 @@ +# M16-GAP-00012 Status + +status: done +task: Light data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 Area Light metadata: type, color, energy, exposure, temperature, temperature enablement, shadow flag, radius, area shape/size/spread and bounded default spot/sun fields. + +evidence: + +- `tools/web/generated/M16-GAP-00012.py` generated a single `WebGapLight` Area Light fixture with deterministic RNA values. +- Desktop report reopened the fixture after save and matched exactly, including Light type 4, rectangle shape 1, color `[0.25, 0.5, 0.75]`, energy 400, exposure 1, temperature 5000, area size 3x2 and spread 2.4. +- WASM/Main opened the same fixture and matched the desktop report within the bounded float tolerance. WASM save/reopen matched the full Light snapshot exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00012.py -- tests/files/web/generated/M16-GAP-00012-datablock-Light.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00012` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00012` exited 0. + +artifacts: `tests/golden/M16-GAP-00012/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes one `datablock:Light` metadata slice only. Light editing commands, rendering behavior, linked/override lights and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, checker, reports, manifest, status and context; restore `M16-GAP-00011` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00013` diff --git a/docs/status/M16-GAP-00013.md b/docs/status/M16-GAP-00013.md new file mode 100644 index 00000000..c0a86b88 --- /dev/null +++ b/docs/status/M16-GAP-00013.md @@ -0,0 +1,25 @@ +# M16-GAP-00013 Status + +status: done +task: Material data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 Principled Material metadata and minimal shader graph: PBR values, IOR/transmission/coat, emission, alpha, two-node topology, one link and graph hash. + +evidence: + +- `tools/web/generated/M16-GAP-00013.py` generated a retained `WebGapMaterial` on a minimal triangle Mesh, with Principled and Material Output nodes. +- Desktop report reopened after save and matched exactly: base color `[0.2, 0.4, 0.8, 0.9]`, roughness 0.6, metallic 0.35, IOR 1.6, transmission 0.27, coat 0.64/0.12, emission `[0.05, 0.1, 0.2, 1]` at strength 3.5, two nodes and one link. +- WASM/Main opened the same fixture, matched all bounded material fields and shader graph topology, and produced a stable 64-character graph hash. WASM save/reopen matched the full material snapshot exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00013.py -- tests/files/web/generated/M16-GAP-00013-datablock-Material.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00013` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00013` exited 0. + +artifacts: `tests/golden/M16-GAP-00013/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes one `datablock:Material` reader slice only. Material authoring commands, texture evaluation, unsupported node behavior and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, checker, reports, manifest, status and context; restore `M16-GAP-00012` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00014` diff --git a/docs/status/M16-GAP-00014.md b/docs/status/M16-GAP-00014.md new file mode 100644 index 00000000..ee5085f4 --- /dev/null +++ b/docs/status/M16-GAP-00014.md @@ -0,0 +1,25 @@ +# M16-GAP-00014 Status + +status: done +task: Mesh data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 Mesh geometry metadata for one quad: counts, triangulated indices, positions, UV layer identity and UV values. + +evidence: + +- `tools/web/generated/M16-GAP-00014.py` generated a retained `WebGapMesh` quad with four vertices, one face and one `WebGapUV` layer. +- Desktop report reopened after save and matched exactly: 4 vertices, 4 edges, 1 face, 4 corners, 2 triangles, deterministic positions/indices and UV values. +- WASM/Main opened the same fixture with `geometryStatus=available`, matched counts, positions, indices and UV layer, and save/reopen matched the complete mesh snapshot exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00014.py -- tests/files/web/generated/M16-GAP-00014-datablock-Mesh.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00014` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00014` exited 0. + +artifacts: `tests/golden/M16-GAP-00014/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes one `datablock:Mesh` geometry-reader slice only. Mesh edit operators, modifiers, shape keys, skinning, paint attributes and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, checker, reports, manifest, status and context; restore `M16-GAP-00013` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00015` diff --git a/docs/status/M16-GAP-00015.md b/docs/status/M16-GAP-00015.md new file mode 100644 index 00000000..d81e4b75 --- /dev/null +++ b/docs/status/M16-GAP-00015.md @@ -0,0 +1,25 @@ +# M16-GAP-00015 Status + +status: done +task: MetaBall data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 MetaBall element metadata: point count, element positions, radii and anisotropic scale values. + +evidence: + +- `tools/web/generated/M16-GAP-00015.py` generated one `WebGapMetaBall` data-block with two deterministic elements and a linked object. +- Desktop report reopened after save and matched exactly: two elements at `[-0.65, 0, 0.4]` and `[0.65, 0, 0.4]`, radii 0.75/0.55 and scales 1.1/0.9/1.2 and 0.8/1.05/0.95. +- WASM/Main opened the same fixture with `geometryStatus=available`, matched both elements and pointCount, and save/reopen matched the full non-mesh snapshot exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00015.py -- tests/files/web/generated/M16-GAP-00015-datablock-MetaBall.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00015` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00015` exited 0. + +artifacts: `tests/golden/M16-GAP-00015/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes one `datablock:MetaBall` metadata slice only. MetaBall editing/evaluation commands and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, checker, reports, manifest, status and context; restore `M16-GAP-00014` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00016` diff --git a/docs/status/M16-GAP-00016.md b/docs/status/M16-GAP-00016.md new file mode 100644 index 00000000..83ba6528 --- /dev/null +++ b/docs/status/M16-GAP-00016.md @@ -0,0 +1,25 @@ +# M16-GAP-00016 Status + +status: done +task: NodeTree data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 shader NodeTree observability through a retained Material: RGB -> Principled -> Material Output nodes, links and the reader's stable shader graph hash. + +evidence: + +- `tools/web/generated/M16-GAP-00016.py` generated `WebGapNodeTreeMaterial` with three nodes and two links, retained by a minimal triangle object. +- Desktop report reopened after save and matched exactly: ShaderNodeRGB, ShaderNodeBsdfPrincipled and ShaderNodeOutputMaterial with two deterministic links. +- WASM/Main opened the same fixture, exposed the graph through the material shader graph with three nodes, two links and a 64-character hash, and save/reopen matched the material graph exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00016.py -- tests/files/web/generated/M16-GAP-00016-datablock-NodeTree.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00016` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00016` exited 0. + +artifacts: `tests/golden/M16-GAP-00016/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes the shader NodeTree reader slice exposed by Material. Geometry-node groups, compositor trees, node editing and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, checker, reports, manifest, status and context; restore `M16-GAP-00015` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00017` diff --git a/docs/status/M16-GAP-00017.md b/docs/status/M16-GAP-00017.md new file mode 100644 index 00000000..ff04ce8f --- /dev/null +++ b/docs/status/M16-GAP-00017.md @@ -0,0 +1,25 @@ +# M16-GAP-00017 Status + +status: done +task: Object data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 Empty Object metadata: type, visibility/selectability, translation, Euler rotation, scale and parent relation. + +evidence: + +- `tools/web/generated/M16-GAP-00017.py` generated a data-free `WebGapObject` Empty with deterministic transform values. +- Desktop report reopened after save and matched exactly: EMPTY, visible/selectable, translation `[1.25, -2.5, 3.75]`, rotation `[0.2, -0.35, 0.5]`, scale `[1.5, 0.75, 2]`, no parent. +- WASM/Main opened the same fixture and matched the Object node fields; save/reopen matched the complete node snapshot exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00017.py -- tests/files/web/generated/M16-GAP-00017-datablock-Object.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00017` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00017` exited 0. + +artifacts: `tests/golden/M16-GAP-00017/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes one `datablock:Object` metadata slice only. Object operators, parenting workflows, constraints, modifiers and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, checker, reports, manifest, status and context; restore `M16-GAP-00016` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00018` diff --git a/docs/status/M16-GAP-00018.md b/docs/status/M16-GAP-00018.md new file mode 100644 index 00000000..19481b1b --- /dev/null +++ b/docs/status/M16-GAP-00018.md @@ -0,0 +1,25 @@ +# M16-GAP-00018 Status + +status: done +task: ParticleSettings data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 ParticleSettings identity and bounded emission fields: type, source, distribution, physics, count, frame range, lifetime, particle size and draw size. + +evidence: + +- `tools/web/generated/M16-GAP-00018.py` generated a minimal retained `WebGapParticleSettings` data-block without a particle-system modifier, avoiding unrelated modifier state while preserving the exact RNA data. +- Desktop report reopened after save and matched exactly: emitter type, face source, JIT distribution, Newton physics, 128 particles, frames 4-96, lifetime 32, size 0.125 and draw size 0.25. +- The Blend reader now exports `ParticleSettings` blocks into SceneIR; WASM/Main opened the same fixture and matched every bounded field. Save/reopen matched the full ParticleSettings snapshot exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00018.py -- tests/files/web/generated/M16-GAP-00018-datablock-ParticleSettings.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00018` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00018` exited 0. + +artifacts: `tests/golden/M16-GAP-00018/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/API/protocol/runtime and both reports. + +knownRisk: This closes one `datablock:ParticleSettings` observability slice only. Particle-system modifiers, particle simulation, operators and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, generator, checker branch, reports, manifest, status and context; restore `M16-GAP-00017` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00019` diff --git a/docs/status/M16-GAP-00019.md b/docs/status/M16-GAP-00019.md new file mode 100644 index 00000000..cbcba526 --- /dev/null +++ b/docs/status/M16-GAP-00019.md @@ -0,0 +1,25 @@ +# M16-GAP-00019 Status + +status: done +task: PointCloud data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 PointCloud geometry with four deterministic points, position attributes and radii. + +evidence: + +- `tools/web/generated/M16-GAP-00019.py` generated a retained `WebGapPointCloud` through Blender's point-cloud conversion path with four deterministic points and radius values `[0.25, 0.5, 0.75, 1.0]`. +- Desktop report reopened after save and matched exactly: four points and all control-point/radius values. +- Existing PointCloud reader support exposed the same fixture in WASM/Main with `geometryStatus=available`; positions and radii matched desktop and save/reopen matched the full non-mesh snapshot exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00019.py -- tests/files/web/generated/M16-GAP-00019-datablock-PointCloud.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00019` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00019` exited 0. + +artifacts: `tests/golden/M16-GAP-00019/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes one `datablock:PointCloud` geometry-reader slice only. PointCloud editing operators, attribute mutation and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, generator, checker branch, reports, manifest, status and context; restore `M16-GAP-00018` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00020` diff --git a/docs/status/M16-GAP-00020.md b/docs/status/M16-GAP-00020.md new file mode 100644 index 00000000..a226e880 --- /dev/null +++ b/docs/status/M16-GAP-00020.md @@ -0,0 +1,25 @@ +# M16-GAP-00020 Status + +status: done +task: Scene data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 Scene identity and bounded timeline/render/unit metadata: current/start/end frames, FPS, render engine and unit scale. + +evidence: + +- `tools/web/generated/M16-GAP-00020.py` generated `WebGapScene` with frame 48 in range 12-180, 30 FPS, Eevee render and metric unit scale 0.25. +- Desktop report reopened after save and matched exactly for scene identity, timeline, render engine and unit metadata. +- WASM/Main opened the same fixture, matched the Scene record and global frame/coordinate metadata, and save/reopen matched the complete scene and frame snapshots exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00020.py -- tests/files/web/generated/M16-GAP-00020-datablock-Scene.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00020` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00020` exited 0. + +artifacts: `tests/golden/M16-GAP-00020/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes one `datablock:Scene` metadata slice only. Scene sequencing, compositor, render execution and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, generator, checker branch, reports, manifest, status and context; restore `M16-GAP-00019` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00021` diff --git a/docs/status/M16-GAP-00021.md b/docs/status/M16-GAP-00021.md new file mode 100644 index 00000000..b50cb5f1 --- /dev/null +++ b/docs/status/M16-GAP-00021.md @@ -0,0 +1,25 @@ +# M16-GAP-00021 Status + +status: done +task: Screen data-block LOCAL_EXACT slice +updated: 2026-08-19 America/New_York + +scope: Blender 5.2 `bScreen` identity and bounded editor layout observability through the linked editor workflow: four areas, editor types and regions. + +evidence: + +- `tools/web/generated/M16-GAP-00021.py` renamed the factory startup screen to `WebGapScreen`, preserving its deterministic four-area layout. +- Desktop report reopened after save and matched exactly: `screen:WebGapScreen`, four areas, `VIEW_3D`, `OUTLINER`, `PROPERTIES`, `DOPESHEET_EDITOR`, and 18 regions. +- WASM/Main opened the same fixture with editor workflow available, matched the corresponding workspace area/editor set and save/reopen matched the complete workflow exactly. +- A truncated malformed Blend submitted to an already loaded Main was rejected and the original snapshot remained unchanged. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00021.py -- tests/files/web/generated/M16-GAP-00021-datablock-Screen.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00021` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00021` exited 0. + +artifacts: `tests/golden/M16-GAP-00021/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes one `datablock:Screen` layout-observability slice only. Editor operations, workspace mutation and all other generated gaps remain separate tasks. + +rollback: remove this task's fixture, generator, checker branch, reports, manifest, status and context; restore `M16-GAP-00020` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00022` diff --git a/docs/status/M16-GAP-00022.md b/docs/status/M16-GAP-00022.md new file mode 100644 index 00000000..ade31b76 --- /dev/null +++ b/docs/status/M16-GAP-00022.md @@ -0,0 +1,25 @@ +# M16-GAP-00022 Status + +status: done +task: Sound data-block LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Blender 5.2 `bSound` identity and bounded sound resource fields through the same generated fixture in desktop and WASM/Main: source path, packing state, volume, pitch, channel count and sample rate. + +evidence: + +- `tools/web/generated/M16-GAP-00022.py` deterministically creates `sound:WebGapSound` from the repository WAV fixture and saves the Blend fixture. +- Desktop reopen report matches exactly: `sound:WebGapSound`, `//WebGapSound.wav`, unpacked, volume/pitch `0.0`, one audio channel and `8000` Hz. +- The reader matches Blender's DNA `bSound` type and emits the same `sounds` resource in Scene IR; protocol validation bounds the resource fields. +- WASM/Main opened the same fixture, matched every desktop sound field, saved and reopened with an identical snapshot, and rejected a truncated Blend without mutating the loaded Main. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00022.py -- tests/files/web/generated/M16-GAP-00022-datablock-Sound.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00022` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00022` exited 0. + +artifacts: `tests/golden/M16-GAP-00022/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes only the `datablock:Sound` resource-observability slice. Audio playback, sequencer editing and other data-blocks remain separate tasks. + +rollback: remove this task's fixture, generator, desktop checker, checker branch, reader/protocol/runtime changes, reports, manifest, status and context; restore `M16-GAP-00021` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00023` diff --git a/docs/status/M16-GAP-00023.md b/docs/status/M16-GAP-00023.md new file mode 100644 index 00000000..6428dc04 --- /dev/null +++ b/docs/status/M16-GAP-00023.md @@ -0,0 +1,25 @@ +# M16-GAP-00023 Status + +status: done +task: Speaker data-block LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Blender 5.2 `Speaker` identity and bounded speaker resource fields through the same generated fixture in desktop and WASM/Main: linked sound identity, volume limits, distance controls, attenuation, cone controls, volume and pitch. + +evidence: + +- `tools/web/generated/M16-GAP-00023.py` deterministically creates `speaker:WebGapSpeaker` linked to `sound:WebGapSpeakerSound` and saves the Blend fixture. +- Desktop reopen report matches exactly for the speaker identity, linked sound and all bounded fields. +- The reader exports Blender's `Speaker` structure as a `speakers` Scene IR resource, including the linked sound ID; protocol validation bounds the resource fields. +- WASM/Main opened the same fixture, matched every desktop speaker field, saved and reopened with an identical snapshot, and rejected a truncated Blend without mutating the loaded Main. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00023.py -- tests/files/web/generated/M16-GAP-00023-datablock-Speaker.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00023` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00023` exited 0. + +artifacts: `tests/golden/M16-GAP-00023/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes only the `datablock:Speaker` resource-observability slice. Audio playback, speaker operators and other data-blocks remain separate tasks. + +rollback: remove this task's fixture, generator, desktop checker, checker branch, reader/protocol/runtime changes, reports, manifest, status and context; restore `M16-GAP-00022` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00024` diff --git a/docs/status/M16-GAP-00024.md b/docs/status/M16-GAP-00024.md new file mode 100644 index 00000000..ac89eed1 --- /dev/null +++ b/docs/status/M16-GAP-00024.md @@ -0,0 +1,26 @@ +# M16-GAP-00024 Status + +status: done +task: Text data-block LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Blender 5.2 `Text` identity and bounded internal text resource fields through the same generated fixture in desktop and WASM/Main: source content, SHA-256, UTF-8 byte length, line count, path, internal state, dirty state and module flag. + +evidence: + +- `tools/web/generated/M16-GAP-00024.py` deterministically creates `text:WebGapText` with two text lines and project-relative filepath. +- Desktop reopen report matches exactly: source hash `668dbf...15f82`, 39 UTF-8 bytes, three stored lines, `//WebGapText.txt`, and stable flags. +- The reader exports the bounded Text resource while preserving the existing blocked script-source inventory; protocol validation enforces source/hash/size/line budgets. +- WASM/Main opened the same fixture, matched every desktop Text field, saved and reopened with an identical snapshot, and rejected a truncated Blend without mutating the loaded Main. +- `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00024.py -- tests/files/web/generated/M16-GAP-00024-datablock-Text.blend` exited 0. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00024` exited 0. +- `node tools/web/check-generated-gap.mjs --task M16-GAP-00024` exited 0. +- `npm --prefix web run typecheck` exited 0. + +artifacts: `tests/golden/M16-GAP-00024/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes only the `datablock:Text` resource-observability slice. Text editing UI, script execution and other data-blocks remain separate tasks. + +rollback: remove this task's fixture, generator, desktop checker, checker branch, reader/protocol/runtime changes, reports, manifest, status and context; restore `M16-GAP-00023` as the queue tail without editing its successful evidence. + +nextTask: `M16-GAP-00025` diff --git a/docs/status/M16-GAP-00025.md b/docs/status/M16-GAP-00025.md new file mode 100644 index 00000000..ac15488c --- /dev/null +++ b/docs/status/M16-GAP-00025.md @@ -0,0 +1,22 @@ +# M16-GAP-00025 Status + +status: done +task: Texture data-block LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Blender 5.2 `Tex` identity and bounded procedural texture fields: type, noise scale/depth, intensity, contrast and saturation. + +evidence: + +- `tools/web/generated/M16-GAP-00025.py` deterministically creates `texture:WebGapTexture` as a CLOUDS texture. +- Desktop reopen report matches exactly; WASM/Main matched all fields, save/reopen was identical, and truncated Blend input was rejected without Main mutation. +- Reader exports `Tex` as `textures`; protocol validation bounds the resource fields. +- Generator, desktop checker, Web checker and Emscripten runtime validation all exited 0. + +artifacts: `tests/golden/M16-GAP-00025/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes only the procedural `datablock:Texture` resource slice. Texture node editing and image sampling remain separate tasks. + +rollback: remove this task's fixture, generator, checker, reader/protocol/runtime changes, reports, manifest, status and context; restore `M16-GAP-00024` as queue tail. + +nextTask: `M16-GAP-00026` diff --git a/docs/status/M16-GAP-00026.md b/docs/status/M16-GAP-00026.md new file mode 100644 index 00000000..3ca5f761 --- /dev/null +++ b/docs/status/M16-GAP-00026.md @@ -0,0 +1,22 @@ +# M16-GAP-00026 Status + +status: done +task: Volume data-block LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Blender 5.2 `Volume` resource observability through bounded non-mesh Scene IR fields: source path, geometry status and volume display/render properties. + +evidence: + +- `tools/web/generated/M16-GAP-00026.py` deterministically creates `volume:WebGapVolume` with project-relative OpenVDB path, density `2.5`, nearest interpolation and step size `0.125`. +- Desktop and WASM reports match exactly; save/reopen is stable and malformed Blend input leaves Main unchanged. +- Existing Volume non-mesh reader path provides the bounded resource fields; no broader volume grid or rendering behavior was added. +- Generator, desktop checker and Web checker exited 0. + +artifacts: `tests/golden/M16-GAP-00026/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. + +knownRisk: This closes only bounded `datablock:Volume` metadata. OpenVDB loading, grids and volume rendering remain separate tasks. + +rollback: remove this task's fixture, generator, checker, reports, manifest, status and context; restore `M16-GAP-00025` as queue tail. + +nextTask: `M16-GAP-00027` diff --git a/docs/status/M16-GAP-00027.md b/docs/status/M16-GAP-00027.md new file mode 100644 index 00000000..eee45543 --- /dev/null +++ b/docs/status/M16-GAP-00027.md @@ -0,0 +1,17 @@ +# M16-GAP-00027 Status + +status: done +task: WindowManager data-block LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Headless `WindowManager` identity and bounded runtime state: manager identity/name, preset name, window count and interface lock state. + +evidence: + +- Desktop fixture and reopen report are exact: `window-manager:WinMan`, preset `New Preset`, one window, interface unlocked. +- WASM/Main exposes the same bounded `windowManager` resource, save/reopen is exact, and malformed Blend input leaves Main unchanged. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00027` exited 0. + +knownRisk: WindowManager operators, reports, keymaps and live window mutation remain outside this bounded headless slice. + +nextTask: `M16-GAP-00028` diff --git a/docs/status/M16-GAP-00028.md b/docs/status/M16-GAP-00028.md new file mode 100644 index 00000000..48df05af --- /dev/null +++ b/docs/status/M16-GAP-00028.md @@ -0,0 +1,17 @@ +# M16-GAP-00028 Status + +status: done +task: WorkSpace data-block LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Workspace identity and bounded screen linkage count for `workspace:WebGapWorkspace`. + +evidence: + +- Desktop fixture renamed the Layout workspace to `WebGapWorkspace`; reopen is exact. +- WASM/Main exposes the same workspace resource and screen count, save/reopen is exact, and malformed Blend input leaves Main unchanged. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00028` exited 0. + +knownRisk: Full workspace editor mutation remains covered by the Screen/editor workflow slice; this task only closes Workspace identity and linkage count. + +nextTask: `M16-GAP-00029` diff --git a/docs/status/M16-GAP-00029.md b/docs/status/M16-GAP-00029.md new file mode 100644 index 00000000..a441e1c8 --- /dev/null +++ b/docs/status/M16-GAP-00029.md @@ -0,0 +1,17 @@ +# M16-GAP-00029 Status + +status: done +task: World data-block LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: World identity, background color and bounded mist settings for `world:WebGapWorld`. + +evidence: + +- Desktop fixture exposes `WebGapWorld` with the configured color and mist fields; save/reopen is exact. +- WASM/Main exposes the same world resource from the same fixture, save/reopen is exact, and malformed Blend input leaves Main unchanged. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00029` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00029` exited 0. + +knownRisk: Full world shader/editor mutation remains outside this bounded data-block identity slice. + +nextTask: `M16-GAP-00030` diff --git a/docs/status/M16-GAP-00030.md b/docs/status/M16-GAP-00030.md new file mode 100644 index 00000000..2d128267 --- /dev/null +++ b/docs/status/M16-GAP-00030.md @@ -0,0 +1,18 @@ +# M16-GAP-00030 Status + +status: done +task: ARMATURE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: ARMATURE modifier identity, target object, vertex group, deform flags, visibility modes and dependency linkage for `mesh:WebGapArmatureMesh`. + +evidence: + +- Desktop fixture exposes one ARMATURE modifier targeting `object:WebGapArmatureObject`; save/reopen is exact. +- WASM/Main exposes the same modifier stack from the same fixture, including `armatureObjectId`, `vertexGroup`, `deformFlags`, and dependency; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00030` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00030` exited 0. + +knownRisk: Full ARMATURE deformation evaluation and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00031` diff --git a/docs/status/M16-GAP-00031.md b/docs/status/M16-GAP-00031.md new file mode 100644 index 00000000..aab01d51 --- /dev/null +++ b/docs/status/M16-GAP-00031.md @@ -0,0 +1,18 @@ +# M16-GAP-00031 Status + +status: done +task: ARRAY modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: ARRAY modifier identity, fixed duplicate count, start/end cap targets and visibility modes for `mesh:WebGapArrayObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapArray` with count 4 and stable start/end cap targets; save/reopen is exact. +- WASM/Main exposes the same modifier parameters and dependency targets from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00031` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00031` exited 0. + +knownRisk: Full evaluated Array geometry and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00032` diff --git a/docs/status/M16-GAP-00032.md b/docs/status/M16-GAP-00032.md new file mode 100644 index 00000000..2123a1a8 --- /dev/null +++ b/docs/status/M16-GAP-00032.md @@ -0,0 +1,18 @@ +# M16-GAP-00032 Status + +status: done +task: BEVEL modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: BEVEL modifier identity, width, segments, profile and visibility modes for `mesh:WebGapBevelMesh`. + +evidence: + +- Desktop fixture exposes `WebGapBevel` with width 0.2, three segments and profile 0.35; save/reopen is exact. +- WASM/Main exposes the same modifier parameters from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00032` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00032` exited 0. + +knownRisk: Full evaluated Bevel geometry and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00033` diff --git a/docs/status/M16-GAP-00033.md b/docs/status/M16-GAP-00033.md new file mode 100644 index 00000000..62ff28d2 --- /dev/null +++ b/docs/status/M16-GAP-00033.md @@ -0,0 +1,18 @@ +# M16-GAP-00033 Status + +status: done +task: BOOLEAN modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: BOOLEAN modifier identity, Difference operation, Exact solver and cutter target linkage for `mesh:WebGapBooleanObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapBoolean` with Difference/Exact settings and stable cutter target; save/reopen is exact. +- WASM/Main exposes the same modifier parameters and target dependency from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00033` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00033` exited 0. + +knownRisk: Full evaluated Boolean geometry and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00034` diff --git a/docs/status/M16-GAP-00034.md b/docs/status/M16-GAP-00034.md new file mode 100644 index 00000000..1a3a8212 --- /dev/null +++ b/docs/status/M16-GAP-00034.md @@ -0,0 +1,18 @@ +# M16-GAP-00034 Status + +status: done +task: BUILD modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: BUILD modifier identity, frame start/length, randomization flags/seed and visibility modes for `mesh:WebGapBuildMesh`. + +evidence: + +- Desktop fixture exposes `WebGapBuild` with start 3, length 12 and stable seed; save/reopen is exact. +- Fixed reader field decoding for BUILD `randomize`/`seed` and rebuilt the Chromium WASM engine; WASM/Main exposes matching fields from the same fixture. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00034` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00034` exited 0. + +knownRisk: Full evaluated Build geometry and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00035` diff --git a/docs/status/M16-GAP-00035.md b/docs/status/M16-GAP-00035.md new file mode 100644 index 00000000..cd7c64a6 --- /dev/null +++ b/docs/status/M16-GAP-00035.md @@ -0,0 +1,18 @@ +# M16-GAP-00035 Status + +status: done +task: CAST modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: CAST modifier identity, factor, radius, cast mode flags and visibility modes for `mesh:WebGapCastMesh`. + +evidence: + +- Desktop fixture exposes `WebGapCast` with factor 0.65, radius 2.5 and stable cast flags; save/reopen is exact. +- WASM/Main exposes the same modifier parameters from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00035` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00035` exited 0. + +knownRisk: Full evaluated Cast geometry and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00036` diff --git a/docs/status/M16-GAP-00036.md b/docs/status/M16-GAP-00036.md new file mode 100644 index 00000000..51e9ee75 --- /dev/null +++ b/docs/status/M16-GAP-00036.md @@ -0,0 +1,18 @@ +# M16-GAP-00036 Status + +status: done +task: CLOTH modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: CLOTH modifier identity and visibility modes for `mesh:WebGapClothMesh`. + +evidence: + +- Desktop fixture exposes `WebGapCloth`; save/reopen is exact. +- WASM/Main exposes the same modifier stack from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00036` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00036` exited 0. + +knownRisk: Full evaluated cloth simulation and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00037` diff --git a/docs/status/M16-GAP-00037.md b/docs/status/M16-GAP-00037.md new file mode 100644 index 00000000..8209317e --- /dev/null +++ b/docs/status/M16-GAP-00037.md @@ -0,0 +1,18 @@ +# M16-GAP-00037 Status + +status: done +task: COLLISION modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: COLLISION modifier identity and visibility modes for `mesh:WebGapCollisionMesh`. + +evidence: + +- Desktop fixture exposes `WebGapCollision`; save/reopen is exact. +- WASM/Main exposes the same modifier stack from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00037` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00037` exited 0. + +knownRisk: Full evaluated collision simulation and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00038` diff --git a/docs/status/M16-GAP-00038.md b/docs/status/M16-GAP-00038.md new file mode 100644 index 00000000..7a300425 --- /dev/null +++ b/docs/status/M16-GAP-00038.md @@ -0,0 +1,18 @@ +# M16-GAP-00038 Status + +status: done +task: CORRECTIVE_SMOOTH modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: CORRECTIVE_SMOOTH modifier identity and visibility modes for `mesh:WebGapCorrectiveSmoothObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapCorrectiveSmooth`; save/reopen is exact. +- WASM/Main exposes the same modifier stack from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00038` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00038` exited 0. + +knownRisk: Full evaluated corrective smoothing and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00039` diff --git a/docs/status/M16-GAP-00039.md b/docs/status/M16-GAP-00039.md new file mode 100644 index 00000000..9b4de8fc --- /dev/null +++ b/docs/status/M16-GAP-00039.md @@ -0,0 +1,18 @@ +# M16-GAP-00039 Status + +status: done +task: CURVE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: CURVE modifier identity and visibility modes for `mesh:WebGapCurveModifierObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapCurveModifier`; save/reopen is exact. +- WASM/Main exposes the same modifier stack from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00039` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00039` exited 0. + +knownRisk: Full evaluated curve deformation and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00040` diff --git a/docs/status/M16-GAP-00040.md b/docs/status/M16-GAP-00040.md new file mode 100644 index 00000000..bf18d3b3 --- /dev/null +++ b/docs/status/M16-GAP-00040.md @@ -0,0 +1,18 @@ +# M16-GAP-00040 Status + +status: done +task: DATA_TRANSFER modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: DATA_TRANSFER modifier identity and visibility modes for `mesh:WebGapDataTransferObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapDataTransfer`; save/reopen is exact. +- WASM/Main exposes the same modifier stack from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `npm --prefix web run test:generated-gap -- --task M16-GAP-00040` and `node tools/web/check-generated-gap.mjs --task M16-GAP-00040` exited 0. + +knownRisk: Full evaluated data transfer and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00041` diff --git a/docs/status/M16-GAP-00041.md b/docs/status/M16-GAP-00041.md new file mode 100644 index 00000000..eced6255 --- /dev/null +++ b/docs/status/M16-GAP-00041.md @@ -0,0 +1,18 @@ +# M16-GAP-00041 Status + +status: done +task: DECIMATE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: DECIMATE modifier metadata and collapse parameters for `mesh:WebGapDecimateObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapDecimate` with ratio 0.65, two iterations, collapse mode, and angle limit 0.4; save/reopen is exact. +- WASM/Main exposes the same modifier parameters from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `build_blender_5.2.0/bin/blender ... M16-GAP-00041.py`, `npm --prefix web run test:generated-gap -- --task M16-GAP-00041`, and `node tools/web/check-generated-gap.mjs --task M16-GAP-00041` exited 0. + +knownRisk: Full evaluated decimation geometry and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00042` diff --git a/docs/status/M16-GAP-00042.md b/docs/status/M16-GAP-00042.md new file mode 100644 index 00000000..149e8aa6 --- /dev/null +++ b/docs/status/M16-GAP-00042.md @@ -0,0 +1,18 @@ +# M16-GAP-00042 Status + +status: done +task: DISPLACE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: DISPLACE modifier direction, strength, level, space, and texture mapping for `mesh:WebGapDisplaceObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapDisplace` with Z direction, strength 0.75, mid-level 0.25, global space, and global texture mapping; save/reopen is exact. +- WASM/Main exposes the same modifier parameters from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `build_blender_5.2.0/bin/blender ... M16-GAP-00042.py`, `npm --prefix web run test:generated-gap -- --task M16-GAP-00042`, and `node tools/web/check-generated-gap.mjs --task M16-GAP-00042` exited 0. + +knownRisk: Full evaluated displacement texture sampling and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00043` diff --git a/docs/status/M16-GAP-00043.md b/docs/status/M16-GAP-00043.md new file mode 100644 index 00000000..1d702ade --- /dev/null +++ b/docs/status/M16-GAP-00043.md @@ -0,0 +1,18 @@ +# M16-GAP-00043 Status + +status: done +task: DYNAMIC_PAINT modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: DYNAMIC_PAINT modifier identity, type code, visibility, and blocked evaluation status for `mesh:WebGapDynamicPaintObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapDynamicPaint`; save/reopen is exact. +- WASM/Main exposes the same modifier with typeCode 40 and the expected blocked evaluation status from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `build_blender_5.2.0/bin/blender ... M16-GAP-00043.py`, `npm --prefix web run test:generated-gap -- --task M16-GAP-00043`, and `node tools/web/check-generated-gap.mjs --task M16-GAP-00043` exited 0. + +knownRisk: Dynamic paint simulation settings and evaluated surfaces remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00044` diff --git a/docs/status/M16-GAP-00044.md b/docs/status/M16-GAP-00044.md new file mode 100644 index 00000000..d7806b68 --- /dev/null +++ b/docs/status/M16-GAP-00044.md @@ -0,0 +1,18 @@ +# M16-GAP-00044 Status + +status: done +task: EDGE_SPLIT modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: EDGE_SPLIT modifier split angle and visibility for `mesh:WebGapEdgeSplitObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapEdgeSplit` with split angle 0.35; save/reopen is exact. +- WASM/Main exposes the same split angle and modifier stack from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `build_blender_5.2.0/bin/blender ... M16-GAP-00044.py`, `npm --prefix web run test:generated-gap -- --task M16-GAP-00044`, and `node tools/web/check-generated-gap.mjs --task M16-GAP-00044` exited 0. + +knownRisk: Full evaluated edge splitting and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00045` diff --git a/docs/status/M16-GAP-00045.md b/docs/status/M16-GAP-00045.md new file mode 100644 index 00000000..489f1a6e --- /dev/null +++ b/docs/status/M16-GAP-00045.md @@ -0,0 +1,18 @@ +# M16-GAP-00045 Status + +status: done +task: EXPLODE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: EXPLODE modifier identity, type code, visibility, and blocked evaluation status for `mesh:WebGapExplodeObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapExplode`; save/reopen is exact. +- WASM/Main exposes the same modifier with typeCode 21 and blocked evaluation status from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `build_blender_5.2.0/bin/blender ... M16-GAP-00045.py`, `npm --prefix web run test:generated-gap -- --task M16-GAP-00045`, and `node tools/web/check-generated-gap.mjs --task M16-GAP-00045` exited 0. + +knownRisk: Full explode simulation and editor mutation remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00046` diff --git a/docs/status/M16-GAP-00046.md b/docs/status/M16-GAP-00046.md new file mode 100644 index 00000000..9b3effda --- /dev/null +++ b/docs/status/M16-GAP-00046.md @@ -0,0 +1,18 @@ +# M16-GAP-00046 Status + +status: done +task: FLUID modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: FLUID modifier identity, type code, visibility, and blocked evaluation status for `mesh:WebGapFluidObjectMesh`. + +evidence: + +- Desktop fixture exposes `WebGapFluid`; save/reopen is exact. +- WASM/Main exposes the same modifier with typeCode 56 and blocked evaluation status from the same fixture; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- `build_blender_5.2.0/bin/blender ... M16-GAP-00046.py`, `npm --prefix web run test:generated-gap -- --task M16-GAP-00046`, and `node tools/web/check-generated-gap.mjs --task M16-GAP-00046` exited 0. + +knownRisk: Full fluid simulation settings and evaluated volumes remain outside this metadata/local-exact modifier slice. + +nextTask: `M16-GAP-00047` diff --git a/docs/status/M16-GAP-00047.md b/docs/status/M16-GAP-00047.md new file mode 100644 index 00000000..0486aab7 --- /dev/null +++ b/docs/status/M16-GAP-00047.md @@ -0,0 +1,18 @@ +# M16-GAP-00047 Status + +status: done +task: GREASE_PENCIL_ARMATURE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil object modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Armature` on `GreasePencilObject`; save/reopen is exact. +- WASM/Main now exposes non-Mesh object modifier stacks on scene nodes, including `GREASE_PENCIL_ARMATURE` typeCode 79; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Rebuilt `web_engine.wasm` from the reader change; generator, npm comparator, and direct comparator all exited 0. + +knownRisk: Grease Pencil armature deformation evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00048` diff --git a/docs/status/M16-GAP-00048.md b/docs/status/M16-GAP-00048.md new file mode 100644 index 00000000..26ce7e5b --- /dev/null +++ b/docs/status/M16-GAP-00048.md @@ -0,0 +1,18 @@ +# M16-GAP-00048 Status + +status: done +task: GREASE_PENCIL_ARRAY modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil ARRAY modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Array`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_ARRAY` typeCode 75 on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil array evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00049` diff --git a/docs/status/M16-GAP-00049.md b/docs/status/M16-GAP-00049.md new file mode 100644 index 00000000..12bc70dd --- /dev/null +++ b/docs/status/M16-GAP-00049.md @@ -0,0 +1,18 @@ +# M16-GAP-00049 Status + +status: done +task: GREASE_PENCIL_BUILD modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil BUILD modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Build`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_BUILD` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil build evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00050` diff --git a/docs/status/M16-GAP-00050.md b/docs/status/M16-GAP-00050.md new file mode 100644 index 00000000..88031944 --- /dev/null +++ b/docs/status/M16-GAP-00050.md @@ -0,0 +1,18 @@ +# M16-GAP-00050 Status + +status: done +task: GREASE_PENCIL_COLOR modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil COLOR modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Color`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_COLOR` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil color evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00051` diff --git a/docs/status/M16-GAP-00051.md b/docs/status/M16-GAP-00051.md new file mode 100644 index 00000000..b4ea0e29 --- /dev/null +++ b/docs/status/M16-GAP-00051.md @@ -0,0 +1,18 @@ +# M16-GAP-00051 Status + +status: done +task: GREASE_PENCIL_DASH modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil DASH modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Dash`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_DASH` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil dash evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00052` diff --git a/docs/status/M16-GAP-00052.md b/docs/status/M16-GAP-00052.md new file mode 100644 index 00000000..10576422 --- /dev/null +++ b/docs/status/M16-GAP-00052.md @@ -0,0 +1,18 @@ +# M16-GAP-00052 Status + +status: done +task: GREASE_PENCIL_ENVELOPE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil ENVELOPE modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Envelope`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_ENVELOPE` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil envelope evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00053` diff --git a/docs/status/M16-GAP-00053.md b/docs/status/M16-GAP-00053.md new file mode 100644 index 00000000..11263e3d --- /dev/null +++ b/docs/status/M16-GAP-00053.md @@ -0,0 +1,18 @@ +# M16-GAP-00053 Status + +status: done +task: GREASE_PENCIL_HOOK modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil HOOK modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Hook`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_HOOK` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil hook evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00054` diff --git a/docs/status/M16-GAP-00054.md b/docs/status/M16-GAP-00054.md new file mode 100644 index 00000000..c4fca944 --- /dev/null +++ b/docs/status/M16-GAP-00054.md @@ -0,0 +1,18 @@ +# M16-GAP-00054 Status + +status: done +task: GREASE_PENCIL_LATTICE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil LATTICE modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Lattice`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_LATTICE` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil lattice evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00055` diff --git a/docs/status/M16-GAP-00055.md b/docs/status/M16-GAP-00055.md new file mode 100644 index 00000000..a31e8e1f --- /dev/null +++ b/docs/status/M16-GAP-00055.md @@ -0,0 +1,18 @@ +# M16-GAP-00055 Status + +status: done +task: GREASE_PENCIL_LENGTH modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil LENGTH modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Length`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_LENGTH` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil length evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00056` diff --git a/docs/status/M16-GAP-00056.md b/docs/status/M16-GAP-00056.md new file mode 100644 index 00000000..e28dfa0b --- /dev/null +++ b/docs/status/M16-GAP-00056.md @@ -0,0 +1,18 @@ +# M16-GAP-00056 Status + +status: done +task: GREASE_PENCIL_MIRROR modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil MIRROR modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Mirror`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_MIRROR` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil mirror evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00057` diff --git a/docs/status/M16-GAP-00057.md b/docs/status/M16-GAP-00057.md new file mode 100644 index 00000000..d2204ddf --- /dev/null +++ b/docs/status/M16-GAP-00057.md @@ -0,0 +1,18 @@ +# M16-GAP-00057 Status + +status: done +task: GREASE_PENCIL_MULTIPLY modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil MULTIPLY modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Multiply`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_MULTIPLY` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil multiply evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00058` diff --git a/docs/status/M16-GAP-00058.md b/docs/status/M16-GAP-00058.md new file mode 100644 index 00000000..cde2fe64 --- /dev/null +++ b/docs/status/M16-GAP-00058.md @@ -0,0 +1,18 @@ +# M16-GAP-00058 Status + +status: done +task: GREASE_PENCIL_NOISE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil NOISE modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Noise`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_NOISE` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil noise evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00059` diff --git a/docs/status/M16-GAP-00059.md b/docs/status/M16-GAP-00059.md new file mode 100644 index 00000000..8bd3a4f0 --- /dev/null +++ b/docs/status/M16-GAP-00059.md @@ -0,0 +1,18 @@ +# M16-GAP-00059 Status + +status: done +task: GREASE_PENCIL_OFFSET modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil OFFSET modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Offset`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_OFFSET` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil offset evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00060` diff --git a/docs/status/M16-GAP-00060.md b/docs/status/M16-GAP-00060.md new file mode 100644 index 00000000..ba5bf136 --- /dev/null +++ b/docs/status/M16-GAP-00060.md @@ -0,0 +1,18 @@ +# M16-GAP-00060 Status + +status: done +task: GREASE_PENCIL_OPACITY modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil OPACITY modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Opacity`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_OPACITY` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil opacity evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00061` diff --git a/docs/status/M16-GAP-00061.md b/docs/status/M16-GAP-00061.md new file mode 100644 index 00000000..cdd2840e --- /dev/null +++ b/docs/status/M16-GAP-00061.md @@ -0,0 +1,18 @@ +# M16-GAP-00061 Status + +status: done +task: GREASE_PENCIL_OUTLINE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil OUTLINE modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Outline`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_OUTLINE` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil outline evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00062` diff --git a/docs/status/M16-GAP-00062.md b/docs/status/M16-GAP-00062.md new file mode 100644 index 00000000..ccb08700 --- /dev/null +++ b/docs/status/M16-GAP-00062.md @@ -0,0 +1,18 @@ +# M16-GAP-00062 Status + +status: done +task: GREASE_PENCIL_SHRINKWRAP modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil SHRINKWRAP modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Shrinkwrap`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_SHRINKWRAP` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil shrinkwrap evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00063` diff --git a/docs/status/M16-GAP-00063.md b/docs/status/M16-GAP-00063.md new file mode 100644 index 00000000..ee30e97e --- /dev/null +++ b/docs/status/M16-GAP-00063.md @@ -0,0 +1,18 @@ +# M16-GAP-00063 Status + +status: done +task: GREASE_PENCIL_SIMPLIFY modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil SIMPLIFY modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Simplify`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_SIMPLIFY` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil simplify evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00064` diff --git a/docs/status/M16-GAP-00064.md b/docs/status/M16-GAP-00064.md new file mode 100644 index 00000000..186bb76c --- /dev/null +++ b/docs/status/M16-GAP-00064.md @@ -0,0 +1,18 @@ +# M16-GAP-00064 Status + +status: done +task: GREASE_PENCIL_SMOOTH modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil SMOOTH modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Smooth`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_SMOOTH` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil smooth evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00065` diff --git a/docs/status/M16-GAP-00065.md b/docs/status/M16-GAP-00065.md new file mode 100644 index 00000000..4baf2c4b --- /dev/null +++ b/docs/status/M16-GAP-00065.md @@ -0,0 +1,18 @@ +# M16-GAP-00065 Status + +status: done +task: GREASE_PENCIL_SUBDIV modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil SUBDIV modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Subdiv`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_SUBDIV` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil subdivision evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00066` diff --git a/docs/status/M16-GAP-00066.md b/docs/status/M16-GAP-00066.md new file mode 100644 index 00000000..c845c990 --- /dev/null +++ b/docs/status/M16-GAP-00066.md @@ -0,0 +1,18 @@ +# M16-GAP-00066 Status + +status: done +task: GREASE_PENCIL_TEXTURE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil TEXTURE modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Texture`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_TEXTURE` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil texture evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00067` diff --git a/docs/status/M16-GAP-00067.md b/docs/status/M16-GAP-00067.md new file mode 100644 index 00000000..891717fe --- /dev/null +++ b/docs/status/M16-GAP-00067.md @@ -0,0 +1,18 @@ +# M16-GAP-00067 Status + +status: done +task: GREASE_PENCIL_THICKNESS modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil THICKNESS modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Thickness`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_THICKNESS` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil thickness evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00068` diff --git a/docs/status/M16-GAP-00068.md b/docs/status/M16-GAP-00068.md new file mode 100644 index 00000000..b76a7b8d --- /dev/null +++ b/docs/status/M16-GAP-00068.md @@ -0,0 +1,18 @@ +# M16-GAP-00068 Status + +status: done +task: GREASE_PENCIL_TIME modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil TIME modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Time`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_TIME` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil time evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00069` diff --git a/docs/status/M16-GAP-00069.md b/docs/status/M16-GAP-00069.md new file mode 100644 index 00000000..9441314e --- /dev/null +++ b/docs/status/M16-GAP-00069.md @@ -0,0 +1,18 @@ +# M16-GAP-00069 Status + +status: done +task: GREASE_PENCIL_TINT modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil TINT modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Tint`; save/reopen is exact. +- WASM/Main exposes `GREASE_PENCIL_TINT` on the object scene node; save/reopen is exact. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Grease Pencil tint evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00070` diff --git a/docs/status/M16-GAP-00070.md b/docs/status/M16-GAP-00070.md new file mode 100644 index 00000000..a2a2db86 --- /dev/null +++ b/docs/status/M16-GAP-00070.md @@ -0,0 +1,18 @@ +# M16-GAP-00070 Status + +status: done +task: GREASE_PENCIL_VERTEX_WEIGHT_ANGLE modifier LOCAL_EXACT slice +updated: 2026-08-20 America/New_York + +scope: Grease Pencil VERTEX_WEIGHT_ANGLE modifier stack exposure for `object:GreasePencilObject`. + +evidence: + +- Desktop fixture exposes `Gp Vertex Weight Angle`; save/reopen is exact. +- Corrected the reader's Blender 5.2 type-name mapping and rebuilt WASM; WASM/Main exposes `GREASE_PENCIL_VERTEX_WEIGHT_ANGLE` on the object scene node. +- Malformed Blend input is rejected without mutating Main. +- Generator, npm comparator, and direct comparator exited 0. + +knownRisk: Vertex-weight angle deformation evaluation remains blocked; this slice covers metadata and object-stack transport only. + +nextTask: `M16-GAP-00071` diff --git a/docs/status/W-060.md b/docs/status/W-060.md index 2c0c8c4a..0d0b0aaf 100644 --- a/docs/status/W-060.md +++ b/docs/status/W-060.md @@ -1,6 +1,6 @@ # W-060 Status -status: done_current_scope +status: done_current_scope task: 对象模式命令 The first native command registry slice is implemented end to end. The Worker diff --git a/docs/status/W-073.md b/docs/status/W-073.md index 8d797c3e..8f546a1e 100644 --- a/docs/status/W-073.md +++ b/docs/status/W-073.md @@ -1,6 +1,6 @@ # W-073 Status -status: in_progress +status: in_progress task: 定义 Blender 三角面简化和 LOD 协议 `web/protocol/simplify.ts` now defines versioned `SimplifyProfile`, diff --git a/docs/status/W-074.md b/docs/status/W-074.md index c4d6777a..b6913a6a 100644 --- a/docs/status/W-074.md +++ b/docs/status/W-074.md @@ -1,6 +1,6 @@ # W-074 Status -status: in_progress +status: in_progress task: 编译并复用 Blender Decimate 实现 `web_engine_decimate.cpp` now wraps Blender's native BMesh decimate entry points diff --git a/docs/status/W-075.md b/docs/status/W-075.md index 43db678b..f505d4d1 100644 --- a/docs/status/W-075.md +++ b/docs/status/W-075.md @@ -1,6 +1,6 @@ # W-075 Status -status: in_progress +status: in_progress task: 实现三种模式和修改器堆栈求值 The React Properties editor now exposes a Blender-style Decimate inspector for diff --git a/docs/status/W-076.md b/docs/status/W-076.md index acd75759..9122211f 100644 --- a/docs/status/W-076.md +++ b/docs/status/W-076.md @@ -1,6 +1,6 @@ # W-076 Status -status: in_progress +status: in_progress task: 属性、UV 和蒙皮安全简化 `SimplifyProfile` now requires an explicit attribute policy after parsing and diff --git a/docs/status/W-077.md b/docs/status/W-077.md index 7dd751bc..8da6161e 100644 --- a/docs/status/W-077.md +++ b/docs/status/W-077.md @@ -1,6 +1,6 @@ # W-077 Status -status: in_progress +status: in_progress task: 多级 LOD 生成、缓存和视口选择 The cache boundary is now implemented without changing the native WASM ABI: diff --git a/docs/status/W-078.md b/docs/status/W-078.md index a1e49ba0..4be7c0a1 100644 --- a/docs/status/W-078.md +++ b/docs/status/W-078.md @@ -1,6 +1,6 @@ # W-078 Status -status: in_progress +status: in_progress task: 轻量化预算和导出策略 `protocol/budget.ts` now validates explicit integer budgets for triangles, diff --git a/docs/status/W-079.md b/docs/status/W-079.md index f371f882..b0434a29 100644 --- a/docs/status/W-079.md +++ b/docs/status/W-079.md @@ -1,6 +1,6 @@ # W-079 Status -status: in_progress +status: in_progress task: 三角面简化和轻量化里程碑 The Blender golden fixture is checked by diff --git a/docs/tasks/M14-04F.md b/docs/tasks/M14-04F.md index c6f29239..f51a229a 100644 --- a/docs/tasks/M14-04F.md +++ b/docs/tasks/M14-04F.md @@ -2,7 +2,7 @@ - `task`: `M14-04F` - `parent`: `M14-04E` -- `status`: `in_progress` +- `status`: `done` ## 目标 @@ -31,8 +31,8 @@ Firefox/WebKit 不在本项目范围内。 等价生产诊断,而不是仅记录派发了几个 `PointerEvent`。 7. **交接门**:focused 命令、必要的 typecheck/build、report、manifest、status 和回滚路径齐全。 -协议单测和事件派发通过,只能关闭前四个门的一部分;在生产接线和真实状态断言完成前,任务保持 -`in_progress`,不得根据报告中的固定保证字段直接改为 `done`。 +协议状态已接入主线程 WebGL 和 OffscreenCanvas Worker 两条生产 viewport 路径;Chromium checker +读取两个 canvas 的真实 `data-input-modal-*` 状态,重复 `pointerup`/`pointercancel` 不增加提交计数。 ## 验收 diff --git a/docs/tasks/M14-04G.md b/docs/tasks/M14-04G.md new file mode 100644 index 00000000..324e32ad --- /dev/null +++ b/docs/tasks/M14-04G.md @@ -0,0 +1,60 @@ +# M14-04G:Chromium responsive layout no-overlap/no-overflow matrix + +- `task`: `M14-04G` +- `parent`: `M14-04F` +- `status`: `done` + +## 目标 + +在 Chromium 主线程 WebGL 和 OffscreenCanvas Worker 两种生产视口下,验证桌面、平板和手机 +尺寸不会产生横向溢出、关键区域重叠、文字裁切或不可操作的触控目标;布局失败必须能被 +机器 checker 稳定报告。Firefox/WebKit 不在本项目范围内。 + +## 输入 + +- 上一个 manifest:`tests/golden/M14-04F/manifest.json` +- 生产布局入口:`web/app/src/app/App.tsx`、`web/app/src/app/app-shell.css` +- 视口入口:`web/app/src/three-adapter/viewport.ts`、`web/app/src/three-adapter/offscreen-viewport.ts` +- 既有 e2e 参考:`web/tests/e2e/responsive-layout.spec.ts` + +## 范围 + +做: + +- 固定 `1440x900`、`1280x720`、`834x1112`、`390x844` 四个 Chromium viewport。 +- 分别验证 `offscreen=0` 和 `offscreen=1`,记录实际 renderer backend。 +- 检查 document 横向滚动、topbar、sidebar、viewport、timeline、status bar 的 bounding box。 +- 检查长项目名、错误提示、打开进度、面板展开和 DPR 2 下文字与按钮仍在容器内。 +- 记录失败元素、测量值、viewport、DPR、backend 和报告 hash。 + +不做: + +- Firefox/WebKit 兼容性证据。 +- 完整 UI 重设计或新增 Blender 功能。 +- 只用截图非空作为布局通过条件。 + +## 验收 + +```text +npm --prefix web run test:chromium-layout +``` + +必要的补充门: + +```text +npm --prefix web run typecheck +npm --prefix web run build +git diff --check +``` + +## 产物和交接 + +- 报告:`tests/golden/M14-04G/chromium-layout-report.json` +- manifest:`tests/golden/M14-04G/manifest.json` +- 状态页:`docs/status/M14-04G.md` +- 下一任务:由 manifest 的 `nextTask` 决定 + +## 回滚 + +删除布局 checker、测试、报告、manifest、package 命令和本任务状态页;恢复 `M14-04F` 作为队列尾, +不得修改 M14-04F 的成功证据。 diff --git a/docs/tasks/M14-04H.md b/docs/tasks/M14-04H.md new file mode 100644 index 00000000..09e35d14 --- /dev/null +++ b/docs/tasks/M14-04H.md @@ -0,0 +1,60 @@ +# M14-04H:Chromium keyboard-only, accessible names/roles and focus restoration + +- `task`: `M14-04H` +- `parent`: `M14-04G` +- `status`: `done` + +## 目标 + +在 Chromium 中验证不依赖 pointer 的核心菜单与操作搜索流程:键盘可以到达并激活入口,打开 +modal/menu 后焦点落在可操作项,Escape/提交后焦点回到触发器,交互元素具备可计算名称和正确 +角色。Firefox/WebKit 不在本项目范围内。 + +## 输入 + +- 上一个 manifest:`tests/golden/M14-04G/manifest.json` +- 生产入口:`web/app/src/app/App.tsx` +- 样式入口:`web/app/src/app/app-shell.css` +- 既有参考 e2e:`web/tests/e2e/keyboard-accessibility.spec.ts` + +## 范围 + +做: + +- main/offscreen 两个 Chromium 页面配置。 +- Tab/Shift+Tab 到文件菜单、Enter 打开、Escape 关闭并恢复触发器焦点。 +- F3 打开操作搜索、输入框自动聚焦、Escape 关闭并恢复 F3 触发器焦点。 +- 扫描可见 button/input/select/textarea/canvas/[role],检查可计算名称、禁用状态和合法角色。 +- 记录焦点轨迹、角色/名称缺口和稳定报告 hash。 + +不做: + +- Firefox/WebKit 或特定屏幕阅读器的兼容性声明。 +- 重新设计所有快捷键或引入新的 operator。 +- 用 axe 的单一静态结果替代真实键盘路径。 + +## 验收 + +```text +npm --prefix web run test:chromium-accessibility +``` + +必要的补充门: + +```text +npm --prefix web run typecheck +npm --prefix web run build +git diff --check +``` + +## 产物和交接 + +- 报告:`tests/golden/M14-04H/chromium-accessibility-report.json` +- manifest:`tests/golden/M14-04H/manifest.json` +- 状态页:`docs/status/M14-04H.md` +- 下一任务:由 manifest 的 `nextTask` 决定 + +## 回滚 + +删除 accessibility checker、报告、manifest、package 命令和本任务状态页;恢复 `M14-04G` 作为队列尾, +不得修改 M14-04G 的布局证据。 diff --git a/docs/tasks/M15-01A.md b/docs/tasks/M15-01A.md new file mode 100644 index 00000000..30b1605e --- /dev/null +++ b/docs/tasks/M15-01A.md @@ -0,0 +1,58 @@ +# M15-01A:Blender 5.2 RNA data-block type inventory + +- `task`: `M15-01A` +- `parent`: `M14-04H` +- `status`: `done` + +## 目标 + +使用 pinned Blender 5.2 runtime 的真实 RNA 注册表生成稳定的 data-block type 清单;每项必须 +包含稳定 RNA identifier、类型名、ID 基类和 runtime/source anchor。此项只冻结 inventory, +不改变任何 V1 `releaseStatus` 或 Blender family `parityStatus`。 + +## 输入 + +- 上一个 manifest:`tests/golden/M14-04H/manifest.json` +- Blender runtime:`build_blender_5.2.0/bin/blender` +- 生成器:`tools/web/generate-blender-rna-datablock-inventory.py` +- 最小执行入口:`tools/web/check-blender-rna-datablock-inventory.mjs` + +## 范围 + +做: + +- 以 `bpy.types` 中继承 `bpy.types.ID` 的注册类型为 inventory 输入。 +- 固定 schema、排序、稳定 `parityId`、Blender version/build identity 和 source anchor。 +- 重新生成到临时目录并与提交的 golden JSON 做字节级比较。 +- 拒绝重复 identifier、空 identifier、版本漂移和未排序条目。 + +不做: + +- operator、modifier、node、editor、format 或 runtime evaluator 清单;这些由后续 M15-01B-F 负责。 +- 通过手写列表补齐 Blender 类型。 +- 修改 `parity-ledger.json` 的完成状态。 + +## 验收 + +```text +npm --prefix web run test:blender-rna-inventory +``` + +必要的补充门: + +```text +npm --prefix web run typecheck +git diff --check +``` + +## 产物和交接 + +- 报告/清单:`tests/golden/M15-01A/blender-rna-datablock-inventory.json` +- manifest:`tests/golden/M15-01A/manifest.json` +- 状态页:`docs/status/M15-01A.md` +- 下一任务:由 manifest 的 `nextTask` 决定 + +## 回滚 + +删除生成器、checker、报告、manifest、package 命令和本任务状态页;恢复 `M14-04H` 作为队列尾, +不得修改 M14-04H 的 Chromium 证据。 diff --git a/docs/tasks/M15-01B.md b/docs/tasks/M15-01B.md new file mode 100644 index 00000000..6c6b6d7b --- /dev/null +++ b/docs/tasks/M15-01B.md @@ -0,0 +1,58 @@ +# M15-01B:Blender 5.2 operator idname/poll/property inventory + +- `task`: `M15-01B` +- `parent`: `M15-01A` +- `status`: `in_progress` + +## 目标 + +从 pinned Blender 5.2 的真实 `bpy.ops` registry 生成确定性的 operator 清单,记录 operator +idname、RNA identifier、factory-startup poll 结果和排序后的 RNA properties。此项只生成机器 +基线,不把 operator 自动标记为已支持。 + +## 输入 + +- 上一个 manifest:`tests/golden/M15-01A/manifest.json` +- Blender runtime:`build_blender_5.2.0/bin/blender` +- 生成器:`tools/web/generate-blender-operator-inventory.py` +- checker:`tools/web/check-blender-operator-inventory.mjs` + +## 范围 + +做: + +- 递归枚举 `bpy.ops` 的注册 module/operator。 +- 记录稳定 operator path、RNA identifier、poll result/error 和属性 identifier/type。 +- 固定排序、去重、runtime identity 和 inventory hash;临时重生成必须字节相同。 + +不做: + +- 执行任意 operator 或修改 `.blend`。 +- 生成 modifier、node、editor 或 import/export 清单。 +- 把 `poll=false` 或 build-disabled 当成 parity 完成/阻断结论。 + +## 验收 + +```text +npm --prefix web run test:blender-operator-inventory +``` + +必要的补充门: + +```text +npm --prefix web run typecheck +git diff --check +``` + +## 产物和交接 + +- inventory:`tests/golden/M15-01B/blender-operator-inventory.json` +- report:`tests/golden/M15-01B/operator-inventory-check-report.json` +- manifest:`tests/golden/M15-01B/manifest.json` +- 状态页:`docs/status/M15-01B.md` +- 下一任务:由 manifest 的 `nextTask` 决定 + +## 回滚 + +删除 operator generator、checker、inventory、report、manifest、package 命令和本任务状态页;恢复 +`M15-01A` 作为队列尾,不修改 data-block inventory。 diff --git a/docs/tasks/M15-01C.md b/docs/tasks/M15-01C.md new file mode 100644 index 00000000..7cbaed60 --- /dev/null +++ b/docs/tasks/M15-01C.md @@ -0,0 +1,38 @@ +# M15-01C:Blender 5.2 modifier、constraint 与 node inventory + +- `task`: `M15-01C` +- `parent`: `M15-01B` +- `status`: `in_progress` + +## 目标 + +从 pinned Blender 5.2 的真实 RNA registry 生成 modifier、constraint、Shader Node、Geometry +Node 和 Compositor Node 清单。此项只冻结机器基线,不把任何条目标记为已支持。 + +## 输入 + +- 上一个 manifest:`tests/golden/M15-01B/manifest.json` +- Blender runtime:`build_blender_5.2.0/bin/blender` +- 生成器:`tools/web/generate-blender-family-inventory.py` +- checker:`tools/web/check-blender-family-inventory.mjs` + +## 验收 + +```text +npm --prefix web run test:blender-family-inventory +npm --prefix web run typecheck +git diff --check +``` + +## 产物和交接 + +- inventory:`tests/golden/M15-01C/blender-family-inventory.json` +- report:`tests/golden/M15-01C/family-inventory-check-report.json` +- manifest:`tests/golden/M15-01C/manifest.json` +- 状态页:`docs/status/M15-01C.md` +- 下一任务:由 manifest 的 `nextTask` 决定 + +## 回滚 + +删除 family generator、checker、inventory、report、manifest、package 命令和本任务状态页;恢复 +`M15-01B` 作为队列尾,不修改 operator inventory。 diff --git a/docs/tasks/M15-01D.md b/docs/tasks/M15-01D.md new file mode 100644 index 00000000..60edcde7 --- /dev/null +++ b/docs/tasks/M15-01D.md @@ -0,0 +1,38 @@ +# M15-01D:Blender 5.2 sequencer、physics 与 import/export inventory + +- `task`: `M15-01D` +- `parent`: `M15-01C` +- `status`: `in_progress` + +## 目标 + +从 pinned Blender 5.2 的真实 RNA/operator registry 生成 sequencer strip/effect 类型、physics +数据类型和 import/export operator 清单。此项只冻结机器基线,不把任何条目标记为已支持。 + +## 输入 + +- 上一个 manifest:`tests/golden/M15-01C/manifest.json` +- Blender runtime:`build_blender_5.2.0/bin/blender` +- 生成器:`tools/web/generate-blender-format-inventory.py` +- checker:`tools/web/check-blender-format-inventory.mjs` + +## 验收 + +```text +npm --prefix web run test:blender-format-inventory +npm --prefix web run typecheck +git diff --check +``` + +## 产物和交接 + +- inventory:`tests/golden/M15-01D/blender-format-inventory.json` +- report:`tests/golden/M15-01D/format-inventory-check-report.json` +- manifest:`tests/golden/M15-01D/manifest.json` +- 状态页:`docs/status/M15-01D.md` +- 下一任务:由 manifest 的 `nextTask` 决定 + +## 回滚 + +删除 format generator、checker、inventory、report、manifest、package 命令和本任务状态页;恢复 +`M15-01C` 作为队列尾,不修改 family inventory。 diff --git a/docs/tasks/M15-01E.md b/docs/tasks/M15-01E.md new file mode 100644 index 00000000..f67afd05 --- /dev/null +++ b/docs/tasks/M15-01E.md @@ -0,0 +1,31 @@ +# M15-01E:Blender 5.2 editor/space/region/workspace/keymap inventory + +- `task`: `M15-01E` +- `parent`: `M15-01D` +- `status`: `in_progress` + +## 目标 + +从 pinned Blender 5.2 的真实 RNA registry 和初始化后的默认 keyconfig 生成 editor、space、region、 +workspace mode 与 keymap 清单。此项只冻结机器基线,不把任何条目标记为已支持。 + +## 验收 + +```text +npm --prefix web run test:blender-editor-inventory +npm --prefix web run typecheck +git diff --check +``` + +## 产物和交接 + +- inventory:`tests/golden/M15-01E/blender-editor-inventory.json` +- report:`tests/golden/M15-01E/editor-inventory-check-report.json` +- manifest:`tests/golden/M15-01E/manifest.json` +- 状态页:`docs/status/M15-01E.md` +- 下一任务:由 manifest 的 `nextTask` 决定 + +## 回滚 + +删除 editor generator、checker、inventory、report、manifest、package 命令和本任务状态页;恢复 +`M15-01D` 作为队列尾,不修改 format inventory。 diff --git a/docs/tasks/M15-01F.md b/docs/tasks/M15-01F.md new file mode 100644 index 00000000..29ba52bc --- /dev/null +++ b/docs/tasks/M15-01F.md @@ -0,0 +1,31 @@ +# M15-01F:Blender 5.2 Main/Scene/Mesh/Depsgraph/core inventory + +- `task`: `M15-01F` +- `parent`: `M15-01E` +- `status`: `in_progress` + +## 目标 + +为 Main、Scene、Mesh、Depsgraph 和现有 V1 core slice 生成同级的 Blender 5.2 RNA 类与属性清单。 +此项只冻结机器基线,不把“当前范围完成”映射为全量 parity 完成。 + +## 验收 + +```text +npm --prefix web run test:blender-core-inventory +npm --prefix web run typecheck +git diff --check +``` + +## 产物和交接 + +- inventory:`tests/golden/M15-01F/blender-core-inventory.json` +- report:`tests/golden/M15-01F/core-inventory-check-report.json` +- manifest:`tests/golden/M15-01F/manifest.json` +- 状态页:`docs/status/M15-01F.md` +- 下一任务:由 manifest 的 `nextTask` 决定 + +## 回滚 + +删除 core generator、checker、inventory、report、manifest、package 命令和本任务状态页;恢复 +`M15-01E` 作为队列尾,不修改 editor inventory。 diff --git a/docs/tasks/M15-02A.md b/docs/tasks/M15-02A.md new file mode 100644 index 00000000..04245129 --- /dev/null +++ b/docs/tasks/M15-02A.md @@ -0,0 +1,31 @@ +# M15-02A:inventory 条目 owner/implementation/test/evidence 映射 + +- `task`: `M15-02A` +- `parent`: `M15-01F` +- `status`: `in_progress` + +## 目标 + +为 M15-01A 至 M15-01F 的每个 inventory 条目生成唯一稳定 ID,并绑定 owner family、实现分类、 +专项 checker 和 manifest evidence。映射保持 `INVENTORIED_ONLY`,不改变 parity 或 release 状态。 + +## 验收 + +```text +npm --prefix web run test:blender-parity-map +npm --prefix web run typecheck +git diff --check +``` + +## 产物和交接 + +- map:`tests/golden/M15-02A/blender-parity-map.json` +- report:`tests/golden/M15-02A/parity-map-check-report.json` +- manifest:`tests/golden/M15-02A/manifest.json` +- 状态页:`docs/status/M15-02A.md` +- 下一任务:由 manifest 的 `nextTask` 决定 + +## 回滚 + +删除 parity map generator、checker、map、report、manifest、package 命令和本任务状态页;恢复 +`M15-01F` 作为队列尾,不修改任何 inventory。 diff --git a/docs/tasks/M15-02B.md b/docs/tasks/M15-02B.md new file mode 100644 index 00000000..a5e9a53c --- /dev/null +++ b/docs/tasks/M15-02B.md @@ -0,0 +1,31 @@ +# M15-02B:parity map gap 分类审计 + +- `task`: `M15-02B` +- `parent`: `M15-02A` +- `status`: `in_progress` + +## 目标 + +机器化识别 inventory map 中的未映射、重复映射、只有 summary、只有 proxy 和只有 route 条目。 +`INVENTORY_BASELINE` 明确分类为 `summaryOnly`,不当作 parity 完成。 + +## 验收 + +```text +npm --prefix web run test:blender-gap-audit +npm --prefix web run typecheck +git diff --check +``` + +## 产物和交接 + +- audit:`tests/golden/M15-02B/blender-gap-audit.json` +- report:`tests/golden/M15-02B/gap-audit-check-report.json` +- manifest:`tests/golden/M15-02B/manifest.json` +- 状态页:`docs/status/M15-02B.md` +- 下一任务:由 manifest 的 `nextTask` 决定 + +## 回滚 + +删除 gap audit generator、checker、audit、report、manifest、package 命令和本任务状态页;恢复 +`M15-02A` 作为队列尾,不修改 parity map。 diff --git a/docs/tasks/M15-02C.md b/docs/tasks/M15-02C.md new file mode 100644 index 00000000..1b2cf622 --- /dev/null +++ b/docs/tasks/M15-02C.md @@ -0,0 +1,10 @@ +# M15-02C:LOCAL_EXACT 证据 fail-closed 审计 + +- `task`: `M15-02C` +- `parent`: `M15-02B` +- `status`: `in_progress` + +审计每条 `LOCAL_EXACT` 声明是否同时具备 desktop fixture、WASM fixture 和同 fixture 比较证据;当前 +inventory-only map 没有此类声明,结果必须为 `notApplicable`,不能推导 parity 完成。 + +验收:`npm --prefix web run test:blender-local-exact-audit`、`npm --prefix web run typecheck`、`git diff --check`。 diff --git a/docs/tasks/M15-02D.md b/docs/tasks/M15-02D.md new file mode 100644 index 00000000..e5f06865 --- /dev/null +++ b/docs/tasks/M15-02D.md @@ -0,0 +1,9 @@ +# M15-02D:LOCAL_EQUIVALENT 证据 fail-closed 审计 + +- `task`: `M15-02D` +- `parent`: `M15-02C` +- `status`: `pending` + +审计 Main 与 save/reopen 证据;无声明时输出 `notApplicable`,缺证据的声明必须阻断。 + +验收:`npm --prefix web run test:blender-local-equivalent-audit`、`npm --prefix web run typecheck`、`git diff --check`。 diff --git a/docs/tasks/M15-02E.md b/docs/tasks/M15-02E.md new file mode 100644 index 00000000..43d29369 --- /dev/null +++ b/docs/tasks/M15-02E.md @@ -0,0 +1,9 @@ +# M15-02E:SERVER_EXACT 证据 fail-closed 审计 + +- `task`: `M15-02E` +- `parent`: `M15-02D` +- `status`: `pending` + +审计真实 job、cancel、isolation、result binding 证据;无声明时输出 `notApplicable`,缺证据的声明必须阻断。 + +验收:`npm --prefix web run test:blender-server-exact-audit`、`npm --prefix web run typecheck`、`git diff --check`。 diff --git a/docs/tasks/M15-02F.md b/docs/tasks/M15-02F.md new file mode 100644 index 00000000..7c047468 --- /dev/null +++ b/docs/tasks/M15-02F.md @@ -0,0 +1,9 @@ +# M15-02F:unknown data 保存破坏 fail-closed 审计 + +- `task`: `M15-02F` +- `parent`: `M15-02E` +- `status`: `pending` + +审计 unknown-data fixture、save/reload 与 byte-preservation 证据;无声明时输出 `notApplicable`,缺证据的声明必须阻断。 + +验收:`npm --prefix web run test:blender-unknown-data-audit`、`npm --prefix web run typecheck`、`git diff --check`。 diff --git a/docs/tasks/M15-03A.md b/docs/tasks/M15-03A.md new file mode 100644 index 00000000..bfec79b4 --- /dev/null +++ b/docs/tasks/M15-03A.md @@ -0,0 +1,9 @@ +# M15-03A:每 gap 一个最小 nextTask + +- `task`: `M15-03A` +- `parent`: `M15-02F` +- `status`: `in_progress` + +为每个 gap 生成唯一最小任务,不生成“完成整个 family”的聚合任务;只允许一个 active task。 + +验收:`npm --prefix web run test:blender-next-task-plan`、`npm --prefix web run typecheck`、`git diff --check`。 diff --git a/docs/tasks/M15-03B.md b/docs/tasks/M15-03B.md new file mode 100644 index 00000000..d62f88c8 --- /dev/null +++ b/docs/tasks/M15-03B.md @@ -0,0 +1,9 @@ +# M15-03B:nextTask 完整规格审计 + +- `task`: `M15-03B` +- `parent`: `M15-03A` +- `status`: `in_progress` + +验证每个生成任务包含 fixture、desktop command、Web command、comparator 和退出条件。 + +验收:`npm --prefix web run test:blender-next-task-spec`、`npm --prefix web run typecheck`、`git diff --check`。 diff --git a/docs/tasks/M15-03C.md b/docs/tasks/M15-03C.md new file mode 100644 index 00000000..32afa14c --- /dev/null +++ b/docs/tasks/M15-03C.md @@ -0,0 +1,9 @@ +# M15-03C:nextTask 依赖图与单 active 指针 + +- `task`: `M15-03C` +- `parent`: `M15-03B` +- `status`: `pending` + +验证依赖无缺失、无环且仅有一个 active task。 + +验收:`npm --prefix web run test:blender-task-graph`、`npm --prefix web run typecheck`、`git diff --check`。 diff --git a/docs/tasks/M15-03D.md b/docs/tasks/M15-03D.md new file mode 100644 index 00000000..d6beb9f9 --- /dev/null +++ b/docs/tasks/M15-03D.md @@ -0,0 +1,9 @@ +# M15-03D:机器 gap 统计 + +- `task`: `M15-03D` +- `parent`: `M15-03C` +- `status`: `pending` + +分别输出 inventoried、completed、blocked、uninventoried,禁止聚合 gate 推导完成。 + +验收:`npm --prefix web run test:blender-task-stats`、`npm --prefix web run typecheck`、`git diff --check`。 diff --git a/docs/tasks/M15-03E.md b/docs/tasks/M15-03E.md new file mode 100644 index 00000000..6f888f2c --- /dev/null +++ b/docs/tasks/M15-03E.md @@ -0,0 +1,10 @@ +# M15-03E:owner family 零 gap closure gate + +- `task`: `M15-03E` +- `parent`: `M15-03D` +- `status`: `blocked` + +逐 family 验证零 gap。当前仍有 6,900 项,gate 必须为 `BLOCKED`,并把执行指针交给唯一 active +实现任务;不得由历史 release 聚合 gate 反推完成。 + +验收:`npm --prefix web run test:blender-zero-gap-gate`、`npm --prefix web run typecheck`、`git diff --check`。 diff --git a/docs/tasks/M16-GAP-00001.md b/docs/tasks/M16-GAP-00001.md new file mode 100644 index 00000000..43886f30 --- /dev/null +++ b/docs/tasks/M16-GAP-00001.md @@ -0,0 +1,18 @@ +# M16-GAP-00001:Action data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00001` +- `parent`: `M15-03E` +- `status`: `in_progress` +- `gap`: `datablock:Action` +- `ownerFamily`: `RNA_DATABLOCK` +- `targetImplementationClass`: `LOCAL_EXACT` + +## Required evidence + +- Fixture: `tests/files/web/generated/M16-GAP-00001-datablock-Action.blend` +- Desktop command: `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00001.py -- tests/files/web/generated/M16-GAP-00001-datablock-Action.blend` +- Web command: `npm --prefix web run test:generated-gap -- --task M16-GAP-00001` +- Comparator: `node tools/web/check-generated-gap.mjs --task M16-GAP-00001` + +The task cannot be marked complete until desktop/WASM same-fixture evidence, save/reopen Main evidence, +artifact hashes and the comparator result are present. diff --git a/docs/tasks/M16-GAP-00002.md b/docs/tasks/M16-GAP-00002.md new file mode 100644 index 00000000..c2749109 --- /dev/null +++ b/docs/tasks/M16-GAP-00002.md @@ -0,0 +1,18 @@ +# M16-GAP-00002:Armature data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00002` +- `parent`: `M16-GAP-00001` +- `status`: `in_progress` +- `gap`: `datablock:Armature` +- `ownerFamily`: `RNA_DATABLOCK` +- `targetImplementationClass`: `LOCAL_EXACT` + +## Required evidence + +- Fixture: `tests/files/web/generated/M16-GAP-00002-datablock-Armature.blend` +- Desktop command: `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00002.py -- tests/files/web/generated/M16-GAP-00002-datablock-Armature.blend` +- Web command: `npm --prefix web run test:generated-gap -- --task M16-GAP-00002` +- Comparator: `node tools/web/check-generated-gap.mjs --task M16-GAP-00002` + +The task remains blocked until a same-fixture desktop/WASM report, save/reopen evidence and artifact +manifest are present. The checker currently reports `IMPLEMENTATION_NOT_STARTED` for this pointer. diff --git a/docs/tasks/M16-GAP-00003.md b/docs/tasks/M16-GAP-00003.md new file mode 100644 index 00000000..ba6939e8 --- /dev/null +++ b/docs/tasks/M16-GAP-00003.md @@ -0,0 +1,11 @@ +# M16-GAP-00003:Brush data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00003` +- `parent`: `M16-GAP-00002` +- `status`: `in_progress` +- `gap`: `datablock:Brush` +- `ownerFamily`: `RNA_DATABLOCK` +- `targetImplementationClass`: `LOCAL_EXACT` + +Required fixture, Blender desktop report, WASM report, save/reopen comparison and manifest hashes must +be produced before completion. The generated-gap checker currently reports `IMPLEMENTATION_NOT_STARTED`. diff --git a/docs/tasks/M16-GAP-00004.md b/docs/tasks/M16-GAP-00004.md new file mode 100644 index 00000000..9eef3abe --- /dev/null +++ b/docs/tasks/M16-GAP-00004.md @@ -0,0 +1,11 @@ +# M16-GAP-00004:Camera data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00004` +- `parent`: `M16-GAP-00003` +- `status`: `in_progress` +- `gap`: `datablock:Camera` +- `ownerFamily`: `RNA_DATABLOCK` +- `targetImplementationClass`: `LOCAL_EXACT` + +Required fixture, Blender desktop report, WASM report, save/reopen comparison and manifest hashes must +be produced before completion. The generated-gap checker currently reports `IMPLEMENTATION_NOT_STARTED`. diff --git a/docs/tasks/M16-GAP-00005.md b/docs/tasks/M16-GAP-00005.md new file mode 100644 index 00000000..c61eb899 --- /dev/null +++ b/docs/tasks/M16-GAP-00005.md @@ -0,0 +1,9 @@ +# M16-GAP-00005:Collection data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00005` +- `parent`: `M16-GAP-00004` +- `status`: `in_progress` +- `gap`: `datablock:Collection` +- `targetImplementationClass`: `LOCAL_EXACT` + +The task requires same-fixture desktop/WASM collection hierarchy and save/reopen evidence. diff --git a/docs/tasks/M16-GAP-00006.md b/docs/tasks/M16-GAP-00006.md new file mode 100644 index 00000000..f61e0fdf --- /dev/null +++ b/docs/tasks/M16-GAP-00006.md @@ -0,0 +1,10 @@ +# M16-GAP-00006:Curve data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00006` +- `parent`: `M16-GAP-00005` +- `status`: `in_progress` +- `gap`: `datablock:Curve` +- `targetImplementationClass`: `LOCAL_EXACT` + +Required fixture, desktop/WASM curve geometry report, save/reopen comparison and manifest hashes are +still outstanding; checker reports `IMPLEMENTATION_NOT_STARTED`. diff --git a/docs/tasks/M16-GAP-00007.md b/docs/tasks/M16-GAP-00007.md new file mode 100644 index 00000000..fd64e624 --- /dev/null +++ b/docs/tasks/M16-GAP-00007.md @@ -0,0 +1,10 @@ +# M16-GAP-00007:Curves data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00007` +- `parent`: `M16-GAP-00006` +- `status`: `in_progress` +- `gap`: `datablock:Curves` +- `targetImplementationClass`: `LOCAL_EXACT` + +Required hair/curves fixture, desktop/WASM geometry report, save/reopen comparison and manifest hashes +are outstanding; checker reports `IMPLEMENTATION_NOT_STARTED`. diff --git a/docs/tasks/M16-GAP-00008.md b/docs/tasks/M16-GAP-00008.md new file mode 100644 index 00000000..228d37ee --- /dev/null +++ b/docs/tasks/M16-GAP-00008.md @@ -0,0 +1,9 @@ +# M16-GAP-00008:FreestyleLineStyle data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00008` +- `parent`: `M16-GAP-00007` +- `status`: `in_progress` +- `gap`: `datablock:FreestyleLineStyle` +- `targetImplementationClass`: `LOCAL_EXACT` + +Required style fixture, desktop/WASM evidence and save/reopen comparison are outstanding. diff --git a/docs/tasks/M16-GAP-00009.md b/docs/tasks/M16-GAP-00009.md new file mode 100644 index 00000000..4ea2356f --- /dev/null +++ b/docs/tasks/M16-GAP-00009.md @@ -0,0 +1,9 @@ +# M16-GAP-00009:GreasePencil data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00009` +- `parent`: `M16-GAP-00008` +- `status`: `in_progress` +- `gap`: `datablock:GreasePencil` +- `targetImplementationClass`: `LOCAL_EXACT` + +Required Grease Pencil drawing fixture, desktop/WASM evidence and save/reopen comparison are outstanding. diff --git a/docs/tasks/M16-GAP-00010.md b/docs/tasks/M16-GAP-00010.md new file mode 100644 index 00000000..a0fc71b0 --- /dev/null +++ b/docs/tasks/M16-GAP-00010.md @@ -0,0 +1,50 @@ +# M16-GAP-00010:Lattice data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00010` +- `parent`: `M16-GAP-00009` +- `status`: `done` +- `gap`: `datablock:Lattice` +- `ownerFamily`: `RNA_DATABLOCK` +- `targetImplementationClass`: `LOCAL_EXACT` + +## 目标 + +让同一个 Lattice fixture 在 Blender desktop 和 WASM/Main 中得到一致的点阵/形变数据,并在 save/reopen 后保持一致。 + +## 输入与范围 + +- Fixture:`tests/files/web/generated/M16-GAP-00010-datablock-Lattice.blend` +- 生产入口:`blender-5.2.0/source/blender/web_engine/`、`web/app/src/vendor/blender/` +- 检查器:`tools/web/check-generated-gap.mjs`、`tools/web/generated/M16-GAP-00010.py` +- 做:Lattice 数据读取、desktop/WASM 对标、save/reopen 和结构化报告。 +- 不做:其他 data-block、UI 编辑器、Firefox/WebKit 或完整 Lattice 编辑工具。 + +## 子任务门 + +| 门 | 唯一交付 | 通过条件 | +| --- | --- | --- | +| L-C | Lattice 字段/稳定 ID/错误码契约 | schema 和 malformed/unsupported 负例固定 | +| L-D | Blender desktop fixture/report | 同一 fixture 生成可重跑 report 和 hash | +| L-W | WASM/Main reader | 生产入口读取同一 fixture,输出字段与 desktop 对齐 | +| L-R | save/reopen | 新 Main 重开后点阵/形变和 revision 不变 | +| L-E | 证据交接 | comparator、manifest、status 和 rollback 全部可复验 | + +每次只推进一扇门;失败门保持 `in_progress`,不得用后续报告代替前置证据。 + +## 验收 + +```bash +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00010.py -- tests/files/web/generated/M16-GAP-00010-datablock-Lattice.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00010 +node tools/web/check-generated-gap.mjs --task M16-GAP-00010 +``` + +必须覆盖 malformed/unsupported 输入或取消路径;失败不得改变 Main revision 或推进 `nextTask`。 + +## 交付与回滚 + +- 报告:`tests/golden/M16-GAP-00010/` +- 状态:`docs/status/M16-GAP-00010.md` +- manifest:`tests/golden/M16-GAP-00010/manifest.json` +- 完成后运行 `node tools/web/check-task-context.mjs --task M16-GAP-00010 --write`。 +- 回滚:删除本任务新增的生产入口、测试、报告、manifest、status 和 context,恢复 parent manifest 为队列尾;不得改写 parent 成功证据。 diff --git a/docs/tasks/M16-GAP-00011.md b/docs/tasks/M16-GAP-00011.md new file mode 100644 index 00000000..6d396da3 --- /dev/null +++ b/docs/tasks/M16-GAP-00011.md @@ -0,0 +1,39 @@ +# M16-GAP-00011:Library data-block LOCAL_EXACT slice + +- `task`: `M16-GAP-00011` +- `parent`: `M16-GAP-00010` +- `status`: `in_progress` +- `gap`: `datablock:Library` +- `ownerFamily`: `RNA_DATABLOCK` +- `targetImplementationClass`: `LOCAL_EXACT` + +## 目标 + +让同一个 Library fixture 在 Blender desktop 和 WASM/Main 中得到一致的最小可观察数据,并在 save/reopen 后保持一致。只改变 `datablock:Library` 这一条 gap;不扩大到其他 data-block 或编辑器行为。 + +## 输入与范围 + +- Fixture:`tests/files/web/generated/M16-GAP-00011-datablock-Library.blend` +- 生成入口:`tools/web/generated/M16-GAP-00011.py` +- 生产入口:`blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- 检查器:`tools/web/check-generated-gap.mjs` +- 做:Library 字段读取、desktop/WASM 对标、save/reopen 和结构化报告。 +- 不做:其他 data-block、UI 编辑器、Firefox/WebKit 或完整 Library 管理器。 + +## 验收 + +```bash +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00011.py -- tests/files/web/generated/M16-GAP-00011-datablock-Library.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00011 +node tools/web/check-generated-gap.mjs --task M16-GAP-00011 +``` + +必须覆盖 malformed/unsupported 输入或取消路径;失败不得改变 Main revision 或推进 `nextTask`。命令未实际退出 0、fixture 不可重开或任一 hash 漂移时保持 `in_progress`,不得发布晚到的成功结果。 + +## 交付与回滚 + +- 报告:`tests/golden/M16-GAP-00011/` +- 状态:`docs/status/M16-GAP-00011.md` +- manifest:`tests/golden/M16-GAP-00011/manifest.json` +- 交接:`node tools/web/check-task-context.mjs --task M16-GAP-00011 --write` +- 回滚:删除本任务新增的生产入口、fixture、测试、报告、manifest、status 和 context;恢复 `M16-GAP-00010` 作为队列尾,不改写其成功证据。 diff --git a/docs/tasks/M16-GAP-00012.md b/docs/tasks/M16-GAP-00012.md new file mode 100644 index 00000000..1efe249b --- /dev/null +++ b/docs/tasks/M16-GAP-00012.md @@ -0,0 +1,37 @@ +# M16-GAP-00012: datablock:Light LOCAL_EXACT slice + +- task: M16-GAP-00012 +- parent: M16-GAP-00011 +- status: in_progress +- gap: datablock:Light +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Light data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00012-datablock-Light.blend` +- Generator: `tools/web/generated/M16-GAP-00012.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00012.py -- tests/files/web/generated/M16-GAP-00012-datablock-Light.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00012 +node tools/web/check-generated-gap.mjs --task M16-GAP-00012 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00012/` +- Status: `docs/status/M16-GAP-00012.md` +- Manifest: `tests/golden/M16-GAP-00012/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00012 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00013.md b/docs/tasks/M16-GAP-00013.md new file mode 100644 index 00000000..4b3079e4 --- /dev/null +++ b/docs/tasks/M16-GAP-00013.md @@ -0,0 +1,37 @@ +# M16-GAP-00013: datablock:Material LOCAL_EXACT slice + +- task: M16-GAP-00013 +- parent: M16-GAP-00012 +- status: in_progress +- gap: datablock:Material +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Material data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00013-datablock-Material.blend` +- Generator: `tools/web/generated/M16-GAP-00013.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00013.py -- tests/files/web/generated/M16-GAP-00013-datablock-Material.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00013 +node tools/web/check-generated-gap.mjs --task M16-GAP-00013 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00013/` +- Status: `docs/status/M16-GAP-00013.md` +- Manifest: `tests/golden/M16-GAP-00013/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00013 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00014.md b/docs/tasks/M16-GAP-00014.md new file mode 100644 index 00000000..f6dc29fc --- /dev/null +++ b/docs/tasks/M16-GAP-00014.md @@ -0,0 +1,37 @@ +# M16-GAP-00014: datablock:Mesh LOCAL_EXACT slice + +- task: M16-GAP-00014 +- parent: M16-GAP-00013 +- status: in_progress +- gap: datablock:Mesh +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Mesh data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00014-datablock-Mesh.blend` +- Generator: `tools/web/generated/M16-GAP-00014.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00014.py -- tests/files/web/generated/M16-GAP-00014-datablock-Mesh.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00014 +node tools/web/check-generated-gap.mjs --task M16-GAP-00014 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00014/` +- Status: `docs/status/M16-GAP-00014.md` +- Manifest: `tests/golden/M16-GAP-00014/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00014 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00015.md b/docs/tasks/M16-GAP-00015.md new file mode 100644 index 00000000..ee624bc1 --- /dev/null +++ b/docs/tasks/M16-GAP-00015.md @@ -0,0 +1,37 @@ +# M16-GAP-00015: datablock:MetaBall LOCAL_EXACT slice + +- task: M16-GAP-00015 +- parent: M16-GAP-00014 +- status: in_progress +- gap: datablock:MetaBall +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:MetaBall data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00015-datablock-MetaBall.blend` +- Generator: `tools/web/generated/M16-GAP-00015.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00015.py -- tests/files/web/generated/M16-GAP-00015-datablock-MetaBall.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00015 +node tools/web/check-generated-gap.mjs --task M16-GAP-00015 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00015/` +- Status: `docs/status/M16-GAP-00015.md` +- Manifest: `tests/golden/M16-GAP-00015/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00015 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00016.md b/docs/tasks/M16-GAP-00016.md new file mode 100644 index 00000000..1d31d572 --- /dev/null +++ b/docs/tasks/M16-GAP-00016.md @@ -0,0 +1,37 @@ +# M16-GAP-00016: datablock:NodeTree LOCAL_EXACT slice + +- task: M16-GAP-00016 +- parent: M16-GAP-00015 +- status: in_progress +- gap: datablock:NodeTree +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:NodeTree data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00016-datablock-NodeTree.blend` +- Generator: `tools/web/generated/M16-GAP-00016.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00016.py -- tests/files/web/generated/M16-GAP-00016-datablock-NodeTree.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00016 +node tools/web/check-generated-gap.mjs --task M16-GAP-00016 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00016/` +- Status: `docs/status/M16-GAP-00016.md` +- Manifest: `tests/golden/M16-GAP-00016/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00016 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00017.md b/docs/tasks/M16-GAP-00017.md new file mode 100644 index 00000000..09cbeefe --- /dev/null +++ b/docs/tasks/M16-GAP-00017.md @@ -0,0 +1,37 @@ +# M16-GAP-00017: datablock:Object LOCAL_EXACT slice + +- task: M16-GAP-00017 +- parent: M16-GAP-00016 +- status: in_progress +- gap: datablock:Object +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Object data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00017-datablock-Object.blend` +- Generator: `tools/web/generated/M16-GAP-00017.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00017.py -- tests/files/web/generated/M16-GAP-00017-datablock-Object.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00017 +node tools/web/check-generated-gap.mjs --task M16-GAP-00017 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00017/` +- Status: `docs/status/M16-GAP-00017.md` +- Manifest: `tests/golden/M16-GAP-00017/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00017 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00018.md b/docs/tasks/M16-GAP-00018.md new file mode 100644 index 00000000..7e147348 --- /dev/null +++ b/docs/tasks/M16-GAP-00018.md @@ -0,0 +1,37 @@ +# M16-GAP-00018: datablock:ParticleSettings LOCAL_EXACT slice + +- task: M16-GAP-00018 +- parent: M16-GAP-00017 +- status: in_progress +- gap: datablock:ParticleSettings +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:ParticleSettings data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00018-datablock-ParticleSettings.blend` +- Generator: `tools/web/generated/M16-GAP-00018.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00018.py -- tests/files/web/generated/M16-GAP-00018-datablock-ParticleSettings.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00018 +node tools/web/check-generated-gap.mjs --task M16-GAP-00018 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00018/` +- Status: `docs/status/M16-GAP-00018.md` +- Manifest: `tests/golden/M16-GAP-00018/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00018 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00019.md b/docs/tasks/M16-GAP-00019.md new file mode 100644 index 00000000..1ffd84b6 --- /dev/null +++ b/docs/tasks/M16-GAP-00019.md @@ -0,0 +1,37 @@ +# M16-GAP-00019: datablock:PointCloud LOCAL_EXACT slice + +- task: M16-GAP-00019 +- parent: M16-GAP-00018 +- status: in_progress +- gap: datablock:PointCloud +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:PointCloud data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00019-datablock-PointCloud.blend` +- Generator: `tools/web/generated/M16-GAP-00019.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00019.py -- tests/files/web/generated/M16-GAP-00019-datablock-PointCloud.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00019 +node tools/web/check-generated-gap.mjs --task M16-GAP-00019 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00019/` +- Status: `docs/status/M16-GAP-00019.md` +- Manifest: `tests/golden/M16-GAP-00019/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00019 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00020.md b/docs/tasks/M16-GAP-00020.md new file mode 100644 index 00000000..b402596a --- /dev/null +++ b/docs/tasks/M16-GAP-00020.md @@ -0,0 +1,37 @@ +# M16-GAP-00020: datablock:Scene LOCAL_EXACT slice + +- task: M16-GAP-00020 +- parent: M16-GAP-00019 +- status: in_progress +- gap: datablock:Scene +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Scene data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00020-datablock-Scene.blend` +- Generator: `tools/web/generated/M16-GAP-00020.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00020.py -- tests/files/web/generated/M16-GAP-00020-datablock-Scene.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00020 +node tools/web/check-generated-gap.mjs --task M16-GAP-00020 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00020/` +- Status: `docs/status/M16-GAP-00020.md` +- Manifest: `tests/golden/M16-GAP-00020/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00020 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00021.md b/docs/tasks/M16-GAP-00021.md new file mode 100644 index 00000000..e1650a17 --- /dev/null +++ b/docs/tasks/M16-GAP-00021.md @@ -0,0 +1,37 @@ +# M16-GAP-00021: datablock:Screen LOCAL_EXACT slice + +- task: M16-GAP-00021 +- parent: M16-GAP-00020 +- status: in_progress +- gap: datablock:Screen +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Screen data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00021-datablock-Screen.blend` +- Generator: `tools/web/generated/M16-GAP-00021.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00021.py -- tests/files/web/generated/M16-GAP-00021-datablock-Screen.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00021 +node tools/web/check-generated-gap.mjs --task M16-GAP-00021 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00021/` +- Status: `docs/status/M16-GAP-00021.md` +- Manifest: `tests/golden/M16-GAP-00021/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00021 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00022.md b/docs/tasks/M16-GAP-00022.md new file mode 100644 index 00000000..e194c6b1 --- /dev/null +++ b/docs/tasks/M16-GAP-00022.md @@ -0,0 +1,37 @@ +# M16-GAP-00022: datablock:Sound LOCAL_EXACT slice + +- task: M16-GAP-00022 +- parent: M16-GAP-00021 +- status: in_progress +- gap: datablock:Sound +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Sound data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00022-datablock-Sound.blend` +- Generator: `tools/web/generated/M16-GAP-00022.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00022.py -- tests/files/web/generated/M16-GAP-00022-datablock-Sound.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00022 +node tools/web/check-generated-gap.mjs --task M16-GAP-00022 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00022/` +- Status: `docs/status/M16-GAP-00022.md` +- Manifest: `tests/golden/M16-GAP-00022/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00022 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00023.md b/docs/tasks/M16-GAP-00023.md new file mode 100644 index 00000000..ecae34da --- /dev/null +++ b/docs/tasks/M16-GAP-00023.md @@ -0,0 +1,37 @@ +# M16-GAP-00023: datablock:Speaker LOCAL_EXACT slice + +- task: M16-GAP-00023 +- parent: M16-GAP-00022 +- status: in_progress +- gap: datablock:Speaker +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Speaker data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00023-datablock-Speaker.blend` +- Generator: `tools/web/generated/M16-GAP-00023.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00023.py -- tests/files/web/generated/M16-GAP-00023-datablock-Speaker.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00023 +node tools/web/check-generated-gap.mjs --task M16-GAP-00023 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00023/` +- Status: `docs/status/M16-GAP-00023.md` +- Manifest: `tests/golden/M16-GAP-00023/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00023 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00024.md b/docs/tasks/M16-GAP-00024.md new file mode 100644 index 00000000..6889183f --- /dev/null +++ b/docs/tasks/M16-GAP-00024.md @@ -0,0 +1,37 @@ +# M16-GAP-00024: datablock:Text LOCAL_EXACT slice + +- task: M16-GAP-00024 +- parent: M16-GAP-00023 +- status: in_progress +- gap: datablock:Text +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Text data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00024-datablock-Text.blend` +- Generator: `tools/web/generated/M16-GAP-00024.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00024.py -- tests/files/web/generated/M16-GAP-00024-datablock-Text.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00024 +node tools/web/check-generated-gap.mjs --task M16-GAP-00024 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00024/` +- Status: `docs/status/M16-GAP-00024.md` +- Manifest: `tests/golden/M16-GAP-00024/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00024 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00025.md b/docs/tasks/M16-GAP-00025.md new file mode 100644 index 00000000..afc3dcf5 --- /dev/null +++ b/docs/tasks/M16-GAP-00025.md @@ -0,0 +1,37 @@ +# M16-GAP-00025: datablock:Texture LOCAL_EXACT slice + +- task: M16-GAP-00025 +- parent: M16-GAP-00024 +- status: in_progress +- gap: datablock:Texture +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Texture data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00025-datablock-Texture.blend` +- Generator: `tools/web/generated/M16-GAP-00025.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00025.py -- tests/files/web/generated/M16-GAP-00025-datablock-Texture.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00025 +node tools/web/check-generated-gap.mjs --task M16-GAP-00025 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00025/` +- Status: `docs/status/M16-GAP-00025.md` +- Manifest: `tests/golden/M16-GAP-00025/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00025 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00026.md b/docs/tasks/M16-GAP-00026.md new file mode 100644 index 00000000..149a39d3 --- /dev/null +++ b/docs/tasks/M16-GAP-00026.md @@ -0,0 +1,37 @@ +# M16-GAP-00026: datablock:Volume LOCAL_EXACT slice + +- task: M16-GAP-00026 +- parent: M16-GAP-00025 +- status: in_progress +- gap: datablock:Volume +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:Volume data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00026-datablock-Volume.blend` +- Generator: `tools/web/generated/M16-GAP-00026.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00026.py -- tests/files/web/generated/M16-GAP-00026-datablock-Volume.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00026 +node tools/web/check-generated-gap.mjs --task M16-GAP-00026 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00026/` +- Status: `docs/status/M16-GAP-00026.md` +- Manifest: `tests/golden/M16-GAP-00026/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00026 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00027.md b/docs/tasks/M16-GAP-00027.md new file mode 100644 index 00000000..bfdd3029 --- /dev/null +++ b/docs/tasks/M16-GAP-00027.md @@ -0,0 +1,37 @@ +# M16-GAP-00027: datablock:WindowManager LOCAL_EXACT slice + +- task: M16-GAP-00027 +- parent: M16-GAP-00026 +- status: in_progress +- gap: datablock:WindowManager +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:WindowManager data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00027-datablock-WindowManager.blend` +- Generator: `tools/web/generated/M16-GAP-00027.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00027.py -- tests/files/web/generated/M16-GAP-00027-datablock-WindowManager.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00027 +node tools/web/check-generated-gap.mjs --task M16-GAP-00027 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00027/` +- Status: `docs/status/M16-GAP-00027.md` +- Manifest: `tests/golden/M16-GAP-00027/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00027 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00028.md b/docs/tasks/M16-GAP-00028.md new file mode 100644 index 00000000..74848707 --- /dev/null +++ b/docs/tasks/M16-GAP-00028.md @@ -0,0 +1,37 @@ +# M16-GAP-00028: datablock:WorkSpace LOCAL_EXACT slice + +- task: M16-GAP-00028 +- parent: M16-GAP-00027 +- status: in_progress +- gap: datablock:WorkSpace +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:WorkSpace data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00028-datablock-WorkSpace.blend` +- Generator: `tools/web/generated/M16-GAP-00028.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00028.py -- tests/files/web/generated/M16-GAP-00028-datablock-WorkSpace.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00028 +node tools/web/check-generated-gap.mjs --task M16-GAP-00028 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00028/` +- Status: `docs/status/M16-GAP-00028.md` +- Manifest: `tests/golden/M16-GAP-00028/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00028 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00029.md b/docs/tasks/M16-GAP-00029.md new file mode 100644 index 00000000..cfa2b3e1 --- /dev/null +++ b/docs/tasks/M16-GAP-00029.md @@ -0,0 +1,37 @@ +# M16-GAP-00029: datablock:World LOCAL_EXACT slice + +- task: M16-GAP-00029 +- parent: M16-GAP-00028 +- status: in_progress +- gap: datablock:World +- ownerFamily: RNA_DATABLOCK +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable datablock:World data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00029-datablock-World.blend` +- Generator: `tools/web/generated/M16-GAP-00029.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00029.py -- tests/files/web/generated/M16-GAP-00029-datablock-World.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00029 +node tools/web/check-generated-gap.mjs --task M16-GAP-00029 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00029/` +- Status: `docs/status/M16-GAP-00029.md` +- Manifest: `tests/golden/M16-GAP-00029/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00029 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00030.md b/docs/tasks/M16-GAP-00030.md new file mode 100644 index 00000000..772a5629 --- /dev/null +++ b/docs/tasks/M16-GAP-00030.md @@ -0,0 +1,37 @@ +# M16-GAP-00030: modifier:ARMATURE LOCAL_EXACT slice + +- task: M16-GAP-00030 +- parent: M16-GAP-00029 +- status: in_progress +- gap: modifier:ARMATURE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:ARMATURE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00030-modifier-ARMATURE.blend` +- Generator: `tools/web/generated/M16-GAP-00030.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00030.py -- tests/files/web/generated/M16-GAP-00030-modifier-ARMATURE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00030 +node tools/web/check-generated-gap.mjs --task M16-GAP-00030 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00030/` +- Status: `docs/status/M16-GAP-00030.md` +- Manifest: `tests/golden/M16-GAP-00030/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00030 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00031.md b/docs/tasks/M16-GAP-00031.md new file mode 100644 index 00000000..2acf869d --- /dev/null +++ b/docs/tasks/M16-GAP-00031.md @@ -0,0 +1,37 @@ +# M16-GAP-00031: modifier:ARRAY LOCAL_EXACT slice + +- task: M16-GAP-00031 +- parent: M16-GAP-00030 +- status: in_progress +- gap: modifier:ARRAY +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:ARRAY data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00031-modifier-ARRAY.blend` +- Generator: `tools/web/generated/M16-GAP-00031.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00031.py -- tests/files/web/generated/M16-GAP-00031-modifier-ARRAY.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00031 +node tools/web/check-generated-gap.mjs --task M16-GAP-00031 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00031/` +- Status: `docs/status/M16-GAP-00031.md` +- Manifest: `tests/golden/M16-GAP-00031/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00031 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00032.md b/docs/tasks/M16-GAP-00032.md new file mode 100644 index 00000000..49427a1d --- /dev/null +++ b/docs/tasks/M16-GAP-00032.md @@ -0,0 +1,37 @@ +# M16-GAP-00032: modifier:BEVEL LOCAL_EXACT slice + +- task: M16-GAP-00032 +- parent: M16-GAP-00031 +- status: in_progress +- gap: modifier:BEVEL +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:BEVEL data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00032-modifier-BEVEL.blend` +- Generator: `tools/web/generated/M16-GAP-00032.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00032.py -- tests/files/web/generated/M16-GAP-00032-modifier-BEVEL.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00032 +node tools/web/check-generated-gap.mjs --task M16-GAP-00032 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00032/` +- Status: `docs/status/M16-GAP-00032.md` +- Manifest: `tests/golden/M16-GAP-00032/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00032 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00033.md b/docs/tasks/M16-GAP-00033.md new file mode 100644 index 00000000..f8d331fa --- /dev/null +++ b/docs/tasks/M16-GAP-00033.md @@ -0,0 +1,37 @@ +# M16-GAP-00033: modifier:BOOLEAN LOCAL_EXACT slice + +- task: M16-GAP-00033 +- parent: M16-GAP-00032 +- status: in_progress +- gap: modifier:BOOLEAN +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:BOOLEAN data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00033-modifier-BOOLEAN.blend` +- Generator: `tools/web/generated/M16-GAP-00033.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00033.py -- tests/files/web/generated/M16-GAP-00033-modifier-BOOLEAN.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00033 +node tools/web/check-generated-gap.mjs --task M16-GAP-00033 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00033/` +- Status: `docs/status/M16-GAP-00033.md` +- Manifest: `tests/golden/M16-GAP-00033/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00033 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00034.md b/docs/tasks/M16-GAP-00034.md new file mode 100644 index 00000000..bd5ab763 --- /dev/null +++ b/docs/tasks/M16-GAP-00034.md @@ -0,0 +1,37 @@ +# M16-GAP-00034: modifier:BUILD LOCAL_EXACT slice + +- task: M16-GAP-00034 +- parent: M16-GAP-00033 +- status: in_progress +- gap: modifier:BUILD +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:BUILD data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00034-modifier-BUILD.blend` +- Generator: `tools/web/generated/M16-GAP-00034.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00034.py -- tests/files/web/generated/M16-GAP-00034-modifier-BUILD.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00034 +node tools/web/check-generated-gap.mjs --task M16-GAP-00034 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00034/` +- Status: `docs/status/M16-GAP-00034.md` +- Manifest: `tests/golden/M16-GAP-00034/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00034 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00035.md b/docs/tasks/M16-GAP-00035.md new file mode 100644 index 00000000..72ced045 --- /dev/null +++ b/docs/tasks/M16-GAP-00035.md @@ -0,0 +1,37 @@ +# M16-GAP-00035: modifier:CAST LOCAL_EXACT slice + +- task: M16-GAP-00035 +- parent: M16-GAP-00034 +- status: in_progress +- gap: modifier:CAST +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:CAST data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00035-modifier-CAST.blend` +- Generator: `tools/web/generated/M16-GAP-00035.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00035.py -- tests/files/web/generated/M16-GAP-00035-modifier-CAST.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00035 +node tools/web/check-generated-gap.mjs --task M16-GAP-00035 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00035/` +- Status: `docs/status/M16-GAP-00035.md` +- Manifest: `tests/golden/M16-GAP-00035/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00035 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00036.md b/docs/tasks/M16-GAP-00036.md new file mode 100644 index 00000000..8911a5c2 --- /dev/null +++ b/docs/tasks/M16-GAP-00036.md @@ -0,0 +1,37 @@ +# M16-GAP-00036: modifier:CLOTH LOCAL_EXACT slice + +- task: M16-GAP-00036 +- parent: M16-GAP-00035 +- status: in_progress +- gap: modifier:CLOTH +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:CLOTH data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00036-modifier-CLOTH.blend` +- Generator: `tools/web/generated/M16-GAP-00036.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00036.py -- tests/files/web/generated/M16-GAP-00036-modifier-CLOTH.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00036 +node tools/web/check-generated-gap.mjs --task M16-GAP-00036 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00036/` +- Status: `docs/status/M16-GAP-00036.md` +- Manifest: `tests/golden/M16-GAP-00036/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00036 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00037.md b/docs/tasks/M16-GAP-00037.md new file mode 100644 index 00000000..788b81d8 --- /dev/null +++ b/docs/tasks/M16-GAP-00037.md @@ -0,0 +1,37 @@ +# M16-GAP-00037: modifier:COLLISION LOCAL_EXACT slice + +- task: M16-GAP-00037 +- parent: M16-GAP-00036 +- status: in_progress +- gap: modifier:COLLISION +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:COLLISION data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00037-modifier-COLLISION.blend` +- Generator: `tools/web/generated/M16-GAP-00037.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00037.py -- tests/files/web/generated/M16-GAP-00037-modifier-COLLISION.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00037 +node tools/web/check-generated-gap.mjs --task M16-GAP-00037 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00037/` +- Status: `docs/status/M16-GAP-00037.md` +- Manifest: `tests/golden/M16-GAP-00037/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00037 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00038.md b/docs/tasks/M16-GAP-00038.md new file mode 100644 index 00000000..97c0b11d --- /dev/null +++ b/docs/tasks/M16-GAP-00038.md @@ -0,0 +1,37 @@ +# M16-GAP-00038: modifier:CORRECTIVE_SMOOTH LOCAL_EXACT slice + +- task: M16-GAP-00038 +- parent: M16-GAP-00037 +- status: in_progress +- gap: modifier:CORRECTIVE_SMOOTH +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:CORRECTIVE_SMOOTH data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00038-modifier-CORRECTIVE_SMOOTH.blend` +- Generator: `tools/web/generated/M16-GAP-00038.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00038.py -- tests/files/web/generated/M16-GAP-00038-modifier-CORRECTIVE_SMOOTH.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00038 +node tools/web/check-generated-gap.mjs --task M16-GAP-00038 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00038/` +- Status: `docs/status/M16-GAP-00038.md` +- Manifest: `tests/golden/M16-GAP-00038/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00038 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00039.md b/docs/tasks/M16-GAP-00039.md new file mode 100644 index 00000000..f157fb59 --- /dev/null +++ b/docs/tasks/M16-GAP-00039.md @@ -0,0 +1,37 @@ +# M16-GAP-00039: modifier:CURVE LOCAL_EXACT slice + +- task: M16-GAP-00039 +- parent: M16-GAP-00038 +- status: in_progress +- gap: modifier:CURVE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:CURVE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00039-modifier-CURVE.blend` +- Generator: `tools/web/generated/M16-GAP-00039.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00039.py -- tests/files/web/generated/M16-GAP-00039-modifier-CURVE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00039 +node tools/web/check-generated-gap.mjs --task M16-GAP-00039 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00039/` +- Status: `docs/status/M16-GAP-00039.md` +- Manifest: `tests/golden/M16-GAP-00039/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00039 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00040.md b/docs/tasks/M16-GAP-00040.md new file mode 100644 index 00000000..b1a1557a --- /dev/null +++ b/docs/tasks/M16-GAP-00040.md @@ -0,0 +1,37 @@ +# M16-GAP-00040: modifier:DATA_TRANSFER LOCAL_EXACT slice + +- task: M16-GAP-00040 +- parent: M16-GAP-00039 +- status: in_progress +- gap: modifier:DATA_TRANSFER +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:DATA_TRANSFER data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00040-modifier-DATA_TRANSFER.blend` +- Generator: `tools/web/generated/M16-GAP-00040.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00040.py -- tests/files/web/generated/M16-GAP-00040-modifier-DATA_TRANSFER.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00040 +node tools/web/check-generated-gap.mjs --task M16-GAP-00040 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00040/` +- Status: `docs/status/M16-GAP-00040.md` +- Manifest: `tests/golden/M16-GAP-00040/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00040 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00041.md b/docs/tasks/M16-GAP-00041.md new file mode 100644 index 00000000..7d751b0a --- /dev/null +++ b/docs/tasks/M16-GAP-00041.md @@ -0,0 +1,37 @@ +# M16-GAP-00041: modifier:DECIMATE LOCAL_EXACT slice + +- task: M16-GAP-00041 +- parent: M16-GAP-00040 +- status: in_progress +- gap: modifier:DECIMATE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:DECIMATE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend` +- Generator: `tools/web/generated/M16-GAP-00041.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00041.py -- tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00041 +node tools/web/check-generated-gap.mjs --task M16-GAP-00041 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00041/` +- Status: `docs/status/M16-GAP-00041.md` +- Manifest: `tests/golden/M16-GAP-00041/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00041 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00042.md b/docs/tasks/M16-GAP-00042.md new file mode 100644 index 00000000..e174bccb --- /dev/null +++ b/docs/tasks/M16-GAP-00042.md @@ -0,0 +1,37 @@ +# M16-GAP-00042: modifier:DISPLACE LOCAL_EXACT slice + +- task: M16-GAP-00042 +- parent: M16-GAP-00041 +- status: in_progress +- gap: modifier:DISPLACE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:DISPLACE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00042-modifier-DISPLACE.blend` +- Generator: `tools/web/generated/M16-GAP-00042.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00042.py -- tests/files/web/generated/M16-GAP-00042-modifier-DISPLACE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00042 +node tools/web/check-generated-gap.mjs --task M16-GAP-00042 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00042/` +- Status: `docs/status/M16-GAP-00042.md` +- Manifest: `tests/golden/M16-GAP-00042/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00042 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00043.md b/docs/tasks/M16-GAP-00043.md new file mode 100644 index 00000000..91b9ab83 --- /dev/null +++ b/docs/tasks/M16-GAP-00043.md @@ -0,0 +1,37 @@ +# M16-GAP-00043: modifier:DYNAMIC_PAINT LOCAL_EXACT slice + +- task: M16-GAP-00043 +- parent: M16-GAP-00042 +- status: in_progress +- gap: modifier:DYNAMIC_PAINT +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:DYNAMIC_PAINT data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00043-modifier-DYNAMIC_PAINT.blend` +- Generator: `tools/web/generated/M16-GAP-00043.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00043.py -- tests/files/web/generated/M16-GAP-00043-modifier-DYNAMIC_PAINT.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00043 +node tools/web/check-generated-gap.mjs --task M16-GAP-00043 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00043/` +- Status: `docs/status/M16-GAP-00043.md` +- Manifest: `tests/golden/M16-GAP-00043/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00043 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00044.md b/docs/tasks/M16-GAP-00044.md new file mode 100644 index 00000000..6b107091 --- /dev/null +++ b/docs/tasks/M16-GAP-00044.md @@ -0,0 +1,37 @@ +# M16-GAP-00044: modifier:EDGE_SPLIT LOCAL_EXACT slice + +- task: M16-GAP-00044 +- parent: M16-GAP-00043 +- status: in_progress +- gap: modifier:EDGE_SPLIT +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:EDGE_SPLIT data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00044-modifier-EDGE_SPLIT.blend` +- Generator: `tools/web/generated/M16-GAP-00044.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00044.py -- tests/files/web/generated/M16-GAP-00044-modifier-EDGE_SPLIT.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00044 +node tools/web/check-generated-gap.mjs --task M16-GAP-00044 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00044/` +- Status: `docs/status/M16-GAP-00044.md` +- Manifest: `tests/golden/M16-GAP-00044/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00044 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00045.md b/docs/tasks/M16-GAP-00045.md new file mode 100644 index 00000000..10743b0f --- /dev/null +++ b/docs/tasks/M16-GAP-00045.md @@ -0,0 +1,37 @@ +# M16-GAP-00045: modifier:EXPLODE LOCAL_EXACT slice + +- task: M16-GAP-00045 +- parent: M16-GAP-00044 +- status: in_progress +- gap: modifier:EXPLODE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:EXPLODE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00045-modifier-EXPLODE.blend` +- Generator: `tools/web/generated/M16-GAP-00045.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00045.py -- tests/files/web/generated/M16-GAP-00045-modifier-EXPLODE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00045 +node tools/web/check-generated-gap.mjs --task M16-GAP-00045 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00045/` +- Status: `docs/status/M16-GAP-00045.md` +- Manifest: `tests/golden/M16-GAP-00045/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00045 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00046.md b/docs/tasks/M16-GAP-00046.md new file mode 100644 index 00000000..0faff94e --- /dev/null +++ b/docs/tasks/M16-GAP-00046.md @@ -0,0 +1,37 @@ +# M16-GAP-00046: modifier:FLUID LOCAL_EXACT slice + +- task: M16-GAP-00046 +- parent: M16-GAP-00045 +- status: in_progress +- gap: modifier:FLUID +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:FLUID data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00046-modifier-FLUID.blend` +- Generator: `tools/web/generated/M16-GAP-00046.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00046.py -- tests/files/web/generated/M16-GAP-00046-modifier-FLUID.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00046 +node tools/web/check-generated-gap.mjs --task M16-GAP-00046 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00046/` +- Status: `docs/status/M16-GAP-00046.md` +- Manifest: `tests/golden/M16-GAP-00046/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00046 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00047.md b/docs/tasks/M16-GAP-00047.md new file mode 100644 index 00000000..e7655a83 --- /dev/null +++ b/docs/tasks/M16-GAP-00047.md @@ -0,0 +1,37 @@ +# M16-GAP-00047: modifier:GREASE_PENCIL_ARMATURE LOCAL_EXACT slice + +- task: M16-GAP-00047 +- parent: M16-GAP-00046 +- status: in_progress +- gap: modifier:GREASE_PENCIL_ARMATURE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_ARMATURE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00047-modifier-GREASE_PENCIL_ARMATURE.blend` +- Generator: `tools/web/generated/M16-GAP-00047.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00047.py -- tests/files/web/generated/M16-GAP-00047-modifier-GREASE_PENCIL_ARMATURE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00047 +node tools/web/check-generated-gap.mjs --task M16-GAP-00047 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00047/` +- Status: `docs/status/M16-GAP-00047.md` +- Manifest: `tests/golden/M16-GAP-00047/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00047 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00048.md b/docs/tasks/M16-GAP-00048.md new file mode 100644 index 00000000..973de0c9 --- /dev/null +++ b/docs/tasks/M16-GAP-00048.md @@ -0,0 +1,37 @@ +# M16-GAP-00048: modifier:GREASE_PENCIL_ARRAY LOCAL_EXACT slice + +- task: M16-GAP-00048 +- parent: M16-GAP-00047 +- status: in_progress +- gap: modifier:GREASE_PENCIL_ARRAY +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_ARRAY data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00048-modifier-GREASE_PENCIL_ARRAY.blend` +- Generator: `tools/web/generated/M16-GAP-00048.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00048.py -- tests/files/web/generated/M16-GAP-00048-modifier-GREASE_PENCIL_ARRAY.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00048 +node tools/web/check-generated-gap.mjs --task M16-GAP-00048 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00048/` +- Status: `docs/status/M16-GAP-00048.md` +- Manifest: `tests/golden/M16-GAP-00048/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00048 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00049.md b/docs/tasks/M16-GAP-00049.md new file mode 100644 index 00000000..8e272091 --- /dev/null +++ b/docs/tasks/M16-GAP-00049.md @@ -0,0 +1,37 @@ +# M16-GAP-00049: modifier:GREASE_PENCIL_BUILD LOCAL_EXACT slice + +- task: M16-GAP-00049 +- parent: M16-GAP-00048 +- status: in_progress +- gap: modifier:GREASE_PENCIL_BUILD +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_BUILD data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00049-modifier-GREASE_PENCIL_BUILD.blend` +- Generator: `tools/web/generated/M16-GAP-00049.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00049.py -- tests/files/web/generated/M16-GAP-00049-modifier-GREASE_PENCIL_BUILD.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00049 +node tools/web/check-generated-gap.mjs --task M16-GAP-00049 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00049/` +- Status: `docs/status/M16-GAP-00049.md` +- Manifest: `tests/golden/M16-GAP-00049/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00049 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00050.md b/docs/tasks/M16-GAP-00050.md new file mode 100644 index 00000000..98ba4247 --- /dev/null +++ b/docs/tasks/M16-GAP-00050.md @@ -0,0 +1,37 @@ +# M16-GAP-00050: modifier:GREASE_PENCIL_COLOR LOCAL_EXACT slice + +- task: M16-GAP-00050 +- parent: M16-GAP-00049 +- status: in_progress +- gap: modifier:GREASE_PENCIL_COLOR +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_COLOR data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00050-modifier-GREASE_PENCIL_COLOR.blend` +- Generator: `tools/web/generated/M16-GAP-00050.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00050.py -- tests/files/web/generated/M16-GAP-00050-modifier-GREASE_PENCIL_COLOR.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00050 +node tools/web/check-generated-gap.mjs --task M16-GAP-00050 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00050/` +- Status: `docs/status/M16-GAP-00050.md` +- Manifest: `tests/golden/M16-GAP-00050/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00050 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00051.md b/docs/tasks/M16-GAP-00051.md new file mode 100644 index 00000000..94268cd3 --- /dev/null +++ b/docs/tasks/M16-GAP-00051.md @@ -0,0 +1,37 @@ +# M16-GAP-00051: modifier:GREASE_PENCIL_DASH LOCAL_EXACT slice + +- task: M16-GAP-00051 +- parent: M16-GAP-00050 +- status: in_progress +- gap: modifier:GREASE_PENCIL_DASH +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_DASH data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00051-modifier-GREASE_PENCIL_DASH.blend` +- Generator: `tools/web/generated/M16-GAP-00051.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00051.py -- tests/files/web/generated/M16-GAP-00051-modifier-GREASE_PENCIL_DASH.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00051 +node tools/web/check-generated-gap.mjs --task M16-GAP-00051 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00051/` +- Status: `docs/status/M16-GAP-00051.md` +- Manifest: `tests/golden/M16-GAP-00051/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00051 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00052.md b/docs/tasks/M16-GAP-00052.md new file mode 100644 index 00000000..69832439 --- /dev/null +++ b/docs/tasks/M16-GAP-00052.md @@ -0,0 +1,37 @@ +# M16-GAP-00052: modifier:GREASE_PENCIL_ENVELOPE LOCAL_EXACT slice + +- task: M16-GAP-00052 +- parent: M16-GAP-00051 +- status: in_progress +- gap: modifier:GREASE_PENCIL_ENVELOPE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_ENVELOPE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00052-modifier-GREASE_PENCIL_ENVELOPE.blend` +- Generator: `tools/web/generated/M16-GAP-00052.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00052.py -- tests/files/web/generated/M16-GAP-00052-modifier-GREASE_PENCIL_ENVELOPE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00052 +node tools/web/check-generated-gap.mjs --task M16-GAP-00052 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00052/` +- Status: `docs/status/M16-GAP-00052.md` +- Manifest: `tests/golden/M16-GAP-00052/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00052 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00053.md b/docs/tasks/M16-GAP-00053.md new file mode 100644 index 00000000..cfba467d --- /dev/null +++ b/docs/tasks/M16-GAP-00053.md @@ -0,0 +1,37 @@ +# M16-GAP-00053: modifier:GREASE_PENCIL_HOOK LOCAL_EXACT slice + +- task: M16-GAP-00053 +- parent: M16-GAP-00052 +- status: in_progress +- gap: modifier:GREASE_PENCIL_HOOK +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_HOOK data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00053-modifier-GREASE_PENCIL_HOOK.blend` +- Generator: `tools/web/generated/M16-GAP-00053.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00053.py -- tests/files/web/generated/M16-GAP-00053-modifier-GREASE_PENCIL_HOOK.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00053 +node tools/web/check-generated-gap.mjs --task M16-GAP-00053 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00053/` +- Status: `docs/status/M16-GAP-00053.md` +- Manifest: `tests/golden/M16-GAP-00053/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00053 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00054.md b/docs/tasks/M16-GAP-00054.md new file mode 100644 index 00000000..0b5b11a0 --- /dev/null +++ b/docs/tasks/M16-GAP-00054.md @@ -0,0 +1,37 @@ +# M16-GAP-00054: modifier:GREASE_PENCIL_LATTICE LOCAL_EXACT slice + +- task: M16-GAP-00054 +- parent: M16-GAP-00053 +- status: in_progress +- gap: modifier:GREASE_PENCIL_LATTICE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_LATTICE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00054-modifier-GREASE_PENCIL_LATTICE.blend` +- Generator: `tools/web/generated/M16-GAP-00054.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00054.py -- tests/files/web/generated/M16-GAP-00054-modifier-GREASE_PENCIL_LATTICE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00054 +node tools/web/check-generated-gap.mjs --task M16-GAP-00054 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00054/` +- Status: `docs/status/M16-GAP-00054.md` +- Manifest: `tests/golden/M16-GAP-00054/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00054 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00055.md b/docs/tasks/M16-GAP-00055.md new file mode 100644 index 00000000..a271d92d --- /dev/null +++ b/docs/tasks/M16-GAP-00055.md @@ -0,0 +1,37 @@ +# M16-GAP-00055: modifier:GREASE_PENCIL_LENGTH LOCAL_EXACT slice + +- task: M16-GAP-00055 +- parent: M16-GAP-00054 +- status: in_progress +- gap: modifier:GREASE_PENCIL_LENGTH +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_LENGTH data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00055-modifier-GREASE_PENCIL_LENGTH.blend` +- Generator: `tools/web/generated/M16-GAP-00055.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00055.py -- tests/files/web/generated/M16-GAP-00055-modifier-GREASE_PENCIL_LENGTH.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00055 +node tools/web/check-generated-gap.mjs --task M16-GAP-00055 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00055/` +- Status: `docs/status/M16-GAP-00055.md` +- Manifest: `tests/golden/M16-GAP-00055/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00055 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00056.md b/docs/tasks/M16-GAP-00056.md new file mode 100644 index 00000000..081cc7bb --- /dev/null +++ b/docs/tasks/M16-GAP-00056.md @@ -0,0 +1,37 @@ +# M16-GAP-00056: modifier:GREASE_PENCIL_MIRROR LOCAL_EXACT slice + +- task: M16-GAP-00056 +- parent: M16-GAP-00055 +- status: in_progress +- gap: modifier:GREASE_PENCIL_MIRROR +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_MIRROR data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00056-modifier-GREASE_PENCIL_MIRROR.blend` +- Generator: `tools/web/generated/M16-GAP-00056.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00056.py -- tests/files/web/generated/M16-GAP-00056-modifier-GREASE_PENCIL_MIRROR.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00056 +node tools/web/check-generated-gap.mjs --task M16-GAP-00056 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00056/` +- Status: `docs/status/M16-GAP-00056.md` +- Manifest: `tests/golden/M16-GAP-00056/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00056 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00057.md b/docs/tasks/M16-GAP-00057.md new file mode 100644 index 00000000..b3e221cc --- /dev/null +++ b/docs/tasks/M16-GAP-00057.md @@ -0,0 +1,37 @@ +# M16-GAP-00057: modifier:GREASE_PENCIL_MULTIPLY LOCAL_EXACT slice + +- task: M16-GAP-00057 +- parent: M16-GAP-00056 +- status: in_progress +- gap: modifier:GREASE_PENCIL_MULTIPLY +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_MULTIPLY data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00057-modifier-GREASE_PENCIL_MULTIPLY.blend` +- Generator: `tools/web/generated/M16-GAP-00057.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00057.py -- tests/files/web/generated/M16-GAP-00057-modifier-GREASE_PENCIL_MULTIPLY.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00057 +node tools/web/check-generated-gap.mjs --task M16-GAP-00057 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00057/` +- Status: `docs/status/M16-GAP-00057.md` +- Manifest: `tests/golden/M16-GAP-00057/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00057 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00058.md b/docs/tasks/M16-GAP-00058.md new file mode 100644 index 00000000..24711d44 --- /dev/null +++ b/docs/tasks/M16-GAP-00058.md @@ -0,0 +1,37 @@ +# M16-GAP-00058: modifier:GREASE_PENCIL_NOISE LOCAL_EXACT slice + +- task: M16-GAP-00058 +- parent: M16-GAP-00057 +- status: in_progress +- gap: modifier:GREASE_PENCIL_NOISE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_NOISE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00058-modifier-GREASE_PENCIL_NOISE.blend` +- Generator: `tools/web/generated/M16-GAP-00058.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00058.py -- tests/files/web/generated/M16-GAP-00058-modifier-GREASE_PENCIL_NOISE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00058 +node tools/web/check-generated-gap.mjs --task M16-GAP-00058 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00058/` +- Status: `docs/status/M16-GAP-00058.md` +- Manifest: `tests/golden/M16-GAP-00058/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00058 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00059.md b/docs/tasks/M16-GAP-00059.md new file mode 100644 index 00000000..f8911eed --- /dev/null +++ b/docs/tasks/M16-GAP-00059.md @@ -0,0 +1,37 @@ +# M16-GAP-00059: modifier:GREASE_PENCIL_OFFSET LOCAL_EXACT slice + +- task: M16-GAP-00059 +- parent: M16-GAP-00058 +- status: in_progress +- gap: modifier:GREASE_PENCIL_OFFSET +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_OFFSET data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00059-modifier-GREASE_PENCIL_OFFSET.blend` +- Generator: `tools/web/generated/M16-GAP-00059.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00059.py -- tests/files/web/generated/M16-GAP-00059-modifier-GREASE_PENCIL_OFFSET.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00059 +node tools/web/check-generated-gap.mjs --task M16-GAP-00059 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00059/` +- Status: `docs/status/M16-GAP-00059.md` +- Manifest: `tests/golden/M16-GAP-00059/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00059 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00060.md b/docs/tasks/M16-GAP-00060.md new file mode 100644 index 00000000..98277c8d --- /dev/null +++ b/docs/tasks/M16-GAP-00060.md @@ -0,0 +1,37 @@ +# M16-GAP-00060: modifier:GREASE_PENCIL_OPACITY LOCAL_EXACT slice + +- task: M16-GAP-00060 +- parent: M16-GAP-00059 +- status: in_progress +- gap: modifier:GREASE_PENCIL_OPACITY +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_OPACITY data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00060-modifier-GREASE_PENCIL_OPACITY.blend` +- Generator: `tools/web/generated/M16-GAP-00060.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00060.py -- tests/files/web/generated/M16-GAP-00060-modifier-GREASE_PENCIL_OPACITY.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00060 +node tools/web/check-generated-gap.mjs --task M16-GAP-00060 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00060/` +- Status: `docs/status/M16-GAP-00060.md` +- Manifest: `tests/golden/M16-GAP-00060/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00060 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00061.md b/docs/tasks/M16-GAP-00061.md new file mode 100644 index 00000000..8d9bb3c0 --- /dev/null +++ b/docs/tasks/M16-GAP-00061.md @@ -0,0 +1,37 @@ +# M16-GAP-00061: modifier:GREASE_PENCIL_OUTLINE LOCAL_EXACT slice + +- task: M16-GAP-00061 +- parent: M16-GAP-00060 +- status: in_progress +- gap: modifier:GREASE_PENCIL_OUTLINE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_OUTLINE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00061-modifier-GREASE_PENCIL_OUTLINE.blend` +- Generator: `tools/web/generated/M16-GAP-00061.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00061.py -- tests/files/web/generated/M16-GAP-00061-modifier-GREASE_PENCIL_OUTLINE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00061 +node tools/web/check-generated-gap.mjs --task M16-GAP-00061 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00061/` +- Status: `docs/status/M16-GAP-00061.md` +- Manifest: `tests/golden/M16-GAP-00061/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00061 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00062.md b/docs/tasks/M16-GAP-00062.md new file mode 100644 index 00000000..ed4afa64 --- /dev/null +++ b/docs/tasks/M16-GAP-00062.md @@ -0,0 +1,37 @@ +# M16-GAP-00062: modifier:GREASE_PENCIL_SHRINKWRAP LOCAL_EXACT slice + +- task: M16-GAP-00062 +- parent: M16-GAP-00061 +- status: in_progress +- gap: modifier:GREASE_PENCIL_SHRINKWRAP +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_SHRINKWRAP data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00062-modifier-GREASE_PENCIL_SHRINKWRAP.blend` +- Generator: `tools/web/generated/M16-GAP-00062.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00062.py -- tests/files/web/generated/M16-GAP-00062-modifier-GREASE_PENCIL_SHRINKWRAP.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00062 +node tools/web/check-generated-gap.mjs --task M16-GAP-00062 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00062/` +- Status: `docs/status/M16-GAP-00062.md` +- Manifest: `tests/golden/M16-GAP-00062/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00062 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00063.md b/docs/tasks/M16-GAP-00063.md new file mode 100644 index 00000000..0f8b10a0 --- /dev/null +++ b/docs/tasks/M16-GAP-00063.md @@ -0,0 +1,37 @@ +# M16-GAP-00063: modifier:GREASE_PENCIL_SIMPLIFY LOCAL_EXACT slice + +- task: M16-GAP-00063 +- parent: M16-GAP-00062 +- status: in_progress +- gap: modifier:GREASE_PENCIL_SIMPLIFY +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_SIMPLIFY data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00063-modifier-GREASE_PENCIL_SIMPLIFY.blend` +- Generator: `tools/web/generated/M16-GAP-00063.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00063.py -- tests/files/web/generated/M16-GAP-00063-modifier-GREASE_PENCIL_SIMPLIFY.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00063 +node tools/web/check-generated-gap.mjs --task M16-GAP-00063 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00063/` +- Status: `docs/status/M16-GAP-00063.md` +- Manifest: `tests/golden/M16-GAP-00063/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00063 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00064.md b/docs/tasks/M16-GAP-00064.md new file mode 100644 index 00000000..e581c33e --- /dev/null +++ b/docs/tasks/M16-GAP-00064.md @@ -0,0 +1,37 @@ +# M16-GAP-00064: modifier:GREASE_PENCIL_SMOOTH LOCAL_EXACT slice + +- task: M16-GAP-00064 +- parent: M16-GAP-00063 +- status: in_progress +- gap: modifier:GREASE_PENCIL_SMOOTH +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_SMOOTH data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00064-modifier-GREASE_PENCIL_SMOOTH.blend` +- Generator: `tools/web/generated/M16-GAP-00064.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00064.py -- tests/files/web/generated/M16-GAP-00064-modifier-GREASE_PENCIL_SMOOTH.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00064 +node tools/web/check-generated-gap.mjs --task M16-GAP-00064 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00064/` +- Status: `docs/status/M16-GAP-00064.md` +- Manifest: `tests/golden/M16-GAP-00064/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00064 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00065.md b/docs/tasks/M16-GAP-00065.md new file mode 100644 index 00000000..3ed9712a --- /dev/null +++ b/docs/tasks/M16-GAP-00065.md @@ -0,0 +1,37 @@ +# M16-GAP-00065: modifier:GREASE_PENCIL_SUBDIV LOCAL_EXACT slice + +- task: M16-GAP-00065 +- parent: M16-GAP-00064 +- status: in_progress +- gap: modifier:GREASE_PENCIL_SUBDIV +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_SUBDIV data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00065-modifier-GREASE_PENCIL_SUBDIV.blend` +- Generator: `tools/web/generated/M16-GAP-00065.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00065.py -- tests/files/web/generated/M16-GAP-00065-modifier-GREASE_PENCIL_SUBDIV.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00065 +node tools/web/check-generated-gap.mjs --task M16-GAP-00065 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00065/` +- Status: `docs/status/M16-GAP-00065.md` +- Manifest: `tests/golden/M16-GAP-00065/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00065 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00066.md b/docs/tasks/M16-GAP-00066.md new file mode 100644 index 00000000..7d299d9d --- /dev/null +++ b/docs/tasks/M16-GAP-00066.md @@ -0,0 +1,37 @@ +# M16-GAP-00066: modifier:GREASE_PENCIL_TEXTURE LOCAL_EXACT slice + +- task: M16-GAP-00066 +- parent: M16-GAP-00065 +- status: in_progress +- gap: modifier:GREASE_PENCIL_TEXTURE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_TEXTURE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00066-modifier-GREASE_PENCIL_TEXTURE.blend` +- Generator: `tools/web/generated/M16-GAP-00066.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00066.py -- tests/files/web/generated/M16-GAP-00066-modifier-GREASE_PENCIL_TEXTURE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00066 +node tools/web/check-generated-gap.mjs --task M16-GAP-00066 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00066/` +- Status: `docs/status/M16-GAP-00066.md` +- Manifest: `tests/golden/M16-GAP-00066/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00066 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00067.md b/docs/tasks/M16-GAP-00067.md new file mode 100644 index 00000000..797b1d81 --- /dev/null +++ b/docs/tasks/M16-GAP-00067.md @@ -0,0 +1,37 @@ +# M16-GAP-00067: modifier:GREASE_PENCIL_THICKNESS LOCAL_EXACT slice + +- task: M16-GAP-00067 +- parent: M16-GAP-00066 +- status: in_progress +- gap: modifier:GREASE_PENCIL_THICKNESS +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_THICKNESS data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00067-modifier-GREASE_PENCIL_THICKNESS.blend` +- Generator: `tools/web/generated/M16-GAP-00067.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00067.py -- tests/files/web/generated/M16-GAP-00067-modifier-GREASE_PENCIL_THICKNESS.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00067 +node tools/web/check-generated-gap.mjs --task M16-GAP-00067 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00067/` +- Status: `docs/status/M16-GAP-00067.md` +- Manifest: `tests/golden/M16-GAP-00067/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00067 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00068.md b/docs/tasks/M16-GAP-00068.md new file mode 100644 index 00000000..194dbdbe --- /dev/null +++ b/docs/tasks/M16-GAP-00068.md @@ -0,0 +1,37 @@ +# M16-GAP-00068: modifier:GREASE_PENCIL_TIME LOCAL_EXACT slice + +- task: M16-GAP-00068 +- parent: M16-GAP-00067 +- status: in_progress +- gap: modifier:GREASE_PENCIL_TIME +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_TIME data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00068-modifier-GREASE_PENCIL_TIME.blend` +- Generator: `tools/web/generated/M16-GAP-00068.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00068.py -- tests/files/web/generated/M16-GAP-00068-modifier-GREASE_PENCIL_TIME.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00068 +node tools/web/check-generated-gap.mjs --task M16-GAP-00068 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00068/` +- Status: `docs/status/M16-GAP-00068.md` +- Manifest: `tests/golden/M16-GAP-00068/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00068 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00069.md b/docs/tasks/M16-GAP-00069.md new file mode 100644 index 00000000..45ce002f --- /dev/null +++ b/docs/tasks/M16-GAP-00069.md @@ -0,0 +1,37 @@ +# M16-GAP-00069: modifier:GREASE_PENCIL_TINT LOCAL_EXACT slice + +- task: M16-GAP-00069 +- parent: M16-GAP-00068 +- status: in_progress +- gap: modifier:GREASE_PENCIL_TINT +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_TINT data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00069-modifier-GREASE_PENCIL_TINT.blend` +- Generator: `tools/web/generated/M16-GAP-00069.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00069.py -- tests/files/web/generated/M16-GAP-00069-modifier-GREASE_PENCIL_TINT.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00069 +node tools/web/check-generated-gap.mjs --task M16-GAP-00069 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00069/` +- Status: `docs/status/M16-GAP-00069.md` +- Manifest: `tests/golden/M16-GAP-00069/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00069 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00070.md b/docs/tasks/M16-GAP-00070.md new file mode 100644 index 00000000..0945c68c --- /dev/null +++ b/docs/tasks/M16-GAP-00070.md @@ -0,0 +1,37 @@ +# M16-GAP-00070: modifier:GREASE_PENCIL_VERTEX_WEIGHT_ANGLE LOCAL_EXACT slice + +- task: M16-GAP-00070 +- parent: M16-GAP-00069 +- status: in_progress +- gap: modifier:GREASE_PENCIL_VERTEX_WEIGHT_ANGLE +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_VERTEX_WEIGHT_ANGLE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00070-modifier-GREASE_PENCIL_VERTEX_WEIGHT_ANGLE.blend` +- Generator: `tools/web/generated/M16-GAP-00070.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00070.py -- tests/files/web/generated/M16-GAP-00070-modifier-GREASE_PENCIL_VERTEX_WEIGHT_ANGLE.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00070 +node tools/web/check-generated-gap.mjs --task M16-GAP-00070 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00070/` +- Status: `docs/status/M16-GAP-00070.md` +- Manifest: `tests/golden/M16-GAP-00070/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00070 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/docs/tasks/M16-GAP-00071.md b/docs/tasks/M16-GAP-00071.md new file mode 100644 index 00000000..4844ecb5 --- /dev/null +++ b/docs/tasks/M16-GAP-00071.md @@ -0,0 +1,37 @@ +# M16-GAP-00071: modifier:GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY LOCAL_EXACT slice + +- task: M16-GAP-00071 +- parent: M16-GAP-00070 +- status: in_progress +- gap: modifier:GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Make the same minimal fixture produce observable modifier:GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers. + +## 输入与范围 + +- Fixture: `tests/files/web/generated/M16-GAP-00071-modifier-GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY.blend` +- Generator: `tools/web/generated/M16-GAP-00071.py` +- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Checker: `tools/web/check-generated-gap.mjs` +- Do: field read, desktop/WASM comparison, save/reopen, structured report. +- Do not: other gaps, Firefox/WebKit, or full editor behavior. + +## 验收 + +build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00071.py -- tests/files/web/generated/M16-GAP-00071-modifier-GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY.blend +npm --prefix web run test:generated-gap -- --task M16-GAP-00071 +node tools/web/check-generated-gap.mjs --task M16-GAP-00071 + +Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/M16-GAP-00071/` +- Status: `docs/status/M16-GAP-00071.md` +- Manifest: `tests/golden/M16-GAP-00071/manifest.json` +- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00071 --write` +- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence. diff --git a/tests/files/web/generated/M16-GAP-00001-datablock-Action.blend b/tests/files/web/generated/M16-GAP-00001-datablock-Action.blend new file mode 100644 index 0000000000000000000000000000000000000000..e441471300d34a2f9ea4a3053fb0b0cacca5a2ff GIT binary patch literal 86769 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%0AD~C&hRU9&CCn0Xu@mW- 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�iXOER`k@eUG2sdj(KLF>3?8lAwsxy2 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 P4gvrJ00000vFehKRU;xs literal 0 HcmV?d00001 diff --git a/tests/files/web/generated/M16-GAP-00004-datablock-Camera.blend b/tests/files/web/generated/M16-GAP-00004-datablock-Camera.blend new file mode 100644 index 0000000000000000000000000000000000000000..bd885dfede9ff01d4882ce691e5f4b4b0075e51e GIT binary patch literal 86379 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

  • +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 literal 0 HcmV?d00001 diff --git a/tests/files/web/generated/M16-GAP-00005-datablock-Collection.blend b/tests/files/web/generated/M16-GAP-00005-datablock-Collection.blend new file mode 100644 index 0000000000000000000000000000000000000000..d05746309d700abccfdf4c2e19c1e58301bdb3cc GIT binary patch literal 86454 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

    jHDus&!y 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