# 保真迁移完成度逐项审计

> 审计对象：`webapp/app/`
> 审计基线：`xiaobai-preservation-slice-11-candidate-20260731`
> 结论口径：自动证据通过不替代用户人工验收，也不授权部署切换

本审计回答的不是“测试是否为绿色”，而是迁移总纲、批准目录、产品表面和人工维护目标是否
分别有可复验的证据。状态只使用：`自动闭环`、`人工闭环`、`明确保留`和`未执行`。

## 1. 目标与证据矩阵

| 要求 | 当前实现 | 主要证据 | 状态 |
|---|---|---|---|
| 原版是唯一产品/视觉基线 | 所有切片从根目录原版复制或机械移动；规格书不覆盖真实行为 | 总纲；切片00-11源码映射 | 自动闭环 |
| `next/`完全隔离 | `next/`未进入候选导入、资产、测试或部署路径；切片10后Git差分为0 | `next失败冻结记录.md`；Git路径审计 | 自动闭环 |
| 批准的模块化单体目录 | `backend/{bootstrap,http,features,data,database,jobs,llm}`、`frontend/{shared,pages,styles,vendor}`、`config/data/tests/tools`均已归位 | `app/config/architecture-inventory.json`；切片01-10 | 自动闭环 |
| 不制造第二套产品实现 | 根入口是兼容外壳；业务方法从原类机械移动，专项测试逐符号比较AST/哈希 | 切片01-10 preservation tests | 自动闭环 |
| 16个主工作区及内部能力完整 | 页面注册表有16个主工作区；策略跟踪、搜索、详情、提醒、账户和系统管理保留 | `pages.config.json`；前端边界测试；Playwright | 自动闭环 |
| API路径、权限、错误语义不变 | 53个精确路径和11个正则路径有唯一所有者；鉴权在后端执行 | `api.config.json`；HTTP/权限测试；21端点差分 | 自动闭环 |
| 数据源有统一边界和质量规则 | 18个数据集登记来源、用途、单位、新鲜度、覆盖率、复权和失败关闭规则 | data registries；DataGateway/quality tests | 自动闭环 |
| 数据库无损、用户隔离不变 | 36张表由初始schema和有序migration管理；62个schema对象、21张关键表差分相同 | 数据库差分；migration/repository/account-boundary tests | 自动闭环 |
| 后台任务可追踪和重试 | 3个任务登记调度、锁、超时、重试和输出版本；运行状态持久化 | `jobs.config.json`；job runner tests | 自动闭环 |
| LLM唯一治理边界 | 问师、问天、复盘助手和策略编译经统一网关执行会员、额度、模型回退、流式和审计规则 | 切片07/09；LLM gateway/stream tests | 自动闭环 |
| 前端唯一请求出口、Shell和页面职责 | 只有`frontend/shared/api.js`调用`fetch`；Shell、状态、弹窗、页面生命周期及页面模块已归位 | frontend boundary tests；切片10源码重组哈希 | 自动闭环 |
| CSS、主题、动画和移动行为不改写 | 原七层CSS和问天动画按字节/源码移动；令牌层与加载顺序受测试保护；用户逐页确认无迁移视觉回归 | CSS governance；切片10/11浏览器证据；`manual-acceptance.md` | 人工闭环 |
| 不确定代码先记录再试删 | 2个文件和5个无消费者函数经自动与人工验收确认废弃；历史表兼容责任继续保留 | `uncertain-code-audit.md`；cleanup contract；`manual-acceptance.md` | 人工闭环 |
| 可由人工维护者复验 | 候选README/架构说明、工具分类、API/架构生成器、统一验证命令均可从`app/`独立运行；系统临时目录导出实测242项候选测试通过 | `app/tools/README.md`；maintenance tool tests；独立导出复验 | 自动闭环 |
| 正式数据库与部署不受影响 | 验收只使用隔离SQLite副本和非8765端口 | 各切片README；运行记录 | 自动闭环 |
| Docker/NAS和正式入口切换 | 用户已明确本轮不做NAS Docker测试；人工验收前禁止切换 | 迁移状态和切换指南 | 未执行 |

## 2. 结构减法的可量化结果

- 根`server.py`从原版约5,851行降为25行稳定入口；实现归入启动、HTTP和产品领域模块。
- 根`database.py`从原版2,839行降为746行，只保留初始schema、组合入口及有明确历史兼容责任的
  方法；各领域查询已移入对应Repository。
- 20个其他根Python兼容模块均为1-15行导出/模块别名，不含第二套实现。
- 原9,283行前端运行时按原连续源码范围拆入共享层和13个页面目录；试删后仍由源码重组测试
  保护，不能悄悄增加、丢失或重排原行为。
- 已确认没有消费者的`demo_data.py`、旧问天加载文件和5个函数进入可单项恢复的试删候选；
  `wencai_saved_queries`因旧数据库兼容和账号隔离继续保留。

大文件不等于自动可删。筛选引擎、Tushare适配器、问天确定性计算和原CSS仍是单一有效实现；
在没有更细的同输入差分与人工视觉确认前继续拆分，反而违反“整理原件而非重拍”的迁移约束。
它们已登记在`config/architecture-inventory.json`的`code_hotspots`，供后续正常维护按领域处理。

## 3. 本次严格审计发现并关闭的缺口

候选版初次自动验收后，三个维护工具仍带有旧目录假设：基线验证器引用不存在的`static/`，
架构清单写向不存在的候选文档目录，原样清单生成器假设`app/app`且会因试删文件直接异常。
这些问题不改变产品页面，却会让接管者无法按指南复验，因此不能视为可维护性完成。

关闭方式：

1. 基线验证器改为检查候选全量测试、两个生成注册表、`frontend/`下全部JavaScript、Git差异和
   测试数据库完整性。
2. 候选架构清单固定生成到`config/architecture-inventory.json`，从正式候选路径统计16页、
   64类路由匹配、36张表、供应商/LLM入口、CSS层和热点文件。
3. 原样资产清单、方法搬运和前端拆分明确标为迁移期工具；可能写文件的操作必须显式传路径或
   `--apply`，默认帮助路径不改文件。
4. 新增维护工具契约测试，保证生成文件新鲜、所有工具`--help`可用，旧`static/`路径不会回归。
5. 跨到2026-08-01周六后，实时详情测试中用运行日构造的“固定时间”不再代表交易日；原版和
   候选测试夹具同步固定到明确工作日，消除跨午夜/周末不确定性。产品实现与交易日规则未改，
   随后统一验收再次通过302项Python测试和45项Playwright。
6. 独立导出`app/`后成功启动健康接口，236项非迁移业务/前端测试通过；同时发现六项日常前端
   契约经辅助函数隐式读取旧`static/app.js`。候选运行时重组现使用已审计的9,283行覆盖边界，
   只有明确的保真差分断言继续读取原版，避免未来清理旧目录后日常契约失效。
7. 对切片10十组截图重新做像素审计，九组平均色差均低于0.3/255；集合竞价候选图实际为登录
   失效页，已明确标为无效并撤销其截图证明力。集合竞价最终视觉继续列为人工验收项。
8. 统一验证器现在按环境选择完整保真套件或候选自有套件；系统临时目录中的纯`app/`导出通过
   242项测试、注册表、24个JavaScript文件和SQLite检查。架构热点大小按归一化UTF-8计算，
   CRLF/LF不再导致清单失效；正式仓库最终通过305项测试和45项Playwright。

## 4. 最终人工裁决与部署边界

2026-08-01用户在隔离端口`8797`浏览全部页面并测试全部功能，确认视觉与功能迁移成功；发现的
问题几乎都属于原版遗留问题，未发现阻止验收的迁移回归。该结论已经关闭以下迁移裁决：

1. 切片11试删候选确认为废弃，恢复标签继续保留。
2. 页面视觉、功能、交互和动画的人工验收完成。
3. 允许建立本地迁移完成标签并推送Gitea。

该结论不授权切换正式数据库、Docker或NAS，也不授权删除根目录原版、数据库备份或冻结的
`next/`记录。部署切换继续以`人工维护与本地切换指南.md`为准，并须单独获得用户批准。
