import test from 'node:test';
import assert from 'node:assert/strict';
import { extractKeyPointIssuesFromRawAnalysis } from '../src/lib/engine/evaluation/derive-skill-opt-points';
test('extractKeyPointIssuesFromRawAnalysis maps result-analysis skill attribution into existing opt issue fields', () => {
const issues = extractKeyPointIssuesFromRawAnalysis(JSON.stringify({
resultEvaluation: {
key_point_findings: [
{
content: 'JOIN::exec 是 CPU 主要瓶颈',
covered: false,
severity: 'high',
explanation: '最终答案没有明确指出 JOIN::exec 是主要瓶颈。',
missing_reason: '缺少执行阶段和占比证据。',
evidence: {
actual: '热点集中在排序阶段。',
expected: 'JOIN::exec 占 78.34%。',
},
trace_root_cause: {
failure_reason: 'trace 中读到了排序热点,但没有继续归纳到 JOIN::exec。',
related_steps: [
{
step_index: 5,
kind: 'tool',
name: 'read',
evidence: '只读到了 create_sort_index 区域。',
},
],
},
is_skill_attributable: true,
attribution_reason: '如果 Skill 强制要求输出前核对热点函数所属执行阶段,可以降低复现概率。',
improvement_suggestion: '在 SKILL.md 中增加:输出瓶颈结论前必须说明热点函数所属执行阶段与占比证据。',
},
],
},
}));
assert.equal(issues.length, 1);
assert.equal(issues[0].severity, 'high');
assert.equal(issues[0].category, '关键观点遗漏');
assert.equal(issues[0].summary, 'JOIN::exec 是 CPU 主要瓶颈');
assert.match(issues[0].evidence, /结果分析:最终答案没有明确指出 JOIN::exec 是主要瓶颈。/);
assert.match(issues[0].evidence, /缺失原因:缺少执行阶段和占比证据。/);
assert.match(issues[0].evidence, /过程根因:trace 中读到了排序热点,但没有继续归纳到 JOIN::exec。/);
assert.match(issues[0].evidence, /相关步骤:#5 · tool · read · 只读到了 create_sort_index 区域。/);
assert.match(issues[0].evidence, /Skill归因:如果 Skill 强制要求输出前核对热点函数所属执行阶段,可以降低复现概率。/);
assert.equal(
issues[0].reasoning,
'如果 Skill 强制要求输出前核对热点函数所属执行阶段,可以降低复现概率。',
);
assert.equal(
issues[0].improvementSuggestion,
'在 SKILL.md 中增加:输出瓶颈结论前必须说明热点函数所属执行阶段与占比证据。',
);
});