# 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_price` 和 `daily_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/明显偏贵43`;`09880.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 的合并实现复审。