Capture M16 gap execution artifacts
This commit is contained in:
@@ -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 ®ion)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|||||||
@@ -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` |
|
||||||
|
|
||||||
领取前执行:
|
领取前执行:
|
||||||
|
|
||||||
|
|||||||
17
docs/status/M16-GAP-00139.md
Normal file
17
docs/status/M16-GAP-00139.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00140.md
Normal file
17
docs/status/M16-GAP-00140.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00141.md
Normal file
17
docs/status/M16-GAP-00141.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00142.md
Normal file
17
docs/status/M16-GAP-00142.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00143.md
Normal file
17
docs/status/M16-GAP-00143.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00144.md
Normal file
17
docs/status/M16-GAP-00144.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00145.md
Normal file
17
docs/status/M16-GAP-00145.md
Normal 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`
|
||||||
18
docs/status/M16-GAP-00146.md
Normal file
18
docs/status/M16-GAP-00146.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00147.md
Normal file
17
docs/status/M16-GAP-00147.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00148.md
Normal file
17
docs/status/M16-GAP-00148.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00149.md
Normal file
17
docs/status/M16-GAP-00149.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00150.md
Normal file
17
docs/status/M16-GAP-00150.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00151.md
Normal file
17
docs/status/M16-GAP-00151.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00152.md
Normal file
17
docs/status/M16-GAP-00152.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00153.md
Normal file
17
docs/status/M16-GAP-00153.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00154.md
Normal file
17
docs/status/M16-GAP-00154.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00155.md
Normal file
17
docs/status/M16-GAP-00155.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00156.md
Normal file
17
docs/status/M16-GAP-00156.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00157.md
Normal file
17
docs/status/M16-GAP-00157.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00158.md
Normal file
17
docs/status/M16-GAP-00158.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00159.md
Normal file
17
docs/status/M16-GAP-00159.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00160.md
Normal file
17
docs/status/M16-GAP-00160.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00161.md
Normal file
17
docs/status/M16-GAP-00161.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00162.md
Normal file
17
docs/status/M16-GAP-00162.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00163.md
Normal file
17
docs/status/M16-GAP-00163.md
Normal 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`
|
||||||
18
docs/status/M16-GAP-00164.md
Normal file
18
docs/status/M16-GAP-00164.md
Normal 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`
|
||||||
18
docs/status/M16-GAP-00165.md
Normal file
18
docs/status/M16-GAP-00165.md
Normal 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`
|
||||||
18
docs/status/M16-GAP-00166.md
Normal file
18
docs/status/M16-GAP-00166.md
Normal 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`
|
||||||
18
docs/status/M16-GAP-00167.md
Normal file
18
docs/status/M16-GAP-00167.md
Normal 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`
|
||||||
18
docs/status/M16-GAP-00168.md
Normal file
18
docs/status/M16-GAP-00168.md
Normal 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`
|
||||||
18
docs/status/M16-GAP-00169.md
Normal file
18
docs/status/M16-GAP-00169.md
Normal 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`
|
||||||
18
docs/status/M16-GAP-00170.md
Normal file
18
docs/status/M16-GAP-00170.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00171.md
Normal file
17
docs/status/M16-GAP-00171.md
Normal 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`
|
||||||
17
docs/status/M16-GAP-00172.md
Normal file
17
docs/status/M16-GAP-00172.md
Normal 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`
|
||||||
18
docs/status/M16-GAP-00173.md
Normal file
18
docs/status/M16-GAP-00173.md
Normal 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`
|
||||||
18
docs/status/M16-GAP-00174.md
Normal file
18
docs/status/M16-GAP-00174.md
Normal 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`
|
||||||
37
docs/tasks/M16-GAP-00140.md
Normal file
37
docs/tasks/M16-GAP-00140.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00141.md
Normal file
37
docs/tasks/M16-GAP-00141.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00142.md
Normal file
37
docs/tasks/M16-GAP-00142.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00143.md
Normal file
37
docs/tasks/M16-GAP-00143.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00144.md
Normal file
37
docs/tasks/M16-GAP-00144.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00145.md
Normal file
37
docs/tasks/M16-GAP-00145.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00146.md
Normal file
37
docs/tasks/M16-GAP-00146.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00147.md
Normal file
37
docs/tasks/M16-GAP-00147.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00148.md
Normal file
37
docs/tasks/M16-GAP-00148.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00149.md
Normal file
37
docs/tasks/M16-GAP-00149.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00150.md
Normal file
37
docs/tasks/M16-GAP-00150.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00151.md
Normal file
37
docs/tasks/M16-GAP-00151.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00152.md
Normal file
37
docs/tasks/M16-GAP-00152.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00153.md
Normal file
37
docs/tasks/M16-GAP-00153.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00154.md
Normal file
37
docs/tasks/M16-GAP-00154.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00155.md
Normal file
37
docs/tasks/M16-GAP-00155.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00156.md
Normal file
37
docs/tasks/M16-GAP-00156.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00157.md
Normal file
37
docs/tasks/M16-GAP-00157.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00158.md
Normal file
37
docs/tasks/M16-GAP-00158.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00159.md
Normal file
37
docs/tasks/M16-GAP-00159.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00160.md
Normal file
37
docs/tasks/M16-GAP-00160.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00161.md
Normal file
37
docs/tasks/M16-GAP-00161.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00162.md
Normal file
37
docs/tasks/M16-GAP-00162.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00163.md
Normal file
37
docs/tasks/M16-GAP-00163.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00164.md
Normal file
37
docs/tasks/M16-GAP-00164.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00165.md
Normal file
37
docs/tasks/M16-GAP-00165.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00166.md
Normal file
37
docs/tasks/M16-GAP-00166.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00167.md
Normal file
37
docs/tasks/M16-GAP-00167.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00168.md
Normal file
37
docs/tasks/M16-GAP-00168.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00169.md
Normal file
37
docs/tasks/M16-GAP-00169.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00170.md
Normal file
37
docs/tasks/M16-GAP-00170.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00171.md
Normal file
37
docs/tasks/M16-GAP-00171.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00172.md
Normal file
37
docs/tasks/M16-GAP-00172.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00173.md
Normal file
37
docs/tasks/M16-GAP-00173.md
Normal 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.
|
||||||
37
docs/tasks/M16-GAP-00174.md
Normal file
37
docs/tasks/M16-GAP-00174.md
Normal 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.
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user