edit | blame | history | raw

2026-08-05 股票估值每日台账 MVP 工作记录

  • 事项:DEV-STOCK-VALUATION-LEDGER-MVP-20260805-001
  • owner:dev.developer.project.secondary / infodev-2
  • requester:case_analysis.analyst.valuation
  • reviewer:dev.reviewer.project / inforev
  • 管理派单:HANDOFF-INFOADMIN-INFODEV2-STOCK-VALUATION-LEDGER-MVP-ASSIGN-20260805-001
  • 任务起点:2026-08-05T17:26:10+08:00
  • 当前状态:MySQL 单后端、HOLD/2 返修和前复权专表 delta 已完成,待合并实现复审。

1. 初版与审核

初版按当时需求实现 SQLite 四表 CLI,完成 15 项测试、125/136 正式导入,未运行正式 daily。共享审核员返回 HOLD/4:V2 fqt=1 不能证明未复权和完整日;后续复评错误地估值日当日生效;同快照哈希下 calculation 改值未识别;全失败会发布空 latest 且双文件非成对提交。

审核期间用户明确否决 SQLite,需求 owner 把正式口径改为本机 MySQL 独立库 stock_valuation,项目管理员冻结:行情只读 trading_xuntou、台账只写 stock_valuation、不得读写 tianxia、不得回退 V2 网络、不保留双后端。

2. MySQL 单后端实施

  • 新增 database.py,只从 STOCK_VALUATION_MYSQL_* 或不入库本机 JSON 读取连接参数;测试库名需要显式开关和固定前缀。
  • schema.sql 改为 MySQL 8 / InnoDB / utf8mb4 四表,连接和全部 CRUD 改为 mysql.connector 参数化 SQL。
  • 导入仍只读正式快照和 valuation_results.json;同身份逐不可变字段核对,差异写 E_IMMUTABLE_VERSION_CONFLICT
  • 第一版估值日可用;后续版本次日生效,前版有效至新估值日。
  • 生产行情桥只做 trading_xuntou SELECT。最新用户口径固定读取 cn_stock_kline_1d_front 前复权专表,检查专表 schema、证券身份、正式日历、请求日以前最大开市日、current 水位、15:05 最终装载时间、来源和币种;禁止通用表、dividend_type 推断和 V2/network 回退。
  • daily_pricedaily_judgement 在同一 MySQL 事务中写入;数据库错误整批回滚。
  • latest 两文件用 staging/backup/replace/rollback 状态机;全失败不发布也不覆盖旧文件。
  • run_daily.ps1 只执行一次 MySQL daily,计划任务仍仅为文档示例。

3. 验证

  • MySQL 隔离测试最终:22/22 PASS / 86.679s;含整批故障回滚、两文件 staging 全点异常矩阵、非正区间零半状态、前复权专表 schema 正反合同、大小写敏感的 ticker/source 精确门禁、陈旧日历水位阻断和禁旧路径。
  • project 完整回归:119/119 PASS / 140.964s
  • 正式结果包隔离库:冷导入 136,热导入 136 unchanged,计数 125/136/0/0。
  • 125 证券离线 daily:125 条价格和判定,四标签全覆盖,复跑无新增。
  • F2:2026-08-06 复评当日旧版本、2026-08-07 新版本,历史不回写。
  • F3:同哈希下 base_low 10 -> 11 明确冲突,原值保留。
  • F4:全失败首次双文件不存在,后续保留旧字节;两个替换点的 OSError/KeyboardInterrupt/SystemExit 均回滚。
  • 首次 MySQL 集中复审=HOLD/2:F1—F3 关闭;F4-R1 指出 staging 的 create/write/flush/fsync 未纳入回滚,P1 指出判定 E_RANGE 可在 price INSERT 后形成半状态。
  • F4-R1 修复:两份 stage 的四故障点 × OSError/KeyboardInterrupt/SystemExit 共 24 组均不改正式 pair 且 stage/backup 为 0。
  • P1 修复:在任何价格 INSERT 前校验并计算判定;base_low=0 得到 FAILED/E_RANGE/0 price/0 judgement
  • 复审过程中用户再次明确行情口径:前复权专表 trading_xuntou.cn_stock_kline_1d_front。已通知审核员旧冻结快照被需求变更部分取代;代码、测试、工程说明和证据按专表 delta 更新,未运行生产 daily。
  • 旧快照限定复审返回 SUPERSEDED_REQUIREMENT_CHANGE,其中 F4-R1/P1 子结论均关闭、范围内阻断为 0;整体 PASS 留给当前专表新快照。
  • 200 行暖查询小于 1 秒。
  • compileall、CLI help、Windows PowerShell 5.1 语法、strict UTF-8/no BOM/尾随空白、scoped diff 和凭据扫描均 PASS;治理=OK/projects1/warnings0
  • 需求 owner 随后按冻结合同完成一次生产 daily;本开发线程仅只读核对正式计数、source、规范行哈希和输出哈希,没有重复运行或改写历史行。

4. 正式 MySQL 与清理

从正式结果包重建并热复验:

  • security=125
  • valuation_version=136
  • daily_price=124
  • daily_judgement=124
  • 跨表孤儿=0
  • 热导入=inserted=0/unchanged=136/gap_count=1

MySQL 核验通过后,按事先登记的精确路径删除旧试制库 ana-data/result/股票估值/估值台账/stock_valuation.sqlite3(删除前 163840/48AF0F...99C),同时删除仅服务该文件的 .gitignore。旧库未被用作迁移源;正式台账可从结果包重建。

5. 边界

  • 需求 owner 生产结果:as_of=2026-08-05,124/124 只 A 股覆盖,标签 偏低3/基本合理39/偏贵39/明显偏贵4309880.HK 为唯一不支持缺口。
  • 审核员复现 current 日历但 window_end < as-of 可误收旧交易日;已在 SQL expected/outer gate 和 _record_from_row 双重要求水位覆盖请求 as-of,补 2026-08-04 window_end / 2026-08-05 as-of 阻断反例。
  • 正式 source ID 全部为 trading_xuntou.cn_stock_kline_1d_front:xtquant:front;开发线程只读核验 source/close/版本/标签一致性,没有重复执行生产 daily。
  • 港股当前不在 A 股行情合同内;不新增 provider。
  • 外部网络、V2 provider、开发线程生产 daily、计划任务安装、tianxia 动作和 ana-dev 修改均为 0。
  • 下一步冻结新哈希并向同一审核员提交 F4-R1/P1 与前复权专表 delta 的合并实现复审。