# `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-04 | 数值归一化策略 | 四个业务模块分别保留两组完全相同的数值转换函数体 | 由`backend/data/numbers.py`集中拥有两种既有语义，消费者保留原局部别名 | 已完成 |
| CR-05 | 根级兼容入口 | 正式后端仍有五处通过迁移兼容模块反向导入规范实现 | 正式代码改用规范路径；兼容入口只服务原公开导入契约 | 已完成 |
| CR-06 | 紧凑日期显示 | Tushare与选股引擎各保留一份完全相同的`YYYYMMDD`显示转换 | 由`bootstrap/config.py`拥有唯一格式策略，消费者保留原局部别名 | 已完成 |
| CR-07 | 数据Provider组装 | 核查网关、容器和业务服务是否重复创建外部数据客户端 | 固化唯一创建位置及兼容例外，不改数据源语义 | 已完成 |
| CR-08 | NDJSON流式传输 | 问师与复盘助手重复维护响应头、事件写入、完成、断线及关闭流程 | HTTP共享层拥有唯一流式连接生命周期 | 已完成 |
| CR-09 | 应用服务门面 | 两个仅服务股池iFinD补全的方法仍错位在全局`DashboardService` | 原函数体机械归位到`PoolServiceMixin` | 已完成 |
| CR-10 | Repository所有权 | 五行行业阶段覆盖的三项持久化方法仍错位在根级数据库门面 | 原函数体机械归位到问天Repository，兼容数据继续保留 | 已完成 |
| CR-11 | 后台任务生命周期 | 导入应用即启动调度线程，启动早于端口绑定，停止只置位但不等待 | 运行时显式启停，每个Runner只拥有一个可等待的调度线程 | 已完成 |
| CR-12 | CSS跨层精确重复 | 七层样式保留多次视觉改造形成的重复顶层规则，前层声明被后层逐字覆盖 | 只删除能够由CSSOM证明完全重复的前层规则，并建立浏览器级重复门禁 | 已完成 |
| CR-13 | CSS跨文件嵌套精确重复 | 相同媒体上下文中的完整规则分散在不同样式文件，前层声明仍被后层完整重复 | 递归核对CSSOM上下文，只退休跨文件的精确副本 | 已完成 |
| CR-14 | CSS同文件精确重复 | 同一文件、同一媒体上下文仍保留多轮视觉调整形成的完整重复规则 | 删除较早副本并把同文件重复纳入浏览器门禁 | 已完成 |

## 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`。

## CR-04验收口径

- 只合并参数、函数体和运行结果完全一致的数值转换函数，不借本批改变任何业务计算或异常默认值。
- `finite_number`继续拒绝`NaN`与正负无穷；`non_nan_number`继续只拒绝`NaN`并保留正负无穷。
- Tushare与智能选股必须复用有限数策略；市场洞察与情绪引擎必须复用非NaN策略，并继续暴露原局部
  `_number`名称以保持兼容。
- 实时行情和图表转换器的空值、默认值或参数签名语义不同，必须继续独立保留，不能因名称相同而合并。
- 原版函数参数和函数体分别与共享实现AST相等；四个消费者的局部别名必须指向对应的唯一函数对象。

## CR-04结果

- 删除Tushare、智能选股、市场洞察和情绪引擎中的四份重复函数体，新建两种明确命名的共享策略；生产
  代码净减少约12行，全仓AST扫描不再发现完全相同的函数定义。
- 将可复用的函数及模块AST契约归入测试辅助层，原有迁移保持性测试改为“未改范围保持相等、被替换
  函数与共享实现相等、运行时唯一对象”三重断言，没有降低门禁。
- 实时行情`backend/data/realtime.py::_number`与图表`backend/features/market/charts.py::_number`
  被明确保留；它们不是本批重复实现，也未改变行为。
- 58项定向测试、41项保持性/治理测试、原版231项、候选320项、纯`app/`导出257项和45项
  Playwright通过；24个JavaScript文件、API/架构注册表、Git空白检查和SQLite完整性检查通过。
- 本批不修改前端、CSS、接口、数据来源、行情口径、选股条件、数据库、LLM、权限或部署。

本批基线为`xiaobai-reduction-03-market-symbol-20260801`；检查点为
`xiaobai-reduction-04-numeric-normalization-20260801`。

## CR-05验收口径

- 逐项扫描根级Python入口、生产代码、测试、工具和动态导入；没有消费者或兼容责任的入口才能删除。
- 规范后端不得经由`screener`、`advanced_strategies`、`tushare_client`或`server`兼容入口
  间接访问已经归位的实现。
- 所有根级模块继续保持原导入名称、导出对象及模块对象身份，既有启动命令和第三方维护脚本不受影响。
- `api_access`、选股Repository的惰性`sentiment_engine`导入及根级`database.py`属于已登记边界，
  分别留到HTTP、Repository阶段处理，不在本批跨边界修改。

## CR-05结果

- 审计确认21个根级兼容入口均有测试、工具、启动或原公开导入契约消费者，因此本批没有冒险删除文件。
- 容器、策略编译器、选股引擎及数据同步命令的五处导入改为规范模块路径，正式代码不再通过四个根级
  兼容模块反向进入实现；运行代码行数未增加。
- 特性边界测试取消选股引擎旧例外，并新增全后端兼容导入门禁；只允许两项已登记过渡边界，后续代码
  无法重新引入隐式根级依赖。
- 候选321项、纯`app/`导出258项、24个JavaScript文件、API/架构注册表、Git空白检查和SQLite
  完整性检查通过；本批不涉及页面、CSS或浏览器行为。
- 本批不修改业务计算、策略公式、数据源、API、数据库、LLM、权限、前端或部署。

本批基线为`xiaobai-reduction-04-numeric-normalization-20260801`；检查点为
`xiaobai-reduction-05-compatibility-boundaries-20260801`。

## CR-06验收口径

- 只合并参数、函数体和异常行为完全相同的日期/文本转换；名称相似但空值、未来日期、错误文案或
  输入格式不同的函数不得合并。
- Tushare与选股引擎继续暴露局部`_display_date`名称，并分别指向唯一共享实现。
- 原版两个`_display_date`函数必须分别与共享实现AST相等，所有原调用结果保持不变。
- 市场洞察的日期显示函数会清理连字符并容忍空值，语义不同，必须继续独立保留。

## CR-06结果

- 删除Tushare与选股引擎内两个重复日期函数体，新增`display_compact_date`唯一策略；生产代码总
  行数不增加，重复函数体由两份降为一份。
- 架构清单登记日期格式唯一所有权；保持性测试改为未改范围AST相等、共享函数AST相等和运行时
  对象身份三重契约，没有放宽原迁移门禁。
- `normalize_date`、市场洞察日期显示、实时行情时间格式和会员日期边界因语义不同均原样保留。
- 候选321项、纯`app/`导出258项、24个JavaScript文件、API/架构注册表、Git空白检查和SQLite
  完整性检查通过；本批不涉及页面、CSS或浏览器行为。
- 本批不修改日期输入规则、业务计算、选股结果、接口、数据库、数据源、LLM、权限或部署。

本批基线为`xiaobai-reduction-05-compatibility-boundaries-20260801`；检查点为
`xiaobai-reduction-06-date-formatting-20260801`。

## CR-07验收口径

- iFinD、图表、实时观察器和Provider适配器必须只在`build_data_gateway`创建，并由容器共享。
- Tushare必须继续通过实时Token供应器按需创建，不能为了减少对象数量缓存过期Token。
- 市场服务中为原版隔离测试桩保留的一处`TushareClient(self.token)`是明确兼容例外，不得被误判为
  第二条正式数据链路。
- 不得合并Tushare、iFinD、东方财富和腾讯的传输、缓存、重试或降级逻辑。

## CR-07结果

- 全后端构造点扫描确认iFinD、MarketChart、东方财富图表和实时观察器均只有网关一个创建位置；
  `ApplicationContainer`暴露的是同一对象引用，没有第二份客户端。
- Tushare Provider使用动态Token供应器，市场服务只有一处已登记测试兼容回退；本批没有发现可安全
  删除的生产实现，因此不为追求行数强行修改运行代码。
- 架构清单新增Provider创建所有权，自动测试会在未来出现第二个未登记构造点时失败。
- 候选322项、纯`app/`导出259项、24个JavaScript文件、API/架构注册表、Git空白检查和SQLite
  完整性检查通过；本批不涉及页面、CSS或浏览器行为。
- 本批不修改请求频率、缓存、重试、Token更新、数据源选择、计算口径、API、数据库或前端。

本批基线为`xiaobai-reduction-06-date-formatting-20260801`；检查点为
`xiaobai-reduction-07-provider-ownership-20260801`。

## CR-08验收口径

- 只合并NDJSON响应头、事件序列化、完成事件、业务错误事件、客户端断线和连接关闭这些传输行为。
- 问师继续直接输出原事件字典；复盘助手继续把文本分片包装为`delta/content`事件。
- 两个功能各自的业务异常类型、请求体错误状态码、错误正文和流创建时机保持不变。
- `_write_stream_event`与连接生命周期必须只由`backend/http/handler.py`拥有，应用大类和功能HTTP
  模块不再保留第二份实现。

## CR-08结果

- 删除问师和复盘助手各16行重复流式控制流，并将应用大类中的10行事件写入方法归入HTTP共享层；
  新共享实现29行、两个调用适配共3行，生产代码净减少10行。
- 新增专项测试固定四个响应头、中文NDJSON序列化、增量顺序、完成事件、业务错误事件和关闭状态。
- 候选324项、纯`app/`导出261项及45项Playwright通过；24个JavaScript文件、API/架构注册表、
  Git空白检查和SQLite完整性检查通过。
- 本批不修改提示词、模型选择、会员计次、流式正文、前端解析、API路径、数据库或数据源。

本批基线为`xiaobai-reduction-07-provider-ownership-20260801`；检查点为
`xiaobai-reduction-08-ndjson-transport-20260801`。

## CR-09验收口径

- 只有消费者全部属于单一领域、且能够按原函数体机械移动的方法才从应用门面移出。
- `_ifind_field`与`_ifind_row_code`继续保持静态/类方法签名、字段优先级、大小写规则和代码正则。
- 账号委托属于稳定公开门面；系统设置属于跨领域协调；后台刷新留到CR-11，本批均不得删除或重写。
- 移动后`DashboardService`必须继续通过Mixin解析同名方法，调用点和返回值不变。

## CR-09结果

- 将iFinD字段匹配和股票代码提取两个方法从应用大类机械移动到股池服务，原版与迁移方法AST逐项
  相等；应用大类不再直接拥有股池专属实现。
- 连同迁移期遗留空行，`backend/application.py`减少32行，股池服务增加24行，生产代码净减少8行。
- 候选324项、纯`app/`导出261项、24个JavaScript文件、API/架构注册表、Git空白检查和SQLite
  完整性检查通过；本批不涉及页面、CSS或浏览器行为。
- 本批不修改字段匹配、涨跌停原因补全、接口、数据源、缓存、数据库、权限或前端。

本批基线为`xiaobai-reduction-08-ndjson-transport-20260801`；检查点为
`xiaobai-reduction-09-service-facade-20260801`。

## CR-10验收口径

- 只移动调用方、数据表和业务含义均明确属于单一领域的方法；数据库连接、事务和返回值必须保持不变。
- `list_sector_phase_overrides`、`save_sector_phase_override`与`delete_sector_phase_override`必须由
  `backend/features/heaven/repository.py`拥有，并继续通过`ReviewDatabase`的Mixin解析。
- 不修改表结构、迁移顺序、时间格式、排序、冲突更新或删除结果语义。
- `wencai_saved_queries`及其三个方法属于已登记的账户隔离兼容数据；即使前端入口已取消，也必须保留。

## CR-10结果

- 将五行行业阶段覆盖的查询、保存和删除三个方法从根级`database.py`机械移动到问天Repository；
  调用名称、SQL、事务边界、时间值和返回结果均未改变。
- 根级数据库门面不再直接拥有问天领域的持久化实现，问财历史兼容表和方法完整保留，未扩大删除范围。
- 34项Repository、问天、账户隔离、清理契约及迁移定向测试通过；候选324项、纯`app/`导出261项、
  24个JavaScript文件、API/架构注册表、Git空白检查和SQLite完整性检查通过。
- 本批不修改页面、CSS、API、数据库结构、行情、数据源、业务计算、LLM、权限或后台任务。

本批基线为`xiaobai-reduction-09-service-facade-20260801`；检查点为
`xiaobai-reduction-10-repository-ownership-20260801`。

## CR-11验收口径

- 导入`backend.application`或构造`DashboardService`不得启动后台调度；必须先成功绑定HTTP端口，
  再由运行时显式启动。
- 同一`InProcessJobRunner`重复启动调度器必须返回同一活动线程，停止必须置位并在限定时间内等待退出，
  有序停止后允许重新启动。
- 运行时关闭顺序固定为：停止调度、等待已提交任务、关闭HTTP服务器；迁移对比工具继续兼容原版入口。
- 三个任务的注册定义、5秒刷新频率、3秒初始延迟、幂等键、锁、重试、业务函数和结果不得改变。
- 声明的超时继续是目标与审计字段；Python线程不能安全强杀，本批不伪造硬取消能力。

## CR-11结果

- 删除`DashboardService`构造阶段的调度副作用，端口占用、模块导入和单元测试不再提前创建后台写线程；
  `backend/bootstrap/runtime.py`成为正式启动与停止所有者。
- `InProcessJobRunner`集中持有调度停止事件和线程引用；重复启动幂等，停止可等待，原任务锁、持久化运行
  状态、成功幂等、失败记录和后续重试逻辑保持不变。
- 新增语法树与运行顺序门禁，固定“构造不启动”“绑定后启动”“停止后关服”，并补齐重复启动与重启测试。
- 候选328项、纯`app/`导出265项和45项Playwright通过；24个JavaScript文件、API/架构注册表、
  Git空白检查和SQLite完整性检查通过。
- 本批没有可安全删除的重复任务实现；为补齐原先缺失的生命周期，生产代码净增加24行。增加内容仅为
  调度状态、幂等启停和运行时委托，不新增业务层、任务或兼容包装。
- 本批不修改页面、CSS、API、数据源、刷新计算、自动选股条件、数据库结构、权限或LLM。

本批基线为`xiaobai-reduction-10-repository-ownership-20260801`；检查点为
`xiaobai-reduction-11-background-jobs-20260801`。

## CR-11人工验收修正

- 2026-08-02人工验收发现本地页面可访问，但行情与LLM同时无法连接。第一原因是验收服务由受限
  自动化会话启动，子进程继承了禁止外部网络访问的权限；重新在主机正常网络权限下启动后恢复。
- 随后的主模型连接测试暴露`LLMServiceMixin`机械迁移时遗漏`validate_text`导入，导致请求在真正
  访问模型前抛出`NameError`并关闭HTTP连接；恢复原依赖并增加保存模型连接探测的运行契约测试。
- 网站自身实测`000001`返回Tushare日K 60根、分时242点；主模型
  `MiniMax-M2.7-highspeed`在2236毫秒内回复`OK`，证明服务进程的数据与LLM出网链路均已恢复。
- 修正后候选329项、纯`app/`导出266项通过；本次只恢复缺失导入和测试，不修改模型配置、额度、
  提示词、回退策略、行情来源或计算逻辑。
- 继续验收观势时发现模型已经成功返回，但问天服务在保存解势记录前关闭了HTTP连接。原因是原版
  `server.py`已有的`secrets`导入在机械拆分到问天服务时遗漏，生成非观气记录去重键时触发
  `NameError`。迁移版恢复该标准库依赖，并增加“模型成功返回后保存观势结果”的完整服务回归测试。
- 使用`000001 平安银行`完成真实页面复测：六爻安全门6/6通过，解势结果正常返回并写入历史，
  `8797`错误日志为空。该修正不改变提示词、模型选择、额度、卦象计算、记录结构或前端行为。

本修正基线为`xiaobai-reduction-11-background-jobs-20260801`；检查点为
`xiaobai-reduction-11-runtime-connectivity-fix-20260802`；后续解势修正检查点为
`xiaobai-reduction-11-heaven-interpret-fix-20260802`。

## CR-12验收口径

- 本批只处理不同样式文件中、同为顶层、选择器与完整声明逐字等价的规则；媒体查询、伪状态、
  动画、问天隔离样式以及仅外形相似的规则不进入删除范围。
- 删除的必须是较早加载的副本，较晚层继续提供完全相同的最终声明；样式加载顺序、变量、HTML、
  JavaScript和主题切换逻辑均不改变。
- 迁移保真测试必须逐段登记允许退休的原始CSS文本，除登记片段外，其余源码继续与原版逐字符相等。
- 浏览器必须验证跨层顶层精确重复为零，并通过日间、夜间、桌面、390px移动端及全站交互回归。

## CR-12结果

- 通过浏览器CSSOM扫描七层运行样式，共发现57组完整重复规则；本批只批准其中7组跨文件顶层重复，
  分别涉及工作区显示、折叠侧栏、板块轮动末列、选股概率值、摘要条两项声明及龙虎榜原因列。
  其余50组位于同文件或嵌套媒体条件等更复杂环境，证据不足，继续保留。
- 删除7条较早加载的规则，三个生产CSS文件净减少19行、480字节；后层最终规则、选择器优先级与
  加载顺序均未改变，没有新增兼容覆盖或第二套样式实现。
- 新增浏览器CSSOM门禁，任何两个样式层再次出现相同顶层选择器与完整声明都会失败；迁移保真门禁
  只允许已登记的7个精确源码片段退休，其他CSS差异仍会失败。
- 真实`8797`页面复核情绪周期日间/夜间、龙虎榜和390×844移动端；三个受影响节点的计算样式
  与删除前一致，移动端无横向溢出。候选330项、CSS/前端契约33项、迁移对照63项及46项
  Playwright全部通过，24个JavaScript文件、API/架构注册表和SQLite完整性检查通过。
- 本批不修改页面布局、颜色、字体、间距、响应式规则、主题、动画、业务功能、API、数据库或部署。

本批基线为`xiaobai-reduction-11-heaven-interpret-fix-20260802`；检查点为
`xiaobai-reduction-12-css-exact-duplicates-20260802`。

## CR-13验收口径

- 本批只处理不同样式文件中、处于浏览器规范化后完全相同媒体条件下、选择器与完整CSSOM声明完全
  相同的规则；不同媒体上下文、同文件重复、近似声明、动画和问天隔离样式继续保留。
- 删除的必须是较早加载的副本，较晚样式层继续提供相同声明；媒体条件、规则顺序、选择器优先级、
  变量、HTML、JavaScript和主题逻辑不得改变。
- 保真门禁必须逐段登记允许退休的原始源码；浏览器门禁必须递归遍历嵌套规则，并只将同一上下文内
  跨文件的完整重复判为失败。
- 390×844明暗主题、1000×800中等宽度和1000×600低高度断点必须保持原计算样式与视觉结果。

## CR-13结果

- 浏览器CSSOM确认22组跨文件嵌套重复：1组位于721-1279px媒体条件，12组位于720px移动端条件，
  9组位于720px或1023px低高度复合条件；全部删除较早层副本，后层规则原样保留。
- `styles.css`减少65行，`redesign-v2.css`减少15行，生产CSS合计净减少80行、约1.9 KB；没有新增
  兼容覆盖、声明值、选择器或样式文件。
- Playwright门禁由顶层扫描扩展为递归上下文扫描，修改后同一嵌套上下文的跨文件完整重复为0；同文件
  重复和不同上下文规则不在本批范围，未被误删。
- 1000×800和1000×600修改前后截图逐字节一致；390×844明暗主题的关键显示、定位、间距、网格、
  溢出和导航状态一致，页面目视无差异。
- 候选330项、CSS/前端契约33项、迁移对照63项及46项Playwright全部通过；24个JavaScript文件、
  API/架构注册表和SQLite完整性检查通过。
- 本批不修改页面布局、颜色、字体、间距、主题、动画、业务功能、API、数据库、数据源、LLM或部署。

本批基线为`xiaobai-reduction-12-css-exact-duplicates-20260802`；检查点为
`xiaobai-reduction-13-css-nested-duplicates-20260802`。

## CR-13后续产品修正：龙虎榜整页滚动

- 2026-08-02用户明确要求取消龙虎榜“当日操作明细单独纵向滚动”，改为龙虎榜主内容区整页纵向滚动，
  解决低分辨率下操作明细可视高度过小的问题；这是经批准的产品行为变化，不作为CSS去重处理。
- 龙虎榜从桌面固定视口共享规则中独立出来；主内容区继续使用工作区高度并承担纵向滚动，游资卡片、
  操作明细和待归类席位按内容自然展开，宽操作表继续保留横向滚动。
- 保真门禁以精确源码替换单独登记本次差异，其他CSS仍与原母版逐字符比较；未新增覆盖层或第二套规则。
- 1366×768真实页面中主内容区为692px、内容高度为2620px，整页滚动可达；操作明细自身高度与内容
  高度一致，不再形成纵向小窗口，1180px宽表仍可横向滚动。
- 本次不修改龙虎榜数据、筛选、搜索、游资卡牌、表格字段、游资档案、API、数据库或其他页面的
  滚动所有权。

本修正基线为`xiaobai-reduction-13-css-nested-duplicates-20260802`；检查点为
`xiaobai-fix-dragon-page-scroll-20260802`。

## CR-14验收口径

- 只处理同一CSS文件、同一浏览器规范化媒体上下文中，选择器和完整CSSOM声明完全相同的规则；
  不同媒体上下文、近似声明、动画和问天隔离样式继续保留。
- 每组只删除较早出现的副本并保留最后一份原规则；样式文件加载顺序、媒体条件、选择器优先级、变量、
  HTML、JavaScript和主题逻辑均不得改变。
- 保真门禁必须精确登记原始片段及其出现/退休次数；浏览器门禁从“只拒绝跨文件重复”提升为
  “同一上下文内任何完整重复均拒绝”。
- 1366×768桌面暗色关键页面和390×844移动端关键页面的尺寸、滚动范围及视觉结果必须保持不变，
  并通过全站Playwright回归。

## CR-14结果

- 浏览器CSSOM确认33组同文件精确重复，其中两个规则各出现三次；共退休35个较早副本：
  `styles.css`9个、`renovation.css`25个、`redesign-v2.css`1个，运行时同上下文完整重复降为0。
- 三个生产CSS文件合计净减少97行、3272字节；未新增选择器、声明、覆盖层或样式文件，最后一份原规则
  及其媒体上下文全部保留。
- 保真门禁新增精确出现次数与退休次数审计，除登记片段外继续与原母版逐字节比较；Playwright CSSOM
  门禁现会拒绝跨文件和同文件重复，后续不能重新堆回同类规则。
- 1366×768暗色模式复核情绪周期、集合竞价、题材库、智能选股、问师和我的复盘；390×844复核
  情绪周期、集合竞价、智能选股和我的复盘。关键尺寸、滚动范围保持一致，移动端情绪周期截图逐像素一致，
  其余页面目视无差异且无横向溢出。
- 候选330项、CSS/前端契约33项、迁移对照63项及46项Playwright全部通过；24个JavaScript文件、
  API/架构注册表和SQLite完整性检查通过。
- 本批不修改页面布局、颜色、字体、间距、响应式行为、主题、动画、业务功能、API、数据库、数据源、
  LLM或部署。

本批基线为`xiaobai-fix-dragon-page-scroll-20260802`；检查点为
`xiaobai-reduction-14-css-same-file-duplicates-20260802`。

## 人工验收记录

- 2026-08-01：用户检查CR-02与CR-03运行结果，确认未发现明显异常。本记录仅表示本轮可见功能与
  页面使用未发现明显回归，不替代后续批次各自的自动测试和人工抽查。
