交付出件箱

← 返回出件箱

🔴 云机会话交接件 · 2026-09-07(机构管理开发 + 视光档案收尾)

新会话:从头到尾读完再说话。变傻的真因是「没查就说」——每条硬事实都附了自证命令,引用前先跑。
memory 和交接件只是参考,跟代码冲突以代码为准。
上一份:~/reports/CLOUD-SESSION-HANDOFF-20260906.md(第 0 节防呆表仍有效)


第 0 节 · 防呆速查表(说错任何一条 = 事故)

事实 值 自证命令
工作 worktree /home/dev2/doctor-ai-brain/.claude/worktrees/s2-rework git -C <路径> branch --show-current
分支 · tip feature/stage2-rework-vf-ui2 · e7504ae0 · 工作区干净 · 0 个未发 commit git status --short(空)
🔴 生产 视光档案二期 9-07 已上线(37 MR · 合并点 0454e346) git grep -c ai_comparison origin/main -- app/services/refractive_record_service.py(应 22)
test 上 0e696b03(别人的告警功能 MR#647) sudo test-inspect deploy
守门基线 报告秒读+4L prompt 40 passed 见第 6 节
红线四文件 md5 d9458a75(four_l_summary_service.py) 4cf281ca(four_l_summary_prompt.py) dcd79643(four-l-detail-sheet.tsx) e7f38502(four-l-mapper.ts) md5sum ... \| cut -c1-8
报告秒读 prompt md5 0f20dfec4d58adbcc26d82d31105967e 第 6 节 canonical 命令
发 test sudo release-to-test --yes "标题";先 git fetch origin test && git merge origin/test 对齐 —
发生产 先跑 status 查待发编号(见第 5 节坑 1),再 sudo release-to-prod --mr N... --branch release/短名-日期 --auto-merge --yes —
迁移 不用找 root:生产每轮部署无条件跑 alembic upgrade heads,代码落地自动执行 —

第 1 节 · 长官的规矩(违者重罚 · 全部有实例)

  1. 「这是你认真思考后给我的吗?」= 你有推断没验证。停下,把没验的前提列出来,先查再答。9-06 被问 6 次每次都真有问题;9-07 我连着看错 3 次(见第 5 节坑 2)。
  2. 「没看懂」= 立刻用大白话重说,不许再堆术语。本会话被打回 5 次以上。正确姿势:一次一个问题、表格、结论先行、每条问句结尾给"你就回 X 或 Y"。
  3. 一次只问一个简单问题;回复短、用表格、带表情。
  4. 改前必 verify(物理 grep · 8+ 维 · 带对照组);改后 4 步 verify + 守门;修完别急着发,等长官令。
  5. 派 agent 只一层;写码 sonnet、检索 haiku;agent 回来自己跑 verify(本会话 agent 虚报/空手而归 5 次以上)。
  6. 报告秒读不动;改视光档案必须 scene 隔离;共用件不动。
  7. 发版少发:攒几个功能一起发(9-02 令)。
  8. 生产:长官不明说就别发。

第 2 节 · 当前状态(三条线)

A. 视光档案二期 —— ✅ 已上生产,已验收

B. 机构管理搬平台手机端 —— 📐 方案+图已定稿,准备开发

C. 近视预测 —— ⏸ 等三方


第 3 节 · 机构管理开发方案(下一步要做的事)

🔴 架构事实(已 physical verify · 别再重查)

事实 证据
平台手机端前端在结算项目 settlement/web/app/platform/minicup/
平台手机端后端也在结算项目 settlement/backend/app/api/settlement/platform_mobile.py
机构管理数据在主项目 organizations 表 + app/api/api_v1.py / admin_orgs_access_link.py
两系统间已有专用通道 settlement/backend/app/core_client/client.py → 主系统 /internal/settlement/*
通道鉴权 header X-Service-Token(env SETTLEMENT_SERVICE_TOKEN),不走 require_role("admin")
通道是我们自己建的 git log -- app/api/internal_settlement.py 最近 3 次全是 dev2(8-15/8-18/8-20)
🔴 14 个开关不在 organizations 表 在独立的 org_brain_config 表;结算侧 core_readonly.py 零可见性(连模型都没有)
结算侧 Organization 模型只映射 8 列 主库实际 18 列;core_readonly.py:42-61

缺口清单(要新建的)

主系统侧 · 新增 /internal/settlement/orgs/* 端点(4 类):
1. 改机构基本信息 + 14 个开关(现有 PUT /api/admin/orgs/{id} 走 admin 鉴权,不能直接用)
2. 停用 / 启用(现有 PATCH /api/admin/orgs/{id}/status)
3. 重新生成凭证(现有 POST /api/admin/orgs/{id}/regenerate-credential)
4. 通用新建机构(现有 provision_organization 是签约专用:套餐 10 开关写死不接受传参 internal_settlement.py:311-322、幂等键绑签约编号,不能复用)

结算侧 · core_client/client.py 补函数封装:
- 上面 4 类的 wrapper
- ⚠️ 另有 2 个核心侧已有路由但客户端没封装的:席位启停 /seats/{uid}/status、密码重置 /seats/{uid}/password-reset

结算侧 · 前端:
- 7 个页面 + 2 个二级页 + 5 个弹窗 + 5 个异常态(全在方案图上)
- 新增权限位(现有 13 个全是 channel/store/payment/ledger/settlement/share_record,没有 orgs),定义在 settlement/web/app/platform/minicup/_components/platform-mobile-context.tsx:17

凭证复制格式:
- 长官 9-07 拍板 抄一份到 web 包(不打通跨包引用)
- 源:settlement/web/lib/seat-credentials-text.ts 的 buildSeatCredentialsText()(长官 7-28 定稿格式)
- 两处文件头要互相加注释指认,防文案漂移
- ⚠️ PC 端 seats/page.tsx:1513-1520 自己手写了 formatCredentialCopy() 且多账号场景无文本可复制(只能下载 Excel)→ 手机端「多账号一键复制」是新增能力,非复刻

分批计划(长官已认可)

批 内容 风险
一 只读:机构列表/详情、席位列表/详情 最低,先让长官看界面
二 写:改基本信息、14 开关、停用启用 中
三 高危:新建机构、重新生成凭证、批量生成席位 高(涉凭证)

长官已拍板的产品决策(别再问)

# 决策
1 新功能叫「机构管理」;手机端现有 platform/minicup/stores 标题从「机构管理」→「机构签约」(与 PC 端结算侧对齐)
2 底部导航「机构」栏不改
3 首页「渠道资料审核」替换成「机构管理」(该入口与底部「渠道」栏同目的地,重复)
4 PC 端两个既有缺陷都不修(门店手机号死字段;14 开关只有品牌价值 4 个有未保存提示——已验证不丢数据)
5 创建机构后不弹凭证窗、不回列表,直接进该机构详情页(便于接着开席位)
6 密钥到「接入凭证」里看/重新生成(api_secret 数据库仅存哈希,只能重新生成)
7 「下载 Excel」→「一键复制全部凭证」
8 席位卡四行:席位账号 / 微信昵称·脱敏ID / 门店名 / 到期+设备;字段名叫「席位账号」不叫「账号」
9 机构卡:「席位 24 · 启用 18 · 创建于 2025-03-12」一行
10 危险操作收进「更多操作」二级弹层,防误触
11 列表改加载更多,不用上一页/下一页
12 机构洞察本期不做

两条待确认(接口层)

  1. 机构卡「席位 X · 启用 Y」:GET /api/v1/admin/orgs 响应无 seat_count/active_seat_count 字段,需后端新增聚合
  2. 机构列表「加载更多」:该接口全量拉取无分页(orgs/page.tsx:16-17 注释),需新增 page/size

第 4 节 · 挂账不做(长官已定)


第 5 节 · 本会话踩的坑(别重蹈)

  1. 判断"发没发过生产"三种查法两种是错的:①按提交号 merge-base --is-ancestor ❌(重造式 cherry-pick 会换号)②按文件内容比 ❌(发过之后 test 还会继续改)③看 main 提交消息里的挑取标记 ✅ 唯一准。发版工具报「已在 codeup/main」时信工具。root 9-07 已加只读 status 子命令:
    bash cd ~/doctor-ai-brain && git fetch -q origin test main python3 /usr/local/lib/release/release_main.py status --repo ~/doctor-ai-brain \ --test-ref origin/test --main-ref origin/main --mr 563 --mr 641
    ⚠️ 云机远程叫 origin 不是 codeup,必须显式传 --test-ref/--main-ref,否则 git 128。
  2. 🔴 比对两端功能必须前端页面 + 后端 schema 同时看。9-07 我只看后端 schema 连错 3 次:①说家长端缺手机号(实际同一列换名 guardian_phone→phone)②说戴镜史格式不同(实际一致)③说防控手段两端都有(实际家长端根本没有,是长官 8-26 自己去掉的)。
  3. git show --name-only <merge_sha> 对合并提交返假 0(默认不展开)。正确:git diff --name-only <sha>^1 <sha>。
  4. 工具输出里的 "status": "MERGED" 可能是上一轮残留。发完必须自己查 main 上标志符号(带对照组)+ 生产库。
  5. 发版命令太长会被自动模式分类器拦(37 个 --mr + 9 个 --accept-test-side)。解法:退出自动模式,不用改配置。子代理更跑不了(权限分类器直接拒 sudo release-to-prod)。
  6. cherry-pick 冲突是常态(9-07 冒了 9 个,分支名换了 6 轮 b→g)。每个冲突文件判据:①main 上不存在=新建→取 test 侧零风险 ②存在则比 git diff origin/main:<f> <功能开工前tip>:<f>=0 差异→无他人改动 ③有差异则逐项 grep 确认 main 上的关键功能 test 上也有。严禁白点名。
  7. 给 ParentPatientUpdate 加字段还不够:update_my_child 里有硬编码 setattr 白名单元组,不加进去 Pydantic 收了也会被丢弃。
  8. 粗活守卫 10 分钟 >8 次锁工具 → 派一个 haiku/sonnet 做机械活即解锁。
  9. 截图工具在超长页面会出现"整页重复"的拼接假象。判据:grep HTML 里主标题/<body>/<html> 各只有 1 份 → 是假象,浏览器打开正常。
  10. 契约测试有 44 个存量红(vllm 连不上/TTS/consult_config 种子未跑/Starlette 漂移等),与我们的改动无关。判定方法:git stash push -u -m "verify-<tag>" 对比改前改后,失败清单一致=存量。⚠️ 严禁裸 stash/pop(多会话共享栈)。

第 6 节 · 验证命令(照抄可用)

W=/home/dev2/doctor-ai-brain/.claude/worktrees/s2-rework
cd $W && git status --short && git log --oneline -3

# 守门(40 passed)
python3 -m pytest tests/unit/test_report_scene_prompt_baseline.py tests/unit/test_four_l_summary_prompt.py -q | tail -1

# 报告秒读 canonical md5(必须 0f20dfec4d58adbcc26d82d31105967e)
PYTHONPATH=$W python3 -c "
import datetime,dataclasses,hashlib
from app.services.four_l_summary_prompt import build_summary_messages, SummaryHint
v={x.name:None for x in dataclasses.fields(SummaryHint)}
v.update(exam_date=datetime.date(2026,9,4),age_years=10.0,myopia_level='低度近视',sph_od_d=-2.0,sph_os_d=-2.0)
m=build_summary_messages(SummaryHint(**v),[],scene='report')
print(hashlib.md5((m[0]['content']+chr(10)+'<<<USER>>>'+chr(10)+m[1]['content']).encode()).hexdigest())"

# 红线四文件 md5(d9458a75 / 4cf281ca / dcd79643 / e7f38502)
md5sum app/services/four_l_summary_service.py app/services/four_l_summary_prompt.py \
  web/app/h5/chat/components/four-l-detail-sheet.tsx web/app/h5/chat/lib/four-l-mapper.ts | cut -c1-8

# 生产是否已含视光档案二期(应 22,对照组 _patient_dict 应 4)
git grep -c "ai_comparison" origin/main -- app/services/refractive_record_service.py
git grep -c "_patient_dict" origin/main -- app/services/refractive_record_service.py

# test 部署状态(唯一权威判据)
sudo test-inspect deploy

第 7 节 · 相关文件