# 小白复盘人工维护与本地切换指南

> 适用目录：`webapp/app/`
> 当前状态：本地迁移已完成自动与用户人工验收；正式数据库、Docker和NAS尚未切换

## 1. 先确认哪个版本是正式版本

- 当前正式基线仍是`webapp/`根目录及根目录`data/review.db`。
- `webapp/app/`是已完成人工验收的保真迁移版本，运行代码来自原版的移动、机械拆分和去重，
  不是重新开发。
- `webapp/next/`是已否决的冻结版本，禁止部署、继续开发或复制实现。
- 用户人工验收前，不要删除根级原版，不要让`app/`写入正式数据库，也不要修改NAS容器。

发生产品含义冲突时，依次以用户明确决定、原版真实运行、原版源码与数据、产品规格书为准。

## 2. 迁移版目录怎么找代码

```text
app/
  server.py                 进程兼容入口；正式实现装配在backend/
  backend/bootstrap/        路径、环境、配置、依赖组装和HTTP服务器
  backend/http/             鉴权、路由元数据、响应与静态资源传输
  backend/features/         按产品领域组织的服务和Repository
  backend/data/             数据网关、质量策略、实时聚合和供应商适配
  backend/database/         SQLite连接、schema和组合Repository
  backend/jobs/             后台任务定义、状态、调度与重试
  backend/llm/              所有模型调用、流式传输、额度与审计边界
  frontend/shared/          API、状态、Shell、组件和跨页能力
  frontend/pages/           每个产品页面的原版行为；问天样式也在对应目录
  frontend/styles/          原版七层样式和共享令牌
  config/                   页面、功能、API、任务、字段和数据质量注册表
  tests/                    单元、边界、保真差分和浏览器回归
  tools/                    清单、API/数据库差分和保真运行工具
  data/                     运行数据库、私有Skill和备份；不提交Git
  游资skills/               可公开的问师Skill
```

根级`app/*.py`多数是兼容导入壳。维护业务时先到`backend/features/<领域>/`找正式实现，
不要在兼容壳中新增第二套逻辑。所有浏览器网络请求必须继续经过
`frontend/shared/api.js`，所有LLM调用必须继续经过`backend/llm/`。

## 3. 本地隔离启动

不要直接拿正式数据库做迁移验收。先创建一个目录并用SQLite backup API生成一致副本，或使用
`app/data/backups/`中专门的验收副本。然后在`webapp`根目录运行：

```powershell
python -u app\tools\run_preservation_runtime.py `
  --runtime-root app `
  --data-dir app\data\backups\manual-acceptance `
  --port 8797
```

浏览器打开`http://127.0.0.1:8797/`。该命令不占用正式`8765`，并把数据库、私有Skill和
运行写入限制在指定测试目录。验收完成后先停止该进程，再处理测试副本。

## 4. 每次改动的最低流程

1. 阅读`AGENTS.md`、保真迁移状态、迁移账本和对应领域测试。
2. 从`config/pages.config.json`与`features.config.json`确认页面、功能和权限边界。
3. 只修改一个完整领域路径；不要同时在兼容壳和正式模块写实现。
4. 新增API时同步检查`config/api.config.json`及`backend/http/`的权限元数据。
5. 用户私有表必须包含并按`user_id`查询，补充跨账号隔离测试。
6. 行情字段必须登记来源、时间、单位、复权、新鲜度和降级规则，不允许静默换源。
7. 先跑领域测试，再跑下面的全量门槛，最后用真实浏览器检查桌面、夜间和移动端。
8. 更新迁移/维护文档后再提交；一个可回档节点只包含一个可以独立解释的改动。

## 5. 全量验证命令

原版基线：

```powershell
cd webapp
python -m unittest discover -s tests -q
```

迁移版：

```powershell
cd webapp\app
python tools\verify_baseline.py
python tools\verify_baseline.py --e2e
```

第一条命令已经包含迁移版全量单元测试、API/架构注册表新鲜度、全部前端JavaScript语法、
Git空白错误和测试数据库只读完整性检查。第二条额外运行Playwright。工具的日常/验收/迁移期
分类见`app/tools/README.md`；迁移期工具不是正常开发命令。

Playwright需要能够启动本机无头Edge。若测试停在浏览器启动前且没有`msedge`进程，先检查执行
环境是否禁止GUI/无头浏览器进程；这不是页面失败，不要通过删除测试或延长产品超时绕过。

API和数据库差分工具：

```text
app/tools/compare_preservation_apis.py
app/tools/compare_preservation_databases.py
```

运行前先查看脚本参数，并使用同一时点生成的原版/迁移版数据库副本。任何`all_equal=false`都应
阻止提交和切换。

## 6. 数据、密钥和私有内容

- SQLite数据库与`.env`中的`APP_ENCRYPTION_KEY`必须成对备份；密钥丢失后不能恢复加密字段。
- `data/private-mentor-skills/`只属于管理员本机/服务器，不进入Git和Docker镜像。
- 不要用文件管理器复制正在写入的`review.db`；使用SQLite backup API或停服后复制。
- 不要把Tushare、iFinD、LLM Token、账号密码、数据库副本或私有Skill提交到仓库。
- 切换期间只有一个数据库可以成为写入主库，禁止让原版与迁移版长期各写一份后再人工合并。

## 7. 人工验收清单

2026-08-01用户已在隔离端口`8797`完成全部页面和功能验收，确认视觉与功能迁移成功；所见问题
几乎都属于原版遗留问题，未发现阻止验收的迁移回归。以下清单继续作为后续结构修改和部署
切换时的回归标准：

- 用同一账号、日期和主题对照原版与迁移版全部页面。
- 检查日间/夜间、1080P/4K、390像素移动端和浏览器缩放后的滚动与弹窗。
- 检查图表悬浮、股票/板块/题材/指数详情、全局搜索和日期切换。
- 检查选股三个工作区、策略跟踪、刷新后结果保持和候选来源隔离。
- 检查问师流式回答只出现一次、置顶排序、历史和会员限制。
- 检查问天三页全部过场、呼吸/铜钱、加载动画、历史和解读结果。
- 使用两个账号检查自选、笔记、交易日志、提醒和对话互不可见。
- 检查系统管理、会员期限、模型池、数据回补和后台任务状态。

人工验收发现差异时，记录页面、账号、日期、主题、视口、输入和截图；先对照原版复现，再判断
是迁移回归还是原版既有问题。

## 8. 获得部署批准后的本地切换方案

以下只是准备步骤，本次迁移没有执行：

1. 停止原版和迁移版进程，确认没有后台任务继续写库。
2. 对根目录正式数据库执行SQLite一致性备份，同时备份`.env`和私有Skill。
3. 把同一份最新正式数据恢复到`app/data/`，保持原`APP_ENCRYPTION_KEY`不变。
4. 在非`8765`端口启动`app/server.py`并完成健康、登录、关键页面和写入冒烟测试。
5. 记录切换提交、数据库备份位置和启动时间后，才把正式入口指向`app/`。
6. 切换观察期内保留根级原版和切换前数据库，只允许迁移版写主库。

Docker/NAS切换应以`app/`作为构建上下文，另行执行构建、卷挂载、权限、健康检查和回退演练。
本轮没有进行这些操作。

## 9. 回退方案

若切换后出现问题：

1. 立即停止迁移版，避免继续写库。
2. 保存故障日志和当前数据库副本用于调查。
3. 恢复切换前成对备份的`review.db`与`.env`。
4. 从切换记录指定的原版提交重新启动根级`server.py`。
5. 验证登录、健康接口、最近交易日、私有数据和模型配置后恢复使用。

切片11已确认废弃项仍可从`xiaobai-preservation-slice-10-20260731`单项恢复；不要用破坏性的
Git重置覆盖正式数据或用户未提交的代码。
