chore(ops): reload 卡死三层预防 + F1-5a 完整走查报告

reload 卡死三层预防(走查中遭遇 uvicorn graceful shutdown 死等触发):
- Layer 1 (apps/backend/start_uvicorn.py 新): 把 reload-excludes
  封装在 Python 字符串内,ps1 命令行只有字面路径,根治 PowerShell
  PSNativeCommandArgumentPassing 在不同 profile 下 wildcard 展开
  行为差异(数组 splatting 和 --% 都不稳)。同时显式设
  timeout-graceful-shutdown=5,5 秒强杀防死等
- Layer 2 (scripts/ops/backend-watchdog.ps1 新): 自主 socket 探针
  (TcpClient + 手写 HTTP/1.1 GET,Connection: close)规避 .NET
  HttpClient pool 复用 + 系统代理误报;3s × 3 = 9s 触发重启;
  进程链 kill 至 pwsh 后端窗口(关闭原窗口);3 次/小时上限自停
- Layer 3 (scripts/ops/start-admin.ps1): 启动时拉起 watchdog,
  菜单 [4] 仅重启后端选项,主菜单退出时一并 kill 看门狗

CLAUDE.md: 新增"后端 reload 卡死预防(强制)"章节,
分级文件风险表 + SOP + 启动菜单速查

走查报告(应查尽查严肃版):
- 后端 6 个改造点 PASS(P1-P4 + GUC + ai_run_logs runtime 字段)
- admin-web 7 页 Playwright 实地走查 → 5 项 UI 不完整登记 F1-5b
- 小程序看板 tab 7 页 weixin-devtools-mcp 实地 + DB 数据核对 →
  board-finance 5/6 项上界裁剪吻合;board-customer 业务日生效;
  board-coach 月度聚合表设计盲区;5 项 sandbox 覆盖盲区登记 F1-5b
- 8 张走查截图归档 docs/audit/changes/screenshots/2026-05-05_f1_5a_walkthrough/

audit_dashboard 刷新到 153 条审计

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Neo
2026-05-05 11:53:08 +08:00
parent 1baa21222b
commit 95a4500c75
14 changed files with 745 additions and 5 deletions

View File

@@ -122,6 +122,33 @@ NeoZQYY Monorepo — 面向台球门店业务的全栈数据平台。多门店
例外:纯格式/文档/注释调整、用户说"跳过验证"
## 后端 reload 卡死预防(强制)
**机制**`uvicorn --reload` 检测到 .py 修改 → 等 lifespan shutdown → 等 WebSocket / asyncio task / DB 连接释放 → 等不到就死等。已在 `start-admin.ps1` + `backend-watchdog.ps1` 做了三层保护,但写代码时仍需配合。
**改 Python 文件按风险分级**
| 风险 | 文件位置示例 | 操作 |
|---|---|---|
| 极低 | `app/ai/prompts/*.py` `app/schemas/*.py` 工具/helper | 直接改reload 自动应用 |
| 中 | `app/services/*` `app/ai/*`(非 dispatcher) `app/routers/*` | 改前关浏览器(切 WS),改后看终端 "Application startup complete" |
| 高 | `app/main.py`(lifespan) `app/services/scheduler.py` `task_queue.py` `app/ai/dispatcher.py` 全局单例(`_admin_svc` 等) | 用启动菜单 [4] 仅重启后端,或 taskkill + 双击 bat |
**测试 SOP**
1. 改 Python 前先 `curl http://127.0.0.1:8000/health` 确认健康
2. 改完文件等 30 秒,再 `curl /health` 二次确认;若仍 timeout → 选启动菜单 [4]
3. 看门狗(`backend-watchdog.ps1`)会在连续 30 秒不响应时自动 kill+重启,不需要手动操作
**启动菜单(双击 `start-admin.bat`**
- [1] 终止所有服务(含看门狗)
- [2] 重启所有服务(含看门狗)
- [3] 退出
- [4] 仅重启后端(保留前端,推荐:测试时 reload 卡死 / Python 改动)
**禁止**
- 改 lifespan / dispatcher / 全局单例时不要靠 reload**手动停后端再启动**
- 不要在 reload 没完成时连续改 .py 文件(前一次没收完后一次又触发,必卡)
## 数据库 Schema 变更规则
修改 PostgreSQL schema迁移/DDL/表/ORM时**必须**同步 `docs/database/`:变更说明 + 兼容性影响ETL/后端/小程序)+ 回滚策略 + ≥3 条校验 SQL。详细模板见 `db/CLAUDE.md`