项目

一般

简介

0002-Sprint2交付物Checklist » 历史记录 » 版本 1

Huarui Lin, 2026-04-17 10:00

1 1 Huarui Lin
# 0002-Sprint2交付物Checklist
2
3
| Story ID | 编号 | 验收标准原文 | 预期结果 | 通过状态 |
4
|:---|:---:|:---|:---|:---:|
5
| **S2-01** | ① | `config.yaml` 新增 `data.raw_paths`(字典结构)与 `duckdb.memory_limit`(默认 `"40GB"`)节点 | Settings 可解析 `data.raw_paths` 与 `storage.duckdb_memory_limit` | |
6
| **S2-01** | ② | DuckDB SQL 绝对禁止 `SELECT *`,对 `fund_basic_info` 必须硬编码 `SELECT fund_id, fund_name, fund_type, create_date`,对净值表仅取核心 3 列 | SQL 中无 `SELECT *`,`columns` 参数显式声明 | |
7
| **S2-01** | ③ | Arrow Schema 包含上述 4 列 + 净值 3 列(`fund_type` 仅作临时审计流转,严禁带入最终落盘) | 提取阶段 6 列,落盘阶段 4 列 | |
8
| **S2-01** | ④ | S1 遗留核销:首个 PR 必须物理删除 S1 阶段的占位 Mock 测试代码,CI 全绿 | `tests/test_sprint1_placeholder.py` 不存在 | |
9
| **S2-01** | ⑤ | 单测:Mock 小 CSV 验证列裁剪与 JOIN 正确性 | `test_extract_raw_to_arrow_success` 通过 | |
10
| **S2-02** | ① | `segment_id` 截断处严格递增,同基金内从 0 开始 | 单测验证递增与从 0 开始 | |
11
| **S2-02** | ② | 建仓期(12周)剔除严格锚定且仅作用于 `segment_id == 0`,segment_0 被完全吞噬后 segment_1 仍保留 | `test_s202_segment_0_erased_but_segment_1_retained` 通过 | |
12
| **S2-02** | ③ | `cumulative_net_value ≤ 0` 的行被剔除 | `test_s202_nav_le_zero_physical_removal` 通过 | |
13
| **S2-02** | ④ | 异常值(单周涨跌幅绝对值 >50%)置 NULL,判定基准基于"本周原始有值且上周原始有值"的真实相邻周,ffill 填充值不参与判定 | `test_s202_long_gap_recovery_no_false_positive` 通过 | |
14
| **S2-02** | ⑤ | 单测覆盖 segment_0 被建仓期完全吞噬及长缺失 ffill 恢复首周免于误杀 | 全部 TestS202 用例通过 | |
15
| **S2-03** | ① | 存活期计算 = 该基金所有段有效周数之和,< 52 周整体剔除 | `test_survival_filtering` 通过 | |
16
| **S2-03** | ② | `data/processed/` 下产出 `net_value_YYYY.parquet`,显式指定 `row_group_size=100000` | Parquet 文件存在且 row_group_size 正确 | |
17
| **S2-03** | ③ | 落盘 Schema 仅含 4 列 `fund_id`(String), `net_value_date`(Date), `cumulative_net_value`(Float64), `segment_id`(UInt32),临时列 `fund_type` 落盘前必须被显式丢弃 | `test_schema_locked_and_float64` 通过 | |
18
| **S2-03** | ④ | `cumulative_net_value` 全链路强制映射为 `Float64`,严禁使用 Decimal | DuckDB columns 声明 DOUBLE + Arrow cast float64 | |
19
| **S2-03** | ⑤ | `create_duckdb_view()` 严禁依赖持久化状态,必须动态扫描年份文件拼接生成 | `test_create_duckdb_view_success` 通过 | |
20
| **S2-04** | ① | 落盘后即刻按年份文件逐个计算 SHA-256,产出 `data/metadata/processed_hash.json` | 各 Parquet 文件 SHA-256 已记录 | |
21
| **S2-04** | ② | 产出 `data/metadata/data_audit.json`,严格符合 5 大根节点 Schema,`whitelist_retention_rate` 分母取原始 CSV 物理总行数 | JSON 结构含 pipeline/input/filtering/cleaning/output | |
22
| **S2-04** | ③ | 压测日志包含 DuckDB/Arrow 转换/Polars 状态机三个维度的 `peak_memory_gb`,总峰值 ≤ 40GB | 真实压测总峰值 1.449 GB | |
23
| **S2-04** | ④ | 若 `retention_rate < 15%`,M2 标记"带风险通过",在 Redmine 建立 High 级别 Bug 单 | 当前 retention_rate ≈ 34.17%,无需标记 | |
24
| **S2-05** | ① | `docs/data_contract.md` 沉淀 Parquet 4 列 Schema、审计 JSON Schema 定义及 Float64 选型依据 | 文档已落盘,Schema 引用自动生成产物 | |
25
| **S2-05** | ② | 产出 ADR `0003-s2-full-arrow-exception.md`,固化 FW-3 豁免边界、内存预估及下游禁用声明 | ADR 已落盘,编号 0003 | |
26
| **S2-05** | ③ | S2-01 至 S2-05 任务卡片在 Redmine 逐条填入验收标准 | 本 Checklist 已提供 | |
27
| **S2-05** | ④ | CI 软预警检查通过(`src/` 变更已同步 `docs/` 变更) | `check_src_docs_sync.sh` 已集成至 deployment.yaml | |