Capture M16 gap execution artifacts
Some checks are pending
M6 deployable RC / quick (push) Waiting to run
M6 deployable RC / chromium (push) Blocked by required conditions
M6 deployable RC / release (push) Blocked by required conditions

This commit is contained in:
mes123456
2026-08-21 21:09:40 -04:00
parent e8ce4f5d0c
commit 46c9ebfcb6
339 changed files with 20028 additions and 108 deletions

View File

@@ -31,6 +31,7 @@
#include "BLO_core_file_reader.hh" #include "BLO_core_file_reader.hh"
#include "DNA_genfile.h" #include "DNA_genfile.h"
#include "DNA_action_types.h"
#include "DNA_anim_enums.h" #include "DNA_anim_enums.h"
#include "DNA_curve_enums.h" #include "DNA_curve_enums.h"
#include "DNA_lattice_types.h" #include "DNA_lattice_types.h"
@@ -549,6 +550,7 @@ std::string id_prefix(const std::string &type_name)
if (type_name == "bSound") return "sound"; if (type_name == "bSound") return "sound";
if (type_name == "Speaker") return "speaker"; if (type_name == "Speaker") return "speaker";
if (type_name == "Tex") return "texture"; if (type_name == "Tex") return "texture";
if (type_name == "bAction" || type_name == "Action") return "action";
return "datablock"; return "datablock";
} }
@@ -564,7 +566,8 @@ bool is_exported_id_type(const std::string &type_name)
type_name == "VFont" || type_name == "Mask" || type_name == "Library" || type_name == "VFont" || type_name == "Mask" || type_name == "Library" ||
type_name == "WorkSpace" || type_name == "bScreen" || type_name == "Brush" || type_name == "WorkSpace" || type_name == "bScreen" || type_name == "Brush" ||
type_name == "FreestyleLineStyle" || type_name == "Lattice" || type_name == "FreestyleLineStyle" || type_name == "Lattice" ||
type_name == "ParticleSettings" || type_name == "bSound" || type_name == "Speaker" || type_name == "Tex"; type_name == "ParticleSettings" || type_name == "bSound" || type_name == "Speaker" || type_name == "Tex" ||
type_name == "bAction" || type_name == "Action";
} }
std::string unique_id(const std::string &prefix, std::string unique_id(const std::string &prefix,
@@ -1248,6 +1251,36 @@ const char *editor_region_kind(const int64_t region_type)
return nullptr; return nullptr;
} }
std::optional<json> editor_view2d_rect(const SDNA &sdna,
const ElementRef &view2d,
const std::string &member_name)
{
const std::optional<ElementRef> rect = embedded_element(sdna, view2d, member_name);
if (!rect) return std::nullopt;
const auto stable_float = [](const float value) {
return std::round(double(value) * 1000000.0) / 1000000.0;
};
return json{{"xmin", stable_float(read_float(sdna, *rect, "xmin").value_or(0.0f))},
{"xmax", stable_float(read_float(sdna, *rect, "xmax").value_or(0.0f))},
{"ymin", stable_float(read_float(sdna, *rect, "ymin").value_or(0.0f))},
{"ymax", stable_float(read_float(sdna, *rect, "ymax").value_or(0.0f))}};
}
std::optional<json> editor_view2d_state(const SDNA &sdna, const ElementRef &region)
{
const std::optional<ElementRef> view2d = embedded_element(sdna, region, "v2d");
if (!view2d) return std::nullopt;
const std::optional<json> current = editor_view2d_rect(sdna, *view2d, "cur");
const std::optional<ElementRef> mask = embedded_element(sdna, *view2d, "mask");
if (!current || !mask) return std::nullopt;
return json{{"cur", *current},
{"mask",
{{"xmin", read_integer(sdna, *mask, "xmin").value_or(0)},
{"xmax", read_integer(sdna, *mask, "xmax").value_or(0)},
{"ymin", read_integer(sdna, *mask, "ymin").value_or(0)},
{"ymax", read_integer(sdna, *mask, "ymax").value_or(0)}}}};
}
std::optional<json> editor_workflow_from_records( std::optional<json> editor_workflow_from_records(
const ParsedBlend &blend, const ParsedBlend &blend,
const std::vector<IdRecord> &records, const std::vector<IdRecord> &records,
@@ -1328,10 +1361,16 @@ std::optional<json> editor_workflow_from_records(
break; break;
} }
const int64_t flags = read_integer(*blend.sdna, region, "flag").value_or(0); const int64_t flags = read_integer(*blend.sdna, region, "flag").value_or(0);
regions.push_back({{"id", record.id + ":area:" + std::to_string(area_index) + json region_record = {{"id", record.id + ":area:" + std::to_string(area_index) +
":region:" + std::to_string(regions.size())}, ":region:" + std::to_string(regions.size())},
{"kind", kind}, {"kind", kind},
{"visible", (flags & RGN_FLAG_HIDDEN) == 0}}); {"visible", (flags & RGN_FLAG_HIDDEN) == 0}};
if (std::strcmp(editor, "DOPE_SHEET") == 0 && std::strcmp(kind, "MAIN") == 0) {
if (const std::optional<json> view2d = editor_view2d_state(*blend.sdna, region)) {
region_record["view2d"] = *view2d;
}
}
regions.push_back(std::move(region_record));
has_main_region |= std::strcmp(kind, "MAIN") == 0; has_main_region |= std::strcmp(kind, "MAIN") == 0;
} }
if (!valid || regions.empty() || !has_main_region) { if (!valid || regions.empty() || !has_main_region) {
@@ -1345,12 +1384,23 @@ std::optional<json> editor_workflow_from_records(
double(rect.x_max - rect.x_min) / screen_width; double(rect.x_max - rect.x_min) / screen_width;
const double height = rect.y_max == screen_y_max ? 1.0 - y : const double height = rect.y_max == screen_y_max ? 1.0 - y :
double(rect.y_max - rect.y_min) / screen_height; double(rect.y_max - rect.y_min) / screen_height;
areas.push_back({{"id", record.id + ":area:" + std::to_string(area_index)}, json area_record = {{"id", record.id + ":area:" + std::to_string(area_index)},
{"editor", editor}, {"editor", editor},
{"regions", std::move(regions)}, {"regions", std::move(regions)},
{"rect", {"rect",
{{"x", x}, {"y", y}, {"width", width}, {"height", height}}}, {{"x", x}, {"y", y}, {"width", width}, {"height", height}}},
{"maximized", false}}); {"maximized", false}};
if (std::strcmp(editor, "DOPE_SHEET") == 0) {
for (const ElementRef &space : linked_list_elements(blend, area, "spacedata")) {
if (space.type_name != "SpaceAction") continue;
if (const std::optional<ElementRef> ads = embedded_element(*blend.sdna, space, "ads")) {
const std::string filter = read_string(*blend.sdna, *ads, "searchstr");
if (!filter.empty()) area_record["filterText"] = filter;
}
break;
}
}
areas.push_back(std::move(area_record));
} }
if (!valid || areas.empty()) continue; if (!valid || areas.empty()) continue;
area_count += areas.size(); area_count += areas.size();
@@ -2545,6 +2595,7 @@ json fcurve_channel(const ParsedBlend &blend, const ElementRef &fcurve)
const std::optional<uint64_t> path_pointer = read_pointer(*blend.sdna, fcurve, "rna_path"); const std::optional<uint64_t> path_pointer = read_pointer(*blend.sdna, fcurve, "rna_path");
const std::string path = path_pointer ? read_raw_string(blend, *path_pointer, 2048) : std::string(); const std::string path = path_pointer ? read_raw_string(blend, *path_pointer, 2048) : std::string();
const int64_t array_index = read_integer(*blend.sdna, fcurve, "array_index").value_or(-1); const int64_t array_index = read_integer(*blend.sdna, fcurve, "array_index").value_or(-1);
const int64_t flags = read_integer(*blend.sdna, fcurve, "flag").value_or(0);
const int64_t extrapolation = read_integer(*blend.sdna, fcurve, "extend").value_or(FCURVE_EXTRAPOLATE_CONSTANT); const int64_t extrapolation = read_integer(*blend.sdna, fcurve, "extend").value_or(FCURVE_EXTRAPOLATE_CONSTANT);
const std::string channel_path = path.empty() || array_index < 0 ? const std::string channel_path = path.empty() || array_index < 0 ?
path : path :
@@ -2614,12 +2665,74 @@ json fcurve_channel(const ParsedBlend &blend, const ElementRef &fcurve)
if (channel_interpolation.empty()) channel_interpolation = interpolation; if (channel_interpolation.empty()) channel_interpolation = interpolation;
else if (channel_interpolation != interpolation) channel_interpolation = "MIXED"; else if (channel_interpolation != interpolation) channel_interpolation = "MIXED";
} }
return { {"path", channel_path}, json result = { {"path", channel_path},
{"editable", (flags & FCURVE_PROTECTED) == 0},
{"enabled", (flags & FCURVE_DISABLED) == 0},
{"selected", (flags & FCURVE_SELECTED) != 0},
{"interpolation", channel_interpolation.empty() ? "BEZIER" : channel_interpolation}, {"interpolation", channel_interpolation.empty() ? "BEZIER" : channel_interpolation},
{"extrapolation", extrapolation == FCURVE_EXTRAPOLATE_LINEAR ? "LINEAR" : "CONSTANT"}, {"extrapolation", extrapolation == FCURVE_EXTRAPOLATE_LINEAR ? "LINEAR" : "CONSTANT"},
{"keyframes", std::move(keyframes)}, {"keyframes", std::move(keyframes)},
{"frameStart", std::isfinite(frame_start) ? frame_start : 0.0f}, {"frameStart", std::isfinite(frame_start) ? frame_start : 0.0f},
{"frameEnd", std::isfinite(frame_end) ? frame_end : 0.0f} }; {"frameEnd", std::isfinite(frame_end) ? frame_end : 0.0f} };
if (const std::optional<uint64_t> group_pointer = read_pointer(*blend.sdna, fcurve, "grp")) {
if (const std::optional<ElementRef> group = element_for_pointer(blend, *group_pointer)) {
const int64_t group_flags = read_integer(*blend.sdna, *group, "flag").value_or(0);
result["group"] = read_string(*blend.sdna, *group, "name");
result["expanded"] = (group_flags & AGRP_EXPANDED) != 0;
}
}
return result;
}
const char *driver_type_name(const int64_t type)
{
switch (type) {
case 0:
return "AVERAGE";
case 1:
return "SCRIPTED";
case 2:
return "SUM";
case 3:
return "MIN";
case 4:
return "MAX";
default:
return "UNKNOWN";
}
}
json driver_fcurve(const ParsedBlend &blend, const ElementRef &fcurve)
{
const std::optional<uint64_t> driver_pointer = read_pointer(*blend.sdna, fcurve, "driver");
if (!driver_pointer) return json();
const std::optional<ElementRef> driver = element_for_pointer(blend, *driver_pointer);
if (!driver) return json();
const std::optional<uint64_t> path_pointer = read_pointer(*blend.sdna, fcurve, "rna_path");
const std::string path = path_pointer ? read_raw_string(blend, *path_pointer, 2048) : std::string();
const int64_t array_index = read_integer(*blend.sdna, fcurve, "array_index").value_or(-1);
const int64_t fcurve_flags = read_integer(*blend.sdna, fcurve, "flag").value_or(0);
const int64_t driver_type = read_integer(*blend.sdna, *driver, "type").value_or(-1);
const int64_t driver_flags = read_integer(*blend.sdna, *driver, "flag").value_or(0);
json variables = json::array();
for (const ElementRef &variable : linked_list_elements(blend, *driver, "variables")) {
variables.push_back({{"name", read_string(*blend.sdna, variable, "name")},
{"type", read_integer(*blend.sdna, variable, "type").value_or(-1)},
{"targetCount", std::clamp<int64_t>(
read_integer(*blend.sdna, variable, "num_targets").value_or(0),
0,
8)}});
}
return { {"path", path},
{"arrayIndex", array_index},
{"editable", (fcurve_flags & FCURVE_PROTECTED) == 0},
{"enabled", (fcurve_flags & FCURVE_DISABLED) == 0},
{"expression", read_string(*blend.sdna, *driver, "expression")},
{"type", driver_type_name(driver_type)},
{"typeCode", driver_type},
{"flags", driver_flags},
{"influence", read_float(*blend.sdna, *driver, "influence").value_or(1.0f)},
{"variables", std::move(variables)}};
} }
void append_fcurve_channels(const ParsedBlend &blend, void append_fcurve_channels(const ParsedBlend &blend,
@@ -3210,6 +3323,7 @@ json scene_ir_from_blend(const ParsedBlend &blend,
json collections = json::array(); json collections = json::array();
json scenes = json::array(); json scenes = json::array();
std::unordered_set<std::string> visited_animations; std::unordered_set<std::string> visited_animations;
std::unordered_set<uint64_t> linked_action_pointers;
std::unordered_map<std::string, json> modifier_stacks_by_mesh_id; std::unordered_map<std::string, json> modifier_stacks_by_mesh_id;
std::unordered_map<std::string, std::array<float, 16>> mesh_bind_matrices; std::unordered_map<std::string, std::array<float, 16>> mesh_bind_matrices;
std::unordered_map<std::string, std::string> armature_id_by_object_id; std::unordered_map<std::string, std::string> armature_id_by_object_id;
@@ -3255,6 +3369,7 @@ json scene_ir_from_blend(const ParsedBlend &blend,
if (const std::optional<uint64_t> adt_pointer = read_pointer(*blend.sdna, element, "adt")) { if (const std::optional<uint64_t> adt_pointer = read_pointer(*blend.sdna, element, "adt")) {
if (const std::optional<ElementRef> adt = element_for_pointer(blend, *adt_pointer)) { if (const std::optional<ElementRef> adt = element_for_pointer(blend, *adt_pointer)) {
if (const std::optional<uint64_t> action_pointer = read_pointer(*blend.sdna, *adt, "action")) { if (const std::optional<uint64_t> action_pointer = read_pointer(*blend.sdna, *adt, "action")) {
linked_action_pointers.insert(*action_pointer);
append_action_animation(blend, record.id, *action_pointer, animations, visited_animations); append_action_animation(blend, record.id, *action_pointer, animations, visited_animations);
} }
int track_index = 0; int track_index = 0;
@@ -3267,6 +3382,7 @@ json scene_ir_from_blend(const ParsedBlend &blend,
const std::optional<uint64_t> action_pointer = read_pointer(*blend.sdna, strip, "act"); const std::optional<uint64_t> action_pointer = read_pointer(*blend.sdna, strip, "act");
std::string action_id = "action:missing:" + record.id; std::string action_id = "action:missing:" + record.id;
if (action_pointer) { if (action_pointer) {
linked_action_pointers.insert(*action_pointer);
append_action_animation(blend, record.id, *action_pointer, animations, visited_animations); append_action_animation(blend, record.id, *action_pointer, animations, visited_animations);
if (const std::optional<ElementRef> action = element_for_pointer(blend, *action_pointer)) { if (const std::optional<ElementRef> action = element_for_pointer(blend, *action_pointer)) {
const std::string action_name = read_id_name(*blend.sdna, *action); const std::string action_name = read_id_name(*blend.sdna, *action);
@@ -3350,6 +3466,16 @@ json scene_ir_from_blend(const ParsedBlend &blend,
{"influence", read_float(*blend.sdna, constraint, "enforce").value_or(1.0f)}}); {"influence", read_float(*blend.sdna, constraint, "enforce").value_or(1.0f)}});
} }
if (!constraints.empty()) node["constraints"] = std::move(constraints); if (!constraints.empty()) node["constraints"] = std::move(constraints);
if (const std::optional<uint64_t> adt_pointer = read_pointer(*blend.sdna, element, "adt")) {
if (const std::optional<ElementRef> adt = element_for_pointer(blend, *adt_pointer)) {
json drivers = json::array();
for (const ElementRef &fcurve : linked_list_elements(blend, *adt, "drivers")) {
json driver = driver_fcurve(blend, fcurve);
if (!driver.is_null()) drivers.push_back(std::move(driver));
}
if (!drivers.empty()) node["drivers"] = std::move(drivers);
}
}
if (parent_pointer) { if (parent_pointer) {
const auto parent = ids_by_pointer.find(*parent_pointer); const auto parent = ids_by_pointer.find(*parent_pointer);
node["parentId"] = parent != ids_by_pointer.end() ? json(parent->second) : json(nullptr); node["parentId"] = parent != ids_by_pointer.end() ? json(parent->second) : json(nullptr);
@@ -4194,6 +4320,19 @@ json scene_ir_from_blend(const ParsedBlend &blend,
} }
} }
for (const IdRecord &record : records) {
if ((record.type_name != "bAction" && record.type_name != "Action") ||
linked_action_pointers.contains(record.pointer))
{
continue;
}
const size_t animation_count = animations.size();
append_action_animation(blend, "unlinked", record.pointer, animations, visited_animations);
if (animations.size() > animation_count) {
animations.back()["unlinked"] = true;
}
}
sort_by_id(nodes); sort_by_id(nodes);
sort_by_id(meshes); sort_by_id(meshes);
sort_by_id(materials); sort_by_id(materials);

View File

@@ -9,10 +9,10 @@
| 字段 | 值 | | 字段 | 值 |
| --- | --- | | --- | --- |
| 里程碑 | M16 Main、Mesh、Modifier、Sculpt | | 里程碑 | M16 Main、Mesh、Modifier、Sculpt |
| 当前任务 | `M16-GAP-00139` | | 当前任务 | `M16-GAP-00174` |
| parent manifest | `tests/golden/M16-GAP-00138/manifest.json` | | parent manifest | `tests/golden/M16-GAP-00173/manifest.json` |
| 任务卡 | [`tasks/M16-GAP-00139.md`](tasks/M16-GAP-00139.md) | | 任务卡 | [`tasks/M16-GAP-00174.md`](tasks/M16-GAP-00174.md) |
| 专项验收 | `npm --prefix web run test:generated-gap -- --task M16-GAP-00139` | | 专项验收 | `npm --prefix web run test:generated-gap -- --task M16-GAP-00174` |
领取前执行: 领取前执行:

View File

@@ -0,0 +1,17 @@
# M16-GAP-00139 Status
status: done
task: action.select_leftright operator LOCAL_EXACT slice
updated: 2026-08-20 America/New_York
scope:
- Action Editor left-side selection on `object:WebGapSelectLeftRightObject`, using `mode=LEFT` at frame 3.
evidence:
- Blender desktop and WASM/Main expose matching three location channels with frames 1 and 3 selected.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context handoff and manifest hashing passed.
nextTask: `M16-GAP-00140`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00140 Status
status: done
task: action.select_less operator LOCAL_EXACT slice
updated: 2026-08-20 America/New_York
scope:
- Action Editor selection-island shrinking on `object:WebGapSelectLessObject`.
evidence:
- Blender desktop and WASM/Main expose matching three location channels with only frame 3 selected after `select_less`.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context handoff and manifest hashing passed.
nextTask: `M16-GAP-00141`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00141 Status
status: done
task: action.select_linked operator LOCAL_EXACT slice
updated: 2026-08-20 America/New_York
scope:
- Action Editor linked selection on `object:WebGapSelectLinkedObject`, starting from `location[0]` frame 3.
evidence:
- Blender desktop and WASM/Main expose matching three location channels with frames 1, 3 and 5 selected after `select_linked`.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context handoff and manifest hashing passed.
nextTask: `M16-GAP-00142`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00142 Status
status: done
task: action.select_more operator LOCAL_EXACT slice
updated: 2026-08-20 America/New_York
scope:
- Action Editor neighboring-key selection on `object:WebGapSelectMoreObject`, starting from `location[0]` frame 3.
evidence:
- Blender desktop and WASM/Main expose matching three location channels with frames 1, 3 and 5 selected after `select_more`.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context handoff and manifest hashing passed.
nextTask: `M16-GAP-00143`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00143 Status
status: done
task: action.snap operator LOCAL_EXACT slice
updated: 2026-08-20 America/New_York
scope:
- Action Editor current-frame snapping on `object:WebGapSnapObject`, using `type=CFRA` at frame 4.
evidence:
- Blender desktop and WASM/Main expose matching location channels with keyframes `[1,4,5]` and frame 4 selected.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context handoff and manifest hashing passed.
nextTask: `M16-GAP-00144`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00144 Status
status: done
task: action.stash operator LOCAL_EXACT slice
updated: 2026-08-20 America/New_York
scope:
- Action Editor Action stashing on `object:WebGapStashObject`.
evidence:
- Blender desktop and WASM/Main expose no active Action plus one NLA track containing one strip for the stashed Action.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context handoff and manifest hashing passed.
nextTask: `M16-GAP-00145`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00145 Status
status: done
task: action.stash_and_create operator LOCAL_EXACT slice
updated: 2026-08-20 America/New_York
scope:
- Action Editor stash-and-create on `object:WebGapStashCreateObject`.
evidence:
- Blender desktop and WASM/Main expose one NLA track/strip containing the stashed Action while active Action is empty.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context handoff and manifest hashing passed.
nextTask: `M16-GAP-00146`

View File

@@ -0,0 +1,18 @@
# M16-GAP-00146 Status
status: done
task: action.unlink operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor unlink on `WebGapActionUnlinkObject`.
evidence:
- Blender desktop reports no active Action while retaining the fake-user `WebGapActionUnlinkObjectAction` with three location channels.
- WASM/Main exposes the same retained Action as an `animations` record with `unlinked: true` and target `unlinked`.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Reader rebuild, fixture generation, desktop checker, npm comparator, direct comparator and artifact hashing passed.
nextTask: `M16-GAP-00147`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00147 Status
status: done
task: action.view_all operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `action.view_all` view state on the Animation workspace main region.
evidence:
- Blender desktop and WASM/Main expose the same Action Editor `view2d.cur` and mask after `action.view_all`.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Reader rebuild, fixture generation, desktop checker, npm comparator, direct comparator and artifact hashing passed.
nextTask: `M16-GAP-00148`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00148 Status
status: done
task: action.view_frame operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `action.view_frame` centering around current frame 3.
evidence:
- Blender desktop and WASM/Main expose the same Action Editor `view2d.cur` and mask around current frame 3.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Existing reader `view2d` support, fixture generation, desktop checker, npm comparator, direct comparator and artifact hashing passed.
nextTask: `M16-GAP-00149`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00149 Status
status: done
task: action.view_selected operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `action.view_selected` selection and view state around selected frame 3.
evidence:
- Blender desktop and WASM/Main expose the same Action Editor selection on frame 3 for all three location channels and the same `view2d.cur` and mask.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00150`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00150 Status
status: done
task: anim.change_frame operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Animation Editor `anim.change_frame` moves the current frame to 4 for a minimal animated object.
evidence:
- Blender desktop and WASM/Main expose the same current frame 4 and three Action channels with frames 1, 3, and 5.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00151`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00151 Status
status: done
task: anim.channel_select_keys operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channel_select_keys` selects all keys on the first location channel.
evidence:
- Blender desktop and WASM/Main expose the same selection: location index 0 at frames 1, 3, and 5; the other channels remain unselected.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00152`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00152 Status
status: done
task: anim.channel_view_pick operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channel_view_pick` frames the shared location-channel range.
evidence:
- Blender desktop and WASM/Main expose the same Action Editor `view2d.cur` and mask around frames 1 through 5.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00153`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00153 Status
status: done
task: anim.channels_bake operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_bake` bakes selected location channels over scene frames 1 through 5 at step 1.
evidence:
- Blender desktop and WASM/Main expose identical 1, 2, 3, 4, 5 keyframes on all three location channels.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00154`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00154 Status
status: done
task: anim.channels_clean_empty operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_clean_empty` removes an empty AnimData container while preserving a populated Action.
evidence:
- Blender desktop and WASM/Main show the empty object's AnimData removed and the keep object's three location channels at frames 1, 3, and 5.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00155`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00155 Status
status: done
task: anim.channels_click operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_click` selects the first location channel.
evidence:
- Blender desktop and WASM/Main expose the same selected location index 0 keys at frames 1, 3, and 5; other channels remain unselected.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00156`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00156 Status
status: done
task: anim.channels_collapse operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_collapse` collapses all channels.
evidence:
- Blender desktop and WASM/Main preserve the same three location channels at frames 1, 3, and 5 after `all=true` collapse.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00157`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00157 Status
status: done
task: anim.channels_delete operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_delete` deletes the selected location[0] FCurve.
evidence:
- Blender desktop and WASM/Main show the Action emptied after deleting the only location channel; the WASM snapshot correctly omits the empty animation.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00158`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00158 Status
status: done
task: anim.channels_editable_toggle operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_editable_toggle` toggles the selected location channels to non-editable.
evidence:
- Blender desktop and WASM/Main expose all three location FCurves with `editable: false`.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00159`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00159 Status
status: done
task: anim.channels_expand operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_expand(all=true)` expands the `Object Transforms` channel group.
evidence:
- Blender desktop and WASM/Main expose the group as `Object Transforms` with `expanded: true` on all three location channels.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00160`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00160 Status
status: done
task: anim.channels_fcurves_enable operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_fcurves_enable` preserves three location F-Curves and exposes their enabled state.
evidence:
- Blender desktop and WASM/Main expose all three `location_missing` channels with `enabled: true` after the operator path.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context governance, and artifact hashing passed.
nextTask: `M16-GAP-00161`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00161 Status
status: done
task: anim.channels_group operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_group` assigns the three selected location F-Curves to `WebGapTransforms`.
evidence:
- Blender desktop and WASM/Main expose all three channels with the exact `WebGapTransforms` group.
- Save/reopen is exact; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context governance, and artifact hashing passed.
nextTask: `M16-GAP-00162`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00162 Status
status: done
task: anim.channels_move operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_move` moves the first location F-Curve down.
evidence:
- Blender desktop and WASM/Main expose the same three location channels in order `[1, 0, 2]`.
- Save/reopen preserves the channel order exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context governance, and artifact hashing passed.
nextTask: `M16-GAP-00163`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00163 Status
status: done
task: anim.channels_rename operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_rename` renames the first disabled F-Curve RNA path to `rotation_euler`.
evidence:
- Blender desktop and WASM/Main expose the same three channels: `rotation_euler[0]`, `location_missing[1]`, and `location_missing[2]` with identical keyframes.
- WASM preserves the disabled flags for the two invalid control paths; save/reopen preserves the animation snapshot exactly.
- Fixture generation, desktop checker, npm comparator, direct comparator, malformed Blend rejection, context governance, and artifact hashing passed.
nextTask: `M16-GAP-00164`

View File

@@ -0,0 +1,18 @@
# M16-GAP-00164 Status
status: done
task: anim.channels_select_all operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_select_all` selects all three F-Curve channels without selecting keyframes.
evidence:
- Blender desktop and WASM/Main expose the same three `location` channels with `selected: true` and unchanged keyframe selection.
- The reader exposes the persisted `FCURVE_SELECTED` flag through the optional SceneIR channel field `selected`.
- Save/reopen preserves the animation snapshot exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, WebEngine rebuild, context governance, and artifact hashing passed.
nextTask: `M16-GAP-00165`

View File

@@ -0,0 +1,18 @@
# M16-GAP-00165 Status
status: done
task: anim.channels_select_box operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_select_box` selects all three F-Curve channels without selecting keyframes.
evidence:
- Blender desktop and WASM/Main expose the same three `location` channels with `selected: true` and unchanged keyframe selection.
- The reader reuses the persisted `FCURVE_SELECTED` flag through the optional SceneIR channel field `selected`.
- Save/reopen preserves the animation snapshot exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context governance, and artifact hashing passed.
nextTask: `M16-GAP-00166`

View File

@@ -0,0 +1,18 @@
# M16-GAP-00166 Status
status: done
task: anim.channels_select_filter operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_select_filter` persists the `Location` channel filter in the Dope Sheet editor workflow.
evidence:
- Blender desktop and WASM/Main expose the same Action Editor `filterText: "Location"` and the same three animation channels.
- The reader maps persisted `SpaceAction.ads.searchstr` to the optional editor area `filterText` field; protocol validation bounds the string to 64 bytes.
- Save/reopen preserves the editor workflow and animation snapshot exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, WebEngine rebuild, npm comparator, direct comparator, context governance, and artifact hashing passed.
nextTask: `M16-GAP-00167`

View File

@@ -0,0 +1,18 @@
# M16-GAP-00167 Status
status: done
task: anim.channels_setting_disable operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_setting_disable(type=PROTECT)` disables editability on all three selected F-Curve channels.
evidence:
- Blender desktop and WASM/Main expose the same three animation channels with `editable: false`.
- The existing reader mapping of the persisted F-Curve protection flag is sufficient for this setting.
- Save/reopen preserves the animation snapshot exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, context governance, and artifact hashing passed.
nextTask: `M16-GAP-00168`

View File

@@ -0,0 +1,18 @@
# M16-GAP-00168 Status
status: done
task: anim.channels_setting_enable operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_setting_enable(type=PROTECT)` protects all three selected F-Curve channels.
evidence:
- Blender desktop and WASM/Main expose the same three animation channels with `editable: false`.
- The existing reader mapping of the persisted F-Curve protection flag is sufficient for this setting.
- Save/reopen preserves the animation snapshot exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00169`

View File

@@ -0,0 +1,18 @@
# M16-GAP-00169 Status
status: done
task: anim.channels_setting_toggle operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_setting_toggle(type=PROTECT)` toggles protection on all three selected F-Curve channels.
evidence:
- Blender desktop and WASM/Main expose the same three animation channels with `editable: false` after the toggle.
- The existing reader mapping of the persisted F-Curve protection flag is sufficient for this setting.
- Save/reopen preserves the animation snapshot exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00170`

View File

@@ -0,0 +1,18 @@
# M16-GAP-00170 Status
status: done
task: anim.channels_ungroup operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_ungroup` removes all selected F-Curves from their Action Group.
evidence:
- Blender desktop and WASM/Main expose the same three animation channels with no group after ungrouping.
- The existing reader mapping of F-Curve group pointers is sufficient for the grouped and ungrouped states.
- Save/reopen preserves the animation snapshot exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00171`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00171 Status
status: done
task: anim.channels_view_selected operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- Action Editor `anim.channels_view_selected` preserves the three selected F-Curves and exposes the resulting `view2d` state.
evidence:
- Blender desktop and WASM/Main expose the same three selected animation channels and the same six-decimal normalized Action Editor `view2d` bounds.
- Save/reopen preserves both the animation snapshot and editor workflow exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00172`

View File

@@ -0,0 +1,17 @@
# M16-GAP-00172 Status
status: done
task: anim.clear_useless_actions operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- `anim.clear_useless_actions` removes the fake-user-only Action with no F-Curves while preserving the used Action and the fake-user Action library with F-Curves.
evidence:
- Blender desktop and WASM/Main expose the same two preserved Actions, each with three location channels and frames 1, 3, and 5; the empty Action is absent.
- Save/reopen preserves the animation snapshot exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00173`

View File

@@ -0,0 +1,18 @@
# M16-GAP-00173 Status
status: done
task: anim.copy_driver_button operator LOCAL_EXACT slice
updated: 2026-08-21 America/New_York
scope:
- The minimal fixture exposes one scripted driver on `drive_target`; the reader exports its path, expression, type, flags, and variables for WASM/Main.
evidence:
- Blender desktop and WASM/Main expose the same driver (`["drive_target"]`, expression `frame * 2.0 + 1.0`, type `SCRIPTED`), with value `3.0`.
- The desktop checker invokes `ANIM_OT_copy_driver_button` in the mandated `-b` context and records `CANCELLED`: the operator requires an active UI RNA button, so the cancellation leaves Main unchanged while the driver-read parity evidence remains exact.
- Save/reopen preserves the driver exactly; malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
nextTask: `M16-GAP-00174`

View File

@@ -0,0 +1,18 @@
# M16-GAP-00174 Status
status: in_progress
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; the reader preserves the object and the absence of drivers for WASM/Main.
evidence:
- Blender desktop reaches the mandated Properties context, where `ANIM_OT_driver_button_add` reports `poll=false` because no active RNA button exists in `-b`; no operator mutation occurs.
- Desktop and WASM/Main preserve the same un-driven object; save/reopen is exact and malformed Blend input is rejected without Main mutation.
- Fixture generation, desktop checker, npm comparator, direct comparator, and artifact hashing passed.
- Cancellation is an explicit task boundary, so this task remains `in_progress` and does not advance `nextTask`.
nextTask: `M16-GAP-00174`

View File

@@ -0,0 +1,37 @@
# M16-GAP-00140: operator:action.select_less LOCAL_EXACT slice
- task: M16-GAP-00140
- parent: M16-GAP-00139
- status: in_progress
- gap: operator:action.select_less
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:action.select_less data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00140-operator-action.select_less.blend`
- Generator: `tools/web/generated/M16-GAP-00140.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00140.py -- tests/files/web/generated/M16-GAP-00140-operator-action.select_less.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00140
node tools/web/check-generated-gap.mjs --task M16-GAP-00140
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00140/`
- Status: `docs/status/M16-GAP-00140.md`
- Manifest: `tests/golden/M16-GAP-00140/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00140 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00141: operator:action.select_linked LOCAL_EXACT slice
- task: M16-GAP-00141
- parent: M16-GAP-00140
- status: in_progress
- gap: operator:action.select_linked
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:action.select_linked data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00141-operator-action.select_linked.blend`
- Generator: `tools/web/generated/M16-GAP-00141.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00141.py -- tests/files/web/generated/M16-GAP-00141-operator-action.select_linked.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00141
node tools/web/check-generated-gap.mjs --task M16-GAP-00141
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00141/`
- Status: `docs/status/M16-GAP-00141.md`
- Manifest: `tests/golden/M16-GAP-00141/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00141 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00142: operator:action.select_more LOCAL_EXACT slice
- task: M16-GAP-00142
- parent: M16-GAP-00141
- status: in_progress
- gap: operator:action.select_more
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:action.select_more data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00142-operator-action.select_more.blend`
- Generator: `tools/web/generated/M16-GAP-00142.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00142.py -- tests/files/web/generated/M16-GAP-00142-operator-action.select_more.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00142
node tools/web/check-generated-gap.mjs --task M16-GAP-00142
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00142/`
- Status: `docs/status/M16-GAP-00142.md`
- Manifest: `tests/golden/M16-GAP-00142/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00142 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00143: operator:action.snap LOCAL_EXACT slice
- task: M16-GAP-00143
- parent: M16-GAP-00142
- status: in_progress
- gap: operator:action.snap
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:action.snap data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00143-operator-action.snap.blend`
- Generator: `tools/web/generated/M16-GAP-00143.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00143.py -- tests/files/web/generated/M16-GAP-00143-operator-action.snap.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00143
node tools/web/check-generated-gap.mjs --task M16-GAP-00143
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00143/`
- Status: `docs/status/M16-GAP-00143.md`
- Manifest: `tests/golden/M16-GAP-00143/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00143 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00144: operator:action.stash LOCAL_EXACT slice
- task: M16-GAP-00144
- parent: M16-GAP-00143
- status: in_progress
- gap: operator:action.stash
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:action.stash data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00144-operator-action.stash.blend`
- Generator: `tools/web/generated/M16-GAP-00144.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00144.py -- tests/files/web/generated/M16-GAP-00144-operator-action.stash.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00144
node tools/web/check-generated-gap.mjs --task M16-GAP-00144
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00144/`
- Status: `docs/status/M16-GAP-00144.md`
- Manifest: `tests/golden/M16-GAP-00144/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00144 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00145: operator:action.stash_and_create LOCAL_EXACT slice
- task: M16-GAP-00145
- parent: M16-GAP-00144
- status: in_progress
- gap: operator:action.stash_and_create
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:action.stash_and_create data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00145-operator-action.stash_and_create.blend`
- Generator: `tools/web/generated/M16-GAP-00145.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00145.py -- tests/files/web/generated/M16-GAP-00145-operator-action.stash_and_create.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00145
node tools/web/check-generated-gap.mjs --task M16-GAP-00145
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00145/`
- Status: `docs/status/M16-GAP-00145.md`
- Manifest: `tests/golden/M16-GAP-00145/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00145 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00146: operator:action.unlink LOCAL_EXACT slice
- task: M16-GAP-00146
- parent: M16-GAP-00145
- status: in_progress
- gap: operator:action.unlink
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:action.unlink data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00146-operator-action.unlink.blend`
- Generator: `tools/web/generated/M16-GAP-00146.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00146.py -- tests/files/web/generated/M16-GAP-00146-operator-action.unlink.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00146
node tools/web/check-generated-gap.mjs --task M16-GAP-00146
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00146/`
- Status: `docs/status/M16-GAP-00146.md`
- Manifest: `tests/golden/M16-GAP-00146/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00146 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00147: operator:action.view_all LOCAL_EXACT slice
- task: M16-GAP-00147
- parent: M16-GAP-00146
- status: in_progress
- gap: operator:action.view_all
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:action.view_all data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00147-operator-action.view_all.blend`
- Generator: `tools/web/generated/M16-GAP-00147.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00147.py -- tests/files/web/generated/M16-GAP-00147-operator-action.view_all.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00147
node tools/web/check-generated-gap.mjs --task M16-GAP-00147
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00147/`
- Status: `docs/status/M16-GAP-00147.md`
- Manifest: `tests/golden/M16-GAP-00147/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00147 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00148: operator:action.view_frame LOCAL_EXACT slice
- task: M16-GAP-00148
- parent: M16-GAP-00147
- status: in_progress
- gap: operator:action.view_frame
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:action.view_frame data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00148-operator-action.view_frame.blend`
- Generator: `tools/web/generated/M16-GAP-00148.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00148.py -- tests/files/web/generated/M16-GAP-00148-operator-action.view_frame.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00148
node tools/web/check-generated-gap.mjs --task M16-GAP-00148
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00148/`
- Status: `docs/status/M16-GAP-00148.md`
- Manifest: `tests/golden/M16-GAP-00148/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00148 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00149: operator:action.view_selected LOCAL_EXACT slice
- task: M16-GAP-00149
- parent: M16-GAP-00148
- status: in_progress
- gap: operator:action.view_selected
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:action.view_selected data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00149-operator-action.view_selected.blend`
- Generator: `tools/web/generated/M16-GAP-00149.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00149.py -- tests/files/web/generated/M16-GAP-00149-operator-action.view_selected.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00149
node tools/web/check-generated-gap.mjs --task M16-GAP-00149
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00149/`
- Status: `docs/status/M16-GAP-00149.md`
- Manifest: `tests/golden/M16-GAP-00149/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00149 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00150: operator:anim.change_frame LOCAL_EXACT slice
- task: M16-GAP-00150
- parent: M16-GAP-00149
- status: in_progress
- gap: operator:anim.change_frame
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.change_frame data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00150-operator-anim.change_frame.blend`
- Generator: `tools/web/generated/M16-GAP-00150.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00150.py -- tests/files/web/generated/M16-GAP-00150-operator-anim.change_frame.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00150
node tools/web/check-generated-gap.mjs --task M16-GAP-00150
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00150/`
- Status: `docs/status/M16-GAP-00150.md`
- Manifest: `tests/golden/M16-GAP-00150/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00150 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00151: operator:anim.channel_select_keys LOCAL_EXACT slice
- task: M16-GAP-00151
- parent: M16-GAP-00150
- status: in_progress
- gap: operator:anim.channel_select_keys
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channel_select_keys data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00151-operator-anim.channel_select_keys.blend`
- Generator: `tools/web/generated/M16-GAP-00151.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00151.py -- tests/files/web/generated/M16-GAP-00151-operator-anim.channel_select_keys.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00151
node tools/web/check-generated-gap.mjs --task M16-GAP-00151
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00151/`
- Status: `docs/status/M16-GAP-00151.md`
- Manifest: `tests/golden/M16-GAP-00151/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00151 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00152: operator:anim.channel_view_pick LOCAL_EXACT slice
- task: M16-GAP-00152
- parent: M16-GAP-00151
- status: in_progress
- gap: operator:anim.channel_view_pick
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channel_view_pick data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00152-operator-anim.channel_view_pick.blend`
- Generator: `tools/web/generated/M16-GAP-00152.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00152.py -- tests/files/web/generated/M16-GAP-00152-operator-anim.channel_view_pick.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00152
node tools/web/check-generated-gap.mjs --task M16-GAP-00152
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00152/`
- Status: `docs/status/M16-GAP-00152.md`
- Manifest: `tests/golden/M16-GAP-00152/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00152 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00153: operator:anim.channels_bake LOCAL_EXACT slice
- task: M16-GAP-00153
- parent: M16-GAP-00152
- status: in_progress
- gap: operator:anim.channels_bake
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_bake data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00153-operator-anim.channels_bake.blend`
- Generator: `tools/web/generated/M16-GAP-00153.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00153.py -- tests/files/web/generated/M16-GAP-00153-operator-anim.channels_bake.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00153
node tools/web/check-generated-gap.mjs --task M16-GAP-00153
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00153/`
- Status: `docs/status/M16-GAP-00153.md`
- Manifest: `tests/golden/M16-GAP-00153/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00153 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00154: operator:anim.channels_clean_empty LOCAL_EXACT slice
- task: M16-GAP-00154
- parent: M16-GAP-00153
- status: in_progress
- gap: operator:anim.channels_clean_empty
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_clean_empty data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00154-operator-anim.channels_clean_empty.blend`
- Generator: `tools/web/generated/M16-GAP-00154.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00154.py -- tests/files/web/generated/M16-GAP-00154-operator-anim.channels_clean_empty.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00154
node tools/web/check-generated-gap.mjs --task M16-GAP-00154
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00154/`
- Status: `docs/status/M16-GAP-00154.md`
- Manifest: `tests/golden/M16-GAP-00154/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00154 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00155: operator:anim.channels_click LOCAL_EXACT slice
- task: M16-GAP-00155
- parent: M16-GAP-00154
- status: in_progress
- gap: operator:anim.channels_click
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_click data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00155-operator-anim.channels_click.blend`
- Generator: `tools/web/generated/M16-GAP-00155.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00155.py -- tests/files/web/generated/M16-GAP-00155-operator-anim.channels_click.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00155
node tools/web/check-generated-gap.mjs --task M16-GAP-00155
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00155/`
- Status: `docs/status/M16-GAP-00155.md`
- Manifest: `tests/golden/M16-GAP-00155/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00155 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00156: operator:anim.channels_collapse LOCAL_EXACT slice
- task: M16-GAP-00156
- parent: M16-GAP-00155
- status: in_progress
- gap: operator:anim.channels_collapse
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_collapse data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00156-operator-anim.channels_collapse.blend`
- Generator: `tools/web/generated/M16-GAP-00156.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00156.py -- tests/files/web/generated/M16-GAP-00156-operator-anim.channels_collapse.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00156
node tools/web/check-generated-gap.mjs --task M16-GAP-00156
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00156/`
- Status: `docs/status/M16-GAP-00156.md`
- Manifest: `tests/golden/M16-GAP-00156/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00156 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00157: operator:anim.channels_delete LOCAL_EXACT slice
- task: M16-GAP-00157
- parent: M16-GAP-00156
- status: in_progress
- gap: operator:anim.channels_delete
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_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.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00157-operator-anim.channels_delete.blend`
- Generator: `tools/web/generated/M16-GAP-00157.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00157.py -- tests/files/web/generated/M16-GAP-00157-operator-anim.channels_delete.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00157
node tools/web/check-generated-gap.mjs --task M16-GAP-00157
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00157/`
- Status: `docs/status/M16-GAP-00157.md`
- Manifest: `tests/golden/M16-GAP-00157/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00157 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00158: operator:anim.channels_editable_toggle LOCAL_EXACT slice
- task: M16-GAP-00158
- parent: M16-GAP-00157
- status: in_progress
- gap: operator:anim.channels_editable_toggle
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_editable_toggle data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00158-operator-anim.channels_editable_toggle.blend`
- Generator: `tools/web/generated/M16-GAP-00158.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00158.py -- tests/files/web/generated/M16-GAP-00158-operator-anim.channels_editable_toggle.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00158
node tools/web/check-generated-gap.mjs --task M16-GAP-00158
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00158/`
- Status: `docs/status/M16-GAP-00158.md`
- Manifest: `tests/golden/M16-GAP-00158/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00158 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00159: operator:anim.channels_expand LOCAL_EXACT slice
- task: M16-GAP-00159
- parent: M16-GAP-00158
- status: in_progress
- gap: operator:anim.channels_expand
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_expand data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00159-operator-anim.channels_expand.blend`
- Generator: `tools/web/generated/M16-GAP-00159.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00159.py -- tests/files/web/generated/M16-GAP-00159-operator-anim.channels_expand.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00159
node tools/web/check-generated-gap.mjs --task M16-GAP-00159
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00159/`
- Status: `docs/status/M16-GAP-00159.md`
- Manifest: `tests/golden/M16-GAP-00159/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00159 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00160: operator:anim.channels_fcurves_enable LOCAL_EXACT slice
- task: M16-GAP-00160
- parent: M16-GAP-00159
- status: in_progress
- gap: operator:anim.channels_fcurves_enable
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_fcurves_enable data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00160-operator-anim.channels_fcurves_enable.blend`
- Generator: `tools/web/generated/M16-GAP-00160.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00160.py -- tests/files/web/generated/M16-GAP-00160-operator-anim.channels_fcurves_enable.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00160
node tools/web/check-generated-gap.mjs --task M16-GAP-00160
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00160/`
- Status: `docs/status/M16-GAP-00160.md`
- Manifest: `tests/golden/M16-GAP-00160/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00160 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00161: operator:anim.channels_group LOCAL_EXACT slice
- task: M16-GAP-00161
- parent: M16-GAP-00160
- status: in_progress
- gap: operator:anim.channels_group
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_group data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00161-operator-anim.channels_group.blend`
- Generator: `tools/web/generated/M16-GAP-00161.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00161.py -- tests/files/web/generated/M16-GAP-00161-operator-anim.channels_group.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00161
node tools/web/check-generated-gap.mjs --task M16-GAP-00161
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00161/`
- Status: `docs/status/M16-GAP-00161.md`
- Manifest: `tests/golden/M16-GAP-00161/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00161 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00162: operator:anim.channels_move LOCAL_EXACT slice
- task: M16-GAP-00162
- parent: M16-GAP-00161
- status: in_progress
- gap: operator:anim.channels_move
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_move data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00162-operator-anim.channels_move.blend`
- Generator: `tools/web/generated/M16-GAP-00162.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00162.py -- tests/files/web/generated/M16-GAP-00162-operator-anim.channels_move.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00162
node tools/web/check-generated-gap.mjs --task M16-GAP-00162
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00162/`
- Status: `docs/status/M16-GAP-00162.md`
- Manifest: `tests/golden/M16-GAP-00162/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00162 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00163: operator:anim.channels_rename LOCAL_EXACT slice
- task: M16-GAP-00163
- parent: M16-GAP-00162
- status: in_progress
- gap: operator:anim.channels_rename
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_rename data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00163-operator-anim.channels_rename.blend`
- Generator: `tools/web/generated/M16-GAP-00163.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00163.py -- tests/files/web/generated/M16-GAP-00163-operator-anim.channels_rename.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00163
node tools/web/check-generated-gap.mjs --task M16-GAP-00163
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00163/`
- Status: `docs/status/M16-GAP-00163.md`
- Manifest: `tests/golden/M16-GAP-00163/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00163 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00164: operator:anim.channels_select_all LOCAL_EXACT slice
- task: M16-GAP-00164
- parent: M16-GAP-00163
- status: in_progress
- gap: operator:anim.channels_select_all
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_select_all data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00164-operator-anim.channels_select_all.blend`
- Generator: `tools/web/generated/M16-GAP-00164.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00164.py -- tests/files/web/generated/M16-GAP-00164-operator-anim.channels_select_all.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00164
node tools/web/check-generated-gap.mjs --task M16-GAP-00164
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00164/`
- Status: `docs/status/M16-GAP-00164.md`
- Manifest: `tests/golden/M16-GAP-00164/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00164 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00165: operator:anim.channels_select_box LOCAL_EXACT slice
- task: M16-GAP-00165
- parent: M16-GAP-00164
- status: in_progress
- gap: operator:anim.channels_select_box
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_select_box data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00165-operator-anim.channels_select_box.blend`
- Generator: `tools/web/generated/M16-GAP-00165.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00165.py -- tests/files/web/generated/M16-GAP-00165-operator-anim.channels_select_box.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00165
node tools/web/check-generated-gap.mjs --task M16-GAP-00165
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00165/`
- Status: `docs/status/M16-GAP-00165.md`
- Manifest: `tests/golden/M16-GAP-00165/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00165 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00166: operator:anim.channels_select_filter LOCAL_EXACT slice
- task: M16-GAP-00166
- parent: M16-GAP-00165
- status: in_progress
- gap: operator:anim.channels_select_filter
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_select_filter data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00166-operator-anim.channels_select_filter.blend`
- Generator: `tools/web/generated/M16-GAP-00166.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00166.py -- tests/files/web/generated/M16-GAP-00166-operator-anim.channels_select_filter.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00166
node tools/web/check-generated-gap.mjs --task M16-GAP-00166
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00166/`
- Status: `docs/status/M16-GAP-00166.md`
- Manifest: `tests/golden/M16-GAP-00166/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00166 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00167: operator:anim.channels_setting_disable LOCAL_EXACT slice
- task: M16-GAP-00167
- parent: M16-GAP-00166
- status: in_progress
- gap: operator:anim.channels_setting_disable
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_setting_disable data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00167-operator-anim.channels_setting_disable.blend`
- Generator: `tools/web/generated/M16-GAP-00167.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00167.py -- tests/files/web/generated/M16-GAP-00167-operator-anim.channels_setting_disable.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00167
node tools/web/check-generated-gap.mjs --task M16-GAP-00167
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00167/`
- Status: `docs/status/M16-GAP-00167.md`
- Manifest: `tests/golden/M16-GAP-00167/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00167 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00168: operator:anim.channels_setting_enable LOCAL_EXACT slice
- task: M16-GAP-00168
- parent: M16-GAP-00167
- status: in_progress
- gap: operator:anim.channels_setting_enable
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_setting_enable data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00168-operator-anim.channels_setting_enable.blend`
- Generator: `tools/web/generated/M16-GAP-00168.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00168.py -- tests/files/web/generated/M16-GAP-00168-operator-anim.channels_setting_enable.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00168
node tools/web/check-generated-gap.mjs --task M16-GAP-00168
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00168/`
- Status: `docs/status/M16-GAP-00168.md`
- Manifest: `tests/golden/M16-GAP-00168/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00168 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00169: operator:anim.channels_setting_toggle LOCAL_EXACT slice
- task: M16-GAP-00169
- parent: M16-GAP-00168
- status: in_progress
- gap: operator:anim.channels_setting_toggle
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_setting_toggle data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00169-operator-anim.channels_setting_toggle.blend`
- Generator: `tools/web/generated/M16-GAP-00169.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00169.py -- tests/files/web/generated/M16-GAP-00169-operator-anim.channels_setting_toggle.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00169
node tools/web/check-generated-gap.mjs --task M16-GAP-00169
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00169/`
- Status: `docs/status/M16-GAP-00169.md`
- Manifest: `tests/golden/M16-GAP-00169/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00169 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00170: operator:anim.channels_ungroup LOCAL_EXACT slice
- task: M16-GAP-00170
- parent: M16-GAP-00169
- status: in_progress
- gap: operator:anim.channels_ungroup
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_ungroup data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00170-operator-anim.channels_ungroup.blend`
- Generator: `tools/web/generated/M16-GAP-00170.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00170.py -- tests/files/web/generated/M16-GAP-00170-operator-anim.channels_ungroup.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00170
node tools/web/check-generated-gap.mjs --task M16-GAP-00170
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00170/`
- Status: `docs/status/M16-GAP-00170.md`
- Manifest: `tests/golden/M16-GAP-00170/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00170 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00171: operator:anim.channels_view_selected LOCAL_EXACT slice
- task: M16-GAP-00171
- parent: M16-GAP-00170
- status: in_progress
- gap: operator:anim.channels_view_selected
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.channels_view_selected data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00171-operator-anim.channels_view_selected.blend`
- Generator: `tools/web/generated/M16-GAP-00171.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00171.py -- tests/files/web/generated/M16-GAP-00171-operator-anim.channels_view_selected.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00171
node tools/web/check-generated-gap.mjs --task M16-GAP-00171
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00171/`
- Status: `docs/status/M16-GAP-00171.md`
- Manifest: `tests/golden/M16-GAP-00171/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00171 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00172: operator:anim.clear_useless_actions LOCAL_EXACT slice
- task: M16-GAP-00172
- parent: M16-GAP-00171
- status: in_progress
- gap: operator:anim.clear_useless_actions
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.clear_useless_actions data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00172-operator-anim.clear_useless_actions.blend`
- Generator: `tools/web/generated/M16-GAP-00172.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00172.py -- tests/files/web/generated/M16-GAP-00172-operator-anim.clear_useless_actions.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00172
node tools/web/check-generated-gap.mjs --task M16-GAP-00172
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00172/`
- Status: `docs/status/M16-GAP-00172.md`
- Manifest: `tests/golden/M16-GAP-00172/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00172 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00173: operator:anim.copy_driver_button LOCAL_EXACT slice
- task: M16-GAP-00173
- parent: M16-GAP-00172
- status: in_progress
- gap: operator:anim.copy_driver_button
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.copy_driver_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.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00173-operator-anim.copy_driver_button.blend`
- Generator: `tools/web/generated/M16-GAP-00173.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00173.py -- tests/files/web/generated/M16-GAP-00173-operator-anim.copy_driver_button.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00173
node tools/web/check-generated-gap.mjs --task M16-GAP-00173
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00173/`
- Status: `docs/status/M16-GAP-00173.md`
- Manifest: `tests/golden/M16-GAP-00173/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00173 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00174: operator:anim.driver_button_add LOCAL_EXACT slice
- task: M16-GAP-00174
- parent: M16-GAP-00173
- status: in_progress
- gap: operator:anim.driver_button_add
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:anim.driver_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.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00174-operator-anim.driver_button_add.blend`
- Generator: `tools/web/generated/M16-GAP-00174.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00174.py -- tests/files/web/generated/M16-GAP-00174-operator-anim.driver_button_add.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00174
node tools/web/check-generated-gap.mjs --task M16-GAP-00174
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00174/`
- Status: `docs/status/M16-GAP-00174.md`
- Manifest: `tests/golden/M16-GAP-00174/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00174 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

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