# `app/`代码减法账本

> 基线：`xiaobai-preservation-complete-20260801`  
> 工作目录：只允许修改`webapp/app/`；原版根目录和冻结的`next/`只读  
> 目标：删除重复实现和历史补丁，不改变功能、视觉、交互、动画、计算、权限、API或数据行为

## 固定规则

1. 每批只处理一个明确边界，先证明重复或无消费者，再修改。
2. 新共享实现必须在同一提交删除全部被替代实现；禁止只加一层包装。
3. 运行代码总量原则上不得增加；测试和证据代码单独统计。
4. 迁移期源码相等测试不得简单删除。发生已批准的结构重构时，必须替换成行为、错误语义和
   唯一所有权契约。
5. 每批通过领域测试、全量候选测试、独立导出测试和受影响的浏览器流程后才建立Git检查点。
6. CSS最后处理；没有逐页日间、夜间和多视口截图证据，不删除视觉规则。

## 批次记录

| 批次 | 边界 | 基线问题 | 目标 | 状态 |
|---|---|---|---|---|
| CR-01 | LLM供应商传输 | 问师、问天、复盘助手和策略编译各自构造HTTP请求、解析响应和读取错误 | 只保留`backend/llm/transport.py`一个网络出口 | 已完成 |
| CR-02 | HTTP精确POST委托 | 27个端点重复使用“比较路径、调用无参数处理器、返回”三行分支 | 用公开/受保护两张显式映射统一委托，同时保留复杂路由的原控制流 | 已完成 |
| CR-03 | 股票市场后缀转换 | Tushare业务与iFinD图表各保留一份完全相同的沪深京代码转换函数 | 图表复用`bootstrap/config.py::tushare_code`，只保留一份函数体 | 已完成 |

## CR-01验收口径

- 四个功能模块不得包含`urllib.request`或`/chat/completions`。
- 非流式与流式请求的URL、鉴权、User-Agent、SSE累积和空响应行为保持不变。
- 各功能原有错误类型和用户可见错误文案保持不变。
- `LLMGateway`的会员、额度、主辅回退、首字后不中途换模型和审计规则保持不变。
- 架构清单必须登记唯一传输入口；完整测试和真实主模型最小调用通过。

## CR-01结果

- 四个功能模块的运行代码由572行降至422行；新增唯一传输实现129行，生产代码净减少21行、
  约1.4 KB。行数不是主要收益，关键是5处`/chat/completions`请求只剩1处。
- 三套重复HTTP错误正文解析合并为一套；各功能原有错误类型和用户可见文案由专项测试固定。
- 迁移期4个“Agent文件逐字相等”断言没有直接删除，而是替换为共享传输唯一所有权、提示词模块
  归属、SSE行为和兼容模块对象契约。
- 候选311项、纯`app/`导出248项、45项Playwright通过；24个JavaScript文件、架构/API注册表和
  SQLite完整性检查通过。
- 使用候选数据库中加密保存的主模型完成真实非流式与流式最小调用，分别成功返回完整响应和
  4个流式分片。调用未输出密钥或模型正文。
- 本批不修改页面、CSS、提示词、业务计算、会员额度、模型回退、数据库或部署。

回档基线为`xiaobai-preservation-complete-20260801`；本批检查点为
`xiaobai-reduction-01-llm-transport-20260801`。

## CR-02验收口径

- 仅纳入没有路径参数、请求体解析或专属异常分支的精确POST端点；其余路由保持原样。
- 公开注册/登录端点继续在鉴权前分发；受保护端点继续严格执行登录、CSRF、注册表权限、处理器。
- 27个映射路径必须都由权威API注册表解析，处理方法必须真实存在，公开与受保护集合不得重叠。
- API路径、功能归属、访问角色、状态码、错误正文和静态页面绕过鉴权行为保持不变。
- API清单生成器必须结构化读取显式映射；架构清查复用API清单，不再维护第二套路由发现规则。

## CR-02结果

- 2个公开端点和25个受保护端点改为显式委托映射，原来的79行重复分支被43行映射、分发与调用替代；
  `backend/application.py`净减少36行，规范化源码约减少1.0 KB。
- 带正则路径参数、请求体读取、查询参数转换或特殊异常语义的GET、POST、DELETE端点未改动。
- 架构清查删除了自行扫描精确/正则API路径的第二套规则，改为消费权威`api.config.json`；API注册表的
  53个精确路径、11个正则路径、功能归属和权限均未变化。
- 原版231项、候选315项、纯`app/`导出252项、45项Playwright通过；24个JavaScript文件、
  API/架构注册表、Git空白检查和SQLite完整性检查通过。
- 本批不修改前端、CSS、业务计算、数据源、数据库结构、LLM、会员规则或部署。

本批基线为`xiaobai-reduction-01-llm-transport-20260801`；检查点为
`xiaobai-reduction-02-http-dispatch-20260801`。

## CR-03验收口径

- 图表模块不再定义第二份市场后缀转换函数，仍保留原局部名称和两个调用点。
- 深市、沪市、北交所的既有映射结果保持不变；不借本批修正或扩展代码规则。
- 原图表文件除该函数外的所有顶层定义继续与原版AST逐项相等。
- 原版`_stock_market_code`函数的参数和函数体必须与唯一共享实现AST相等，运行时别名必须指向
  同一个函数对象。

## CR-03结果

- 删除`backend/features/market/charts.py`中第二份10行定义，以1行导入别名复用共享实现，生产代码
  净减少9行；全仓后端只剩一份沪深京后缀转换函数体。
- 未合并实时聚合、东方财富图表、iFinD和Tushare的HTTP传输；它们的缓存、错误、重试和降级语义
  不同，仅有外形相似，证据不足以安全抽象。
- 原有迁移期整文件相等断言被等价范围断言、共享函数AST断言和唯一对象断言替代，没有降低门禁。
- 原版231项、候选317项、纯`app/`导出254项、45项Playwright通过；API/架构注册表、
  24个JavaScript文件、Git空白检查和SQLite完整性检查通过。
- 本批不修改图表请求、数据来源、缓存、时间范围、行情计算、前端、CSS、数据库或部署。

本批基线为`xiaobai-reduction-02-http-dispatch-20260801`；检查点为
`xiaobai-reduction-03-market-symbol-20260801`。
