交付出件箱

← 返回出件箱

云机会话交接件 · 2026-08-24(接 08-23 会话)

按顺序读:第 0 节防呆 → 第 1 节手上的活 → 第 2 节别再犯的错 → 第 3 节等长官下的令。
上一会话(dev2)交接。本会话完成 Phase 74 的 A/D/E/F 四批,24 个 commit。


第 0 节 · 🔴 新会话最容易变傻的地方(先看这个,一条不许跳)

长官原话:「每次换新会话就会变傻就会经常犯错,这个一定要教好。」
下面每一条都是本会话真犯过、被长官或 root 当场抓到的,不是通用建议。

变傻的真因:没查就说 · 判据选错 · 对照组失效还往下走 · 状态声明不限定环境

我这次犯的错(真事) 正确做法
🔴 抠了 CSS 令牌就直接写页面,没并排量 → 长官贴图打回「和方案图做的不一样」,一次揪出 6 处 照效果图做页面六步一步不能少:抠源码 → 写 → 渲染 → 量化对比 getComputedStyle → 修 → 截图眼检
🔴 量得对 ≠ 看着对:26 项样式量化 24 项一致,但验光方式显示成英文 small_pupil、标签写成"已完成"(图上是"AI 识别") 量化之后必须 Read 截图肉眼看:文案语义、缺件、漏翻译,量不出来
🔴 count(*) 返 0 就说"没有" → 报告「test 没有席位账号」,长官说"我有账号" users 表开了 RLS,dev_ro 被挡。0 命中要用同一张表交叉验证(pg_stat_user_tables.n_live_tup),拿旁边的表当对照无效
🔴 对照组选错:拿 organizations 有 77 行 证明 users 的 0 是真 0 两张表权限面不同,不能互为对照
🔴 说「已实装 · 物理生效」不写环境 → root 抓到:生产根本没那两列 状态声明必须点名环境(分支 / test / 生产)· 缺环境 = 缺主语
🔴 自检查法本身会骗人:溢出检测比"子元素 vs 父元素右缘",父元素被撑大时报 0 而页面真溢出 判据用 documentElement.scrollWidth > innerWidth
🔴 守门测试自身假阳性:扫端点源码禁 quota 字样,结果注释里写"禁止配额"把自己触发了 守门测试也要剥注释只查代码行 + 带对照组
🔴 凭函数名下结论:见 Depends(verify_api_key) 就判"只认机构、配额落不了地" 读实现才发现它认席位 Bearer 且返 seat_<id> —— 函数名不是事实,实现才是
🔴 猜字段名:以为眼别表是 k1/k2,实际 keratometry_k1/k2;验光方式以为存中文,实际是英文枚举(提交真 500) 写前 grep,别猜
🔴 自检时查法写错反诬文档:\bgap-2\b 把 gap-2.5 算进来,以为文档错了 结果对不上时先怀疑查法,不是先改文档

四条硬判据(下任何结论前过一遍)

  1. 说"X 存在/不存在/是这样实现的" → 先 grep,带对照组(对照组必须同表/同权限面)
  2. 说"页面做好了" → 渲染 + 量化对比 + 截图眼检,三样缺一不算
  3. 说"已完成/已验证/已生效" → 必须点名环境:本地 worktree / test / 生产
  4. 长官或 root 说"不是有 X 吗" → 默认我错,先查证再表态(这次 root 说错一次、我说错一次,各一次)

第 1 节 · 手上的活:Phase 74 智脑 C 端家长版(子席位)

状态:8 批完成 4 批 · 工作区干净 · 卡在「等长官发版令」

cd /home/dev2/doctor-ai-brain/.claude/worktrees/phase74-c-end   # ⚠️ 不是主仓
git branch --show-current   # feature/phase74-c-end-parent
git log --oneline -1        # 070104ce(24 commit · 领先 test 16 个)
git status --short | wc -l  # 0

⚠️ worktree 开工前两件事(否则测试/聊天链路会炸):

cp ../bridge-cse_01SwexbXUUUeRpnregSsBquU/.env .env     # 主仓没有 .env
ln -sfn /home/dev2/doctor-ai-brain/data/faiss_indices data/faiss_indices

已完成四批

批 做了什么 环境
A 地基 席位类型列 / 手机号三端各一 / 机构开关 / 登录返回体加字段 已发 test(MR #508)
D 家长壳 同页分流 / 设置第三分支 / 平板挡板 / 微信多账号弹框选 已发 test
E 档案 5 页面 + 4 端点 + 归属双向隔离 + migration phase74_002 仅分支
F 识别 拍照识别复用 27B · 502 可控降级 仅分支

剩四批(建议 G → B → C → H)


第 2 节 · 本会话抓到的真问题(接手必须知道,否则会重复踩)

2.1 🔴 抓到并堵了一个真安全洞(E 批前置)

require_org_seat 只校验 role、不认 seat_type,而家长子席位物理上就是 role='org_seat'。
RED 阶段真打实证:家长 token 打门店档案端点返 200,拿到门店的孩子档案(跨租户越权)。
⇒ 新增 require_store_seat(纯加法),门店 10 端点换用它;家长侧用 _require_parent 对偶封死。

2.2 🔴 方案图自身有缺口(功能真打才发现)

检查单表单只收「矫正视力」,而记录卡要显示「裸眼视力」—— 中间没有来源,数据链断的。
补齐依据不是拍脑袋:识别 extract 明确提取 va_od/va_os、眼别表有独立列 unaided_va_decimal。

2.3 🔴 D-A 口径与实现不一致(root 提出前我未察觉)

文档写「检查数据只用 vision_exams」,实际实现走 patients + refractive_records。
判定:实现对、文档错 —— vision_exams 生产 88 行 patient_id 全 NULL,它无档案主体。
两处文档已标作废,以 tech §八之二 为唯一事实源。

2.4 patients 表处置(root 已备案)

保留但隔离 —— 不清理(门店平板 refractive_records.patient_id NOT NULL 强依赖)、
不迁移(7 条演示数据)。隔离已实装于分支 · 生产待迁移生效(A/E 批 migration 都还没上生产)。

2.5 流程欠账(已补一项、跳过一项)

需求变更六阶段:1/2/3/5 走了;阶段 4 缺两样 —— test-coverage 已补齐;
plan-audit 九轮经长官同意跳过(价值在动手前,代码已完成)。
📌 后面 G/B/C/H 四批严格按规程走:impl 前先写测试清单、先跑九轮审计。


第 3 节 · 等长官下的令(到点主动提醒,别干等)

令 触发什么
发 test(E+F) sudo release-to-test "标题" · 发前 push 等 60 秒 · 发完查流水线 + 物理验列
test 上开家长账号 test 目前没有家长账号,家长端点不了 —— 我自己造不出来(要管理员凭据)
发生产 sudo release-to-prod --mr <编号> · 🔴 发前必查生产存量 phone 重复
顺序确认 G→B→C→H 还是另有优先级

🔴 红线:push / 建 MR / 合并 / 发版一次一令,绝不外推(哪怕上文有"可以"字样)。


第 4 节 · 本会话新立的三条记忆(新会话务必读)

记忆 一句话
ui-must-measure-not-eyeball 照效果图做页面:抠 CSS ≠ 做对,必须并排量 + 截图眼检,六步不能少
state-claims-must-name-environment 「已实装/已生效」缺环境 = 缺主语;分支 ≠ test ≠ 生产
pitfall-rls-hides-rows-false-zero RLS 让 count(*) 恒返 0;对照组必须同表,拿旁边的表无效

另更新:project-c-end-phase74-pending(手上的活全量状态)。


第 5 节 · 顺带产出(非 Phase 74)


云机环境 · 非验收证据。本文所有 commit 号、行数、环境状态均为交接时 git/sudo db-prod 真实输出。