自包含,不依赖 dev2 记忆系统。所有路径/commit/命令均可直接用。
仓库:doctor-ai-brain(FastAPI + PostgreSQL + Next.js)。三分支:功能分支自codeup/test拉 → 合 test(部署 test.tongban.love)→ 挑选晋级 main(部署 chat.tongban.love)。
本机是东京云隔离开发机(2vCPU/3.4G),不是测试/生产机。
sudo test-inspect deploy(看「已部署 commit」「坏提交」)。生产没有对应工具,生产部署要不长官真机验、要不请 root 用 seatops 查容器。sudo test-inspect trace <容器名>;容器状态 sudo test-inspect pssudo db-query test "SELECT ..."(单句、无分号)。⚠️ users 表受 RLS,直接查返 0 是假 0(实有 407 行);要交叉验用 SELECT relname,n_live_tup FROM pg_stat_user_tables WHERE relname='users'。sudo db-prod "SQL"(改前必先 SELECT、UPDATE 必带 WHERE、无 DELETE 权限)。git push origin feature/xxx → 等 60s → sudo release-to-test --yes "标题"(自动建MR+评审+合并+部署)sudo release-to-prod --mr N --yes --auto-merge(必须点名 MR;多 MR 拼分支名超长会 500,要带 --branch <短名>)。发前打印 commit_ids/changed_files 核对没夹带别人的;遇冲突工具直接中止 → 找 root 手工解,别用 --accept-*-side 整取一侧。登录类改动必须先 test 真机验过再发生产。git checkout -b feature/xxx origin/testljg_admin,密码向长官索取(别写进本文件——本文件会被公网出件箱列目录)wecom_agent.py:203 status_code=204 + -> None)在线上 FastAPI 0.115 import 崩,堵部署 15.5h,root 修 MR#770 已恢复。教训:from __future__ annotations 下 204/304 接口禁 -> None,要 response_model=None + -> Response;提交前跑 pytest tests/contract/test_app_import_smoke.py。90e9d7ca,root 实读生产 bundle 确认)。现象:门店共享平板/手机,上个席位「退出系统」后新账号用手机号登被误拦「席位账号不是手机号」。根因:三处席位退出(tablet/page.tsx handleSeatLogout、chat/components/menu-sidebar.tsx handleLogout 的 isSeat 分支、settings/components/ParentAccountCard.tsx)只清 seat token、漏 clearWxIdentity() → 上个账号 bound_seats 残留 → deriveSeatLoginMode 沿用旧「account」写法拦手机号。修法(窄版):三处补 clearWxIdentity()+sessionStorage.setItem("seat_relogin_relax","1");seat-login-hints.ts deriveSeatLoginMode 空数组分支:有标记→both,无标记→仍 account(保 Phase 68.5 红线1:老账号首次进入显示「席位账号」一字不变)。串号安全后端早做兼容(seat_auth.py:300 scene 限定门店号 + :322 chosen_username 选端)。10 维物理 verify 已完成(全 test 现网实证)。关键事实:
- argon2 是唯一瓶颈:app/services/password_utils.py time_cost=3/memory_cost=64MiB/parallelism=4;单次 0.059s → 5万 ≈ 49 分钟(不是旧说的 95min)。号码生成不是瓶颈(批次三 app/services/seat_service.py:180 _alloc_org_seq_batch 一条 SQL 批量取号,已在 test)。
- 异步基础设施现成:Celery(app/celery_app.py)+ app/tasks/director_distill_task.py / app/models/director_studio.py DirectorDistillJob(job 表 status/progress JSONB + .delay() + 前端轮询 GET,协议C第11项不用 SSE)→ 批次四「批量开号任务」直接抄。
- 导出:app/api/admin_brand_code.py _build_export_workbook()(openpyxl + StreamingResponse)可复用做下载记录页。
- 同步开号上限 1-100(平台端 le=50)长官 9-21 拍板保留不动,5万走独立异步端点。
- 迁移挂点:新迁移 down_revision 接生产当前 head;⚠️本仓多 alembic head 债,写迁移前先 alembic heads 核。
- 礼品卡 gift_card 代码现网 0 命中 = 全新概念。旧方案「100档14ms/500档20ms/5000档69ms」查无出处不可信;83.12 三档实测(100/500/1000)一直没跑。
- 管理端入口:挂 web/app/(dashboard)/admin/parent-seats/page.tsx 现有工具条(开通子席位/导出旁),别另开菜单。
- 待长官拍板 D1-D4:①5万后台约 49min 体验接受?要不要多 worker 并行(不建议降密码强度)②批量生成的明文密码存不存(存=可反复补下载但几万条明文是隐患;不存=只生成那次给下载)③一次批量上限=5万还是别的④开工前先补跑 100/500/1000 实测拿真数字?
⬜ 未碰。长官定「四批跑稳后单独隔离做、现在别碰」。到期后鉴权真拦人,要动登录校验链。
app/services/brand_code_service.py activate_brand_code 在授权回调落库)。「按来源区分展示」其实已做(后端默认排除 brand_code + 筛选下拉 + 导出来源列 + 明细表来源列=#769 已上生产)。issue_org_bind_token in app/auth/jwt_local.py:315):token 只装 org_id、确定性、永久无过期;一机构一码全共用;机构停用即失效(org-scan 每端点查 brand_code_claim.py:64 _org_or_404 的 is_active),再启用自动恢复;停用机构不级联停席位(org_service.py:455 soft_delete_org 只改 org+APICredential)。require_store_seat→require_org_seat 只查 seat.is_active,middleware.py:388)不查机构停用 = 潜在缺口,长官决定不修*(实操停机构会手动停席位)。_seat_login_resolve_phone(:276)候选 = phone 命中 + phone_login_enabled + scene 过滤(:300 store/tablet 只认门店号,parent 只认家长号);门店手机号不重复→命中唯一;家长+门店同号才多命中→用 chosen_username(:322)选端。不会串号。sessionStorage.clear())和家长子席位账号(退出走 ParentAccountCard,是席位登录)。别按「门店端/家长端设备」分,要按「是不是席位登录 isSeat」分。--branch <短名>;非交互跑 release 工具必带 --yes,别用 printf 'y'| 管道(会被分类器拦)。