Continue Blender Web parity task handoff
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

This commit is contained in:
mes123456
2026-08-23 05:47:21 -04:00
parent 0a22992a13
commit 9f43244982
962 changed files with 60772 additions and 297 deletions

View File

@@ -172,5 +172,94 @@
"operator:anim.channels_view_selected",
"operator:anim.clear_useless_actions",
"operator:anim.copy_driver_button",
"operator:anim.driver_button_add"
"operator:anim.driver_button_add",
"operator:anim.driver_button_edit",
"operator:anim.driver_button_remove",
"operator:anim.end_frame_set",
"operator:anim.keyframe_clear_button",
"operator:anim.keyframe_clear_v3d",
"operator:anim.keyframe_clear_vse",
"operator:anim.keyframe_delete",
"operator:anim.keyframe_delete_button",
"operator:anim.keyframe_delete_by_name",
"operator:anim.keyframe_delete_v3d",
"operator:anim.keyframe_delete_vse",
"operator:anim.keyframe_insert",
"operator:anim.keyframe_insert_button",
"operator:anim.keyframe_insert_by_name",
"operator:anim.keyframe_insert_menu",
"operator:anim.keying_set_active_set",
"operator:anim.keying_set_add",
"operator:anim.keying_set_export",
"operator:anim.keying_set_path_add",
"operator:anim.keying_set_path_remove",
"operator:anim.keying_set_remove",
"operator:anim.keyingset_button_add",
"operator:anim.keyingset_button_remove",
"operator:anim.merge_animation",
"operator:anim.paste_driver_button",
"operator:anim.previewrange_clear",
"operator:anim.previewrange_set",
"operator:anim.replace_action",
"operator:anim.replace_action_new",
"operator:anim.scene_range_frame",
"operator:anim.separate_slots",
"operator:anim.slot_channels_move_to_new_action",
"operator:anim.slot_new_for_id",
"operator:anim.slot_unassign_from_constraint",
"operator:anim.slot_unassign_from_id",
"operator:anim.slot_unassign_from_nla_strip",
"operator:anim.start_frame_set",
"operator:anim.update_animated_transform_constraints",
"operator:anim.version_bone_hide_property",
"operator:anim.view_curve_in_graph_editor",
"operator:armature.align",
"operator:armature.assign_to_collection",
"operator:armature.autoside_names",
"operator:armature.bone_primitive_add",
"operator:armature.calculate_roll",
"operator:armature.click_extrude",
"operator:armature.collection_add",
"operator:armature.collection_assign",
"operator:armature.collection_create_and_assign",
"operator:armature.collection_deselect",
"operator:armature.collection_move",
"operator:armature.collection_remove",
"operator:armature.collection_remove_unused",
"operator:armature.collection_select",
"operator:armature.collection_show_all",
"operator:armature.collection_unassign",
"operator:armature.collection_unassign_named",
"operator:armature.collection_unsolo_all",
"operator:armature.copy_bone_color_to_selected",
"operator:armature.delete",
"operator:armature.dissolve",
"operator:armature.duplicate",
"operator:armature.duplicate_move",
"operator:armature.duplicate_rename",
"operator:armature.extrude",
"operator:armature.extrude_forked",
"operator:armature.extrude_move",
"operator:armature.fill",
"operator:armature.flip_names",
"operator:armature.hide",
"operator:armature.move_to_collection",
"operator:armature.parent_clear",
"operator:armature.parent_set",
"operator:armature.reveal",
"operator:armature.roll_clear",
"operator:armature.select_all",
"operator:armature.select_hierarchy",
"operator:armature.select_less",
"operator:armature.select_linked",
"operator:armature.select_linked_pick",
"operator:armature.select_mirror",
"operator:armature.select_more",
"operator:armature.select_similar",
"operator:armature.separate",
"operator:armature.shortest_path_pick",
"operator:armature.split",
"operator:armature.subdivide",
"operator:armature.switch_direction",
"operator:armature.symmetrize"
]

View File

@@ -20,11 +20,11 @@
},
"plan": {
"path": "tests/golden/M15-03A/next-task-plan.json",
"sha256": "a57fb3d61f40361920529f42f8664b24393ed1db7d220e14fc123aaafb62b8c7"
"sha256": "f10310d6530d8a9adfde0bc6bca35e4bfae7a05169028e1a8b36e374b059c8bb"
},
"report": {
"path": "tests/golden/M15-03A/next-task-plan-check-report.json",
"sha256": "f444269c15dc0ec8beb88590019add5b6d22afb91012a016e47dae31c87b0851"
"sha256": "1fede6a6bba0a935ffbdc1aa21ea7ca0addd741139b754c2a27d380eacf5c794"
},
"package": {
"path": "web/package.json",

View File

@@ -5,8 +5,8 @@
"summary": {
"taskCount": 6900,
"active": 1,
"pending": 6725,
"completed": 174,
"pending": 6636,
"completed": 263,
"blocked": 0,
"byWave": {
"M16": 2667,
@@ -18,7 +18,7 @@
"M22": 19
}
},
"firstTask": "M16-GAP-00175",
"planSha256": "a57fb3d61f40361920529f42f8664b24393ed1db7d220e14fc123aaafb62b8c7",
"firstTask": "M16-GAP-00264",
"planSha256": "f10310d6530d8a9adfde0bc6bca35e4bfae7a05169028e1a8b36e374b059c8bb",
"nextTask": "M15-03B"
}

View File

@@ -13,14 +13,14 @@
},
"completions": {
"path": "tests/golden/M15-03A/completed-gap-tasks.json",
"sha256": "420e0de0b9d018752dfb355bf82a9936a7f2dd4e4b73c6147cd52c3d3e0e419b"
"sha256": "b927d84d995f64669fabdcb50019a7db895d9a6f4e004913122d32c2dfca01ac"
}
},
"summary": {
"taskCount": 6900,
"active": 1,
"pending": 6725,
"completed": 174,
"pending": 6636,
"completed": 263,
"blocked": 0,
"byWave": {
"M16": 2667,
@@ -4040,7 +4040,7 @@
"gapId": "operator:anim.driver_button_edit",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "active",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4063,7 +4063,7 @@
"gapId": "operator:anim.driver_button_remove",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4086,7 +4086,7 @@
"gapId": "operator:anim.end_frame_set",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4109,7 +4109,7 @@
"gapId": "operator:anim.keyframe_clear_button",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4132,7 +4132,7 @@
"gapId": "operator:anim.keyframe_clear_v3d",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4155,7 +4155,7 @@
"gapId": "operator:anim.keyframe_clear_vse",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4178,7 +4178,7 @@
"gapId": "operator:anim.keyframe_delete",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4201,7 +4201,7 @@
"gapId": "operator:anim.keyframe_delete_button",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4224,7 +4224,7 @@
"gapId": "operator:anim.keyframe_delete_by_name",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4247,7 +4247,7 @@
"gapId": "operator:anim.keyframe_delete_v3d",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4270,7 +4270,7 @@
"gapId": "operator:anim.keyframe_delete_vse",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4293,7 +4293,7 @@
"gapId": "operator:anim.keyframe_insert",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4316,7 +4316,7 @@
"gapId": "operator:anim.keyframe_insert_button",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4339,7 +4339,7 @@
"gapId": "operator:anim.keyframe_insert_by_name",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4362,7 +4362,7 @@
"gapId": "operator:anim.keyframe_insert_menu",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4385,7 +4385,7 @@
"gapId": "operator:anim.keying_set_active_set",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4408,7 +4408,7 @@
"gapId": "operator:anim.keying_set_add",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4431,7 +4431,7 @@
"gapId": "operator:anim.keying_set_export",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4454,7 +4454,7 @@
"gapId": "operator:anim.keying_set_path_add",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4477,7 +4477,7 @@
"gapId": "operator:anim.keying_set_path_remove",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4500,7 +4500,7 @@
"gapId": "operator:anim.keying_set_remove",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4523,7 +4523,7 @@
"gapId": "operator:anim.keyingset_button_add",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4546,7 +4546,7 @@
"gapId": "operator:anim.keyingset_button_remove",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4569,7 +4569,7 @@
"gapId": "operator:anim.merge_animation",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4592,7 +4592,7 @@
"gapId": "operator:anim.paste_driver_button",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4615,7 +4615,7 @@
"gapId": "operator:anim.previewrange_clear",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4638,7 +4638,7 @@
"gapId": "operator:anim.previewrange_set",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4661,7 +4661,7 @@
"gapId": "operator:anim.replace_action",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4684,7 +4684,7 @@
"gapId": "operator:anim.replace_action_new",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4707,7 +4707,7 @@
"gapId": "operator:anim.scene_range_frame",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4730,7 +4730,7 @@
"gapId": "operator:anim.separate_slots",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4753,7 +4753,7 @@
"gapId": "operator:anim.slot_channels_move_to_new_action",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4776,7 +4776,7 @@
"gapId": "operator:anim.slot_new_for_id",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4799,7 +4799,7 @@
"gapId": "operator:anim.slot_unassign_from_constraint",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4822,7 +4822,7 @@
"gapId": "operator:anim.slot_unassign_from_id",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4845,7 +4845,7 @@
"gapId": "operator:anim.slot_unassign_from_nla_strip",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4868,7 +4868,7 @@
"gapId": "operator:anim.start_frame_set",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4891,7 +4891,7 @@
"gapId": "operator:anim.update_animated_transform_constraints",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4914,7 +4914,7 @@
"gapId": "operator:anim.version_bone_hide_property",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4937,7 +4937,7 @@
"gapId": "operator:anim.view_curve_in_graph_editor",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4960,7 +4960,7 @@
"gapId": "operator:armature.align",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -4983,7 +4983,7 @@
"gapId": "operator:armature.assign_to_collection",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5006,7 +5006,7 @@
"gapId": "operator:armature.autoside_names",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5029,7 +5029,7 @@
"gapId": "operator:armature.bone_primitive_add",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5052,7 +5052,7 @@
"gapId": "operator:armature.calculate_roll",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5075,7 +5075,7 @@
"gapId": "operator:armature.click_extrude",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5098,7 +5098,7 @@
"gapId": "operator:armature.collection_add",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5121,7 +5121,7 @@
"gapId": "operator:armature.collection_assign",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5144,7 +5144,7 @@
"gapId": "operator:armature.collection_create_and_assign",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5167,7 +5167,7 @@
"gapId": "operator:armature.collection_deselect",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5190,7 +5190,7 @@
"gapId": "operator:armature.collection_move",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5213,7 +5213,7 @@
"gapId": "operator:armature.collection_remove",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5236,7 +5236,7 @@
"gapId": "operator:armature.collection_remove_unused",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5259,7 +5259,7 @@
"gapId": "operator:armature.collection_select",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5282,7 +5282,7 @@
"gapId": "operator:armature.collection_show_all",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5305,7 +5305,7 @@
"gapId": "operator:armature.collection_unassign",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5328,7 +5328,7 @@
"gapId": "operator:armature.collection_unassign_named",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5351,7 +5351,7 @@
"gapId": "operator:armature.collection_unsolo_all",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5374,7 +5374,7 @@
"gapId": "operator:armature.copy_bone_color_to_selected",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5397,7 +5397,7 @@
"gapId": "operator:armature.delete",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5420,7 +5420,7 @@
"gapId": "operator:armature.dissolve",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5443,7 +5443,7 @@
"gapId": "operator:armature.duplicate",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5466,7 +5466,7 @@
"gapId": "operator:armature.duplicate_move",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5489,7 +5489,7 @@
"gapId": "operator:armature.duplicate_rename",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5512,7 +5512,7 @@
"gapId": "operator:armature.extrude",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5535,7 +5535,7 @@
"gapId": "operator:armature.extrude_forked",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5558,7 +5558,7 @@
"gapId": "operator:armature.extrude_move",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5581,7 +5581,7 @@
"gapId": "operator:armature.fill",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5604,7 +5604,7 @@
"gapId": "operator:armature.flip_names",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5627,7 +5627,7 @@
"gapId": "operator:armature.hide",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5650,7 +5650,7 @@
"gapId": "operator:armature.move_to_collection",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5673,7 +5673,7 @@
"gapId": "operator:armature.parent_clear",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5696,7 +5696,7 @@
"gapId": "operator:armature.parent_set",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5719,7 +5719,7 @@
"gapId": "operator:armature.reveal",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5742,7 +5742,7 @@
"gapId": "operator:armature.roll_clear",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5765,7 +5765,7 @@
"gapId": "operator:armature.select_all",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5788,7 +5788,7 @@
"gapId": "operator:armature.select_hierarchy",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5811,7 +5811,7 @@
"gapId": "operator:armature.select_less",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5834,7 +5834,7 @@
"gapId": "operator:armature.select_linked",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5857,7 +5857,7 @@
"gapId": "operator:armature.select_linked_pick",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5880,7 +5880,7 @@
"gapId": "operator:armature.select_mirror",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5903,7 +5903,7 @@
"gapId": "operator:armature.select_more",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5926,7 +5926,7 @@
"gapId": "operator:armature.select_similar",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5949,7 +5949,7 @@
"gapId": "operator:armature.separate",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5972,7 +5972,7 @@
"gapId": "operator:armature.shortest_path_pick",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -5995,7 +5995,7 @@
"gapId": "operator:armature.split",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -6018,7 +6018,7 @@
"gapId": "operator:armature.subdivide",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -6041,7 +6041,7 @@
"gapId": "operator:armature.switch_direction",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -6064,7 +6064,7 @@
"gapId": "operator:armature.symmetrize",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "completed",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -6087,7 +6087,7 @@
"gapId": "operator:asset.asset_download",
"ownerFamily": "OPERATOR",
"sourceTask": "M15-01B",
"state": "pending",
"state": "active",
"dependencies": [],
"targetImplementationClass": "LOCAL_EXACT",
"fixture": {
@@ -158734,7 +158734,7 @@
]
}
],
"firstTask": "M16-GAP-00175",
"firstTask": "M16-GAP-00264",
"closureGate": "M15-03E",
"nextTask": "M15-03B"
}

View File

@@ -172,96 +172,96 @@
{"id":"M16-GAP-00172","gapId":"operator:anim.clear_useless_actions","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00173","gapId":"operator:anim.copy_driver_button","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00174","gapId":"operator:anim.driver_button_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00175","gapId":"operator:anim.driver_button_edit","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"active","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00176","gapId":"operator:anim.driver_button_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00177","gapId":"operator:anim.end_frame_set","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00178","gapId":"operator:anim.keyframe_clear_button","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00179","gapId":"operator:anim.keyframe_clear_v3d","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00180","gapId":"operator:anim.keyframe_clear_vse","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00181","gapId":"operator:anim.keyframe_delete","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00182","gapId":"operator:anim.keyframe_delete_button","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00183","gapId":"operator:anim.keyframe_delete_by_name","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00184","gapId":"operator:anim.keyframe_delete_v3d","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00185","gapId":"operator:anim.keyframe_delete_vse","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00186","gapId":"operator:anim.keyframe_insert","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00187","gapId":"operator:anim.keyframe_insert_button","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00188","gapId":"operator:anim.keyframe_insert_by_name","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00189","gapId":"operator:anim.keyframe_insert_menu","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00190","gapId":"operator:anim.keying_set_active_set","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00191","gapId":"operator:anim.keying_set_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00192","gapId":"operator:anim.keying_set_export","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00193","gapId":"operator:anim.keying_set_path_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00194","gapId":"operator:anim.keying_set_path_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00195","gapId":"operator:anim.keying_set_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00196","gapId":"operator:anim.keyingset_button_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00197","gapId":"operator:anim.keyingset_button_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00198","gapId":"operator:anim.merge_animation","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00199","gapId":"operator:anim.paste_driver_button","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00200","gapId":"operator:anim.previewrange_clear","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00201","gapId":"operator:anim.previewrange_set","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00202","gapId":"operator:anim.replace_action","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00203","gapId":"operator:anim.replace_action_new","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00204","gapId":"operator:anim.scene_range_frame","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00205","gapId":"operator:anim.separate_slots","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00206","gapId":"operator:anim.slot_channels_move_to_new_action","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00207","gapId":"operator:anim.slot_new_for_id","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00208","gapId":"operator:anim.slot_unassign_from_constraint","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00209","gapId":"operator:anim.slot_unassign_from_id","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00210","gapId":"operator:anim.slot_unassign_from_nla_strip","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00211","gapId":"operator:anim.start_frame_set","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00212","gapId":"operator:anim.update_animated_transform_constraints","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00213","gapId":"operator:anim.version_bone_hide_property","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00214","gapId":"operator:anim.view_curve_in_graph_editor","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00215","gapId":"operator:armature.align","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00216","gapId":"operator:armature.assign_to_collection","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00217","gapId":"operator:armature.autoside_names","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00218","gapId":"operator:armature.bone_primitive_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00219","gapId":"operator:armature.calculate_roll","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00220","gapId":"operator:armature.click_extrude","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00221","gapId":"operator:armature.collection_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00222","gapId":"operator:armature.collection_assign","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00223","gapId":"operator:armature.collection_create_and_assign","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00224","gapId":"operator:armature.collection_deselect","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00225","gapId":"operator:armature.collection_move","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00226","gapId":"operator:armature.collection_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00227","gapId":"operator:armature.collection_remove_unused","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00228","gapId":"operator:armature.collection_select","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00229","gapId":"operator:armature.collection_show_all","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00230","gapId":"operator:armature.collection_unassign","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00231","gapId":"operator:armature.collection_unassign_named","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00232","gapId":"operator:armature.collection_unsolo_all","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00233","gapId":"operator:armature.copy_bone_color_to_selected","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00234","gapId":"operator:armature.delete","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00235","gapId":"operator:armature.dissolve","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00236","gapId":"operator:armature.duplicate","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00237","gapId":"operator:armature.duplicate_move","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00238","gapId":"operator:armature.duplicate_rename","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00239","gapId":"operator:armature.extrude","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00240","gapId":"operator:armature.extrude_forked","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00241","gapId":"operator:armature.extrude_move","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00242","gapId":"operator:armature.fill","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00243","gapId":"operator:armature.flip_names","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00244","gapId":"operator:armature.hide","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00245","gapId":"operator:armature.move_to_collection","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00246","gapId":"operator:armature.parent_clear","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00247","gapId":"operator:armature.parent_set","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00248","gapId":"operator:armature.reveal","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00249","gapId":"operator:armature.roll_clear","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00250","gapId":"operator:armature.select_all","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00251","gapId":"operator:armature.select_hierarchy","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00252","gapId":"operator:armature.select_less","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00253","gapId":"operator:armature.select_linked","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00254","gapId":"operator:armature.select_linked_pick","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00255","gapId":"operator:armature.select_mirror","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00256","gapId":"operator:armature.select_more","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00257","gapId":"operator:armature.select_similar","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00258","gapId":"operator:armature.separate","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00259","gapId":"operator:armature.shortest_path_pick","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00260","gapId":"operator:armature.split","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00261","gapId":"operator:armature.subdivide","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00262","gapId":"operator:armature.switch_direction","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00263","gapId":"operator:armature.symmetrize","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00264","gapId":"operator:asset.asset_download","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00175","gapId":"operator:anim.driver_button_edit","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00176","gapId":"operator:anim.driver_button_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00177","gapId":"operator:anim.end_frame_set","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00178","gapId":"operator:anim.keyframe_clear_button","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00179","gapId":"operator:anim.keyframe_clear_v3d","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00180","gapId":"operator:anim.keyframe_clear_vse","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00181","gapId":"operator:anim.keyframe_delete","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00182","gapId":"operator:anim.keyframe_delete_button","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00183","gapId":"operator:anim.keyframe_delete_by_name","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00184","gapId":"operator:anim.keyframe_delete_v3d","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00185","gapId":"operator:anim.keyframe_delete_vse","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00186","gapId":"operator:anim.keyframe_insert","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00187","gapId":"operator:anim.keyframe_insert_button","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00188","gapId":"operator:anim.keyframe_insert_by_name","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00189","gapId":"operator:anim.keyframe_insert_menu","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00190","gapId":"operator:anim.keying_set_active_set","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00191","gapId":"operator:anim.keying_set_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00192","gapId":"operator:anim.keying_set_export","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00193","gapId":"operator:anim.keying_set_path_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00194","gapId":"operator:anim.keying_set_path_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00195","gapId":"operator:anim.keying_set_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00196","gapId":"operator:anim.keyingset_button_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00197","gapId":"operator:anim.keyingset_button_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00198","gapId":"operator:anim.merge_animation","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00199","gapId":"operator:anim.paste_driver_button","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00200","gapId":"operator:anim.previewrange_clear","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00201","gapId":"operator:anim.previewrange_set","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00202","gapId":"operator:anim.replace_action","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00203","gapId":"operator:anim.replace_action_new","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00204","gapId":"operator:anim.scene_range_frame","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00205","gapId":"operator:anim.separate_slots","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00206","gapId":"operator:anim.slot_channels_move_to_new_action","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00207","gapId":"operator:anim.slot_new_for_id","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00208","gapId":"operator:anim.slot_unassign_from_constraint","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00209","gapId":"operator:anim.slot_unassign_from_id","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00210","gapId":"operator:anim.slot_unassign_from_nla_strip","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00211","gapId":"operator:anim.start_frame_set","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00212","gapId":"operator:anim.update_animated_transform_constraints","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00213","gapId":"operator:anim.version_bone_hide_property","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00214","gapId":"operator:anim.view_curve_in_graph_editor","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00215","gapId":"operator:armature.align","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00216","gapId":"operator:armature.assign_to_collection","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00217","gapId":"operator:armature.autoside_names","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00218","gapId":"operator:armature.bone_primitive_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00219","gapId":"operator:armature.calculate_roll","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00220","gapId":"operator:armature.click_extrude","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00221","gapId":"operator:armature.collection_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00222","gapId":"operator:armature.collection_assign","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00223","gapId":"operator:armature.collection_create_and_assign","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00224","gapId":"operator:armature.collection_deselect","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00225","gapId":"operator:armature.collection_move","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00226","gapId":"operator:armature.collection_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00227","gapId":"operator:armature.collection_remove_unused","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00228","gapId":"operator:armature.collection_select","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00229","gapId":"operator:armature.collection_show_all","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00230","gapId":"operator:armature.collection_unassign","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00231","gapId":"operator:armature.collection_unassign_named","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00232","gapId":"operator:armature.collection_unsolo_all","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00233","gapId":"operator:armature.copy_bone_color_to_selected","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00234","gapId":"operator:armature.delete","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00235","gapId":"operator:armature.dissolve","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00236","gapId":"operator:armature.duplicate","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00237","gapId":"operator:armature.duplicate_move","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00238","gapId":"operator:armature.duplicate_rename","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00239","gapId":"operator:armature.extrude","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00240","gapId":"operator:armature.extrude_forked","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00241","gapId":"operator:armature.extrude_move","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00242","gapId":"operator:armature.fill","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00243","gapId":"operator:armature.flip_names","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00244","gapId":"operator:armature.hide","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00245","gapId":"operator:armature.move_to_collection","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00246","gapId":"operator:armature.parent_clear","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00247","gapId":"operator:armature.parent_set","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00248","gapId":"operator:armature.reveal","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00249","gapId":"operator:armature.roll_clear","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00250","gapId":"operator:armature.select_all","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00251","gapId":"operator:armature.select_hierarchy","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00252","gapId":"operator:armature.select_less","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00253","gapId":"operator:armature.select_linked","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00254","gapId":"operator:armature.select_linked_pick","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00255","gapId":"operator:armature.select_mirror","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00256","gapId":"operator:armature.select_more","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00257","gapId":"operator:armature.select_similar","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00258","gapId":"operator:armature.separate","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00259","gapId":"operator:armature.shortest_path_pick","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00260","gapId":"operator:armature.split","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00261","gapId":"operator:armature.subdivide","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00262","gapId":"operator:armature.switch_direction","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00263","gapId":"operator:armature.symmetrize","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00264","gapId":"operator:asset.asset_download","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"active","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00265","gapId":"operator:asset.assets_download","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00266","gapId":"operator:asset.assign_action","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
{"id":"M16-GAP-00267","gapId":"operator:asset.browse_containing_blend_file","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,22 @@
{
"blenderVersion": "5.2.0 LTS",
"drivers": [
{
"expression": "frame * 2.5 + 1.25",
"index": 0,
"path": "[\"drive_target\"]",
"type": "SCRIPTED",
"variableCount": 0
}
],
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00175-operator-anim.driver_button_edit.blend",
"fixtureSha256": "40ee0435bc330c7d1baa8d40150f2cc4f62ec4cfd195cce2e0e73ad006f7131a",
"mainMutation": "NONE",
"operation": "ANIM_DRIVER_BUTTON_EDIT_DESKTOP",
"operatorStatus": "INTERFACE",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00175",
"value": 3.75
}

View File

@@ -0,0 +1,40 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00175",
"operation": "ANIM_DRIVER_BUTTON_EDIT_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00175-operator-anim.driver_button_edit.blend",
"sha256": "40ee0435bc330c7d1baa8d40150f2cc4f62ec4cfd195cce2e0e73ad006f7131a"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00175/anim-driver-button-edit-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "INTERFACE",
"mainMutation": "NONE"
},
"wasm": {
"status": "EXACT",
"objectId": "object:WebGapAnimDriverButtonEditObject",
"drivers": [
{
"arrayIndex": 0,
"editable": true,
"enabled": true,
"expression": "frame * 2.5 + 1.25",
"flags": 8,
"influence": 0,
"path": "[\"drive_target\"]",
"type": "SCRIPTED",
"typeCode": 1,
"variables": []
}
]
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00176"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00175",
"parentTask": "M16-GAP-00174",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_DRIVER_BUTTON_EDIT_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00174/manifest.json",
"sha256": "5905f9176a5d6c9ce6a6fb755bd1b8f7ccdc2d08f81b3444eea660341d180de9"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00175-operator-anim.driver_button_edit.blend",
"sha256": "40ee0435bc330c7d1baa8d40150f2cc4f62ec4cfd195cce2e0e73ad006f7131a"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00175.py",
"sha256": "e4edbf58ccda3bcd61d4cb4fa2d80c2f68bad6313c94bc0c84115eaa1a4b12be"
},
"desktopChecker": {
"path": "tools/web/check-action-driver-button-edit-desktop.py",
"sha256": "864c46ed3df66b0341660e715c6609d845851dc71afa7bd96348e19bce0db530"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "da24b371cbc7c8d0c75f0f0e133ea51e14bfee3730b810ba75d39ee47047c64f"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00175/anim-driver-button-edit-desktop-report.json",
"sha256": "0e712a373d6c4d28cb14c38fcd911987c7216466ef52a9d3d19a3ce34e913112"
},
"webReport": {
"path": "tests/golden/M16-GAP-00175/anim-driver-button-edit-local-exact-report.json",
"sha256": "9bc321582ce9a45951ec4e8a43236b69a571053fc8cf48fe4cdf8b29113aada0"
},
"status": {
"path": "docs/status/M16-GAP-00175.md",
"sha256": "7a5a2a5e308ce9804db350cc06fbdac36b959892a1f2245531fc515388c0146c"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00175/task-context.json",
"sha256": "80eb9962039ff734c5b7c5a3f908be62c92a5cffd9cfe4de80f19ccd07ad9670"
}
},
"nextTask": "M16-GAP-00176"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00175",
"parentTask": "M16-GAP-00174",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.driver_button_edit 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.",
"scope": {
"gap": "operator:anim.driver_button_edit",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00175.py -- tests/files/web/generated/M16-GAP-00175-operator-anim.driver_button_edit.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00175",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00175"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00175.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2003,
"contextRemainingTokens": 500
},
"source": {
"bytes": 7901,
"tokens": 1976
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00175.py",
"bytes": 1168,
"tokens": 292
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00175-operator-anim.driver_button_edit.blend",
"bytes": 86619,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 365288,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00175/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00175.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00175/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1168,
"tokens": 292
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00176",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00175.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00174/manifest.json",
"parentStatus": "docs/status/M16-GAP-00174.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00175.md",
"tests/golden/M16-GAP-00174/manifest.json",
"docs/status/M16-GAP-00174.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00174",
"parentTask": "M16-GAP-00173",
"status": "done",
"nextTask": "M16-GAP-00175",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00174 Status",
"status: done",
"task: anim.driver_button_add operator LOCAL_EXACT slice",
"updated: 2026-08-21 America/New_York",
"scope:",
"- The minimal fixture contains an un-driven `drive_target` property; foreground Chromium-compatible Blender UI automation invokes `ANIM_OT_driver_button_add` on that exact RNA button and the reader preserves the resulting driver for WASM/Main.",
"evidence:",
"- Blender desktop registers a focused Properties panel, activates the real RNA button, and invokes `ANIM_OT_driver_button_add` through the UI context (`poll=true`, `FINISHED`, `DRIVER_ADDED`)."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1804,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 451
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00175.md",
"bytes": 1804,
"lines": 38,
"tokens": 451
},
{
"path": "tests/golden/M16-GAP-00174/manifest.json",
"bytes": 2916,
"lines": 74,
"tokens": 729
},
{
"path": "docs/status/M16-GAP-00174.md",
"bytes": 1013,
"lines": 18,
"tokens": 254
}
],
"sourceTokens": 1976,
"evidenceFiles": 1,
"evidenceBytes": 1168,
"evidenceTokens": 292,
"totalTokens": 2268,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3292,
"serializedContextTokens": 757,
"withinBudget": true
}
}

View File

@@ -0,0 +1,15 @@
{
"blenderVersion": "5.2.0 LTS",
"drivers": [],
"evidenceStatus": "PRESERVED",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00176-operator-anim.driver_button_remove.blend",
"fixtureSha256": "292203abee32979f8fcc7568b78e66846d5d6280c194fcfa5c7be56170247012",
"mainMutation": "DRIVER_REMOVED",
"operation": "ANIM_DRIVER_BUTTON_REMOVE_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00176",
"value": 3.75
}

View File

@@ -0,0 +1,27 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00176",
"operation": "ANIM_DRIVER_BUTTON_REMOVE_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00176-operator-anim.driver_button_remove.blend",
"sha256": "292203abee32979f8fcc7568b78e66846d5d6280c194fcfa5c7be56170247012"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00176/anim-driver-button-remove-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "DRIVER_REMOVED"
},
"wasm": {
"status": "EXACT",
"objectId": "object:WebGapAnimDriverButtonRemoveObject",
"drivers": []
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00177"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00176",
"parentTask": "M16-GAP-00175",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_DRIVER_BUTTON_REMOVE_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00175/manifest.json",
"sha256": "f0769d32fe2fced8edf7c232c7e8956862e1418010981c0e00ead511c61d05e7"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00176-operator-anim.driver_button_remove.blend",
"sha256": "292203abee32979f8fcc7568b78e66846d5d6280c194fcfa5c7be56170247012"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00176.py",
"sha256": "9591dac532101bf681890f06a1f88f2f1a106e728846e3b86829abb834f1291b"
},
"desktopChecker": {
"path": "tools/web/check-action-driver-button-remove-desktop.py",
"sha256": "34db1bdf7b6086dca2447c00726703642da7ce58b572ded0ae57595e4ba5a359"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "9ece9cca678f392484ef701ab529d8ce21a85e34fea1e72f43bdfc09bf18b1ea"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00176/anim-driver-button-remove-desktop-report.json",
"sha256": "369081c441e48ee8ad39d9f4c90a4c2f80b4802143f0243e2d3e0d92f9198ee9"
},
"webReport": {
"path": "tests/golden/M16-GAP-00176/anim-driver-button-remove-local-exact-report.json",
"sha256": "44e366eb69905cd48d27decfab478c13dd6b1b715fcaae8ef7d3c75d09f1a311"
},
"status": {
"path": "docs/status/M16-GAP-00176.md",
"sha256": "f40dac4690310310d87b5cf020995ad109daf4c9167ab953c9d001c31c7e84b8"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00176/task-context.json",
"sha256": "0811175e4a76169bdf347bb9fc858e67d4559ce1aa40b81e9c0e9b604d122550"
}
},
"nextTask": "M16-GAP-00177"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00176",
"parentTask": "M16-GAP-00175",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.driver_button_remove 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.",
"scope": {
"gap": "operator:anim.driver_button_remove",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00176.py -- tests/files/web/generated/M16-GAP-00176-operator-anim.driver_button_remove.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00176",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00176"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00176.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2195,
"contextRemainingTokens": 547
},
"source": {
"bytes": 7709,
"tokens": 1929
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00176.py",
"bytes": 1172,
"tokens": 293
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00176-operator-anim.driver_button_remove.blend",
"bytes": 86464,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 368769,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00176/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00176.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00176/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1172,
"tokens": 293
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00177",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00176.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00175/manifest.json",
"parentStatus": "docs/status/M16-GAP-00175.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00176.md",
"tests/golden/M16-GAP-00175/manifest.json",
"docs/status/M16-GAP-00175.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00175",
"parentTask": "M16-GAP-00174",
"status": "done",
"nextTask": "M16-GAP-00176",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00175 Status",
"status: done",
"task: anim.driver_button_edit operator LOCAL_EXACT slice",
"updated: 2026-08-21 America/New_York",
"scope:",
"- The minimal fixture contains one scripted driver on `drive_target`; Blender desktop invokes `ANIM_OT_driver_button_edit` in the active Properties context (`poll=true`, `INTERFACE`) and preserves the driver without a Main mutation.",
"evidence:",
"- Desktop and WASM/Main expose the same driver (`[\"drive_target\"]`, expression `frame * 2.5 + 1.25`, scripted, no variables); save/reopen is exact and malformed Blend input is rejected without Main mutation."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1814,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 454
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00176.md",
"bytes": 1814,
"lines": 38,
"tokens": 454
},
{
"path": "tests/golden/M16-GAP-00175/manifest.json",
"bytes": 2921,
"lines": 74,
"tokens": 731
},
{
"path": "docs/status/M16-GAP-00175.md",
"bytes": 806,
"lines": 17,
"tokens": 202
}
],
"sourceTokens": 1929,
"evidenceFiles": 1,
"evidenceBytes": 1172,
"evidenceTokens": 293,
"totalTokens": 2222,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3246,
"serializedContextTokens": 758,
"withinBudget": true
}
}

View File

@@ -0,0 +1,17 @@
{
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00177-operator-anim.end_frame_set.blend",
"fixtureSha256": "b86b4daff038a40e597d1814a021c28fe6cb65e09fb7cfc9ee7bc59f665d9809",
"frame": {
"current": 42,
"end": 42,
"start": 1
},
"mainMutation": "FRAME_END_SET",
"operation": "ANIM_END_FRAME_SET_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00177"
}

View File

@@ -0,0 +1,30 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00177",
"operation": "ANIM_END_FRAME_SET_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00177-operator-anim.end_frame_set.blend",
"sha256": "b86b4daff038a40e597d1814a021c28fe6cb65e09fb7cfc9ee7bc59f665d9809"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00177/anim-end-frame-set-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "FRAME_END_SET"
},
"wasm": {
"status": "EXACT",
"frame": {
"current": 42,
"end": 42,
"start": 1
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00178"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00177",
"parentTask": "M16-GAP-00176",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_END_FRAME_SET_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00176/manifest.json",
"sha256": "38da8c875cf61f18159444a30c2fb2a3a83d5cef31498fb220b9e201931e605b"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00177-operator-anim.end_frame_set.blend",
"sha256": "3cdef7cd4a48256700c0308247dc400a160b2495a9bbf246be5800dd742c1154"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00177.py",
"sha256": "c8f783aa06acd980ebd0f3e228f4065e779434b22059e6b032b652adb521a1d7"
},
"desktopChecker": {
"path": "tools/web/check-action-end-frame-set-desktop.py",
"sha256": "7ea71a9a4e48775fde115223a115f9f31df016ce57e4a13af60b89d5bc7d836a"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "5edc8a52f534e391d322f2f7ee73fc65652b385242de0ee75ebc79a3d026aa53"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00177/anim-end-frame-set-desktop-report.json",
"sha256": "7e162f3b29c2636224d1a7c55f12978e573226aae207f7f45018062d595a038c"
},
"webReport": {
"path": "tests/golden/M16-GAP-00177/anim-end-frame-set-local-exact-report.json",
"sha256": "a08e18c614b9e612c744d6d1c55898fb5d1b7e6b74a9f41301627a5de6801db2"
},
"status": {
"path": "docs/status/M16-GAP-00177.md",
"sha256": "c87a6acb0b22e57107bae051a9d8ce524ae296363a6e3f25fb98bc8872bf03f2"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00177/task-context.json",
"sha256": "06ee966e3f4ae02711eefa7b9562493e348ec9fd2fdf09592ff3d5f5d4f2b89c"
}
},
"nextTask": "M16-GAP-00178"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00177",
"parentTask": "M16-GAP-00176",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.end_frame_set 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.",
"scope": {
"gap": "operator:anim.end_frame_set",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00177.py -- tests/files/web/generated/M16-GAP-00177-operator-anim.end_frame_set.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00177",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00177"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00177.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2262,
"contextRemainingTokens": 565
},
"source": {
"bytes": 7642,
"tokens": 1911
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00177.py",
"bytes": 590,
"tokens": 148
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00177-operator-anim.end_frame_set.blend",
"bytes": 85579,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 372024,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00177/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00177.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00177/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 590,
"tokens": 148
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00178",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00177.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00176/manifest.json",
"parentStatus": "docs/status/M16-GAP-00176.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00177.md",
"tests/golden/M16-GAP-00176/manifest.json",
"docs/status/M16-GAP-00176.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00176",
"parentTask": "M16-GAP-00175",
"status": "done",
"nextTask": "M16-GAP-00177",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00176 Status",
"status: done",
"task: anim.driver_button_remove operator LOCAL_EXACT slice",
"updated: 2026-08-21 America/New_York",
"scope:",
"- The minimal fixture starts with one scripted driver on `drive_target`; foreground Chromium-compatible Blender UI activates the RNA button and invokes `ANIM_OT_driver_button_remove(all=true)` (`poll=true`, `FINISHED`), removing that driver from Main.",
"evidence:",
"- Desktop and WASM/Main expose the same final object with no drivers; save/reopen is exact and malformed Blend input is rejected without Main mutation."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1779,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 445
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00177.md",
"bytes": 1779,
"lines": 38,
"tokens": 445
},
{
"path": "tests/golden/M16-GAP-00176/manifest.json",
"bytes": 2931,
"lines": 74,
"tokens": 733
},
{
"path": "docs/status/M16-GAP-00176.md",
"bytes": 764,
"lines": 17,
"tokens": 191
}
],
"sourceTokens": 1911,
"evidenceFiles": 1,
"evidenceBytes": 590,
"evidenceTokens": 148,
"totalTokens": 2059,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3083,
"serializedContextTokens": 752,
"withinBudget": true
}
}

View File

@@ -0,0 +1,46 @@
{
"after": {
"action": {
"channels": [],
"name": "WebGapAnimKeyframeClearButtonAction"
},
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"clear_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeClearButtonAction"
},
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00178-operator-anim.keyframe_clear_button.blend",
"fixtureSha256": "75aa5f056fc9afe3562ad101a7f3b8aacf93ad54fae06519b236b5fc345831b6",
"mainMutation": "KEYFRAMES_CLEARED",
"operation": "ANIM_KEYFRAME_CLEAR_BUTTON_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00178"
}

View File

@@ -0,0 +1,66 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00178",
"operation": "ANIM_KEYFRAME_CLEAR_BUTTON_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00178-operator-anim.keyframe_clear_button.blend",
"sha256": "75aa5f056fc9afe3562ad101a7f3b8aacf93ad54fae06519b236b5fc345831b6"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00178/anim-keyframe-clear-button-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYFRAMES_CLEARED",
"before": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"clear_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyframeClearButtonAction"
},
"after": {
"channels": [],
"name": "WebGapAnimKeyframeClearButtonAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeClearButtonAction:object:WebGapAnimKeyframeClearButtonObject",
"channelPaths": [
"[\"clear_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationCount": 0,
"keyframesCleared": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00179"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00178",
"parentTask": "M16-GAP-00177",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_CLEAR_BUTTON_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00177/manifest.json",
"sha256": "35f8e52349884e7752b9d652fd415e0ac27688262e1d81cbe73550794db3b6b6"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00178-operator-anim.keyframe_clear_button.blend",
"sha256": "75aa5f056fc9afe3562ad101a7f3b8aacf93ad54fae06519b236b5fc345831b6"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00178.py",
"sha256": "2182c0a9dda794a1f037cea8178151382cfc9c15c1599c23f3d81d4d1883f6da"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-clear-button-desktop.py",
"sha256": "53c60181c3ca7da0eb16446a8eacf499963aa8e8a6e328b09a21a3301744c0b7"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "c70a9d246f13ed1d0d9e3e950f7289cb943a3b04ce37e4b2666a24363b3fe661"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00178/anim-keyframe-clear-button-desktop-report.json",
"sha256": "ba35b96dc8c7aa46427b64465aa223a87ffe2d5bf37ef42a4bd17afc430b4bee"
},
"webReport": {
"path": "tests/golden/M16-GAP-00178/anim-keyframe-clear-button-local-exact-report.json",
"sha256": "9969372551c877505755cf23454610ca8211cc77a6e1267b366e848ebd69e30d"
},
"status": {
"path": "docs/status/M16-GAP-00178.md",
"sha256": "0525407475c3c4cc8ed880d29fe077b178017f3710c56002558bd032362808d5"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00178/task-context.json",
"sha256": "ff864d8ebd9e42c478667639926c27b4580c35baf72c77f7cb0df71d0022e179"
}
},
"nextTask": "M16-GAP-00179"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00178",
"parentTask": "M16-GAP-00177",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_clear_button 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.",
"scope": {
"gap": "operator:anim.keyframe_clear_button",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00178.py -- tests/files/web/generated/M16-GAP-00178-operator-anim.keyframe_clear_button.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00178",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00178"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00178.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2364,
"contextRemainingTokens": 590
},
"source": {
"bytes": 7540,
"tokens": 1886
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00178.py",
"bytes": 1319,
"tokens": 330
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00178-operator-anim.keyframe_clear_button.blend",
"bytes": 86642,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 377589,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00178/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00178.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00178/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1319,
"tokens": 330
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00179",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00178.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00177/manifest.json",
"parentStatus": "docs/status/M16-GAP-00177.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00178.md",
"tests/golden/M16-GAP-00177/manifest.json",
"docs/status/M16-GAP-00177.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00177",
"parentTask": "M16-GAP-00176",
"status": "done",
"nextTask": "M16-GAP-00178",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00177 Status",
"status: done",
"task: anim.end_frame_set operator LOCAL_EXACT slice",
"updated: 2026-08-21 America/New_York",
"scope:",
"- The minimal scene starts at frame 42 with a scene range of 1-120; a foreground animation-area context invokes `ANIM_OT_end_frame_set` (`poll=true`, `FINISHED`) and sets the scene end frame to 42.",
"evidence:",
"- Desktop and WASM/Main expose the same frame state (`current=42`, `start=1`, `end=42`); save/reopen is exact and malformed Blend input is rejected without Main mutation."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1819,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 455
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00178.md",
"bytes": 1819,
"lines": 38,
"tokens": 455
},
{
"path": "tests/golden/M16-GAP-00177/manifest.json",
"bytes": 2896,
"lines": 74,
"tokens": 724
},
{
"path": "docs/status/M16-GAP-00177.md",
"bytes": 657,
"lines": 17,
"tokens": 165
}
],
"sourceTokens": 1886,
"evidenceFiles": 1,
"evidenceBytes": 1319,
"evidenceTokens": 330,
"totalTokens": 2216,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3240,
"serializedContextTokens": 759,
"withinBudget": true
}
}

View File

@@ -0,0 +1,50 @@
{
"after": {
"action": {
"channels": [],
"name": "WebGapAnimKeyframeClearV3DAction"
},
"active": true,
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"clear_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeClearV3DAction"
},
"active": true,
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00179-operator-anim.keyframe_clear_v3d.blend",
"fixtureSha256": "0e079b73025f3623872e92c1e961e012cbcfaff4a64b2c7741a2ff08c935afdd",
"mainMutation": "ANIMATION_CLEARED",
"operation": "ANIM_KEYFRAME_CLEAR_V3D_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00179"
}

View File

@@ -0,0 +1,66 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00179",
"operation": "ANIM_KEYFRAME_CLEAR_V3D_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00179-operator-anim.keyframe_clear_v3d.blend",
"sha256": "0e079b73025f3623872e92c1e961e012cbcfaff4a64b2c7741a2ff08c935afdd"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00179/anim-keyframe-clear-v3d-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "ANIMATION_CLEARED",
"before": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"clear_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyframeClearV3DAction"
},
"after": {
"channels": [],
"name": "WebGapAnimKeyframeClearV3DAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeClearV3DAction:object:WebGapAnimKeyframeClearV3DObject",
"channelPaths": [
"[\"clear_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationCount": 0,
"animationCleared": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00180"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00179",
"parentTask": "M16-GAP-00178",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_CLEAR_V3D_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00178/manifest.json",
"sha256": "351ff1a4e32fff9653bf276eebd6638bfa729130c6379dca0a5355e664961e4e"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00179-operator-anim.keyframe_clear_v3d.blend",
"sha256": "0e079b73025f3623872e92c1e961e012cbcfaff4a64b2c7741a2ff08c935afdd"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00179.py",
"sha256": "600336ccf298afe28fdd1141a2dbac794fde599f28c31f9d7a7a8eb15bb80443"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-clear-v3d-desktop.py",
"sha256": "1d2a7e2bf29a8bc62b6e4e3ebdc9489160f9494d9b7284f7159cc536f2bca1c0"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "99769a632aa2ec5b1d438bd652af0418ea26a1f85f942548d2734e8c5f046b5a"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00179/anim-keyframe-clear-v3d-desktop-report.json",
"sha256": "2e63bae9cbb613ab96faf2fa802e34caf5aca2e7c3968c93ef0dc9de6a16fecf"
},
"webReport": {
"path": "tests/golden/M16-GAP-00179/anim-keyframe-clear-v3d-local-exact-report.json",
"sha256": "6b675af2fd56ce8ee146676101ca9f0be6365a9702b80d8def8c27460a1e7ae9"
},
"status": {
"path": "docs/status/M16-GAP-00179.md",
"sha256": "c1d842b67de5e7275d040a033eb5cd16319ec2c5f77e1b67ed1d55b1c9e0dc4e"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00179/task-context.json",
"sha256": "74ae2d753d5a89d6692a3e73552849d7303e576de19f54d78311b53ba49c5608"
}
},
"nextTask": "M16-GAP-00180"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00179",
"parentTask": "M16-GAP-00178",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_clear_v3d 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.",
"scope": {
"gap": "operator:anim.keyframe_clear_v3d",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00179.py -- tests/files/web/generated/M16-GAP-00179-operator-anim.keyframe_clear_v3d.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00179",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00179"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00179.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1969,
"contextRemainingTokens": 492
},
"source": {
"bytes": 7935,
"tokens": 1984
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00179.py",
"bytes": 1310,
"tokens": 328
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00179-operator-anim.keyframe_clear_v3d.blend",
"bytes": 86603,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 383158,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00179/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00179.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00179/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1310,
"tokens": 328
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00180",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00179.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00178/manifest.json",
"parentStatus": "docs/status/M16-GAP-00178.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00179.md",
"tests/golden/M16-GAP-00178/manifest.json",
"docs/status/M16-GAP-00178.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00178",
"parentTask": "M16-GAP-00177",
"status": "done",
"nextTask": "M16-GAP-00179",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00178 Status",
"status: done",
"task: anim.keyframe_clear_button operator LOCAL_EXACT slice",
"updated: 2026-08-21 America/New_York",
"scope:",
"- The minimal fixture animates one scalar custom RNA property, `clear_target`, on `WebGapAnimKeyframeClearButtonObject` at frames 1, 3, and 5. A foreground Properties context activates that RNA button and invokes `ANIM_OT_keyframe_clear_button(all=true)` (`poll=true`, `FINISHED`), leaving the Action with no F-Curves.",
"evidence:",
"- Desktop evidence records the property changing from three selected keyframes to none; WASM/Main reads the original channel as `[\"clear_target\"][0]` and the cleared fixture with no matching animation. Save/reopen is exact and malformed Blend input is rejected without Main mutation."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1804,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 451
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00179.md",
"bytes": 1804,
"lines": 38,
"tokens": 451
},
{
"path": "tests/golden/M16-GAP-00178/manifest.json",
"bytes": 2936,
"lines": 74,
"tokens": 734
},
{
"path": "docs/status/M16-GAP-00178.md",
"bytes": 1027,
"lines": 17,
"tokens": 257
}
],
"sourceTokens": 1984,
"evidenceFiles": 1,
"evidenceBytes": 1310,
"evidenceTokens": 328,
"totalTokens": 2312,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3336,
"serializedContextTokens": 757,
"withinBudget": true
}
}

View File

@@ -0,0 +1,50 @@
{
"after": {
"action": {
"channels": [],
"name": "WebGapAnimKeyframeClearVSEAction"
},
"active": true,
"blendAlpha": 0.5,
"selected": true
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "sequence_editor.strips_all[\"WebGapAnimKeyframeClearVSEStrip\"].blend_alpha",
"selected": [
true,
true,
true
],
"values": [
0.25,
0.5,
0.75
]
}
],
"name": "WebGapAnimKeyframeClearVSEAction"
},
"active": true,
"blendAlpha": 0.5,
"selected": true
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00180-operator-anim.keyframe_clear_vse.blend",
"fixtureSha256": "e2ef76b206578af5a77919d7f9625ca76ec58bb0a5d9074f907ced31cdd96c4d",
"mainMutation": "ANIMATION_CLEARED",
"operation": "ANIM_KEYFRAME_CLEAR_VSE_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00180"
}

View File

@@ -0,0 +1,67 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00180",
"operation": "ANIM_KEYFRAME_CLEAR_VSE_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00180-operator-anim.keyframe_clear_vse.blend",
"sha256": "e2ef76b206578af5a77919d7f9625ca76ec58bb0a5d9074f907ced31cdd96c4d"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00180/anim-keyframe-clear-vse-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "ANIMATION_CLEARED",
"before": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "sequence_editor.strips_all[\"WebGapAnimKeyframeClearVSEStrip\"].blend_alpha",
"selected": [
true,
true,
true
],
"values": [
0.25,
0.5,
0.75
]
}
],
"name": "WebGapAnimKeyframeClearVSEAction"
},
"after": {
"channels": [],
"name": "WebGapAnimKeyframeClearVSEAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeClearVSEAction:scene:Scene",
"targetId": "scene:Scene",
"channelPaths": [
"sequence_editor.strips_all[\"WebGapAnimKeyframeClearVSEStrip\"].blend_alpha[0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationCount": 0,
"animationCleared": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00181"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00180",
"parentTask": "M16-GAP-00179",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_CLEAR_VSE_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00179/manifest.json",
"sha256": "bd344a1160ca950db34f10d92a43288cc1ac707af00e1bf43a9a903c45547a67"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00180-operator-anim.keyframe_clear_vse.blend",
"sha256": "e2ef76b206578af5a77919d7f9625ca76ec58bb0a5d9074f907ced31cdd96c4d"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00180.py",
"sha256": "e72a0c68e1ac8173c70944bc48f7bd03365913e24b831708da40a28bde936f4d"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-clear-vse-desktop.py",
"sha256": "09aeec25d69a57b657bd690998058a23980b6a4b9425fd63dbb26f14f4edee8f"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "0876494ec0ef358ac3049c7da3e2f207da80826769167379454789b4b27e41c9"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00180/anim-keyframe-clear-vse-desktop-report.json",
"sha256": "6885cc9103c1b9c8396a684559d08d0899ca096580278a5fa321ee6cec4412ec"
},
"webReport": {
"path": "tests/golden/M16-GAP-00180/anim-keyframe-clear-vse-local-exact-report.json",
"sha256": "9e05fde557e26ac9be8dc8c7983be4a25e7637542643aa8b38708a1868de27ad"
},
"status": {
"path": "docs/status/M16-GAP-00180.md",
"sha256": "6af17dd941fdf1f76753ee23a18f97689b7d9719c37ce8714628b0acda11fc5f"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00180/task-context.json",
"sha256": "a90f35e4b60f26bac6d8900a1838d08cbfc20638f65f45f8dbf2306c7160f1d4"
}
},
"nextTask": "M16-GAP-00181"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00180",
"parentTask": "M16-GAP-00179",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_clear_vse 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.",
"scope": {
"gap": "operator:anim.keyframe_clear_vse",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00180.py -- tests/files/web/generated/M16-GAP-00180-operator-anim.keyframe_clear_vse.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00180",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00180"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00180.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2005,
"contextRemainingTokens": 500
},
"source": {
"bytes": 7899,
"tokens": 1976
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00180.py",
"bytes": 1317,
"tokens": 330
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00180-operator-anim.keyframe_clear_vse.blend",
"bytes": 86461,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 388566,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00180/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00180.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00180/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1317,
"tokens": 330
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00181",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00180.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00179/manifest.json",
"parentStatus": "docs/status/M16-GAP-00179.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00180.md",
"tests/golden/M16-GAP-00179/manifest.json",
"docs/status/M16-GAP-00179.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00179",
"parentTask": "M16-GAP-00178",
"status": "done",
"nextTask": "M16-GAP-00180",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00179 Status",
"status: done",
"task: anim.keyframe_clear_v3d operator LOCAL_EXACT slice",
"updated: 2026-08-21 America/New_York",
"scope:",
"- The minimal fixture selects one object with a scalar `clear_target` Action at frames 1, 3, and 5. A foreground `VIEW_3D` context invokes `ANIM_OT_keyframe_clear_v3d(confirm=false)` (`poll=true`, `FINISHED`), removing all editable F-Curves from the selected object's Action.",
"evidence:",
"- Desktop evidence records the selected/active object changing from three selected keyframes to no F-Curves; WASM/Main reads the original channel as `[\"clear_target\"][0]` and the cleared fixture with no matching animation. Save/reopen is exact and malformed Blend input is rejected without Main mutation."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1804,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 451
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00180.md",
"bytes": 1804,
"lines": 38,
"tokens": 451
},
{
"path": "tests/golden/M16-GAP-00179/manifest.json",
"bytes": 2921,
"lines": 74,
"tokens": 731
},
{
"path": "docs/status/M16-GAP-00179.md",
"bytes": 1006,
"lines": 17,
"tokens": 252
}
],
"sourceTokens": 1976,
"evidenceFiles": 1,
"evidenceBytes": 1317,
"evidenceTokens": 330,
"totalTokens": 2306,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3330,
"serializedContextTokens": 757,
"withinBudget": true
}
}

View File

@@ -0,0 +1,69 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
5.0
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true
],
"values": [
1.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeDeleteAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyframeDeleteSet",
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeDeleteAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyframeDeleteSet",
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00181-operator-anim.keyframe_delete.blend",
"fixtureSha256": "0d6d1e45f430c051e4ecaf1f799f4b7666fa8311e2abf188502cf9cdc0011855",
"mainMutation": "KEYFRAME_DELETED",
"operation": "ANIM_KEYFRAME_DELETE_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00181"
}

View File

@@ -0,0 +1,87 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00181",
"operation": "ANIM_KEYFRAME_DELETE_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00181-operator-anim.keyframe_delete.blend",
"sha256": "0d6d1e45f430c051e4ecaf1f799f4b7666fa8311e2abf188502cf9cdc0011855"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00181/anim-keyframe-delete-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYFRAME_DELETED",
"before": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyframeDeleteAction"
},
"after": {
"channels": [
{
"frames": [
1,
5
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true
],
"values": [
1,
5
]
}
],
"name": "WebGapAnimKeyframeDeleteAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeDeleteAction:object:WebGapAnimKeyframeDeleteObject",
"targetId": "object:WebGapAnimKeyframeDeleteObject",
"channelPaths": [
"[\"delete_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyframeDeleteAction:object:WebGapAnimKeyframeDeleteObject",
"keyframesPerChannel": [
2
],
"keyframeDeleted": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00182"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00181",
"parentTask": "M16-GAP-00180",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_DELETE_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00180/manifest.json",
"sha256": "e6d90f0df54469a1016917e71480ad58ba901d50694d2727d5e0927b237848eb"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00181-operator-anim.keyframe_delete.blend",
"sha256": "0d6d1e45f430c051e4ecaf1f799f4b7666fa8311e2abf188502cf9cdc0011855"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00181.py",
"sha256": "bc42dcd74150bdc50dba1190dcda12f0c7f40cd8886e94c541243c5e6df460b7"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-delete-desktop.py",
"sha256": "697bd750b9b3971fa108981e6b8f14f372705eeb39a7e20b33dffa9c1fa55c4c"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "7b77cecee69a1ba85251c1ef17cfe5407f2db93e606a330e9d08609faaf74aeb"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00181/anim-keyframe-delete-desktop-report.json",
"sha256": "cec3f76e20a38572bf4a38789e1df1aa83ffd4f332e940c238e4d633dd841c7d"
},
"webReport": {
"path": "tests/golden/M16-GAP-00181/anim-keyframe-delete-local-exact-report.json",
"sha256": "4e75034a44e46afef417e241e6c81d84a1d46a8bf34e779495d9c6885c3b8bfc"
},
"status": {
"path": "docs/status/M16-GAP-00181.md",
"sha256": "16ef18b3c2a4035e283a5a9af1968d0250763a0a3a2b52fb5a8f4f05821968c2"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00181/task-context.json",
"sha256": "ad1b7ad175eaa42b41c75f1a36d7b55f190c8bbd39d8861e7e7aaa016984b6e1"
}
},
"nextTask": "M16-GAP-00182"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00181",
"parentTask": "M16-GAP-00180",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_delete 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.",
"scope": {
"gap": "operator:anim.keyframe_delete",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00181.py -- tests/files/web/generated/M16-GAP-00181-operator-anim.keyframe_delete.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00181",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00181"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00181.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1968,
"contextRemainingTokens": 490
},
"source": {
"bytes": 7936,
"tokens": 1986
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00181.py",
"bytes": 1630,
"tokens": 408
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00181-operator-anim.keyframe_delete.blend",
"bytes": 86782,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 394089,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00181/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00181.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00181/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1630,
"tokens": 408
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00182",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00181.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00180/manifest.json",
"parentStatus": "docs/status/M16-GAP-00180.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00181.md",
"tests/golden/M16-GAP-00180/manifest.json",
"docs/status/M16-GAP-00180.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00180",
"parentTask": "M16-GAP-00179",
"status": "done",
"nextTask": "M16-GAP-00181",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00180 Status",
"status: done",
"task: anim.keyframe_clear_vse operator LOCAL_EXACT slice",
"updated: 2026-08-21 America/New_York",
"scope:",
"- The minimal fixture contains one selected image strip with a Scene Action animating `blend_alpha` at frames 1, 3, and 5. A real foreground `SEQUENCE_EDITOR` context invokes `ANIM_OT_keyframe_clear_vse(confirm=false)` (`poll=true`, `FINISHED`), removing the selected strip's editable F-Curve while preserving the strip and its evaluated value.",
"evidence:",
"- Desktop evidence records the selected/active strip changing from three selected keyframes to no F-Curves. WASM/Main reads the same Scene Action channel before clearing and no matching animation from the cleared fixture. Save/reopen is exact and malformed Blend input is rejected without Main mutation."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1789,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 448
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00181.md",
"bytes": 1789,
"lines": 38,
"tokens": 448
},
{
"path": "tests/golden/M16-GAP-00180/manifest.json",
"bytes": 2921,
"lines": 74,
"tokens": 731
},
{
"path": "docs/status/M16-GAP-00180.md",
"bytes": 1058,
"lines": 17,
"tokens": 265
}
],
"sourceTokens": 1986,
"evidenceFiles": 1,
"evidenceBytes": 1630,
"evidenceTokens": 408,
"totalTokens": 2394,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3418,
"serializedContextTokens": 754,
"withinBudget": true
}
}

View File

@@ -0,0 +1,67 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
5.0
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true
],
"values": [
1.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeDeleteButtonAction"
},
"active": true,
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeDeleteButtonAction"
},
"active": true,
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00182-operator-anim.keyframe_delete_button.blend",
"fixtureSha256": "8e62660db44872553a7f32f5965afe7811e69261425beba97e6e29cdd5575073",
"mainMutation": "KEYFRAME_DELETED",
"operation": "ANIM_KEYFRAME_DELETE_BUTTON_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00182"
}

View File

@@ -0,0 +1,87 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00182",
"operation": "ANIM_KEYFRAME_DELETE_BUTTON_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00182-operator-anim.keyframe_delete_button.blend",
"sha256": "8e62660db44872553a7f32f5965afe7811e69261425beba97e6e29cdd5575073"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00182/anim-keyframe-delete-button-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYFRAME_DELETED",
"before": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyframeDeleteButtonAction"
},
"after": {
"channels": [
{
"frames": [
1,
5
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true
],
"values": [
1,
5
]
}
],
"name": "WebGapAnimKeyframeDeleteButtonAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeDeleteButtonAction:object:WebGapAnimKeyframeDeleteButtonObject",
"targetId": "object:WebGapAnimKeyframeDeleteButtonObject",
"channelPaths": [
"[\"delete_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyframeDeleteButtonAction:object:WebGapAnimKeyframeDeleteButtonObject",
"keyframesPerChannel": [
2
],
"keyframeDeleted": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00183"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00182",
"parentTask": "M16-GAP-00181",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_DELETE_BUTTON_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00181/manifest.json",
"sha256": "32fd366de6190029b377c8faf9ed1b661234cbc6b01925d247b46e00e7bc62ad"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00182-operator-anim.keyframe_delete_button.blend",
"sha256": "8e62660db44872553a7f32f5965afe7811e69261425beba97e6e29cdd5575073"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00182.py",
"sha256": "8424d4ca63c32c9127c9cf1d095a6dde62121ae8ddccea5dc0bbd8ba37b27a20"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-delete-button-desktop.py",
"sha256": "fdb36e2d97ed687a20682a769f107f10801ab8845ad5e1061565893bad2cebd9"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "961b446842e5115fc503667f19731d2cd0167f5e3be9670d3b513c64fd3ea5b4"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00182/anim-keyframe-delete-button-desktop-report.json",
"sha256": "5df192b8cf82b0e53efa947f9102424cfccf05b29a4e293342ea2e3ace60b0d1"
},
"webReport": {
"path": "tests/golden/M16-GAP-00182/anim-keyframe-delete-button-local-exact-report.json",
"sha256": "097fdcab03f3e748077c3b1d8cdcfbb9a9b2d7df9b1ca03c54b9f0a3a637c947"
},
"status": {
"path": "docs/status/M16-GAP-00182.md",
"sha256": "43e96981d4987ee1b32b07ce6053bca47b50106526d8e932e2b67d0005b576dc"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00182/task-context.json",
"sha256": "76d618d236a7741f912e09f4e48ec7bbdce9ac93c3fafee48dfe7ca2ebeae03c"
}
},
"nextTask": "M16-GAP-00183"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00182",
"parentTask": "M16-GAP-00181",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_delete_button 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.",
"scope": {
"gap": "operator:anim.keyframe_delete_button",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00182.py -- tests/files/web/generated/M16-GAP-00182-operator-anim.keyframe_delete_button.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00182",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00182"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00182.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1696,
"contextRemainingTokens": 423
},
"source": {
"bytes": 8208,
"tokens": 2053
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00182.py",
"bytes": 1325,
"tokens": 332
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00182-operator-anim.keyframe_delete_button.blend",
"bytes": 86755,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 399962,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00182/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00182.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00182/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1325,
"tokens": 332
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00183",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00182.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00181/manifest.json",
"parentStatus": "docs/status/M16-GAP-00181.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00182.md",
"tests/golden/M16-GAP-00181/manifest.json",
"docs/status/M16-GAP-00181.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00181",
"parentTask": "M16-GAP-00180",
"status": "done",
"nextTask": "M16-GAP-00182",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00181 Status",
"status: done",
"task: anim.keyframe_delete operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected object with a custom `delete_target` property and an Action keyed at frames 1, 3, and 5. A dedicated active Keying Set targets that property. A real foreground `VIEW_3D` context invokes `ANIM_OT_keyframe_delete(type=WebGapAnimKeyframeDeleteSet)` (`poll=true`, `FINISHED`) at frame 3, deleting only the current keyframe and preserving the two surrounding keys.",
"evidence:",
"- Desktop evidence records the selected/active object and active Keying Set before deletion, then the Action changing from `[1, 3, 5]` to `[1, 5]`; the custom property remains at 3.0. Save/reopen is exact."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1824,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 456
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00182.md",
"bytes": 1824,
"lines": 38,
"tokens": 456
},
{
"path": "tests/golden/M16-GAP-00181/manifest.json",
"bytes": 2906,
"lines": 74,
"tokens": 727
},
{
"path": "docs/status/M16-GAP-00181.md",
"bytes": 1310,
"lines": 18,
"tokens": 328
}
],
"sourceTokens": 2053,
"evidenceFiles": 1,
"evidenceBytes": 1325,
"evidenceTokens": 332,
"totalTokens": 2385,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3409,
"serializedContextTokens": 760,
"withinBudget": true
}
}

View File

@@ -0,0 +1,69 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
5.0
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true
],
"values": [
1.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeDeleteByNameAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyframeDeleteByNameSet",
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeDeleteByNameAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyframeDeleteByNameSet",
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00183-operator-anim.keyframe_delete_by_name.blend",
"fixtureSha256": "ea5a587aeeabd6692977d5a7660bf49bb7134d4fc81e8ff1a3fa9acd8a75026c",
"mainMutation": "KEYFRAME_DELETED",
"operation": "ANIM_KEYFRAME_DELETE_BY_NAME_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00183"
}

View File

@@ -0,0 +1,87 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00183",
"operation": "ANIM_KEYFRAME_DELETE_BY_NAME_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00183-operator-anim.keyframe_delete_by_name.blend",
"sha256": "ea5a587aeeabd6692977d5a7660bf49bb7134d4fc81e8ff1a3fa9acd8a75026c"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00183/anim-keyframe-delete-by-name-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYFRAME_DELETED",
"before": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyframeDeleteByNameAction"
},
"after": {
"channels": [
{
"frames": [
1,
5
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true
],
"values": [
1,
5
]
}
],
"name": "WebGapAnimKeyframeDeleteByNameAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeDeleteByNameAction:object:WebGapAnimKeyframeDeleteByNameObject",
"targetId": "object:WebGapAnimKeyframeDeleteByNameObject",
"channelPaths": [
"[\"delete_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyframeDeleteByNameAction:object:WebGapAnimKeyframeDeleteByNameObject",
"keyframesPerChannel": [
2
],
"keyframeDeleted": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00184"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00183",
"parentTask": "M16-GAP-00182",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_DELETE_BY_NAME_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00182/manifest.json",
"sha256": "75787ace3726209e5ff0058c6ab8787d8eb6a386318ab2bf50c79457f587bf87"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00183-operator-anim.keyframe_delete_by_name.blend",
"sha256": "ea5a587aeeabd6692977d5a7660bf49bb7134d4fc81e8ff1a3fa9acd8a75026c"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00183.py",
"sha256": "482995ad5ea8beeb8e6a3c4a004de282587d09f5186bac854a0513c747e316b0"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-delete-by-name-desktop.py",
"sha256": "b3c5726677eb6881950a96a13b5221eb74d5b4e13be118ad7f20679c842a64ea"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "e68c992056b117cc4d0e38752e4ad37ed25843fc0f4431459e527f83ef56d3eb"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00183/anim-keyframe-delete-by-name-desktop-report.json",
"sha256": "105d464e66e7ac9c3cee66c3a33a47101c95b08f9851a875373d43370c48f70e"
},
"webReport": {
"path": "tests/golden/M16-GAP-00183/anim-keyframe-delete-by-name-local-exact-report.json",
"sha256": "3e8dd9268e4aa73f673dbbe5c9abc3d9c00acfdbe1cc019673c49925e342deca"
},
"status": {
"path": "docs/status/M16-GAP-00183.md",
"sha256": "e583e704854dd1eca1fa5c672c3184cef8e2433138628aee92b11fb8a3345f98"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00183/task-context.json",
"sha256": "655cf1b0482f7159b63228a6db2bd2828836d707147f3de74727e9fcdc8a07f4"
}
},
"nextTask": "M16-GAP-00184"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00183",
"parentTask": "M16-GAP-00182",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_delete_by_name 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.",
"scope": {
"gap": "operator:anim.keyframe_delete_by_name",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00183.py -- tests/files/web/generated/M16-GAP-00183-operator-anim.keyframe_delete_by_name.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00183",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00183"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00183.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1678,
"contextRemainingTokens": 418
},
"source": {
"bytes": 8226,
"tokens": 2058
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00183.py",
"bytes": 1654,
"tokens": 414
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00183-operator-anim.keyframe_delete_by_name.blend",
"bytes": 86770,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 405874,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00183/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00183.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00183/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1654,
"tokens": 414
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00184",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00183.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00182/manifest.json",
"parentStatus": "docs/status/M16-GAP-00182.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00183.md",
"tests/golden/M16-GAP-00182/manifest.json",
"docs/status/M16-GAP-00182.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00182",
"parentTask": "M16-GAP-00181",
"status": "done",
"nextTask": "M16-GAP-00183",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00182 Status",
"status: done",
"task: anim.keyframe_delete_button operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected object with a custom `delete_target` property and an Action keyed at frames 1, 3, and 5. A registered Properties panel exposes the animated property as a real UI button. A foreground Properties context invokes `ANIM_OT_keyframe_delete_button(all=true)` through that active button at frame 3 (`poll=true`, `FINISHED`), deleting only the current keyframe and preserving the two surrounding keys.",
"evidence:",
"- Desktop evidence records the selected/active object changing from `[1, 3, 5]` to `[1, 5]`; the custom property remains at 3.0 and save/reopen is exact."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1829,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 458
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00183.md",
"bytes": 1829,
"lines": 38,
"tokens": 458
},
{
"path": "tests/golden/M16-GAP-00182/manifest.json",
"bytes": 2941,
"lines": 74,
"tokens": 736
},
{
"path": "docs/status/M16-GAP-00182.md",
"bytes": 1288,
"lines": 18,
"tokens": 322
}
],
"sourceTokens": 2058,
"evidenceFiles": 1,
"evidenceBytes": 1654,
"evidenceTokens": 414,
"totalTokens": 2472,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3496,
"serializedContextTokens": 760,
"withinBudget": true
}
}

View File

@@ -0,0 +1,67 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
5.0
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true
],
"values": [
1.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeDeleteV3DAction"
},
"active": true,
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeDeleteV3DAction"
},
"active": true,
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00184-operator-anim.keyframe_delete_v3d.blend",
"fixtureSha256": "56cc035995506dfa6c68efced79708c11dc50a20ac3d0e7e9ee59fe29e741995",
"mainMutation": "KEYFRAME_DELETED",
"operation": "ANIM_KEYFRAME_DELETE_V3D_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00184"
}

View File

@@ -0,0 +1,87 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00184",
"operation": "ANIM_KEYFRAME_DELETE_V3D_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00184-operator-anim.keyframe_delete_v3d.blend",
"sha256": "56cc035995506dfa6c68efced79708c11dc50a20ac3d0e7e9ee59fe29e741995"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00184/anim-keyframe-delete-v3d-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYFRAME_DELETED",
"before": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyframeDeleteV3DAction"
},
"after": {
"channels": [
{
"frames": [
1,
5
],
"index": 0,
"path": "[\"delete_target\"]",
"selected": [
true,
true
],
"values": [
1,
5
]
}
],
"name": "WebGapAnimKeyframeDeleteV3DAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeDeleteV3DAction:object:WebGapAnimKeyframeDeleteV3DObject",
"targetId": "object:WebGapAnimKeyframeDeleteV3DObject",
"channelPaths": [
"[\"delete_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyframeDeleteV3DAction:object:WebGapAnimKeyframeDeleteV3DObject",
"keyframesPerChannel": [
2
],
"keyframeDeleted": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00185"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00184",
"parentTask": "M16-GAP-00183",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_DELETE_V3D_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00183/manifest.json",
"sha256": "a792624c1a6c90440244488e345af7637a8451d9caa33495368356041aed8273"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00184-operator-anim.keyframe_delete_v3d.blend",
"sha256": "56cc035995506dfa6c68efced79708c11dc50a20ac3d0e7e9ee59fe29e741995"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00184.py",
"sha256": "9bd3112772fe91a57b1cb89a781067316442d4d06e7fbd7fc84429a67fe0272a"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-delete-v3d-desktop.py",
"sha256": "a761edaab49b1a81a7374a465b64b67836ebe06fba9626ba3d5233f91072d541"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "c28933770f3e0af5e792921658d19f9618a439610b8ddc34618d6b70b5a15dcf"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00184/anim-keyframe-delete-v3d-desktop-report.json",
"sha256": "576e712c7d4d72dc15fc2b9a4b65748c2ddd4b43f69c86a57e3365621f19db43"
},
"webReport": {
"path": "tests/golden/M16-GAP-00184/anim-keyframe-delete-v3d-local-exact-report.json",
"sha256": "3737dbe1e6189cd8312cc3cd3f328e764b2a9ce173a48946e9413a82e8fa4a47"
},
"status": {
"path": "docs/status/M16-GAP-00184.md",
"sha256": "44d3f28d968aae9c4315f08dd7581cca309347a839e20db4b8f19288bfbe706e"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00184/task-context.json",
"sha256": "41f3f005f99d3e9130a4335fa5cde7982598096f57756e5760f092d3b78792ec"
}
},
"nextTask": "M16-GAP-00185"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00184",
"parentTask": "M16-GAP-00183",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_delete_v3d 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.",
"scope": {
"gap": "operator:anim.keyframe_delete_v3d",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00184.py -- tests/files/web/generated/M16-GAP-00184-operator-anim.keyframe_delete_v3d.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00184",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00184"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00184.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1711,
"contextRemainingTokens": 426
},
"source": {
"bytes": 8193,
"tokens": 2050
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00184.py",
"bytes": 1392,
"tokens": 348
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00184-operator-anim.keyframe_delete_v3d.blend",
"bytes": 86712,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 411636,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00184/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00184.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00184/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1392,
"tokens": 348
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00185",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00184.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00183/manifest.json",
"parentStatus": "docs/status/M16-GAP-00183.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00184.md",
"tests/golden/M16-GAP-00183/manifest.json",
"docs/status/M16-GAP-00183.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00183",
"parentTask": "M16-GAP-00182",
"status": "done",
"nextTask": "M16-GAP-00184",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00183 Status",
"status: done",
"task: anim.keyframe_delete_by_name operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected object with a custom `delete_target` property and an Action keyed at frames 1, 3, and 5. A named Keying Set targets that property. A foreground `VIEW_3D` context invokes `ANIM_OT_keyframe_delete_by_name(type=WebGapAnimKeyframeDeleteByNameSet)` (`poll=true`, `FINISHED`) at frame 3, deleting only the current keyframe and preserving the two surrounding keys.",
"evidence:",
"- Desktop evidence records the selected/active object and named Keying Set changing from `[1, 3, 5]` to `[1, 5]`; the custom property remains at 3.0 and save/reopen is exact."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1809,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 453
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00184.md",
"bytes": 1809,
"lines": 38,
"tokens": 453
},
{
"path": "tests/golden/M16-GAP-00183/manifest.json",
"bytes": 2946,
"lines": 74,
"tokens": 737
},
{
"path": "docs/status/M16-GAP-00183.md",
"bytes": 1270,
"lines": 18,
"tokens": 318
}
],
"sourceTokens": 2050,
"evidenceFiles": 1,
"evidenceBytes": 1392,
"evidenceTokens": 348,
"totalTokens": 2398,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3422,
"serializedContextTokens": 757,
"withinBudget": true
}
}

View File

@@ -0,0 +1,67 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
5.0
],
"index": 0,
"path": "sequence_editor.strips_all[\"WebGapAnimKeyframeDeleteVSEStrip\"].blend_alpha",
"selected": [
true,
true
],
"values": [
0.25,
0.75
]
}
],
"name": "WebGapAnimKeyframeDeleteVSEAction"
},
"active": true,
"blendAlpha": 0.5,
"selected": true
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "sequence_editor.strips_all[\"WebGapAnimKeyframeDeleteVSEStrip\"].blend_alpha",
"selected": [
true,
true,
true
],
"values": [
0.25,
0.5,
0.75
]
}
],
"name": "WebGapAnimKeyframeDeleteVSEAction"
},
"active": true,
"blendAlpha": 0.5,
"selected": true
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00185-operator-anim.keyframe_delete_vse.blend",
"fixtureSha256": "c01f342471fcae64138f95287363f0e801c4da96992aa4a3d8a4173b0ec0f464",
"mainMutation": "KEYFRAME_DELETED",
"operation": "ANIM_KEYFRAME_DELETE_VSE_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00185"
}

View File

@@ -0,0 +1,87 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00185",
"operation": "ANIM_KEYFRAME_DELETE_VSE_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00185-operator-anim.keyframe_delete_vse.blend",
"sha256": "c01f342471fcae64138f95287363f0e801c4da96992aa4a3d8a4173b0ec0f464"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00185/anim-keyframe-delete-vse-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYFRAME_DELETED",
"before": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "sequence_editor.strips_all[\"WebGapAnimKeyframeDeleteVSEStrip\"].blend_alpha",
"selected": [
true,
true,
true
],
"values": [
0.25,
0.5,
0.75
]
}
],
"name": "WebGapAnimKeyframeDeleteVSEAction"
},
"after": {
"channels": [
{
"frames": [
1,
5
],
"index": 0,
"path": "sequence_editor.strips_all[\"WebGapAnimKeyframeDeleteVSEStrip\"].blend_alpha",
"selected": [
true,
true
],
"values": [
0.25,
0.75
]
}
],
"name": "WebGapAnimKeyframeDeleteVSEAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeDeleteVSEAction:scene:Scene",
"targetId": "scene:Scene",
"channelPaths": [
"sequence_editor.strips_all[\"WebGapAnimKeyframeDeleteVSEStrip\"].blend_alpha[0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyframeDeleteVSEAction:scene:Scene",
"keyframesPerChannel": [
2
],
"keyframeDeleted": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00186"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00185",
"parentTask": "M16-GAP-00184",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_DELETE_VSE_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00184/manifest.json",
"sha256": "73843947605c1cb981fae06d47682662bcfe259534e57cb46ee6404b34d041fc"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00185-operator-anim.keyframe_delete_vse.blend",
"sha256": "c01f342471fcae64138f95287363f0e801c4da96992aa4a3d8a4173b0ec0f464"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00185.py",
"sha256": "9abb73d74b639eef255794c35ce8bb102959a53d4d12f8818d45c28946b1e791"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-delete-vse-desktop.py",
"sha256": "67f18d3fc73b9e16cdccc572f551eb2f0f16d496db952889678189eb8fa9253d"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "edc37dc02748b741ab2842a8a3bad665c5e9af18b74c0ef04d6b86cf29e85f66"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00185/anim-keyframe-delete-vse-desktop-report.json",
"sha256": "a7fb103d0746837b7d56ae89e6b8fa6de374f11cfff8cdf79d88fba199449721"
},
"webReport": {
"path": "tests/golden/M16-GAP-00185/anim-keyframe-delete-vse-local-exact-report.json",
"sha256": "aecbd1f8b711b2299db7e7665931a549a7318d638942eb2d343d680fc0ce5acc"
},
"status": {
"path": "docs/status/M16-GAP-00185.md",
"sha256": "de8e22ea2619605053b10e19061de49f94ed241fba16c8b7aa0b0099be3a3b2b"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00185/task-context.json",
"sha256": "3badb8af0ff6bd1168e2576568f8be4c44f4b77a175ea86b8e6650a9ef92077f"
}
},
"nextTask": "M16-GAP-00186"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00185",
"parentTask": "M16-GAP-00184",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_delete_vse 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.",
"scope": {
"gap": "operator:anim.keyframe_delete_vse",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00185.py -- tests/files/web/generated/M16-GAP-00185-operator-anim.keyframe_delete_vse.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00185",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00185"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00185.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1820,
"contextRemainingTokens": 453
},
"source": {
"bytes": 8084,
"tokens": 2023
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00185.py",
"bytes": 1371,
"tokens": 343
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00185-operator-anim.keyframe_delete_vse.blend",
"bytes": 86629,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 417633,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00185/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00185.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00185/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1371,
"tokens": 343
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00186",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00185.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00184/manifest.json",
"parentStatus": "docs/status/M16-GAP-00184.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00185.md",
"tests/golden/M16-GAP-00184/manifest.json",
"docs/status/M16-GAP-00184.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00184",
"parentTask": "M16-GAP-00183",
"status": "done",
"nextTask": "M16-GAP-00185",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00184 Status",
"status: done",
"task: anim.keyframe_delete_v3d operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a custom `delete_target` property and an Action keyed at frames 1, 3, and 5. A foreground `VIEW_3D` context invokes `ANIM_OT_keyframe_delete_v3d(confirm=false)` (`poll=true`, `FINISHED`) at frame 3, deleting only the current keyframe and preserving the two surrounding keys.",
"evidence:",
"- Desktop evidence records the selected/active object changing from `[1, 3, 5]` to `[1, 5]`; the custom property remains at 3.0 and save/reopen is exact."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1809,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 453
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00185.md",
"bytes": 1809,
"lines": 38,
"tokens": 453
},
{
"path": "tests/golden/M16-GAP-00184/manifest.json",
"bytes": 2926,
"lines": 74,
"tokens": 732
},
{
"path": "docs/status/M16-GAP-00184.md",
"bytes": 1181,
"lines": 18,
"tokens": 296
}
],
"sourceTokens": 2023,
"evidenceFiles": 1,
"evidenceBytes": 1371,
"evidenceTokens": 343,
"totalTokens": 2366,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3390,
"serializedContextTokens": 757,
"withinBudget": true
}
}

View File

@@ -0,0 +1,69 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
false,
true,
false
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeInsertAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyframeInsertSet",
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
5.0
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
true,
true
],
"values": [
1.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeInsertAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyframeInsertSet",
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00186-operator-anim.keyframe_insert.blend",
"fixtureSha256": "582dfb8c8dfe6897937afa687d5ebfdb4aeb2e3ae7db73ed02cf6385745bbf70",
"mainMutation": "KEYFRAME_INSERTED",
"operation": "ANIM_KEYFRAME_INSERT_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00186"
}

View File

@@ -0,0 +1,87 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00186",
"operation": "ANIM_KEYFRAME_INSERT_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00186-operator-anim.keyframe_insert.blend",
"sha256": "582dfb8c8dfe6897937afa687d5ebfdb4aeb2e3ae7db73ed02cf6385745bbf70"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00186/anim-keyframe-insert-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYFRAME_INSERTED",
"before": {
"channels": [
{
"frames": [
1,
5
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
true,
true
],
"values": [
1,
5
]
}
],
"name": "WebGapAnimKeyframeInsertAction"
},
"after": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
false,
true,
false
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyframeInsertAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeInsertAction:object:WebGapAnimKeyframeInsertObject",
"targetId": "object:WebGapAnimKeyframeInsertObject",
"channelPaths": [
"[\"insert_target\"][0]"
],
"keyframesPerChannel": [
2
]
},
"after": {
"animationId": "action:WebGapAnimKeyframeInsertAction:object:WebGapAnimKeyframeInsertObject",
"keyframesPerChannel": [
3
],
"keyframeInserted": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00187"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00186",
"parentTask": "M16-GAP-00185",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_INSERT_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00185/manifest.json",
"sha256": "0c4e04128b54580988cec59baaf08e1471be26050e380bea7eb9f21a2b092da3"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00186-operator-anim.keyframe_insert.blend",
"sha256": "582dfb8c8dfe6897937afa687d5ebfdb4aeb2e3ae7db73ed02cf6385745bbf70"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00186.py",
"sha256": "edd44185e79eb16c51f2160e5bec5d6ee5dd5ad2d1b662533fa0cfe399e713cd"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-insert-desktop.py",
"sha256": "4c09e55f4f9935b4b4be4c7212451a5c1b01a569aa446c94fe80cdbaff5acda9"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "e32fecfab5c014387399f183d2f715194d32809bfbb9f86894730fce4fb99b98"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00186/anim-keyframe-insert-desktop-report.json",
"sha256": "dfb8191a85b427ab80a3f6cb2fa118f0f7ddc1ce895b93c8c6e4ddf34f4d780c"
},
"webReport": {
"path": "tests/golden/M16-GAP-00186/anim-keyframe-insert-local-exact-report.json",
"sha256": "17e4943e084a1323e1de9eca68039b4a6a9e9d060c9e3d3e44e663c8a9d93ce1"
},
"status": {
"path": "docs/status/M16-GAP-00186.md",
"sha256": "1f2f3ec3947f4593dd5204d1058a125127f396013063a8fa0d447c189f4f50ce"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00186/task-context.json",
"sha256": "4115c25ef7bce2ce0cd3fcadedf6c8aba24fbcd4eb0f037f60f1d0548316d540"
}
},
"nextTask": "M16-GAP-00187"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00186",
"parentTask": "M16-GAP-00185",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_insert 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.",
"scope": {
"gap": "operator:anim.keyframe_insert",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00186.py -- tests/files/web/generated/M16-GAP-00186-operator-anim.keyframe_insert.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00186",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00186"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00186.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1774,
"contextRemainingTokens": 442
},
"source": {
"bytes": 8130,
"tokens": 2034
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00186.py",
"bytes": 1651,
"tokens": 413
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00186-operator-anim.keyframe_insert.blend",
"bytes": 86814,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 423464,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00186/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00186.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00186/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1651,
"tokens": 413
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00187",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00186.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00185/manifest.json",
"parentStatus": "docs/status/M16-GAP-00185.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00186.md",
"tests/golden/M16-GAP-00185/manifest.json",
"docs/status/M16-GAP-00185.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00185",
"parentTask": "M16-GAP-00184",
"status": "done",
"nextTask": "M16-GAP-00186",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00185 Status",
"status: done",
"task: anim.keyframe_delete_vse operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active image strip with a Scene Action animating `blend_alpha` at frames 1, 3, and 5. A foreground `SEQUENCE_EDITOR` context invokes `ANIM_OT_keyframe_delete_vse(confirm=false)` (`poll=true`, `FINISHED`) at frame 3, deleting only the current strip keyframe and preserving the two surrounding keys.",
"evidence:",
"- Desktop evidence records the selected/active strip changing from `[1, 3, 5]` to `[1, 5]`; `blend_alpha` remains 0.5 at frame 3 and save/reopen is exact."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1789,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 448
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00186.md",
"bytes": 1789,
"lines": 38,
"tokens": 448
},
{
"path": "tests/golden/M16-GAP-00185/manifest.json",
"bytes": 2926,
"lines": 74,
"tokens": 732
},
{
"path": "docs/status/M16-GAP-00185.md",
"bytes": 1247,
"lines": 18,
"tokens": 312
}
],
"sourceTokens": 2034,
"evidenceFiles": 1,
"evidenceBytes": 1651,
"evidenceTokens": 413,
"totalTokens": 2447,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3471,
"serializedContextTokens": 754,
"withinBudget": true
}
}

View File

@@ -0,0 +1,67 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
false,
true,
false
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeInsertButtonAction"
},
"active": true,
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
5.0
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
true,
true
],
"values": [
1.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeInsertButtonAction"
},
"active": true,
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00187-operator-anim.keyframe_insert_button.blend",
"fixtureSha256": "5398394b340d509043a2e8130249dbbb0736fa540c833a303445c07c9f775e9a",
"mainMutation": "KEYFRAME_INSERTED",
"operation": "ANIM_KEYFRAME_INSERT_BUTTON_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00187"
}

View File

@@ -0,0 +1,87 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00187",
"operation": "ANIM_KEYFRAME_INSERT_BUTTON_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00187-operator-anim.keyframe_insert_button.blend",
"sha256": "5398394b340d509043a2e8130249dbbb0736fa540c833a303445c07c9f775e9a"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00187/anim-keyframe-insert-button-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYFRAME_INSERTED",
"before": {
"channels": [
{
"frames": [
1,
5
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
true,
true
],
"values": [
1,
5
]
}
],
"name": "WebGapAnimKeyframeInsertButtonAction"
},
"after": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
false,
true,
false
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyframeInsertButtonAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeInsertButtonAction:object:WebGapAnimKeyframeInsertButtonObject",
"targetId": "object:WebGapAnimKeyframeInsertButtonObject",
"channelPaths": [
"[\"insert_target\"][0]"
],
"keyframesPerChannel": [
2
]
},
"after": {
"animationId": "action:WebGapAnimKeyframeInsertButtonAction:object:WebGapAnimKeyframeInsertButtonObject",
"keyframesPerChannel": [
3
],
"keyframeInserted": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00188"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00187",
"parentTask": "M16-GAP-00186",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_INSERT_BUTTON_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00186/manifest.json",
"sha256": "fc77d169050a1bd032820da68dd63e059878188faa2eb88ab1fc7ffc5041548d"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00187-operator-anim.keyframe_insert_button.blend",
"sha256": "5398394b340d509043a2e8130249dbbb0736fa540c833a303445c07c9f775e9a"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00187.py",
"sha256": "7eaac0eb63db785dea7da7df596fa19ed5447b356b13667c5f25e5ee1cecf14d"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-insert-button-desktop.py",
"sha256": "0fa0478deb1eb742105b5902070e5764113378ed1c7d390155cd2be61e991b08"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "cd43c016cf91a8e258f8f6a53dd4148c6986bd2ccddfc6f16272ab163bb2419b"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00187/anim-keyframe-insert-button-desktop-report.json",
"sha256": "b7de5f8ac81d96e316a6d13b1f03650339841bf043ff3a4c9b3396a14420f506"
},
"webReport": {
"path": "tests/golden/M16-GAP-00187/anim-keyframe-insert-button-local-exact-report.json",
"sha256": "460c2285310d2cf456ced4f1438ab6fd609a1470dde4a37cd09b349099f90873"
},
"status": {
"path": "docs/status/M16-GAP-00187.md",
"sha256": "16c75cd97e157bcb23bce603f7e27f6f095ce1c76c3f11501355a9431472e691"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00187/task-context.json",
"sha256": "cdfc0b01d9e76dfaed39d9e6c44836cf3aea3df2a363689177e775d2286e0182"
}
},
"nextTask": "M16-GAP-00188"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00187",
"parentTask": "M16-GAP-00186",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_insert_button 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.",
"scope": {
"gap": "operator:anim.keyframe_insert_button",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00187.py -- tests/files/web/generated/M16-GAP-00187-operator-anim.keyframe_insert_button.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00187",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00187"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00187.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1772,
"contextRemainingTokens": 442
},
"source": {
"bytes": 8132,
"tokens": 2034
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00187.py",
"bytes": 1346,
"tokens": 337
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00187-operator-anim.keyframe_insert_button.blend",
"bytes": 86812,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 429105,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00187/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00187.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00187/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1346,
"tokens": 337
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00188",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00187.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00186/manifest.json",
"parentStatus": "docs/status/M16-GAP-00186.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00187.md",
"tests/golden/M16-GAP-00186/manifest.json",
"docs/status/M16-GAP-00186.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00186",
"parentTask": "M16-GAP-00185",
"status": "done",
"nextTask": "M16-GAP-00187",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00186 Status",
"status: done",
"task: anim.keyframe_insert operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a custom `insert_target` property and a named active Keying Set. Its Action starts with keys at frames 1 and 5. A foreground `VIEW_3D` context invokes `ANIM_OT_keyframe_insert()` (`poll=true`, `FINISHED`) at frame 3, inserting the current key while preserving the existing keys.",
"evidence:",
"- Desktop evidence records the Action changing from `[1, 5]` to `[1, 3, 5]`; the inserted key is the only selected key (`[false, true, false]`), the custom property remains at 3.0, and save/reopen is exact."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1824,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 456
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00187.md",
"bytes": 1824,
"lines": 38,
"tokens": 456
},
{
"path": "tests/golden/M16-GAP-00186/manifest.json",
"bytes": 2906,
"lines": 74,
"tokens": 727
},
{
"path": "docs/status/M16-GAP-00186.md",
"bytes": 1234,
"lines": 18,
"tokens": 309
}
],
"sourceTokens": 2034,
"evidenceFiles": 1,
"evidenceBytes": 1346,
"evidenceTokens": 337,
"totalTokens": 2371,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3395,
"serializedContextTokens": 760,
"withinBudget": true
}
}

View File

@@ -0,0 +1,69 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
false,
true,
false
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeInsertByNameAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyframeInsertByNameSet",
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
5.0
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
true,
true
],
"values": [
1.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeInsertByNameAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyframeInsertByNameSet",
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00188-operator-anim.keyframe_insert_by_name.blend",
"fixtureSha256": "b0be38528561fad722c52000ced9b4c44bff594d5fcf134ab89295ab8b97554d",
"mainMutation": "KEYFRAME_INSERTED",
"operation": "ANIM_KEYFRAME_INSERT_BY_NAME_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00188"
}

View File

@@ -0,0 +1,87 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00188",
"operation": "ANIM_KEYFRAME_INSERT_BY_NAME_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00188-operator-anim.keyframe_insert_by_name.blend",
"sha256": "b0be38528561fad722c52000ced9b4c44bff594d5fcf134ab89295ab8b97554d"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00188/anim-keyframe-insert-by-name-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYFRAME_INSERTED",
"before": {
"channels": [
{
"frames": [
1,
5
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
true,
true
],
"values": [
1,
5
]
}
],
"name": "WebGapAnimKeyframeInsertByNameAction"
},
"after": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
false,
true,
false
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyframeInsertByNameAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeInsertByNameAction:object:WebGapAnimKeyframeInsertByNameObject",
"targetId": "object:WebGapAnimKeyframeInsertByNameObject",
"channelPaths": [
"[\"insert_target\"][0]"
],
"keyframesPerChannel": [
2
]
},
"after": {
"animationId": "action:WebGapAnimKeyframeInsertByNameAction:object:WebGapAnimKeyframeInsertByNameObject",
"keyframesPerChannel": [
3
],
"keyframeInserted": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00189"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00188",
"parentTask": "M16-GAP-00187",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_INSERT_BY_NAME_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00187/manifest.json",
"sha256": "942eafb747f0d002ad2179d90f89acc64e3c347d340355895136689755a2052e"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00188-operator-anim.keyframe_insert_by_name.blend",
"sha256": "b0be38528561fad722c52000ced9b4c44bff594d5fcf134ab89295ab8b97554d"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00188.py",
"sha256": "109653bb9dd32d38ba755a6b284bdc75cca195894327db2f96feaf47faf8d935"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-insert-by-name-desktop.py",
"sha256": "754eaa916735252fd9a462629da646890fbb9285c201d569e36314ca1b1d8bb2"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "df1ae531630362ab3e5e6f7e7aef6abbbff3e0d1becd8da84bced5ae5dee258a"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00188/anim-keyframe-insert-by-name-desktop-report.json",
"sha256": "d89d0950420ef0a81ca983619bf0f168b173e1a631769bcb4b342cfe3b2a9c09"
},
"webReport": {
"path": "tests/golden/M16-GAP-00188/anim-keyframe-insert-by-name-local-exact-report.json",
"sha256": "4928e35b98ac71b76c68fe2eccbd86481bb854123d428b1af66fbc7270df7e42"
},
"status": {
"path": "docs/status/M16-GAP-00188.md",
"sha256": "bf958a16b78eae1da59438bfac089fcf16197982a23d91dbcd6d386942bc6425"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00188/task-context.json",
"sha256": "64ceb67dd3d00a7e07a5dd4f263527326442a591b1b5a404c2235809c05274d0"
}
},
"nextTask": "M16-GAP-00189"
}

View File

@@ -0,0 +1,182 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00188",
"parentTask": "M16-GAP-00187",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_insert_by_name 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.",
"scope": {
"gap": "operator:anim.keyframe_insert_by_name",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00188.py -- tests/files/web/generated/M16-GAP-00188-operator-anim.keyframe_insert_by_name.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00188",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00188"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1633,
"contextRemainingTokens": 406
},
"source": {
"bytes": 8271,
"tokens": 2070
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00188-operator-anim.keyframe_insert_by_name.blend",
"bytes": 86813,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/M16-GAP-00188.py",
"bytes": 1665,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 434821,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00188/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00188.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00188/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00189",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00188.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00187/manifest.json",
"parentStatus": "docs/status/M16-GAP-00187.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00188.md",
"tests/golden/M16-GAP-00187/manifest.json",
"docs/status/M16-GAP-00187.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00187",
"parentTask": "M16-GAP-00186",
"status": "done",
"nextTask": "M16-GAP-00188",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00187 Status",
"status: done",
"task: anim.keyframe_insert_button operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a custom `insert_target` property and an Action keyed at frames 1 and 5. A registered Properties panel exposes the animated property as a real UI button. A foreground Properties context invokes `ANIM_OT_keyframe_insert_button(all=true)` through that active button at frame 3 (`poll=true`, `FINISHED`), inserting the current key while preserving the two existing keys.",
"evidence:",
"- Desktop evidence records the Action changing from `[1, 5]` to `[1, 3, 5]`; the inserted key is the only selected key (`[false, true, false]`), the custom property remains at 3.0 and save/reopen is exact."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1829,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 458
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00188.md",
"bytes": 1829,
"lines": 38,
"tokens": 458
},
{
"path": "tests/golden/M16-GAP-00187/manifest.json",
"bytes": 2941,
"lines": 74,
"tokens": 736
},
{
"path": "docs/status/M16-GAP-00187.md",
"bytes": 1333,
"lines": 18,
"tokens": 334
}
],
"sourceTokens": 2070,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2070,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3094,
"serializedContextTokens": 725,
"withinBudget": true
}
}

View File

@@ -0,0 +1,69 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
false,
true,
false
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeInsertMenuAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyframeInsertMenuSet",
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
5.0
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
true,
true
],
"values": [
1.0,
5.0
]
}
],
"name": "WebGapAnimKeyframeInsertMenuAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyframeInsertMenuSet",
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00189-operator-anim.keyframe_insert_menu.blend",
"fixtureSha256": "8c34e11c10c2de3de7209006c87594db1a1df0b62a6f9b92dac45f2cb176a52f",
"mainMutation": "KEYFRAME_INSERTED",
"operation": "ANIM_KEYFRAME_INSERT_MENU_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00189"
}

View File

@@ -0,0 +1,87 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00189",
"operation": "ANIM_KEYFRAME_INSERT_MENU_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00189-operator-anim.keyframe_insert_menu.blend",
"sha256": "8c34e11c10c2de3de7209006c87594db1a1df0b62a6f9b92dac45f2cb176a52f"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00189/anim-keyframe-insert-menu-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYFRAME_INSERTED",
"before": {
"channels": [
{
"frames": [
1,
5
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
true,
true
],
"values": [
1,
5
]
}
],
"name": "WebGapAnimKeyframeInsertMenuAction"
},
"after": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"insert_target\"]",
"selected": [
false,
true,
false
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyframeInsertMenuAction"
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyframeInsertMenuAction:object:WebGapAnimKeyframeInsertMenuObject",
"targetId": "object:WebGapAnimKeyframeInsertMenuObject",
"channelPaths": [
"[\"insert_target\"][0]"
],
"keyframesPerChannel": [
2
]
},
"after": {
"animationId": "action:WebGapAnimKeyframeInsertMenuAction:object:WebGapAnimKeyframeInsertMenuObject",
"keyframesPerChannel": [
3
],
"keyframeInserted": true
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00190"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00189",
"parentTask": "M16-GAP-00188",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYFRAME_INSERT_MENU_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00188/manifest.json",
"sha256": "1ea8b1c23b9e324634206e37e4b74f4714dd749a1d712d3a411a03d2be6aa3f7"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00189-operator-anim.keyframe_insert_menu.blend",
"sha256": "8c34e11c10c2de3de7209006c87594db1a1df0b62a6f9b92dac45f2cb176a52f"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00189.py",
"sha256": "20c8d28aea4b14e24dfe83e1b7c3906e8bf1f2ed1fbb723542320a7ece13f73f"
},
"desktopChecker": {
"path": "tools/web/check-action-keyframe-insert-menu-desktop.py",
"sha256": "a8a378ecd1242852dac76e83d5a19412aa6caf70a85f23364f17d48c806bb921"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "1cb54ea443ad3162267407c789331cc5078dfb05b47f2f6f902132f016813b59"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00189/anim-keyframe-insert-menu-desktop-report.json",
"sha256": "8f01c695716b3902e0d8caa4b335bc67257e4688a4af5e35fd61b5d98d9b3d03"
},
"webReport": {
"path": "tests/golden/M16-GAP-00189/anim-keyframe-insert-menu-local-exact-report.json",
"sha256": "a95cc2b84481263298f5bef1fbe0d46a2ab272de25ce5e0a39e84457453e0144"
},
"status": {
"path": "docs/status/M16-GAP-00189.md",
"sha256": "f57b7b340a8c137afda5bb04daa4a71de372e2b0bd74fdb692029bea2da5e7c4"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00189/task-context.json",
"sha256": "46d321ed3909a9a52fdaf4b2c1f2ee9be2d16c2c8aff32ce4baca43c09f41682"
}
},
"nextTask": "M16-GAP-00190"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00189",
"parentTask": "M16-GAP-00188",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyframe_insert_menu 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.",
"scope": {
"gap": "operator:anim.keyframe_insert_menu",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00189.py -- tests/files/web/generated/M16-GAP-00189-operator-anim.keyframe_insert_menu.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00189",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00189"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00189.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1679,
"contextRemainingTokens": 418
},
"source": {
"bytes": 8225,
"tokens": 2058
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00189.py",
"bytes": 1620,
"tokens": 405
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00189-operator-anim.keyframe_insert_menu.blend",
"bytes": 86801,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 440470,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00189/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00189.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00189/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1620,
"tokens": 405
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00190",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00189.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00188/manifest.json",
"parentStatus": "docs/status/M16-GAP-00188.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00189.md",
"tests/golden/M16-GAP-00188/manifest.json",
"docs/status/M16-GAP-00188.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00188",
"parentTask": "M16-GAP-00187",
"status": "done",
"nextTask": "M16-GAP-00189",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00188 Status",
"status: done",
"task: anim.keyframe_insert_by_name operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a custom `insert_target` property, an Action keyed at frames 1 and 5, and a named Keying Set targeting that property. A foreground `VIEW_3D` context invokes `ANIM_OT_keyframe_insert_by_name(type=WebGapAnimKeyframeInsertByNameSet)` (`poll=true`, `FINISHED`) at frame 3, inserting the current key while preserving the two existing keys.",
"evidence:",
"- Desktop evidence records the Action changing from `[1, 5]` to `[1, 3, 5]`; the inserted key is the only selected key (`[false, true, false]`), the custom property remains at 3.0 and save/reopen is exact."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1814,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 454
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00189.md",
"bytes": 1814,
"lines": 38,
"tokens": 454
},
{
"path": "tests/golden/M16-GAP-00188/manifest.json",
"bytes": 2946,
"lines": 74,
"tokens": 737
},
{
"path": "docs/status/M16-GAP-00188.md",
"bytes": 1297,
"lines": 18,
"tokens": 325
}
],
"sourceTokens": 2058,
"evidenceFiles": 1,
"evidenceBytes": 1620,
"evidenceTokens": 405,
"totalTokens": 2463,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3487,
"serializedContextTokens": 758,
"withinBudget": true
}
}

View File

@@ -0,0 +1,72 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"active_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetActiveAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetActiveB",
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"active_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetActiveAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetActiveA",
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00190-operator-anim.keying_set_active_set.blend",
"fixtureSha256": "54d342c6054339281d8d380e01eb64f038e4735626a69248de66fadee34fbcae",
"mainMutation": "ACTIVE_KEYING_SET_CHANGED",
"operation": "ANIM_KEYING_SET_ACTIVE_SET_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00190"
}

View File

@@ -0,0 +1,103 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00190",
"operation": "ANIM_KEYING_SET_ACTIVE_SET_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00190-operator-anim.keying_set_active_set.blend",
"sha256": "54d342c6054339281d8d380e01eb64f038e4735626a69248de66fadee34fbcae"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00190/anim-keying-set-active-set-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "ACTIVE_KEYING_SET_CHANGED",
"before": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"active_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetActiveAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetActiveA",
"selected": true,
"value": 3
},
"after": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"active_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetActiveAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetActiveB",
"selected": true,
"value": 3
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyingSetActiveAction:object:WebGapAnimKeyingSetActiveObject",
"targetId": "object:WebGapAnimKeyingSetActiveObject",
"channelPaths": [
"[\"active_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyingSetActiveAction:object:WebGapAnimKeyingSetActiveObject",
"keyframesPerChannel": [
3
],
"visibleMainUnchanged": true,
"keyingSetMetadata": "NOT_EXPOSED_BY_SCENE_SNAPSHOT"
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00191"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00190",
"parentTask": "M16-GAP-00189",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYING_SET_ACTIVE_SET_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00189/manifest.json",
"sha256": "1ffc688a62e5c7f5141a9cd52dd192630097f01eacc8a8c6eac4991586eba33e"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00190-operator-anim.keying_set_active_set.blend",
"sha256": "54d342c6054339281d8d380e01eb64f038e4735626a69248de66fadee34fbcae"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00190.py",
"sha256": "f54bc93cb7b686883ae9bf3b36406d953af3c8246dca01e439999b5e09e4574a"
},
"desktopChecker": {
"path": "tools/web/check-action-keying-set-active-set-desktop.py",
"sha256": "c0aaab7f5aae2982303ca0ab4cb05186d3d67ba21728bb49a2f8615a300d05f5"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "3e662b1abc876a4602aec079d6c6fa8d200ab14b102efb426d94bc712113634c"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00190/anim-keying-set-active-set-desktop-report.json",
"sha256": "69ff6f5b3862697e6d17545c63264a0361aa9f6996b874897dd25a138257bc38"
},
"webReport": {
"path": "tests/golden/M16-GAP-00190/anim-keying-set-active-set-local-exact-report.json",
"sha256": "70e94768b98b0b14a1d03e9e016e62374838b4ad6fa68f893519fed6674f709d"
},
"status": {
"path": "docs/status/M16-GAP-00190.md",
"sha256": "59def4f8ecb6005d53b5f1b335da97abf89a21f55ceb3589bd87493e2d06b9bd"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00190/task-context.json",
"sha256": "aaff27f84e2eb6f2d49c31ef6467e512acd01efca64a46dbe0fb967f19aedd98"
}
},
"nextTask": "M16-GAP-00191"
}

View File

@@ -0,0 +1,182 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00190",
"parentTask": "M16-GAP-00189",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keying_set_active_set 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.",
"scope": {
"gap": "operator:anim.keying_set_active_set",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00190.py -- tests/files/web/generated/M16-GAP-00190-operator-anim.keying_set_active_set.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00190",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00190"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1722,
"contextRemainingTokens": 430
},
"source": {
"bytes": 8182,
"tokens": 2046
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00190-operator-anim.keying_set_active_set.blend",
"bytes": 86889,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/M16-GAP-00190.py",
"bytes": 1743,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 445010,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00190/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00190.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00190/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00191",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00190.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00189/manifest.json",
"parentStatus": "docs/status/M16-GAP-00189.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00190.md",
"tests/golden/M16-GAP-00189/manifest.json",
"docs/status/M16-GAP-00189.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00189",
"parentTask": "M16-GAP-00188",
"status": "done",
"nextTask": "M16-GAP-00190",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00189 Status",
"status: done",
"task: anim.keyframe_insert_menu operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a custom `insert_target` property, an Action keyed at frames 1 and 5, and a named active Keying Set. A foreground `VIEW_3D` context invokes `ANIM_OT_keyframe_insert_menu(always_prompt=false)` (`poll=true`, `FINISHED`); Blender takes the active-Keying-Set fast path and inserts the current key at frame 3.",
"evidence:",
"- Desktop evidence records the Action changing from `[1, 5]` to `[1, 3, 5]`; the inserted key is the only selected key (`[false, true, false]`), the custom property remains at 3.0 and save/reopen is exact."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1819,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 455
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00190.md",
"bytes": 1819,
"lines": 38,
"tokens": 455
},
{
"path": "tests/golden/M16-GAP-00189/manifest.json",
"bytes": 2931,
"lines": 74,
"tokens": 733
},
{
"path": "docs/status/M16-GAP-00189.md",
"bytes": 1264,
"lines": 18,
"tokens": 316
}
],
"sourceTokens": 2046,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2046,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3070,
"serializedContextTokens": 723,
"withinBudget": true
}
}

View File

@@ -0,0 +1,74 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"add_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetAddAction"
},
"active": true,
"activeKeyingSet": "KeyingSet",
"keyingSetCount": 1,
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"add_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetAddAction"
},
"active": true,
"activeKeyingSet": null,
"keyingSetCount": 0,
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00191-operator-anim.keying_set_add.blend",
"fixtureSha256": "a87db22a399c85cb282baf65a58763df7656603df9571bc34cdece31ef439187",
"mainMutation": "KEYING_SET_ADDED",
"operation": "ANIM_KEYING_SET_ADD_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00191"
}

View File

@@ -0,0 +1,105 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00191",
"operation": "ANIM_KEYING_SET_ADD_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00191-operator-anim.keying_set_add.blend",
"sha256": "a87db22a399c85cb282baf65a58763df7656603df9571bc34cdece31ef439187"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00191/anim-keying-set-add-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYING_SET_ADDED",
"before": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"add_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetAddAction"
},
"active": true,
"activeKeyingSet": null,
"keyingSetCount": 0,
"selected": true,
"value": 3
},
"after": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"add_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetAddAction"
},
"active": true,
"activeKeyingSet": "KeyingSet",
"keyingSetCount": 1,
"selected": true,
"value": 3
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyingSetAddAction:object:WebGapAnimKeyingSetAddObject",
"targetId": "object:WebGapAnimKeyingSetAddObject",
"channelPaths": [
"[\"add_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyingSetAddAction:object:WebGapAnimKeyingSetAddObject",
"keyframesPerChannel": [
3
],
"visibleMainUnchanged": true,
"keyingSetMetadata": "NOT_EXPOSED_BY_SCENE_SNAPSHOT"
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00192"
}

View File

@@ -0,0 +1,73 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00191",
"parentTask": "M16-GAP-00190",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYING_SET_ADD_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/M16-GAP-00190/manifest.json",
"sha256": "b5b28c6e402db6eb90d4c4a5f1837476d3a24d6725e63c9b70ec5461a4c665d7"
},
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00191-operator-anim.keying_set_add.blend",
"sha256": "a87db22a399c85cb282baf65a58763df7656603df9571bc34cdece31ef439187"
},
"generator": {
"path": "tools/web/generated/M16-GAP-00191.py",
"sha256": "42f787b67fd1858ef184ffaa76438a025d92fc49fe80cdf3a3334e314839a123"
},
"desktopChecker": {
"path": "tools/web/check-action-keying-set-add-desktop.py",
"sha256": "70f33c905c82b3668c51e0f0c177dc4676417f8a6d9f2c1e0c87d6b9f433a958"
},
"webChecker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "cd8fbe18375df8f08c799fab350fe4a864639c12947d1ea8faafca8b4642d6e4"
},
"reader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf"
},
"protocol": {
"path": "web/protocol/editor-workflow.ts",
"sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a"
},
"sceneIrProtocol": {
"path": "web/protocol/scene-ir.ts",
"sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226"
},
"wasm": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmPublic": {
"path": "web/app/public/vendor/blender/web_engine.wasm",
"sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f"
},
"wasmJs": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed"
},
"desktopReport": {
"path": "tests/golden/M16-GAP-00191/anim-keying-set-add-desktop-report.json",
"sha256": "b19f86edd48c4fb40f3077af333baa89127d51218ca110861f2e77063caff304"
},
"webReport": {
"path": "tests/golden/M16-GAP-00191/anim-keying-set-add-local-exact-report.json",
"sha256": "d244b7788db82edae28bf1ceebe5d5a8978b317ea8a259abd4ecc1c071fdc68a"
},
"status": {
"path": "docs/status/M16-GAP-00191.md",
"sha256": "c4d82279105c2e1821577084e539495d09bd99de99eaefadc1f23ed95841a333"
},
"taskContext": {
"path": "tests/golden/M16-GAP-00191/task-context.json",
"sha256": "640288c7b699719aae7d92a951846b7dcdd31e944e1ba88440300331de3af570"
}
},
"nextTask": "M16-GAP-00192"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00191",
"parentTask": "M16-GAP-00190",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keying_set_add 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.",
"scope": {
"gap": "operator:anim.keying_set_add",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00191.py -- tests/files/web/generated/M16-GAP-00191-operator-anim.keying_set_add.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00191",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00191"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00191.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1811,
"contextRemainingTokens": 452
},
"source": {
"bytes": 8093,
"tokens": 2024
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00191.py",
"bytes": 1296,
"tokens": 324
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00191-operator-anim.keying_set_add.blend",
"bytes": 86785,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 449432,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00191/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00191.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00191/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1296,
"tokens": 324
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00192",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00191.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00190/manifest.json",
"parentStatus": "docs/status/M16-GAP-00190.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00191.md",
"tests/golden/M16-GAP-00190/manifest.json",
"docs/status/M16-GAP-00190.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00190",
"parentTask": "M16-GAP-00189",
"status": "done",
"nextTask": "M16-GAP-00191",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00190 Status",
"status: done",
"task: anim.keying_set_active_set operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a custom `active_target` property, a three-key Action, and two named Keying Sets. A foreground `VIEW_3D` context invokes `ANIM_OT_keying_set_active_set(type=WebGapAnimKeyingSetActiveB)` (`poll=true`, `FINISHED`), changing the active Keying Set from A to B without changing the Action.",
"evidence:",
"- Desktop evidence records active Keying Set `WebGapAnimKeyingSetActiveA` changing to `WebGapAnimKeyingSetActiveB`; the Action remains `[1, 3, 5]`, the property remains 3.0, and save/reopen is exact."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1784,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 446
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00191.md",
"bytes": 1784,
"lines": 38,
"tokens": 446
},
{
"path": "tests/golden/M16-GAP-00190/manifest.json",
"bytes": 2936,
"lines": 74,
"tokens": 734
},
{
"path": "docs/status/M16-GAP-00190.md",
"bytes": 1205,
"lines": 18,
"tokens": 302
}
],
"sourceTokens": 2024,
"evidenceFiles": 1,
"evidenceBytes": 1296,
"evidenceTokens": 324,
"totalTokens": 2348,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3372,
"serializedContextTokens": 754,
"withinBudget": true
}
}

View File

@@ -0,0 +1,77 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"export_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetExportAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetExportSet",
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"export_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetExportAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetExportSet",
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"exportedScript": {
"bytes": 471,
"path": "/home/mes123456/workinf_Blender_Wasm/tests/golden/M16-GAP-00192/WebGapAnimKeyingSetExportSet.py",
"sha256": "ef38d3cd23ef00a277e66202010b2001efca51cec053b34762924db32592f966"
},
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00192-operator-anim.keying_set_export.blend",
"fixtureSha256": "ff0342e9d493bc8b20d85acba9177c7115d77f5f515e1d70fc1caf056957c29f",
"mainMutation": "NONE_EXPORT_ONLY",
"operation": "ANIM_KEYING_SET_EXPORT_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00192"
}

View File

@@ -0,0 +1,108 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00192",
"operation": "ANIM_KEYING_SET_EXPORT_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00192-operator-anim.keying_set_export.blend",
"sha256": "ff0342e9d493bc8b20d85acba9177c7115d77f5f515e1d70fc1caf056957c29f"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00192/anim-keying-set-export-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "NONE_EXPORT_ONLY",
"before": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"export_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetExportAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetExportSet",
"selected": true,
"value": 3
},
"after": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"export_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetExportAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetExportSet",
"selected": true,
"value": 3
},
"exportedScript": {
"path": "tests/golden/M16-GAP-00192/WebGapAnimKeyingSetExportSet.py",
"sha256": "ef38d3cd23ef00a277e66202010b2001efca51cec053b34762924db32592f966",
"bytes": 471
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyingSetExportAction:object:WebGapAnimKeyingSetExportObject",
"targetId": "object:WebGapAnimKeyingSetExportObject",
"channelPaths": [
"[\"export_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyingSetExportAction:object:WebGapAnimKeyingSetExportObject",
"keyframesPerChannel": [
3
],
"visibleMainUnchanged": true,
"keyingSetMetadata": "NOT_EXPOSED_BY_SCENE_SNAPSHOT"
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00193"
}

View File

@@ -0,0 +1,29 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00192",
"parentTask": "M16-GAP-00191",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYING_SET_EXPORT_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": { "path": "tests/golden/M16-GAP-00191/manifest.json", "sha256": "1498471253dd616979da562845d490964291b15431b49be766ec224c0aada7aa" },
"fixture": { "path": "tests/files/web/generated/M16-GAP-00192-operator-anim.keying_set_export.blend", "sha256": "ff0342e9d493bc8b20d85acba9177c7115d77f5f515e1d70fc1caf056957c29f" },
"generator": { "path": "tools/web/generated/M16-GAP-00192.py", "sha256": "cb932180b82d9eabe3fac18fa461f4107fc6d1016a262c120c8be0758eeeeafb" },
"desktopChecker": { "path": "tools/web/check-action-keying-set-export-desktop.py", "sha256": "e75538f411751b309e6eb2d4376839b0e1e70784414463356ab36ae39a7ad799" },
"webChecker": { "path": "tools/web/check-generated-gap.mjs", "sha256": "6e3ccae10e11cdf01e27c8d50f0a571d82e650b75c58fd0d283c9f75e2d4db8d" },
"reader": { "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf" },
"protocol": { "path": "web/protocol/editor-workflow.ts", "sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a" },
"sceneIrProtocol": { "path": "web/protocol/scene-ir.ts", "sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226" },
"wasm": { "path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmPublic": { "path": "web/app/public/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmJs": { "path": "web/app/src/vendor/blender/web_engine.js", "sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed" },
"desktopReport": { "path": "tests/golden/M16-GAP-00192/anim-keying-set-export-desktop-report.json", "sha256": "14b1c5675c9088305246d5afea8f291ef989c6735c3795e377b42524af2f7fed" },
"webReport": { "path": "tests/golden/M16-GAP-00192/anim-keying-set-export-local-exact-report.json", "sha256": "0544edee932393df992ac05a4dbb07b4b1c82e4045cb15b674b182989105d0fa" },
"exportedScript": { "path": "tests/golden/M16-GAP-00192/WebGapAnimKeyingSetExportSet.py", "sha256": "ef38d3cd23ef00a277e66202010b2001efca51cec053b34762924db32592f966" },
"status": { "path": "docs/status/M16-GAP-00192.md", "sha256": "1367262e064964fa586ffe5c09ee1702f9be0d7f5f55f5794d54a48ebe8c5349" },
"taskContext": { "path": "tests/golden/M16-GAP-00192/task-context.json", "sha256": "5bdca225c7027399992cc26b67f0e7ed37726d1adc7afd1009677a9eaf491c30" }
},
"nextTask": "M16-GAP-00193"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00192",
"parentTask": "M16-GAP-00191",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keying_set_export 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.",
"scope": {
"gap": "operator:anim.keying_set_export",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00192.py -- tests/files/web/generated/M16-GAP-00192-operator-anim.keying_set_export.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00192",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00192"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00192.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1939,
"contextRemainingTokens": 483
},
"source": {
"bytes": 7965,
"tokens": 1993
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00192.py",
"bytes": 1476,
"tokens": 369
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00192-operator-anim.keying_set_export.blend",
"bytes": 86891,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 454189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00192/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00192.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00192/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1476,
"tokens": 369
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00193",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00192.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00191/manifest.json",
"parentStatus": "docs/status/M16-GAP-00191.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00192.md",
"tests/golden/M16-GAP-00191/manifest.json",
"docs/status/M16-GAP-00191.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00191",
"parentTask": "M16-GAP-00190",
"status": "done",
"nextTask": "M16-GAP-00192",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00191 Status",
"status: done",
"task: anim.keying_set_add operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a custom `add_target` property and a three-key Action, but no scene Keying Sets. A foreground `VIEW_3D` context invokes `ANIM_OT_keying_set_add()` (`poll=true`, `FINISHED`), adding and activating one empty Keying Set without changing the Action.",
"evidence:",
"- Desktop evidence records Keying Set count `0→1`, an active newly-added set, unchanged `[1, 3, 5]` Action data, and exact save/reopen."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1799,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 450
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00192.md",
"bytes": 1799,
"lines": 38,
"tokens": 450
},
{
"path": "tests/golden/M16-GAP-00191/manifest.json",
"bytes": 2901,
"lines": 74,
"tokens": 726
},
{
"path": "docs/status/M16-GAP-00191.md",
"bytes": 1097,
"lines": 18,
"tokens": 275
}
],
"sourceTokens": 1993,
"evidenceFiles": 1,
"evidenceBytes": 1476,
"evidenceTokens": 369,
"totalTokens": 2362,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3386,
"serializedContextTokens": 756,
"withinBudget": true
}
}

View File

@@ -0,0 +1,89 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"path_add_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetPathAddAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetPathAddSet",
"activePathIndex": 0,
"keyingSetCount": 1,
"pathCount": 1,
"paths": [
{
"arrayIndex": 0,
"dataPath": "",
"group": "",
"groupMethod": "KEYINGSET",
"idType": "OBJECT",
"useEntireArray": true
}
],
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"path_add_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetPathAddAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetPathAddSet",
"activePathIndex": 0,
"keyingSetCount": 1,
"pathCount": 0,
"paths": [],
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00193-operator-anim.keying_set_path_add.blend",
"fixtureSha256": "4e14a61ca8cd86b528747d576aa89ff8dcd3c9d3b8f52625a46ff5b7594cc107",
"mainMutation": "KEYING_SET_PATH_ADDED",
"operation": "ANIM_KEYING_SET_PATH_ADD_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00193"
}

View File

@@ -0,0 +1,120 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00193",
"operation": "ANIM_KEYING_SET_PATH_ADD_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00193-operator-anim.keying_set_path_add.blend",
"sha256": "4e14a61ca8cd86b528747d576aa89ff8dcd3c9d3b8f52625a46ff5b7594cc107"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00193/anim-keying-set-path-add-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYING_SET_PATH_ADDED",
"before": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"path_add_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetPathAddAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetPathAddSet",
"activePathIndex": 0,
"keyingSetCount": 1,
"pathCount": 0,
"paths": [],
"selected": true,
"value": 3
},
"after": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"path_add_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetPathAddAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetPathAddSet",
"activePathIndex": 0,
"keyingSetCount": 1,
"pathCount": 1,
"paths": [
{
"arrayIndex": 0,
"dataPath": "",
"group": "",
"groupMethod": "KEYINGSET",
"idType": "OBJECT",
"useEntireArray": true
}
],
"selected": true,
"value": 3
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyingSetPathAddAction:object:WebGapAnimKeyingSetPathAddObject",
"targetId": "object:WebGapAnimKeyingSetPathAddObject",
"channelPaths": [
"[\"path_add_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyingSetPathAddAction:object:WebGapAnimKeyingSetPathAddObject",
"keyframesPerChannel": [
3
],
"visibleMainUnchanged": true,
"keyingSetMetadata": "NOT_EXPOSED_BY_SCENE_SNAPSHOT"
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00194"
}

View File

@@ -0,0 +1,28 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00193",
"parentTask": "M16-GAP-00192",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYING_SET_PATH_ADD_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": { "path": "tests/golden/M16-GAP-00192/manifest.json", "sha256": "03d3b95ec10a7ee544448d4e9869684ca8c6a3f11a1e321fa80d58c812135c76" },
"fixture": { "path": "tests/files/web/generated/M16-GAP-00193-operator-anim.keying_set_path_add.blend", "sha256": "4e14a61ca8cd86b528747d576aa89ff8dcd3c9d3b8f52625a46ff5b7594cc107" },
"generator": { "path": "tools/web/generated/M16-GAP-00193.py", "sha256": "bf3d651dd050b39186f50095519cd02e16fbc9d652e2d307b7f5a05703ab18d7" },
"desktopChecker": { "path": "tools/web/check-action-keying-set-path-add-desktop.py", "sha256": "62a65a5b58bdf9d883691d47c13ece9759f763acf58ab46660a6fc93f486e04d" },
"webChecker": { "path": "tools/web/check-generated-gap.mjs", "sha256": "0f996fe9201c7485a9ef2e829ed2f6361b7cae0eb75477a145aa8f71e443f5cf" },
"reader": { "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf" },
"protocol": { "path": "web/protocol/editor-workflow.ts", "sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a" },
"sceneIrProtocol": { "path": "web/protocol/scene-ir.ts", "sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226" },
"wasm": { "path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmPublic": { "path": "web/app/public/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmJs": { "path": "web/app/src/vendor/blender/web_engine.js", "sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed" },
"desktopReport": { "path": "tests/golden/M16-GAP-00193/anim-keying-set-path-add-desktop-report.json", "sha256": "0deab04ebdbf06c6b344707bf3025677d445c6995cbe3ea1268808c59ec74472" },
"webReport": { "path": "tests/golden/M16-GAP-00193/anim-keying-set-path-add-local-exact-report.json", "sha256": "61e41fbc56bc7c6c1cbceb4ad3e28cb599e072f8c865f0a573091b47ba53790f" },
"status": { "path": "docs/status/M16-GAP-00193.md", "sha256": "f5510b2a17b16c1ffdd873b30c0b397b25d6d1660eb7f16cfcbcfdccbb4ae668" },
"taskContext": { "path": "tests/golden/M16-GAP-00193/task-context.json", "sha256": "d459521fe19a776c7b81dd7b49dc3aba7e3f5eba864612f0817fd1ca9bb4dda9" }
},
"nextTask": "M16-GAP-00194"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00193",
"parentTask": "M16-GAP-00192",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keying_set_path_add 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.",
"scope": {
"gap": "operator:anim.keying_set_path_add",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00193.py -- tests/files/web/generated/M16-GAP-00193-operator-anim.keying_set_path_add.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00193",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00193"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00193.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1957,
"contextRemainingTokens": 488
},
"source": {
"bytes": 7947,
"tokens": 1988
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00193.py",
"bytes": 1534,
"tokens": 384
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00193-operator-anim.keying_set_path_add.blend",
"bytes": 86860,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 458781,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00193/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00193.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00193/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1534,
"tokens": 384
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00194",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00193.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00192/manifest.json",
"parentStatus": "docs/status/M16-GAP-00192.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00193.md",
"tests/golden/M16-GAP-00192/manifest.json",
"docs/status/M16-GAP-00192.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00192",
"parentTask": "M16-GAP-00191",
"status": "done",
"nextTask": "M16-GAP-00193",
"artifactCount": 16
},
"statusSummary": [
"# M16-GAP-00192 Status",
"status: done",
"task: anim.keying_set_export operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a custom `export_target` property, a three-key Action, and one named Keying Set. Blender invokes `ANIM_OT_keying_set_export(filepath=..., filter_python=true)` (`poll=true`, `FINISHED`) and writes the Keying Set Python export without mutating Main.",
"evidence:",
"- Desktop evidence records unchanged object/Action state, exact save/reopen, and a non-empty hash-bound exported Python script."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1809,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 453
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00193.md",
"bytes": 1809,
"lines": 38,
"tokens": 453
},
{
"path": "tests/golden/M16-GAP-00192/manifest.json",
"bytes": 2850,
"lines": 30,
"tokens": 713
},
{
"path": "docs/status/M16-GAP-00192.md",
"bytes": 1120,
"lines": 18,
"tokens": 280
}
],
"sourceTokens": 1988,
"evidenceFiles": 1,
"evidenceBytes": 1534,
"evidenceTokens": 384,
"totalTokens": 2372,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3396,
"serializedContextTokens": 757,
"withinBudget": true
}
}

View File

@@ -0,0 +1,89 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"path_remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetPathRemoveAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetPathRemoveSet",
"activePathIndex": 0,
"keyingSetCount": 1,
"pathCount": 0,
"paths": [],
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"path_remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetPathRemoveAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetPathRemoveSet",
"activePathIndex": 0,
"keyingSetCount": 1,
"pathCount": 1,
"paths": [
{
"arrayIndex": 0,
"dataPath": "[\"path_remove_target\"]",
"group": "",
"groupMethod": "KEYINGSET",
"idType": "OBJECT",
"useEntireArray": false
}
],
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00194-operator-anim.keying_set_path_remove.blend",
"fixtureSha256": "b1161cfd0ac095844825cb2fa19fcbe9819bce552d02535f2d32deef3c8cbb79",
"mainMutation": "KEYING_SET_PATH_REMOVED",
"operation": "ANIM_KEYING_SET_PATH_REMOVE_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00194"
}

View File

@@ -0,0 +1,120 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00194",
"operation": "ANIM_KEYING_SET_PATH_REMOVE_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00194-operator-anim.keying_set_path_remove.blend",
"sha256": "b1161cfd0ac095844825cb2fa19fcbe9819bce552d02535f2d32deef3c8cbb79"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00194/anim-keying-set-path-remove-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYING_SET_PATH_REMOVED",
"before": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"path_remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetPathRemoveAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetPathRemoveSet",
"activePathIndex": 0,
"keyingSetCount": 1,
"pathCount": 1,
"paths": [
{
"arrayIndex": 0,
"dataPath": "[\"path_remove_target\"]",
"group": "",
"groupMethod": "KEYINGSET",
"idType": "OBJECT",
"useEntireArray": false
}
],
"selected": true,
"value": 3
},
"after": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"path_remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetPathRemoveAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetPathRemoveSet",
"activePathIndex": 0,
"keyingSetCount": 1,
"pathCount": 0,
"paths": [],
"selected": true,
"value": 3
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyingSetPathRemoveAction:object:WebGapAnimKeyingSetPathRemoveObject",
"targetId": "object:WebGapAnimKeyingSetPathRemoveObject",
"channelPaths": [
"[\"path_remove_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyingSetPathRemoveAction:object:WebGapAnimKeyingSetPathRemoveObject",
"keyframesPerChannel": [
3
],
"visibleMainUnchanged": true,
"keyingSetMetadata": "NOT_EXPOSED_BY_SCENE_SNAPSHOT"
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00195"
}

View File

@@ -0,0 +1,28 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00194",
"parentTask": "M16-GAP-00193",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYING_SET_PATH_REMOVE_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": { "path": "tests/golden/M16-GAP-00193/manifest.json", "sha256": "203219913781f09abaa1aab272f97117907f44e9dc0a08691500457ac4b24446" },
"fixture": { "path": "tests/files/web/generated/M16-GAP-00194-operator-anim.keying_set_path_remove.blend", "sha256": "b1161cfd0ac095844825cb2fa19fcbe9819bce552d02535f2d32deef3c8cbb79" },
"generator": { "path": "tools/web/generated/M16-GAP-00194.py", "sha256": "182bc9eda4c6383e83f353cb0ee8fee299caf954537592f58cd68f1e1b1328e2" },
"desktopChecker": { "path": "tools/web/check-action-keying-set-path-remove-desktop.py", "sha256": "91e9ae1891106babe828ead19c2f07fd955c06883fa4b03f1b4f12fb8a41824e" },
"webChecker": { "path": "tools/web/check-generated-gap.mjs", "sha256": "5c7c11e2ef348faf5e34343f947df076e8f732c2a03180fcdfecf157fdd46fb9" },
"reader": { "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf" },
"protocol": { "path": "web/protocol/editor-workflow.ts", "sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a" },
"sceneIrProtocol": { "path": "web/protocol/scene-ir.ts", "sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226" },
"wasm": { "path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmPublic": { "path": "web/app/public/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmJs": { "path": "web/app/src/vendor/blender/web_engine.js", "sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed" },
"desktopReport": { "path": "tests/golden/M16-GAP-00194/anim-keying-set-path-remove-desktop-report.json", "sha256": "36ec6d4232418b56ea06b375bd0562718ef0cb787c393a860fcf69b663aa3a89" },
"webReport": { "path": "tests/golden/M16-GAP-00194/anim-keying-set-path-remove-local-exact-report.json", "sha256": "a840e751c3e8c7ef6b02f388e8db434ebcd6cb4d0a151fbb3350d98f6689f438" },
"status": { "path": "docs/status/M16-GAP-00194.md", "sha256": "54a5b5384704b1a16d541cbc6d70c98001495cb010fe1f9235e73d23a0fc2d9d" },
"taskContext": { "path": "tests/golden/M16-GAP-00194/task-context.json", "sha256": "ecd39a4fd55eb2f7fcc3bacaa8046ab21d56ce5ae8e936898c2fa9a85b9f08cd" }
},
"nextTask": "M16-GAP-00195"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00194",
"parentTask": "M16-GAP-00193",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keying_set_path_remove 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.",
"scope": {
"gap": "operator:anim.keying_set_path_remove",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00194.py -- tests/files/web/generated/M16-GAP-00194-operator-anim.keying_set_path_remove.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00194",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00194"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00194.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2145,
"contextRemainingTokens": 535
},
"source": {
"bytes": 7759,
"tokens": 1941
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00194.py",
"bytes": 1618,
"tokens": 405
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00194-operator-anim.keying_set_path_remove.blend",
"bytes": 86865,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 463464,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00194/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00194.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00194/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1618,
"tokens": 405
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00195",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00194.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00193/manifest.json",
"parentStatus": "docs/status/M16-GAP-00193.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00194.md",
"tests/golden/M16-GAP-00193/manifest.json",
"docs/status/M16-GAP-00193.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00193",
"parentTask": "M16-GAP-00192",
"status": "done",
"nextTask": "M16-GAP-00194",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00193 Status",
"status: done",
"task: anim.keying_set_path_add operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a three-key Action and one empty active Keying Set. Blender invokes `ANIM_OT_keying_set_path_add()` (`poll=true`, `FINISHED`), adding one empty path with the expected default fields without changing the Action.",
"evidence:",
"- Desktop evidence records Keying Set path count `0→1`, the empty path defaults, unchanged `[1, 3, 5]` Action data, and exact save/reopen."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1824,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 456
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00194.md",
"bytes": 1824,
"lines": 38,
"tokens": 456
},
{
"path": "tests/golden/M16-GAP-00193/manifest.json",
"bytes": 2686,
"lines": 29,
"tokens": 672
},
{
"path": "docs/status/M16-GAP-00193.md",
"bytes": 1081,
"lines": 18,
"tokens": 271
}
],
"sourceTokens": 1941,
"evidenceFiles": 1,
"evidenceBytes": 1618,
"evidenceTokens": 405,
"totalTokens": 2346,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3370,
"serializedContextTokens": 760,
"withinBudget": true
}
}

View File

@@ -0,0 +1,76 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetRemoveAction"
},
"active": true,
"activeKeyingSet": null,
"keyingSetCount": 0,
"pathCount": 0,
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetRemoveAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetRemoveSet",
"keyingSetCount": 1,
"pathCount": 0,
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00195-operator-anim.keying_set_remove.blend",
"fixtureSha256": "d4fa5993c2580e5521cf2ee66817c416f50de82f5ec4e32298e52db14fa0a9a9",
"mainMutation": "KEYING_SET_REMOVED",
"operation": "ANIM_KEYING_SET_REMOVE_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00195"
}

View File

@@ -0,0 +1,107 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00195",
"operation": "ANIM_KEYING_SET_REMOVE_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00195-operator-anim.keying_set_remove.blend",
"sha256": "d4fa5993c2580e5521cf2ee66817c416f50de82f5ec4e32298e52db14fa0a9a9"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00195/anim-keying-set-remove-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYING_SET_REMOVED",
"before": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetRemoveAction"
},
"active": true,
"activeKeyingSet": "WebGapAnimKeyingSetRemoveSet",
"keyingSetCount": 1,
"pathCount": 0,
"selected": true,
"value": 3
},
"after": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetRemoveAction"
},
"active": true,
"activeKeyingSet": null,
"keyingSetCount": 0,
"pathCount": 0,
"selected": true,
"value": 3
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyingSetRemoveAction:object:WebGapAnimKeyingSetRemoveObject",
"targetId": "object:WebGapAnimKeyingSetRemoveObject",
"channelPaths": [
"[\"remove_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyingSetRemoveAction:object:WebGapAnimKeyingSetRemoveObject",
"keyframesPerChannel": [
3
],
"visibleMainUnchanged": true,
"keyingSetMetadata": "NOT_EXPOSED_BY_SCENE_SNAPSHOT"
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00196"
}

View File

@@ -0,0 +1,28 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00195",
"parentTask": "M16-GAP-00194",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYING_SET_REMOVE_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": { "path": "tests/golden/M16-GAP-00194/manifest.json", "sha256": "d8336a458497eff326ab8a8df3050c5e4e2f41b0297a2f070ec976c09377f270" },
"fixture": { "path": "tests/files/web/generated/M16-GAP-00195-operator-anim.keying_set_remove.blend", "sha256": "d4fa5993c2580e5521cf2ee66817c416f50de82f5ec4e32298e52db14fa0a9a9" },
"generator": { "path": "tools/web/generated/M16-GAP-00195.py", "sha256": "4f8fb118aa60518844dd181607994d857dc8828d66acd526fe0de727491f54e6" },
"desktopChecker": { "path": "tools/web/check-action-keying-set-remove-desktop.py", "sha256": "34a45f49def53589fb7e5b3bcfaaaf500af5e5dba069a8175eff1dd19ba354cc" },
"webChecker": { "path": "tools/web/check-generated-gap.mjs", "sha256": "692c7b2db04a96680bbc7c7807cac3ed552e3123cc4af5f335b3e50cd1ff0bce" },
"reader": { "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf" },
"protocol": { "path": "web/protocol/editor-workflow.ts", "sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a" },
"sceneIrProtocol": { "path": "web/protocol/scene-ir.ts", "sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226" },
"wasm": { "path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmPublic": { "path": "web/app/public/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmJs": { "path": "web/app/src/vendor/blender/web_engine.js", "sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed" },
"desktopReport": { "path": "tests/golden/M16-GAP-00195/anim-keying-set-remove-desktop-report.json", "sha256": "67fc9add6112f6513a95028ba2170d468b1ca82d83cf1b8d1afe2da98b907b15" },
"webReport": { "path": "tests/golden/M16-GAP-00195/anim-keying-set-remove-local-exact-report.json", "sha256": "f1a6dc449055b1cddb1f796b885eaa347cf1c64ca082af7940c9c751a59dec9e" },
"status": { "path": "docs/status/M16-GAP-00195.md", "sha256": "cdb8e80052164365b81fb210701cd5283ea022f219eb1a1e14d561ef178e7420" },
"taskContext": { "path": "tests/golden/M16-GAP-00195/task-context.json", "sha256": "e462b1602ed761491ad2054fc7152fb36306b21a0c14f2511a3cbc21b2b740d2" }
},
"nextTask": "M16-GAP-00196"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00195",
"parentTask": "M16-GAP-00194",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keying_set_remove 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.",
"scope": {
"gap": "operator:anim.keying_set_remove",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00195.py -- tests/files/web/generated/M16-GAP-00195-operator-anim.keying_set_remove.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00195",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00195"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00195.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2175,
"contextRemainingTokens": 542
},
"source": {
"bytes": 7729,
"tokens": 1934
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00195.py",
"bytes": 1524,
"tokens": 381
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00195-operator-anim.keying_set_remove.blend",
"bytes": 86811,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 468034,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00195/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00195.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00195/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1524,
"tokens": 381
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00196",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00195.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00194/manifest.json",
"parentStatus": "docs/status/M16-GAP-00194.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00195.md",
"tests/golden/M16-GAP-00194/manifest.json",
"docs/status/M16-GAP-00194.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00194",
"parentTask": "M16-GAP-00193",
"status": "done",
"nextTask": "M16-GAP-00195",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00194 Status",
"status: done",
"task: anim.keying_set_path_remove operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a three-key Action and one active Keying Set path. Blender invokes `ANIM_OT_keying_set_path_remove()` (`poll=true`, `FINISHED`), removing the active path without changing the Action.",
"evidence:",
"- Desktop evidence records Keying Set path count `1→0`, the pre-existing path fields, unchanged `[1, 3, 5]` Action data, and exact save/reopen."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1799,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 450
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00195.md",
"bytes": 1799,
"lines": 38,
"tokens": 450
},
{
"path": "tests/golden/M16-GAP-00194/manifest.json",
"bytes": 2701,
"lines": 29,
"tokens": 676
},
{
"path": "docs/status/M16-GAP-00194.md",
"bytes": 1061,
"lines": 18,
"tokens": 266
}
],
"sourceTokens": 1934,
"evidenceFiles": 1,
"evidenceBytes": 1524,
"evidenceTokens": 381,
"totalTokens": 2315,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3339,
"serializedContextTokens": 756,
"withinBudget": true
}
}

View File

@@ -0,0 +1,87 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"button_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetButtonAddAction"
},
"active": true,
"activeKeyingSet": "ButtonKeyingSet",
"keyingSetCount": 1,
"pathCount": 1,
"paths": [
{
"arrayIndex": 0,
"dataPath": "[\"button_target\"]",
"group": "",
"groupMethod": "KEYINGSET",
"idType": "OBJECT",
"useEntireArray": true
}
],
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"button_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetButtonAddAction"
},
"active": true,
"activeKeyingSet": null,
"keyingSetCount": 0,
"pathCount": 0,
"paths": [],
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00196-operator-anim.keyingset_button_add.blend",
"fixtureSha256": "2e49572a29dadcdfdae956f7e16bd465c5de06bf8ae94ebdc11da8b1821eb562",
"mainMutation": "KEYING_SET_PATH_ADDED",
"operation": "ANIM_KEYINGSET_BUTTON_ADD_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00196"
}

View File

@@ -0,0 +1,118 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00196",
"operation": "ANIM_KEYINGSET_BUTTON_ADD_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00196-operator-anim.keyingset_button_add.blend",
"sha256": "2e49572a29dadcdfdae956f7e16bd465c5de06bf8ae94ebdc11da8b1821eb562"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00196/anim-keyingset-button-add-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYING_SET_PATH_ADDED",
"before": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"button_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetButtonAddAction"
},
"active": true,
"activeKeyingSet": null,
"keyingSetCount": 0,
"pathCount": 0,
"paths": [],
"selected": true,
"value": 3
},
"after": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"button_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetButtonAddAction"
},
"active": true,
"activeKeyingSet": "ButtonKeyingSet",
"keyingSetCount": 1,
"pathCount": 1,
"paths": [
{
"arrayIndex": 0,
"dataPath": "[\"button_target\"]",
"group": "",
"groupMethod": "KEYINGSET",
"idType": "OBJECT",
"useEntireArray": true
}
],
"selected": true,
"value": 3
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyingSetButtonAddAction:object:WebGapAnimKeyingSetButtonAddObject",
"targetId": "object:WebGapAnimKeyingSetButtonAddObject",
"channelPaths": [
"[\"button_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyingSetButtonAddAction:object:WebGapAnimKeyingSetButtonAddObject",
"keyframesPerChannel": [
3
],
"visibleMainUnchanged": true,
"keyingSetMetadata": "NOT_EXPOSED_BY_SCENE_SNAPSHOT"
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00197"
}

View File

@@ -0,0 +1,28 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00196",
"parentTask": "M16-GAP-00195",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYINGSET_BUTTON_ADD_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": { "path": "tests/golden/M16-GAP-00195/manifest.json", "sha256": "4a46a92b6ea9fee6f99e3d7284e78d74748cb52a57d942d874df664da85d65f2" },
"fixture": { "path": "tests/files/web/generated/M16-GAP-00196-operator-anim.keyingset_button_add.blend", "sha256": "2e49572a29dadcdfdae956f7e16bd465c5de06bf8ae94ebdc11da8b1821eb562" },
"generator": { "path": "tools/web/generated/M16-GAP-00196.py", "sha256": "61eefce310c581808e90c8378b1f085c00d7d28878c0c62946489225b020f2d8" },
"desktopChecker": { "path": "tools/web/check-action-keyingset-button-add-desktop.py", "sha256": "15b1b30ea2793313f52c914021d148c50cd02ba5bcb8d983c37755f811bcd16f" },
"webChecker": { "path": "tools/web/check-generated-gap.mjs", "sha256": "05772ad9408274628a737748e6293cd5fce4d090243b0a51db4b620eb93758c5" },
"reader": { "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf" },
"protocol": { "path": "web/protocol/editor-workflow.ts", "sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a" },
"sceneIrProtocol": { "path": "web/protocol/scene-ir.ts", "sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226" },
"wasm": { "path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmPublic": { "path": "web/app/public/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmJs": { "path": "web/app/src/vendor/blender/web_engine.js", "sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed" },
"desktopReport": { "path": "tests/golden/M16-GAP-00196/anim-keyingset-button-add-desktop-report.json", "sha256": "a213760a261879356db09714df719221fef2f0a4c26865e12396b80089c21583" },
"webReport": { "path": "tests/golden/M16-GAP-00196/anim-keyingset-button-add-local-exact-report.json", "sha256": "3146c77b1f77e3db9b1dc855c31408b0c076ecfea258aea8a86a834ab06ad9b3" },
"status": { "path": "docs/status/M16-GAP-00196.md", "sha256": "b1a31309d96dc8fa456c95e45e78aa192472f84573a8ab9ad21bac1a047a3a8c" },
"taskContext": { "path": "tests/golden/M16-GAP-00196/task-context.json", "sha256": "325c63d0601e3b9adf8afb69f6d3cbfd970e3fc281eaa70b13d7cddb0399e324" }
},
"nextTask": "M16-GAP-00197"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00196",
"parentTask": "M16-GAP-00195",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyingset_button_add 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.",
"scope": {
"gap": "operator:anim.keyingset_button_add",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00196.py -- tests/files/web/generated/M16-GAP-00196-operator-anim.keyingset_button_add.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00196",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00196"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00196.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2173,
"contextRemainingTokens": 542
},
"source": {
"bytes": 7731,
"tokens": 1934
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00196.py",
"bytes": 1349,
"tokens": 338
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00196-operator-anim.keyingset_button_add.blend",
"bytes": 86863,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 472821,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00196/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00196.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00196/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1349,
"tokens": 338
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00197",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00196.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00195/manifest.json",
"parentStatus": "docs/status/M16-GAP-00195.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00196.md",
"tests/golden/M16-GAP-00195/manifest.json",
"docs/status/M16-GAP-00195.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00195",
"parentTask": "M16-GAP-00194",
"status": "done",
"nextTask": "M16-GAP-00196",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00195 Status",
"status: done",
"task: anim.keying_set_remove operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a three-key Action and one empty active Keying Set. Blender invokes `ANIM_OT_keying_set_remove()` (`poll=true`, `FINISHED`), removing the active Keying Set without changing the Action.",
"evidence:",
"- Desktop evidence records Keying Set count `1→0`, active set `WebGapAnimKeyingSetRemoveSet→null`, unchanged `[1, 3, 5]` Action data, and exact save/reopen."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1814,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 454
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00196.md",
"bytes": 1814,
"lines": 38,
"tokens": 454
},
{
"path": "tests/golden/M16-GAP-00195/manifest.json",
"bytes": 2676,
"lines": 29,
"tokens": 669
},
{
"path": "docs/status/M16-GAP-00195.md",
"bytes": 1073,
"lines": 18,
"tokens": 269
}
],
"sourceTokens": 1934,
"evidenceFiles": 1,
"evidenceBytes": 1349,
"evidenceTokens": 338,
"totalTokens": 2272,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3296,
"serializedContextTokens": 758,
"withinBudget": true
}
}

View File

@@ -0,0 +1,87 @@
{
"after": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"button_remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetButtonRemoveAction"
},
"active": true,
"activeKeyingSet": "ButtonKeyingSet",
"keyingSetCount": 1,
"pathCount": 0,
"paths": [],
"selected": true,
"value": 3.0
},
"before": {
"action": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"button_remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimKeyingSetButtonRemoveAction"
},
"active": true,
"activeKeyingSet": "ButtonKeyingSet",
"keyingSetCount": 1,
"pathCount": 1,
"paths": [
{
"arrayIndex": 0,
"dataPath": "[\"button_remove_target\"]",
"group": "",
"groupMethod": "KEYINGSET",
"idType": "OBJECT",
"useEntireArray": false
}
],
"selected": true,
"value": 3.0
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00197-operator-anim.keyingset_button_remove.blend",
"fixtureSha256": "21b52146f8466fb9fd9ca9073d611b6052f7cbb89399b926d8db6e950883e61d",
"mainMutation": "KEYING_SET_PATH_REMOVED",
"operation": "ANIM_KEYINGSET_BUTTON_REMOVE_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00197"
}

View File

@@ -0,0 +1,118 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00197",
"operation": "ANIM_KEYINGSET_BUTTON_REMOVE_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00197-operator-anim.keyingset_button_remove.blend",
"sha256": "21b52146f8466fb9fd9ca9073d611b6052f7cbb89399b926d8db6e950883e61d"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00197/anim-keyingset-button-remove-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "KEYING_SET_PATH_REMOVED",
"before": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"button_remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetButtonRemoveAction"
},
"active": true,
"activeKeyingSet": "ButtonKeyingSet",
"keyingSetCount": 1,
"pathCount": 1,
"paths": [
{
"arrayIndex": 0,
"dataPath": "[\"button_remove_target\"]",
"group": "",
"groupMethod": "KEYINGSET",
"idType": "OBJECT",
"useEntireArray": false
}
],
"selected": true,
"value": 3
},
"after": {
"action": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"button_remove_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimKeyingSetButtonRemoveAction"
},
"active": true,
"activeKeyingSet": "ButtonKeyingSet",
"keyingSetCount": 1,
"pathCount": 0,
"paths": [],
"selected": true,
"value": 3
}
},
"wasm": {
"status": "EXACT",
"before": {
"animationId": "action:WebGapAnimKeyingSetButtonRemoveAction:object:WebGapAnimKeyingSetButtonRemoveObject",
"targetId": "object:WebGapAnimKeyingSetButtonRemoveObject",
"channelPaths": [
"[\"button_remove_target\"][0]"
],
"keyframesPerChannel": [
3
]
},
"after": {
"animationId": "action:WebGapAnimKeyingSetButtonRemoveAction:object:WebGapAnimKeyingSetButtonRemoveObject",
"keyframesPerChannel": [
3
],
"visibleMainUnchanged": true,
"keyingSetMetadata": "NOT_EXPOSED_BY_SCENE_SNAPSHOT"
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00198"
}

View File

@@ -0,0 +1,28 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00197",
"parentTask": "M16-GAP-00196",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_LOCAL_EXACT",
"operation": "ANIM_KEYINGSET_BUTTON_REMOVE_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": { "path": "tests/golden/M16-GAP-00196/manifest.json", "sha256": "ba672d3e9ba02086b25a595fde84f8248d9ed288fdd5b53de0b7ff02071e3e46" },
"fixture": { "path": "tests/files/web/generated/M16-GAP-00197-operator-anim.keyingset_button_remove.blend", "sha256": "21b52146f8466fb9fd9ca9073d611b6052f7cbb89399b926d8db6e950883e61d" },
"generator": { "path": "tools/web/generated/M16-GAP-00197.py", "sha256": "34b9c47630db975f40df4ebc156c9b0488dc7bc85ff0fe6cbcc4603aae2da14c" },
"desktopChecker": { "path": "tools/web/check-action-keyingset-button-remove-desktop.py", "sha256": "0a6c7361b44ef548f4d9bb7ef756e35bd9c09e82ec46edc60626a6918afc57b6" },
"webChecker": { "path": "tools/web/check-generated-gap.mjs", "sha256": "27f61df7c526c3473f458828ee0d1651c12bdc766936b41517c634464e70b267" },
"reader": { "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "8824ba3dfb4090b85dc679a583d263b4bdb190a47978f72f3c11f6b565fdacaf" },
"protocol": { "path": "web/protocol/editor-workflow.ts", "sha256": "a3d4f32fafdc205f0a76362d1a43db85fa023e9edba444fcd77479da0c6f573a" },
"sceneIrProtocol": { "path": "web/protocol/scene-ir.ts", "sha256": "9e877612886c629786405e03e1939d3954af2d38dfea2d6359b367934d06f226" },
"wasm": { "path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmPublic": { "path": "web/app/public/vendor/blender/web_engine.wasm", "sha256": "3bcb7c5d1c3f85318febb9dfd8273ce141b5b38735d622ebb984d64c61059e0f" },
"wasmJs": { "path": "web/app/src/vendor/blender/web_engine.js", "sha256": "9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed" },
"desktopReport": { "path": "tests/golden/M16-GAP-00197/anim-keyingset-button-remove-desktop-report.json", "sha256": "223020f990cda11b261e3d0daf3171450718604cee9f923b5bd3aad8c9377b8a" },
"webReport": { "path": "tests/golden/M16-GAP-00197/anim-keyingset-button-remove-local-exact-report.json", "sha256": "e44421253fcb26b9d313d9f97324b22a46fa8bbd8b734508416bc7bcd43c8f7b" },
"status": { "path": "docs/status/M16-GAP-00197.md", "sha256": "5f9ee54b01a17a8c4554d58c4f9f415a7feac5790a56aa2545a560ffa4ef2362" },
"taskContext": { "path": "tests/golden/M16-GAP-00197/task-context.json", "sha256": "e94b2c9d77d75b841ae3fe60df18005fbbd9da080417e91ec06c79ca62a3d67f" }
},
"nextTask": "M16-GAP-00198"
}

View File

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00197",
"parentTask": "M16-GAP-00196",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable operator:anim.keyingset_button_remove 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.",
"scope": {
"gap": "operator:anim.keyingset_button_remove",
"ownerFamily": "OPERATOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00197.py -- tests/files/web/generated/M16-GAP-00197-operator-anim.keyingset_button_remove.blend",
"npm --prefix web run test:generated-gap -- --task M16-GAP-00197",
"node tools/web/check-generated-gap.mjs --task M16-GAP-00197"
],
"inputPaths": [
"tools/web/generated/M16-GAP-00197.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2113,
"contextRemainingTokens": 527
},
"source": {
"bytes": 7791,
"tokens": 1949
},
"selected": [
{
"path": "tools/web/generated/M16-GAP-00197.py",
"bytes": 1613,
"tokens": 404
}
],
"excluded": [
{
"path": "tests/files/web/generated/M16-GAP-00197-operator-anim.keyingset_button_remove.blend",
"bytes": 86831,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 231498,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 477748,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/M16-GAP-00197/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/M16-GAP-00197.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/M16-GAP-00197/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1613,
"tokens": 404
}
},
"exitCriteria": [
"desktop fixture evidence exists",
"WASM uses the same fixture",
"comparator passes",
"save/reopen preserves Main",
"manifest hashes all artifacts"
],
"nextTask": "M16-GAP-00198",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/M16-GAP-00197.md",
"taskIndex": "tests/golden/M15-03A/task-index.json",
"parentManifest": "tests/golden/M16-GAP-00196/manifest.json",
"parentStatus": "docs/status/M16-GAP-00196.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/M16-GAP-00197.md",
"tests/golden/M16-GAP-00196/manifest.json",
"docs/status/M16-GAP-00196.md"
],
"machineOnly": [
"tests/golden/M15-03A/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "M16-GAP-00196",
"parentTask": "M16-GAP-00195",
"status": "done",
"nextTask": "M16-GAP-00197",
"artifactCount": 15
},
"statusSummary": [
"# M16-GAP-00196 Status",
"status: done",
"task: anim.keyingset_button_add operator LOCAL_EXACT slice",
"updated: 2026-08-22 America/New_York",
"scope:",
"- The minimal fixture contains one selected/active object with a three-key Action and no scene Keying Set. A real `PROPERTIES` RNA button invokes `ANIM_OT_keyingset_button_add()` (`poll=true`, `FINISHED`), creating `ButtonKeyingSet` and adding the active `button_target` path.",
"evidence:",
"- Desktop evidence records Keying Set count `0→1`, path count `0→1`, exact path fields, unchanged `[1, 3, 5]` Action data, and exact save/reopen."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1829,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 458
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2168,
"lines": 45,
"tokens": 542
},
{
"path": "docs/tasks/M16-GAP-00197.md",
"bytes": 1829,
"lines": 38,
"tokens": 458
},
{
"path": "tests/golden/M16-GAP-00196/manifest.json",
"bytes": 2691,
"lines": 29,
"tokens": 673
},
{
"path": "docs/status/M16-GAP-00196.md",
"bytes": 1103,
"lines": 18,
"tokens": 276
}
],
"sourceTokens": 1949,
"evidenceFiles": 1,
"evidenceBytes": 1613,
"evidenceTokens": 404,
"totalTokens": 2353,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3377,
"serializedContextTokens": 760,
"withinBudget": true
}
}

View File

@@ -0,0 +1,164 @@
{
"after": {
"active": true,
"activeObject": "WebGapAnimMergeActiveObject",
"activeObjectAction": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"active_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
},
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"source_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
10.0,
30.0,
50.0
]
}
],
"name": "WebGapAnimMergeActiveAction"
},
"selected": {
"active": true,
"source": true
},
"sourceObject": "WebGapAnimMergeSourceObject",
"sourceObjectAction": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"active_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
},
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"source_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
10.0,
30.0,
50.0
]
}
],
"name": "WebGapAnimMergeActiveAction"
}
},
"before": {
"active": true,
"activeObject": "WebGapAnimMergeActiveObject",
"activeObjectAction": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"active_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
1.0,
3.0,
5.0
]
}
],
"name": "WebGapAnimMergeActiveAction"
},
"selected": {
"active": true,
"source": true
},
"sourceObject": "WebGapAnimMergeSourceObject",
"sourceObjectAction": {
"channels": [
{
"frames": [
1.0,
3.0,
5.0
],
"index": 0,
"path": "[\"source_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
10.0,
30.0,
50.0
]
}
],
"name": "WebGapAnimMergeSourceAction"
}
},
"blenderVersion": "5.2.0 LTS",
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00198-operator-anim.merge_animation.blend",
"fixtureSha256": "0c37b1290f08b1ad872efdf8a52c795d24778a1ecab516ea749ff2ae858bd2fb",
"mainMutation": "ANIMATION_MERGED",
"operation": "ANIM_MERGE_ANIMATION_DESKTOP",
"operatorStatus": "FINISHED",
"poll": true,
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "M16-GAP-00198"
}

View File

@@ -0,0 +1,216 @@
{
"schemaVersion": 1,
"task": "M16-GAP-00198",
"operation": "ANIM_MERGE_ANIMATION_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/M16-GAP-00198-operator-anim.merge_animation.blend",
"sha256": "0c37b1290f08b1ad872efdf8a52c795d24778a1ecab516ea749ff2ae858bd2fb"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/M16-GAP-00198/anim-merge-animation-desktop-report.json",
"saveReopen": "EXACT",
"poll": true,
"operatorStatus": "FINISHED",
"mainMutation": "ANIMATION_MERGED",
"before": {
"active": true,
"activeObject": "WebGapAnimMergeActiveObject",
"activeObjectAction": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"active_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
}
],
"name": "WebGapAnimMergeActiveAction"
},
"selected": {
"active": true,
"source": true
},
"sourceObject": "WebGapAnimMergeSourceObject",
"sourceObjectAction": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"source_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
10,
30,
50
]
}
],
"name": "WebGapAnimMergeSourceAction"
}
},
"after": {
"active": true,
"activeObject": "WebGapAnimMergeActiveObject",
"activeObjectAction": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"active_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
},
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"source_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
10,
30,
50
]
}
],
"name": "WebGapAnimMergeActiveAction"
},
"selected": {
"active": true,
"source": true
},
"sourceObject": "WebGapAnimMergeSourceObject",
"sourceObjectAction": {
"channels": [
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"active_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
1,
3,
5
]
},
{
"frames": [
1,
3,
5
],
"index": 0,
"path": "[\"source_merge_target\"]",
"selected": [
true,
true,
true
],
"values": [
10,
30,
50
]
}
],
"name": "WebGapAnimMergeActiveAction"
}
}
},
"wasm": {
"status": "EXACT",
"before": {
"activeAnimationId": "action:WebGapAnimMergeActiveAction:object:WebGapAnimMergeActiveObject",
"sourceAnimationId": "action:WebGapAnimMergeSourceAction:object:WebGapAnimMergeSourceObject",
"activeChannelPaths": [
"[\"active_merge_target\"][0]"
],
"sourceChannelPaths": [
"[\"source_merge_target\"][0]"
],
"keyframesPerChannel": [
3,
3
]
},
"after": {
"activeAnimationId": "action:WebGapAnimMergeActiveAction:object:WebGapAnimMergeActiveObject",
"sourceAnimationId": "action:WebGapAnimMergeActiveAction:object:WebGapAnimMergeSourceObject",
"channelPaths": [
"[\"active_merge_target\"][0]",
"[\"source_merge_target\"][0]"
],
"keyframesPerChannel": [
3,
3
],
"sourceValues": [
[
1,
3,
5
],
[
10,
30,
50
]
]
},
"sourceActionRemoved": true
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "M16-GAP-00199"
}

Some files were not shown because too many files have changed in this diff Show More