[ISSUE-0069] data-view HTTP 列漏改 mstage + 嵌套滚动条¶
用户截图 matsudental.com:HTTP 列显示红色 "mstage:succe..." chip,hover "抓取失败:mstage:success — 3 contacts"。 不是真失败 — 是 UI 漏改。v0.10.90 修了 log-view.tsx,但 data-view.tsx 同款代码漏了。 同时用户反馈嵌套滚动条 + 要求"形成可持续迭代文档"。
Bug 1:data-view.tsx HTTP 列 mstage 误显示"抓取失败" ✅ v0.10.92 已修¶
病灶¶
src/sections/data/data-view.tsx:295-322 HTTP 列 renderCell:
if (log?.error) {
return (
<Tooltip title={`抓取失败:${log.error}`}>
<Chip color="error" label={log.error.length > 12 ? `${log.error.slice(0, 12)}…` : log.error} ... />
</Tooltip>
);
}
不分 mstage: 还是真错误,一律*:
- 红色 chip (color="error")
- tooltip "抓取失败:${log.error}"
mstage:success — success: 3 contacts 是成功事件,被错误显示为红色"失败"。
v0.10.90 在 log-view.tsx 修过同款问题(加 classifyMstage helper),但 data-view.tsx 漏了。inline 在 log-view.tsx 的 helper 没有抽公用,导致两处不一致。
修¶
- 抽
classifyMstage到公用src/utils/mstage-classify.ts,返回结构化{ kind, color, chipColor, tooltipPrefix, shortLabel } - log-view.tsx 改 import(删 local 函数)
- data-view.tsx 改用 helper:
if (log?.error) {
const m = classifyMstage(log.error);
return (
<Tooltip title={`${m.tooltipPrefix}:${log.error}`}>
<Chip size="small" label={m.shortLabel} color={m.chipColor} sx={{ height: 22, fontSize: 10 }} />
</Tooltip>
);
}
视觉效果(v0.10.92 起)¶
| 标签 | chip 颜色 | shortLabel | Tooltip |
|---|---|---|---|
mstage:success — ... |
🟢 success | "✓ 命中" | "多阶段命中(未开 tab):mstage:success — ..." |
mstage:dead/no-contact/non-html |
⚪ default 灰 | "跳过" | "跳过抓取:..." |
mstage:retry-later |
🟠 warning 暗 | "重试" | "稍后重试(5xx/429):..." |
mstage:antibot-* / fallback/antibot |
🟠 warning | "反爬" | "反爬拦截 / 落 tab:..." |
mstage:fallback/* |
🔵 info | "落tab" | "降级到 tab 抓取:..." |
真错误(无 mstage 前缀,如 ERR_CERT_*) |
🔴 error | 截断 8 字符 | "抓取失败:..." |
Bug 2:嵌套滚动条 ⏸ 待详细复现¶
现象¶
用户截图反馈在数据列表区出现"多个滚动条"。具体位置未标注。
待办¶
需要用户: - 在截图上标注具体哪个滚动条多余 - 或描述操作路径("切到 X tab → 看到 Y 区域")
可能候选位置: - LocalDataView 外层 + DataGrid 内部(双重) - 商家列表 / 官网列表 / 邮箱列表 tab 间切换时容器高度变化 - DataGrid 横向滚动 + 浏览器 window 横向滚动
记到 raw inbox:docs/raw/feedback/2026-05-28-nested-scrollbar-repro-tbd.md(如果用户给细节再处理)。
元改进(用户反馈 3)¶
用户要求"形成可持续迭代文档"。
已创建¶
docs/rules/scrape-pipeline-decision-table.md— mstage 标签完整速查表 + 加新类型流程- 决策树 / mstage → UI 映射 / PipelineOutcome 编码规则 / 加新类型 6 步流程 / 常见混淆点
docs/rules/ui-change-pre-check.md— 改 UI 前的 4 步自查清单- 高频字段速查表(e.error / row.phone / row.emails / scrape_status / task.id / HTTP status)
- 抽公用 helper 的信号 + 模板
- 反面教材 3 例(mstage / phone / scrape_status)
- 速查 checklist
CLAUDE.md 应该指向这俩¶
docs/rules/scrape-pipeline-decision-table.md 和 ui-change-pre-check.md 后续每次改前都先翻。
audit_grep 防退化¶
audit_grep:
- pattern: "Tooltip[\\s\\S]{0,100}抓取失败:\\$\\{[a-z]+\\.error\\}"
description: "Tooltip 渲染 *.error 必须走 classifyMstage 不允许硬编码"
未来如果有人写 <Tooltip title={\抓取失败:${log.error}`}>` 之类,pre-commit scan 会喷红。
元教训¶
- 抽公用要趁早 — log-view.tsx 内 inline classifyMstage 当时偷懒,下游 data-view.tsx 自然漏了同款逻辑。v0.10.90 没有抽公用是技术债。
- dogfood 永远能查出新洞 — 用户截图反馈是最好的 QA。
- 规则文档比 commit message 价值高 — commit 只记 "改了什么",规则文档记 "为什么 + 下次怎么不犯"。
相关¶
- scrape-pipeline-决策表 — 本次新建的速查
- UI改动前置自查 — 本次新建的流程
- [[0067-email-placeholder-phone-probe-403-toggle|0067-email占位符-phone从未写库-probe-403-UI-toggle]] — Phase 1 dogfood #1
- [[0068-dogfood-v0.10.89-4-ux-fixes|0068-dogfood-v0.10.89-清空-mstage显示-phone去重-创建loading]] — Phase 1 dogfood #2
- 多阶段抓取pipeline — 架构详解