You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
8.5 KiB
8.5 KiB
Handoff · customer-contact-graph 票 00 原型 demo(2026-09-09 会话)
接手人:新 agent。本会话主线一句话:用户改道「先原型后 spec」——票 00 原型 demo 写到一半(CSS 完整、body/JS 未落盘),续写、自检、交验收。
1. 你接手的是什么
- Effort:customer-contact-graph(客户联系人图谱 + A4-4-2 §6 整节落地)。改序后的地图与票链见
.scratch/customer-contact-graph/map.md(本会话已更新:新票 00 插最前、frontier=00、Decisions so far 有改序决策原文)。 - 本会话前半:票 01 spec 冻结 grilling 刚开始(Q1 边模型已 pitch、未拍板),用户
/wait-what改道:先做纯前端 mock 原型 demo 验证需求理解,理解确认后再回 spec 冻结。 - 用户两拍板(AskUserQuestion,2026-09-09):
- demo 范围 = 图谱全量 + 列表侧(u536 图谱 15 条 + u533 列表侧关键交互);
- 原型验收通过后升格为正式 demo(票 06 改写为「接真实后端 API」不重写)。
- 票务簿记已完成(无需重做):
map.md改序 + 决策;issues/00-prototype-demo.md新建(in_progress,deliverables 全量在此,先读它);issues/01-spec-freeze.md加 blocked by 00;issues/06-demo-extension.md已改写为「接真实 API」版。
2. 当前进度(票 00 文件状态)
目标文件:.scratch/customer-contact-graph/prototype/prototype-contact-graph.html
- 已落盘并验证:第 1 块 = DOCTYPE +
<head>+ 全部 CSS,185 行,止于</head>(含全部类名:.gcard/.dot/.edge-*/.pill/.sp-*/.modal/#toast等)。 - 未落盘:第 2 块(body 骨架)、第 3/4 块(JS)。第 2 块 body 内容本会话已定稿但两次 Write 均因工具载荷丢失(file_path 参数被吞 → 40400)未写入;重试被用户取消以发起本 handoff。body/JS 直接按本文档 §3 设计重写即可,不要试图找回旧消息。
3. demo 设计定稿(会话内已拍板,重建时不再重新设计)
- 总体:单文件 HTML,零后端依赖;右侧固定 352px「规则/状态/日志」三 tab 面板(surface the state,票 01 grilling 的活素材);主体 = 列表/图谱 pill 切换。
- mock 数据(9 联系人,图谱侧权威):
- 王强/董事长/L1/13123481545;陈大壮/股东/L1/13897283272/isKey=1/isInternal=1;张明/股东/L1/13897281545
- 胡子/采购经理/L2/13897283272/isInternal=1/来源转介绍;张华/市场经理/L2/13812383272;卢伟/市场经理/L2/13897283272/来源组会
- 邓伦/采购专员/L3/13127283272;王大牛/市场专员/L3/13897283272;江小白/其他(类别=投标商务)/L=null/13897283272/来源组局 → 未识别层级区
- 职务字典:高层管理(董事长=1/股东=1)、采购(经理=2/专员=3)、市场(经理=2/专员=3)、人事(经理=2)、投标商务(其他=null)、自定义职务(无层级)。来源字典:转介绍/组会/组局/其他。
- 布局:tier 行制——L1 顶部、公司节点(广州宏远智能电子科技有限公司,深蓝卡)水平居中固定不可拖/无圆点、L2/L3 依次向下、未识别层级 = dashed zone(底部右侧)。层级越高越靠上、同级并列、多顶层并列。
- 自动边规则(demo 候选规则,规则面板明示,票 01 定稿):L 层的上级 = 同职务类别 L-1 的全部联系人(多父);类别内无 L-1 → 全部 L-1;无 L-1 → 不连线。蓝色实线。
- 边模型(demo mock 了票 01 Q1 推荐案语义):
edges[]{id,parent,child,source:auto|manual}+vetoed[](系统边删除并保存 → 永久否决,重建跳过;手动重连同对不受限)+pendingAdds/pendingDeletes;保存时 DFS 环检测 → 阻止保存 + 高亮环边;自连/重复/连公司节点 → Toast 拒绝(重复文案=「已存在连线」)。 - 编辑态全套:绘制自定义关系→按钮变橙「完成绘制」+顶部提示条+卡片顶/底蓝圆点;拖卡调位;从底圆点拖出连线(SVG 预览线跟随,落上级底→下级顶);悬停边变红虚线+中点 × 删除(auto 边二次确认对话框);保存(提交 pending + 记「关系变更日志」)/ 重置(有未保存时二次确认,恢复进编辑时快照)/ 完成绘制(≠保存;有未保存 → 三选弹窗:继续编辑/放弃修改/保存修改)/ 切视图未保存拦截。
- 脱敏(拍板口径,与原型分歧已在页脚+规则面板显性标注):列表单元格 + 图谱卡片电话均默认脱敏
138****3272,点击 → 明文 + 埋点日志(谁/何时/哪个联系人号码);「显示完整号码」批量揭当前页;批量导出 CSV 恒脱敏。 - 6.2 快速添加:modal 多行(姓名*、职务*=类别→职务二级联动+自定义、电话选填、关键、内线、来源);空行不提交;查重(手机号 / 客户+姓名+职务)→ 行内疑似提示 + 该行「确认知悉」勾选后方可提交;错误保留全部内容并定位首错行;成功关 modal + 刷新列表 + 图谱(新联系人进 tier、自动边重建)。
- 6.3 页内编辑:行内编辑 + 修改行高亮 + 行级「撤销修改」;保存全部(校验全部修改行、首错行定位、成功后职务变更触发图谱自动边重建);重置(确认);退出编辑/切图谱未保存拦截(三选)。
- Toast/对话框自实现(不用 alert/confirm)。分页 10条/页(9 联系人 1 页,pager 展示即可)。
- 写法约束:body/JS 的 DOM 类名必须对上已落盘 CSS(见 §2 文件)。
4. 已知坑(本会话实录,均已有记忆/AGENTS.md 条目)
- Write 大 CJK 载荷非确定性丢参(file_path 被吞 → 40400):串行单发重试一次;再败 → 载荷写 workspace 文件 + python 复制(AGENTS.md 降级链)。首报 "unknown" 多为误报——以 Test-Path/回读为准。
- PowerShell 无
&&,用分号。Glob 对.scratch/隐藏目录返回 0 结果(用 Bash ls / 直接 Read)。 - 大文件分块写(≤1000 行/次)防流断(AGENTS.md「Stream dropouts」节)。
5. 下一步(按序)
- 续写 prototype HTML:第 2 块 body 骨架 → 第 3 块 JS(mock 数据/state/布局/自动边/渲染)→ 第 4 块 JS(图谱交互/保存重置/列表侧)。每块落盘后回读验证。
- Playwright 自检(chromium 已缓存于
.scratch/customer-e2e/.venv10;file:// 直开即可):无 JS 报错 + 截图核对布局/卡片/边。 - 交用户验收:图谱 15 条逐条过 + 脱敏分歧点 + 规则面板的自动边规则。
- 通过 → 关票 00,重启票 01 grilling(10 组逐组定稿,Q1 起点见 §6;demo mock 实现 = 对照物)。偏差 → 只改原型文件。
6. 票 01 Q1 推荐案(已 pitch 未拍板——重启 grilling 的起点,勿当已定稿)
单表 customer_contact_edge(继承 BaseEntity):customer_id / parent_contact_id / child_contact_id / edge_source(auto|manual) / edge_status(active|vetoed);系统边删除 = status→vetoed(行保留、deleted=0,防 @TableLogic 吞掉否决记录),manual 边删除 = 常规逻辑删;vetoed 永久(职务变不恢复)+ 手动重连例外;唯一性 = 服务层事务内校验 + uk(customer_id,parent,child,edge_source) 兜底;新错误码 67016 CODE_EDGE_INVALID(自连/重复/端点无效)+ 67017 CODE_EDGE_CYCLE(保存时环检测);关系变更日志 = customer_oplog 新 action GRAPH_SAVE。事实底盘(CustomerContact 四列留位、67xxx 用到 67015、CustomerViewLog 审计分离先例、DictItem parentId 两级树、ContactDTO phone 现无脱敏等)已在会话中核实,代码即证据。
Suggested skills
prototype— 票 00 方法论(已加载过;UI.md 3-变体默认不适用——设计权威=Lanhu 原型,唯一自由度做成规则面板供挑战)。webapp-testing— 收尾 Playwright 自检截图。grilling+domain-modeling— 票 01 重启(demo 验收通过后,一次一问)。ask-matt— 路由不确定时。
权威文件索引
- 地图(已改序):
.scratch/customer-contact-graph/map.md - 票 00(deliverables 全量,先读):
.scratch/customer-contact-graph/issues/00-prototype-demo.md - 需求权威:
.scratch/opportunity-bugfix/lanhu-pages/A4-4-2_客户详情(联系人).md(u533/u536 在行 277-279) - 原型半成品:
.scratch/customer-contact-graph/prototype/prototype-contact-graph.html(185 行,head+CSS 完整) - 编码/工具纪律:
AGENTS.md