# Phase 6 · 质量 + 交付 Quality + Delivery > 从 P5 的 HTML → **自动化审计 + 执行摘要 + 浏览器预览 + 交接** —— 项目闭环的最后一公里。 --- ## 🎯 目标 **输入**:P5 产出的 HTML 报告 **输出**: - ✅ 自动化审计报告(VOC 跳题 / 重复 / 假设覆盖 / 逻辑一致) - 📝 `docs/<品类>/4.采集执行摘要.md`(交接文档) - 🌐 浏览器预览地址 + 操作命令 - 📊 与产品方的 handoff 确认 --- ## 🔍 自动化审计脚本 ### `scripts/tools/_audit-<品类>-voc.js` 必做 9 项 ```js const LA = require('./<品类>-analyze.js'); const data = LA.loadMerged(); const items = data.items; const fs = require('fs'); console.log('===== <品类> VOC 质量审计 ====='); console.log(`总条数:${items.length} / 平台:${Object.keys(data.meta?.platforms || {}).join('+')}`); // === 1. 各章节核心 VOC 抽查(章节主题 × 证据内容一致性)=== const CH_PROBES = [ { ch: 'Ch1.1 成人版爆款', opts: { keyword: '本品名', contentMatch: /肠鸣|胃胀|好了|有用/ } }, { ch: 'Ch2.1 妈咪爱场景', opts: { keyword: '妈咪爱', contentMatch: /宝宝|孩子|医生|月龄/ } }, // ... 每章至少 1 项 ]; for (const p of CH_PROBES) { const hit = LA.getEvidence(items, { ...p.opts, top: 3 }); console.log(`▶ ${p.ch}: ${hit.length} 条命中`); if (hit.length < 3) console.log(` ⚠️ 证据不足`); } // === 2. H1-H8 假设覆盖检查 === console.log('\n▶ H1-H8 假设覆盖:'); for (let i = 1; i <= 8; i++) { const n = items.filter(it => (it.hypotheses || []).includes('H' + i)).length; const status = n >= 100 ? '✓' : n >= 50 ? '⚠️' : '❌'; console.log(` H${i}: ${n} 条 ${status}`); } // === 3. 重复检查(前 40 字相同)=== const bucket = new Map(); for (const it of items) { const key = (it.content || '').slice(0, 40); if (!bucket.has(key)) bucket.set(key, []); bucket.get(key).push(it); } const dupGroups = [...bucket.values()].filter(g => g.length > 1).sort((a, b) => b.length - a.length); console.log(`\n▶ 重复组 ${dupGroups.length} 组(前 5):`); dupGroups.slice(0, 5).forEach((g, i) => { console.log(` [${i + 1}] ${g.length} 条 · 「${g[0].content.slice(0, 60)}」`); }); // === 4. 跳题检查(高赞无相关词)=== const offtopic = items.filter(it => { const c = it.content || ''; if (c.length < 15) return false; const hasRelevant = /<品类相关 regex>/.test(c); return !hasRelevant && (it.likes || 0) >= 100; }); console.log(`\n▶ 高赞跳题 ${offtopic.length} 条(前 10):`); // === 5. HTML 产出质量 === const html = fs.readFileSync('reports/<品类>-voc-insight-report.html', 'utf8'); console.log('\n▶ HTML 产出:'); console.log(' 大小:', (html.length / 1024).toFixed(1), 'KB'); console.log(' sections:', (html.match(/
]*>\s*
\s*<\/div>\s*<\/section>/g) || []).length; console.log(' 空 section:', emptySection); // === 9. 封面数字与 _merged.json 一致 === const coverItemMatch = html.match(/(\d{3,5})\s*条/); const metaCount = items.length; if (coverItemMatch && parseInt(coverItemMatch[1]) !== metaCount) { console.log(` ⚠️ 封面 ${coverItemMatch[1]} 条 != merged ${metaCount} 条`); } console.log('\n===== ✅ 审计完成 ====='); ``` ### 审计结果判读表 | 指标 | 绿灯 ✅ | 黄灯 ⚠️ | 红灯 ❌ | |---|---|---|---| | 总 VOC 条数 | ≥ 目标盘 | 达目标 80% | < 目标 80% | | H1-H8 每条覆盖 | ≥ 100 | 50-99 | < 50 | | 重复组数 | < 5 组 | 5-20 组 | > 20 组 | | 高赞跳题 | < 20 条 | 20-50 条 | > 50 条 | | HTML 大小 | 400-750 KB | 300-400 或 750-1000 | < 300 或 > 1000 | | Coming Soon | 0 | 1-2 | ≥ 3 | | VOC 证据卡 | ≥ 100 | 60-100 | < 60 | | 决策列表 | ≥ 28(每章≥3.5)| 20-27 | < 20 | **红灯必须处理再交付**。黄灯可接受但要在执行摘要里标注已知短板。 --- ## 📝 执行摘要模板 `docs/<品类>/4.采集执行摘要.md` **必有 7 节**: ### 节 1 · 总览 ```markdown > **状态**:✅ 真实采集完成 · ** 条真实 VOC** · ** 产品** · ** 平台** · **H1-H8 全覆盖** ``` ### 节 2 · 采集数据(批次 × 平台 × 条数) ```markdown | 批次 | 主题 | XHS kw | 抖音 kw | 耗时 | | --- | --- | --- | --- | --- | | Batch 1 | P0 · 本品 + 头部竞品 | 11 | 5 | 20 分钟 | | ... | | | | | ``` ### 节 3 · H1-H8 假设覆盖 ```markdown | 假设 | 主题 | 条数 | 备注 | |---|---|---|---| | H1 | ... | 1125 | ✓ 强覆盖 | | H6 | ... | 126 | △ 较少(建议后续补采)| ``` ### 节 4 · 章节交付清单(表格) ```markdown | 章节 | 子章数 | 状态 | 核心 VOC 证据 | |---|---|---|---| | Ch1 诘问起点 | 3 | ✅ | 对比 ♥62890 vs ♥40 | | Ch2 ... | 4 | ✅ | ... | ``` ### 节 5 · 关键 VOC 证据锚点 列出每章最有代表性的 VOC(带 ♥+昵称+片段),便于产品方快速理解证据密度。 ### 节 6 · 质量审计结论 ```markdown - [x] Batch 1-3 全量采集完整 - [x] H1-H8 全部 > 100 条覆盖 - [x] 0 Coming Soon 占位 - [x] 0 重复 VOC 引用 - [△] H6 包装 VOC 较少(126 条)—— 建议后续从京东/天猫差评补采 ``` ### 节 7 · 运维手册 ```markdown ### 增量刷新 node scripts/tools/<品类>-collect.js --batch=1 --force node scripts/tools/<品类>-collect.js --merge node scripts/tools/gen-<品类>.js ### 质量审计 node scripts/tools/_audit-<品类>-voc.js ### 浏览器预览 node scripts/tools/preview-reports.js # localhost:8787 ``` 详见 [`templates/4.采集执行摘要.template.md`](./templates/4.采集执行摘要.template.md)。 --- ## 🖥️ 浏览器预览 ### 快速启动 ```powershell node scripts/tools/preview-reports.js # 打开 http://localhost:8787 # 点击 <品类>-voc-insight-report.html ``` ### 预览侧清单 打开 HTML 后**人工复审**: 1. ☐ 封面数字与执行摘要一致 2. ☐ Agenda 目录可点击跳转 3. ☐ 每章分隔(Divider)视觉清晰 4. ☐ 每个子章有 **eyebrow + title + subtitle**(无空标题) 5. ☐ VOC 证据卡**看得清**(字号 ≥ 0.82rem,不拥挤) 6. ☐ 决策列表**落地动作明确**(不是空话) 7. ☐ 键盘 ← → 翻页顺畅 8. ☐ URL hash 切章可刷新 9. ☐ 全屏无**明显布局错位**(grid 列数合理) 10. ☐ 移动端(可选)基本可用 --- ## 🤝 Handoff 交接 ### 交付物清单(给客户/产品方) ```markdown ## 交付物 ### 📊 HTML 报告 - `reports/<品类>-voc-insight-report.html`(<大小> KB) - 打开方式:浏览器直接拖入 / 双击 ### 📝 文档(4-5 份 markdown) - `docs/<品类>/0.基础调研.md` - `docs/<品类>/1.场景的补充.md` - `docs/<品类>/2.VOC深度思路.md` - `docs/<品类>/3.采集矩阵.md` - `docs/<品类>/4.采集执行摘要.md` ### 💾 原始数据(可追溯) - `docs/<品类>/raw/xhs/*.json`( 个文件) - `docs/<品类>/raw/douyin/*.json` - `docs/<品类>/raw/_merged.json`(合并统一格式) - `docs/<品类>/raw/comments-flat.jsonl`(行级流) - `docs/<品类>/raw/audit.log` ### 🔧 代码(供后续维护) - `scripts/tools/<品类>-*.js`(采集 + 分析 + 组件 + 章节 + 渲染 + 审计) ``` ### Handoff 会议议程(30-60 分钟) 1. **5 分钟** · 打开 HTML,浏览封面 + Agenda,确认总盘数据一致 2. **10 分钟** · 逐章导览,重点看 Ch4(KANO/JTBD)+ Ch6(无人地带)+ Ch8(4P/路径) 3. **15 分钟** · 讨论 3-5 个关键 VOC 证据,看产品方是否认可 4. **10 分钟** · 对照"红线清单"(2.VOC深度思路.md 的禁区)确认无冲突 5. **10 分钟** · Q&A + 后续补采 / 迭代计划 ### 答疑准备(高频问题) | 产品方可能问 | 标准回答 | |---|---| | "VOC 数据真实吗?" | 100% 真实 · 所有 API 调用记录在 `audit.log` · 每条 item 可在 `_merged.json` 回溯 platform+user_id+note_id | | "为什么某条高赞 VOC 没用上?" | `getEvidence` 每章用不同 `seed` 乱序 · 避免同一条被 3 章引用 · 可指定章节放进去 | | "能不能换个角度写 Ch4?" | 重写 `<品类>-ch4-kano.js` · 1-2 小时可产出新版 · 其他章不受影响(模块化) | | "我要把某品牌改为竞品 A" | 编辑 `3.采集矩阵.md` 加 kw · 跑 `--batch=4 --force` · 重新 `gen` | --- ## 🔄 迭代规划(交付后的持续维护) ### 月度刷新 ```powershell # 每月跑一次,刷最新 VOC node scripts/tools/<品类>-collect.js --batch=all --force --merge node scripts/tools/gen-<品类>.js # 比较新旧报告,看热点漂移 ``` ### 季度迭代 - 根据销售数据看哪些 H 假设被"买单" - 对未印证的假设做 postmortem(是 VOC 判断错 还是 执行落地问题) - 调整章节权重(某假设爆款 → 扩成独立章) ### 年度大版本 - 章节骨架可能变更(例如加入"海外市场"章) - 竞品地图可能换头(新进入者) - KANO 五类分布可能迁移(曾经的兴奋 → 必备) --- ## 🚫 常见失误 ### 失误 1 · 审计只跑不看结论 - ❌ 差:脚本跑完只看"审计完成" - ✅ 好:**每项红/黄灯都进执行摘要**并给出补救方案 ### 失误 2 · 执行摘要只抄目录 - ❌ 差:只写章节名,不写核心 VOC 和审计结论 - ✅ 好:**每章列 2-3 条代表性 VOC**(带 ♥+昵称)+ **已知短板 + 补救路径** ### 失误 3 · 交付不留原始数据 - ❌ 差:只给 HTML 不给 `raw/` 文件夹 - ✅ 好:**JSON 全部交付 + audit.log** —— 产品方日后可自行追溯 ### 失误 4 · Handoff 没有"红线"复盘 - ❌ 差:只讲报告里有什么 - ✅ 好:**明确讲"不做什么"**(药盒感 / 恐惧营销 / 硬广),避免落地时走回头路 --- ## ✅ 退出门控(项目完结) Phase 6 完成的 **7 个条件**: 1. ☐ `_audit-<品类>-voc.js` 跑通,**红灯 = 0** 2. ☐ `4.采集执行摘要.md` 7 节齐全 3. ☐ HTML 浏览器预览可正常阅读 4. ☐ 交付物 4 类齐全(HTML + 5 份 markdown + raw/ + scripts/) 5. ☐ 产品方 Handoff 会议已完成 6. ☐ 后续迭代计划已商定(月/季/年) 7. ☐ 已在 `STATUS.md` 打完结标签 --- ## 📚 模板 + 案例 - [`templates/4.采集执行摘要.template.md`](./templates/4.采集执行摘要.template.md) - [`templates/audit.template.js`](./templates/audit.template.js) - [肝纯片完整交付案例](./case-studies/01-jiangzhong-liver-DMY.md)