assert(taskPage.includes("let selectionSyncGeneration = -1;"),"programmatic selection synchronization must be tracked");
assert(taskPage.includes("let selectionSyncGeneration = -1;"),"programmatic selection synchronization must be tracked");
assert(taskPage.includes("if (selectionSyncGeneration === activeLoadGeneration) return;"),"programmatic table selection events must not overwrite task keys");
assert(taskPage.includes("if (selectionSyncGeneration === activeLoadGeneration) return;"),"programmatic table selection events must not overwrite task keys");
assert(taskPage.includes("getTaskPublication"),"task allocation must load the selected class publication state");
assert(taskPage.includes("getTaskPublication"),"task allocation must load the selected class publication state");
assert(taskPage.includes("tasks.value.map((task) => task.taskKey)"),"an unconfigured class must default to all tasks selected");
assert(/tasks\.value\s+\.filter\(\(task\) => task\.taskKey !== comprehensiveTaskKey\)\s+\.map\(\(task\) => task\.taskKey\)/.test(taskPage),"an unconfigured class must keep comprehensive training unpublished until the teacher explicitly selects it");
assert(taskPage.includes("保存发布配置"),"task allocation must require an explicit save");
assert(taskPage.includes("保存发布配置"),"task allocation must require an explicit save");
assert(api.includes("selectTaskPublicationByClassId"),"publication API missing");
assert(api.includes("selectTaskPublicationByClassId"),"publication API missing");
assert(sidebar.includes("filterStudentCourseNavigation"),"student menu must be filtered by published training tasks");
assert(sidebar.includes("filterStudentCourseNavigation"),"student menu must be filtered by published training tasks");