assert(/\/help/.test(api)&&/\/assessment/.test(api),"evaluation API should expose help and assessment operations");
assert(/\/help/.test(api)&&/\/assessment/.test(api),"evaluation API should expose help and assessment operations");
assert(/TrainingAiSidebar/.test(page)&&/:has-saved-answer="hasSavedAnswer"/.test(page),"generic training page should pass persisted answer state to the AI sidebar");
assert(/TrainingAiSidebar/.test(page)&&/:has-saved-answer="hasSavedAnswer"/.test(page),"generic training page should pass persisted answer state to the AI sidebar");
assert(/form\.value/.test(page)&&/workRows\.value/.test(page)&&/processRows\.value/.test(page),"hasAnyAnswer should inspect all supported answer shapes");
assert(/form\.value/.test(page)&&/workRows\.value/.test(page)&&/processRows\.value/.test(page),"hasAnyAnswer should inspect all supported answer shapes");
assert(/requestAiTrainingHelp\(taskKey, question\)/.test(api),"AI help API should accept the student's question");
assert(/data:\s*\{\s*question\s*\}/.test(api),"AI help API should submit the student's question as JSON");
assert(/const question = assistQuestion\.value\.trim\(\)/.test(sidebar),"AI sidebar should trim the student's question before sending it");
assert(/if \(!question\)/.test(sidebar),"AI sidebar should block an empty AI help question");
assert(/requestAiTrainingHelp\(currentTaskKey\.value, question\)/.test(sidebar),"AI sidebar should send the trimmed question to AI help");
assert(/onMounted\(/.test(component)&&/watch\(\s*\(\)\s*=>\s*props\.taskKey/.test(component),"AI evaluation should load on mount and task changes");
assert(/onMounted\(/.test(component)&&/watch\(\s*\(\)\s*=>\s*props\.taskKey/.test(component),"AI evaluation should load on mount and task changes");
assert(/AI助学/.test(component)&&/AI助评/.test(component),"AI evaluation should offer separate help and assessment controls");
assert(/AI助学/.test(component)&&/AI助评/.test(component),"AI evaluation should offer separate help and assessment controls");