Save verified native IFC import and user validation evidence

Real IFC2X3/IFC4 import tested. Full BIM authoring/export remains out of scope; 349-second building import performance remains to optimize.
This commit is contained in:
2026-09-16 04:27:37 +08:00
parent 9a7c4f0335
commit 72152ef356
120 changed files with 3020296 additions and 114 deletions

View File

@@ -50,13 +50,14 @@ const resolutionChecks = {
'UT-002': ['FIX-GROUP'],
'UT-003': ['DOC-01'],
'UT-004': [...modules.map(m=>`UI-03-${m.module}`),'FIX-WINDOW'],
'UT-005': ['FILE-02'],
'UT-005': ['FILE-02','FIX-IFC-REOPEN'],
};
for (const defect of defects) {
const checks = resolutionChecks[defect.id];
defect.status = checks.every(id=>latest.get(id)?.status==='passed'
&& (defect.id!=='UT-004'||id==='FIX-WINDOW'||latest.get(id)?.steps.some(s=>s.name==='窗口宿主初始化及启动错误'&&s.status==='passed'))) ? 'resolved_by_retest' : 'open';
defect.retestCases = checks;
if (defect.id === 'UT-005') defect.resolutionScope = 'IfcOpenShellNative real IFC2X3/IFC4 import and FCStd persistence only; full ifcopenshell Python authoring/export API remains outside this closure.';
defect.retestEvidence = checks.flatMap(evidenceFor);
// Keep the original failure separate from newer passing screenshots.
defect.originalEvidence = [];
@@ -75,10 +76,10 @@ const short = s=>String(s??'').replaceAll('|','/').replaceAll('\n',' ').slice(0,
const lines=['# 用户手册测试总报告','',`生成时间:${new Date().toISOString()}`,'',
`手册 ${manual.length} 项:通过 ${counts.passed};失败 ${counts.failed};阻塞/覆盖不足 ${counts.blocked};未运行 ${counts.not_run}。`,
'',`实际工作台入口 ${modules.length} 个,通过 ${modules.filter(m=>m.result?.status==='passed').length} 个。不得将路由登记 1452/1452 或独立演示页烟测作为上线验收。`,
'', '## 上线结论','', `**当前不具备完整上线放行依据。** 登记缺陷 ${defects.length} 个,${defects.filter(d=>d.status==='resolved_by_retest').length} 个已通过针对性复测。手册尚未通过:${coverage.filter(c=>c.status!=='passed').map(c=>c.id+' '+c.status).join(';')||'无'}。本机性能样本通过不等于生产容量认证,入口可用不代表全部业务命令已经验收。`,
'', '## 上线结论','', `**当前不具备完整上线放行依据。** 登记缺陷 ${defects.length} 个,${defects.filter(d=>d.status==='resolved_by_retest').length} 个已通过针对性复测。手册尚未通过:${coverage.filter(c=>c.status!=='passed').map(c=>c.id+' '+c.status).join(';')||'无'}。本机性能样本通过不等于生产容量认证,入口可用不代表全部业务命令已经验收。IFC 导入通过仅指 IfcOpenShellNative 真实导入绑定,不代表完整 BIM 编辑/导出 API。`,
'', '## 手册逐项覆盖','', '| 编号 | 项目 | 状态 | 依据 |','|---|---|---|---|',
...coverage.map(c=>`| ${c.id} | ${c.title} | ${c.status} | ${short(c.detail)} ${c.evidence[0]?`[过程](${c.evidence[0]})`:''} |`),
'', '## 缺陷与修复复测','',...defects.flatMap(d=>[`### ${d.id} ${d.title} (${d.severity})`,'',`当前状态:${d.status}`,'',`原始问题:${d.reason}`,'',...d.steps.map((s,i)=>`${i+1}. ${s}`),'',...d.originalEvidence.map((p,i)=>`[原始证据 ${i+1}](${p})`),'',...d.retestEvidence.map((p,i)=>`[修复复测 ${i+1}](${p})`),'']),
'', '## 缺陷与修复复测','',...defects.flatMap(d=>[`### ${d.id} ${d.title} (${d.severity})`,'',`当前状态:${d.status}`,'',`原始问题:${d.reason}`,'',d.resolutionScope??'',...d.steps.map((s,i)=>`${i+1}. ${s}`),'',...d.originalEvidence.map((p,i)=>`[原始证据 ${i+1}](${p})`),'',...d.retestEvidence.map((p,i)=>`[修复复测 ${i+1}](${p})`),'']),
'## 批次与耗时','',...runs.map(run=>{const r=JSON.parse(fs.readFileSync(path.join(directory,run,'results.json')));return `- [${run}](${run}/report.md):${r.results.length} 条案例记录,累计案例耗时 ${r.results.reduce((n,x)=>n+(x.seconds??0),0).toFixed(1)} 秒。`; }),
'', '## 解释与限制','',
'- 同一手册项目以最新批次为准,旧失败和复测证据均保留。旧 summary.tsv 不纳入本报告。',