交付出件箱

← 返回出件箱

交接件 · 2026-09-17 凌晨(门店手机端视光档案 · 已上生产)

上一份:CLOUD-SESSION-HANDOFF-20260911.md(已过期,本件取代)
本会话跨 9-16 全天至 9-17 凌晨,起点是"接上断掉的视光档案手机端适配"


0. 一句话状态

门店手机端「视光档案」已上生产(MR #706),含 root 的 Phase81 4L 数据线 #698。
test 发了九批,生产一次性发出;数据层验证全过,生产健康。


1. 生产发布实证(9-17 00:38)

生产数据层验证(只读 SELECT,全过)


2. 本会话做了什么(test 九批 → 一次性发生产)

修的两个高危(会真卡住门店)

  1. 只填卡6眼部检查会被误拦 —— CLINICAL_KEYS 漏 anterior/fundus/oct 六字段,后端与平板端权威口径都含
  2. 视功能漏方向陷入死循环 —— 后端 422 硬校验,手机端既无实时提示、也不解析 detail,门店反复点保存但不知错在哪

补的一个半成品

已读回执:批7a 做了后端字段/接口/门店端展示,家长端从未调用过 mark-read
→ 证据:全仓 grep 0 命中(对照组同批 store_conclusion 命中 9 文件);test 库 5 条已推送记录 read_at 全 NULL
→ 修法:family/[id]/page.tsx 的 openDetail 补 fire-and-forget 调用,抽成纯函数 markConclusionRead.ts
→ 长官真机验过:变已读了

修的一个存量缺口

编辑已完成记录点保存必报错(批4 加编辑入口起就埋着,长官是第一个走通该路径的人)
→ 根因:handleComplete 无条件调 completeRecord,后端 complete_record:3513 硬校验 status!=draft 返 400,被通用 catch 吞成「完成失败,请重试」
→ DB 时间戳佐证:updated_at 晚于 completed_at 39 分钟 = patch 成功、complete 从未执行
→ 修法:照平板端 refractive-record-pane.tsx:569,599 补 wasDraft 门槛(status 此前根本没存进 state)+ complete 单独包 try/catch 分层提示

补的三处破坏性操作二次确认

跟平板端对齐的一堆

视功能 17 个档位选择器(参数逐个从平板端读)、眼位记法 ≈BI/≈BO/≈BD/≈BU、
「本次未做」标记后仍可填、日期范围放宽到 18 年、保存后跳该条记录查看页、
趋势图(三指标/固定步长刻度/末端气泡/图下数据表/悬浮框验光方式/曲线动画/填充朝下/渐变浓度)

布局(长官逐轮真机反馈)

列表贴边、徽章文案与位置、推送状态块定稿、孤行换行、头像彩色剪影、日期带年份


3. 长官拍板记录(别再问第二遍)

# 决策
D19 家长只读预览弹层不做(平板端 9-02 已删入口,9-03 提交明文记为死代码)
D20 历史抽屉不做(跟只读预览同一次重构、同一个 diff 一起摘的)
D21 重复建档预警 = 跳转前阻断弹层(不是详情页顶部提示条)
D22 「近一年」实际 427 天不改(算法要求基准至少一年前,是设计非 bug)
D23 「保存草稿」按钮删掉(平板端 9-02 已落地"保存即完成";生产仅 3 条空壳草稿零新增)
D24 绑定搜索后端扩成三路(席位号/昵称/手机号);隐私核查:phone 本就逐行返回,无新增暴露面
D25 推送状态块最终形态:推送 2026-09-06 15:39 [家长未读] + 状态 已同步/已改动,尚未再次推送
D26 已读徽章去掉时间(带完整时间戳时 375px 差 54px,物理放不下)
D27 「状态」标签不叫「结论状态」(卡片本来就在门店结论里,重复)
D28 「推送给家长」按钮留在卡片底部(全站主操作都在底部,一致性优先)
D29 编辑覆盖数据、AI识别覆盖人工订正值 —— 都不加确认
D30 家长端那两件(检查记录卡三处 / 五处借鉴)仍未定,图已交付

4. 待办(下一位接手)

长官已知悉、未拍板

  1. 家长端检查记录卡三处:球镜补单位 D / 负号换 U+2212 / OD-OS 改中文右左
    图:https://dev-tokyo.tail3912a6.ts.net/parent-exam-card-3fix-20260916.html
  2. 家长端五处借鉴门店端:方案P转置 / Y轴固定步长 / 真减号 / 苹果浅色皮肤 / 单位只写表头
    图:https://dev-tokyo.tail3912a6.ts.net/parent-borrow-store-compare-20260916.html

本会话发现、未处理

  1. /health 在生产外部是假信号(⚠️ 影响所有人的发版验收)
    nginx 只把 /api/ 反代后端 8001,app/main.py:406 的 /health 挂根路径,
    被 Next.js (community)/[doctorCode] 动态路由当 doctorCode="health" 接住
    → 后端死了也会返 200。建议加 /api/health 或调 nginx
    → 在那之前验后端存活改用:GET /api/nonexistent-xxx → 404 FastAPI 标准响应
  2. GET /api/community/personas 返 500 —— 无参数简单 GET 就 500,
    community 模块本次未改动,无日志权限未排查,建议另开工单
  3. test 遗留测试数据:刘予曦记录 67972d68-6e83-4ea0-9bdb-fbf695ce4091 备注末尾多一个「。」
    (9-16 验编辑保存 bug 时长官批准造的)

5. 本会话踩的坑(全是真教训)

  1. 两端联动功能只验单边 = 验了个寂寞
    已读回执后端/接口/门店端全验过全绿,但整条链路从没通过。
    → 以后凡两端联动,验收必须走完整链路(查库 → 真操作 → 再查库看字段变没变)

  2. 验收标准定错,量得再准也没用
    长官说"徽章位置不对",我让 agent 验的是"排版没溢出",它报"溢出 0"我就放行 —— 但徽章还在下一行。
    → 位置类问题的验收标准必须是坐标(getBoundingClientRect 的 top/left),不是溢出判定

  3. 别拿 agent 的文字描述当现状,要看长官的截图
    两次派单写错要求("改动提示挪到时间右边"其实本来就在那儿),都是没对着截图核

  4. agent 报"我这边量着是对的"时不能采信为结论
    列表贴边那条,三轮三个 agent 都报 gap=0,跟长官真机不符。
    → 正解:要么找到能复现的条件,要么换一个无条件成立的写法(最后用 ml-auto 替代 justify-between 解决)

  5. 为了让测试跑通而改产品行为 = 本末倒置
    曲线动画被 agent 为了 jsdom 测试关掉(isAnimationActive={false}),我看测试绿就放过了,长官真机发现动画没了。
    → 正解:测试环境另想办法绕(放宽 waitFor 让动画跑完),不动产品行为

  6. 组件单测绿 ≠ 页面上真能看见
    TrendTooltip 写了、单独渲染截图验过,但图表里的 <Tooltip> 从没接上它,是孤儿代码。
    → 验证必须渲染整个页面捕获真实传参,不能只测组件本身

  7. agent 返回"待命/等通知"是派单写法的问题
    写"等部署完成"它就真在等别人通知。
    → 正解:把"怎么等"写成可执行动作 ——「每次 bash 调用里写 sleep 60 然后查一次,重复 N 次」

  8. 重复派单浪费一轮
    agent 卡住时我以为它没做完又派了一路,两边并行跑、截图撞名。
    → 正解:先查它做到哪一步(git log / 部署记录),再决定是续还是重派

  9. 判迁移在不在 main:文件名 ≠ revision 标识(root 的教训,我们照做了)
    文件名 batch7a_conclusion_read_receipt.py vs revision batch7a_read_receipt
    → 用 git grep -l '^revision = "xxx"' 锚行首 + 带对照组

  10. 平板端有退役文件,拿它当对照会得出错误结论
    record-canvas.tsx 全仓 0 处渲染(只当数据源),真正在用的是 frame5-record-entry.tsx。
    前几轮比对结论反复,根子在这


6. 关键文件与工具