0001-Sprint2规划会议 » 历史记录 » 版本 1
Huarui Lin, 2026-04-15 20:03
| 1 | 1 | Huarui Lin | # Sprint2规划会议 |
|---|---|---|---|
| 2 | |||
| 3 | **Sprint 2 规划会议 Agenda** |
||
| 4 | **会议主题**:Sprint 2 数据基建与入库攻坚(M2 里程碑交付规划) |
||
| 5 | **会议目标**:冻结 M2 模块间接口契约;正式化全量 Arrow 特例的架构决策;将规约条款拆解为 Redmine 可执行的强卡控验收标准。 |
||
| 6 | **会议时长**:2.5 小时 |
||
| 7 | **参会角色**:项目经理(Henry Lin)、算法/研发工程师、数据资产管理员(可选出席,视数据源疑问而定) |
||
| 8 | |||
| 9 | --- |
||
| 10 | ### 议程一:S1 遗留闭环与 S2 护航规则宣读(15 分钟) |
||
| 11 | |||
| 12 | * **S1 待办核销**: |
||
| 13 | * 确认 **TODO-02**(S1 占位 Mock 测试代码物理销毁)将作为 S2-01 首个 PR 合并的前置强制拦截条件。 |
||
| 14 | * 确认 **RISK-01/TODO-01**(CI 性能熔断 180 秒阈值)的监控机制在 S2 引入真实 DuckDB I/O 后的响应预案。 |
||
| 15 | * **S2 绝对红线重申**:全局严禁 Pandas;严禁魔法数字(必须走 `config.yaml` 新增节点);DuckDB 职责边界不可逾越。 |
||
| 16 | |||
| 17 | ### 议程二:架构决策正式化:FW-3 全量 Arrow 特例(20 分钟) |
||
| 18 | |||
| 19 | * **决策落锤**:基于会前确认,正式批准 Step 2 的 `process_timeseries()` 阶段作为特例,一次性加载 DuckDB 粗筛后的全量 Arrow(约 2300万行,预估内存 1.2GB)。 |
||
| 20 | * **合规防腐要求**: |
||
| 21 | * 研发必须在本次会议后输出 `docs/adr/002-full-arrow-exception-for-s2.md`。 |
||
| 22 | * ADR 中必须明确记录:特例仅限于“缺失值填充与截断状态机”阶段,进入后续滚动窗口计算(Step 3)时,必须回到 FW-3 按年串行提取的标准范式。 |
||
| 23 | * 同步更新 `docs/architecture_baseline.md` 中 FW-3 章节的例外说明。 |
||
| 24 | |||
| 25 | ### 议程三:数据契约对齐与 DuckDB 粗筛设计(30 分钟) |
||
| 26 | |||
| 27 | * **DuckDB 投影防偏移**:审核 S2-01 的 SQL 逻辑,确认 `fund_basic_info` 的 4 列冗余字段(基于 S1 CONF-04 承诺函)已在 DuckDB 层通过硬编码 `SELECT` 显式裁剪,不进入 Arrow 生态。 |
||
| 28 | * **审计日志 Schema 锁定**:逐字段复核《0002-数据基建》中定义的 `data_audit.json` 标准 Schema。确认研发理解所有统计字段(如 `whitelist_retention_rate` 的分母定义)的计算来源,禁止硬编码。 |
||
| 29 | * **配置扩展确认**:确认 `config.yaml` 中 `data.raw_paths` 与 `duckdb.memory_limit` 的嵌套结构设计。 |
||
| 30 | |||
| 31 | ### 议程四:Polars 时序状态机核心逻辑攻防(45 分钟) |
||
| 32 | |||
| 33 | * **CR-001 `segment_id` 生成逻辑**:研发需展示 `>4周连续缺失` 截断并递增 `segment_id` 的 Polars 向量化实现思路(严禁全局 Python for 循环),PM 审查其跨年连续性与边界条件。 |
||
| 34 | * **建仓期硬删逻辑锚定**:确认建仓期 12 周的剔除基准严格取 **`segment_id == 0` 段的首条日期**向前推算,而非该基金在数据库中的绝对首条日期。 |
||
| 35 | * **异常值处理矩阵**:明确区分两种异常的处理物理动作: |
||
| 36 | * `cumulative_net_value ≤ 0`:物理剔除行。 |
||
| 37 | * 单周涨跌幅绝对值 > 50%:保留行,仅将该行 `cumulative_net_value` 置为 NULL(保留时间轴连续性供 ffill 使用)。 |
||
| 38 | * **单测边界用例对齐**:确认 `tests/test_data_loader.py` 必须覆盖的 5 个极端场景(跨年 ffill、第 5 周缺失截断、10 周短命基金被建仓期完全吞噬、异常值 NULL 化后恢复、多段截断后的 segment_id 独立性)。 |
||
| 39 | |||
| 40 | ### 议程五:落盘、压测与数据血缘(30 分钟) |
||
| 41 | |||
| 42 | * **存储契约确认**:确认 PyArrow `write_parquet()` 显式指定 `row_group_size=100000`;确认覆盖写模式(不追加);确认最终 Schema 严格锁定为 4 列(`fund_id:String`, `net_value_date:Date`, `cumulative_net_value:Float64`, `segment_id:UInt32`)。 |
||
| 43 | * **DuckDB VIEW 重建机制**:确认 `create_duckdb_view()` 函数在每次全量刷盘时,动态扫描 `data/processed/` 目录拼接年份文件的逻辑。 |
||
| 44 | * **内存压测方案**:确认在 64GB 实体机上的压测观测点(DuckDB 阶段峰值、全量 Arrow 转换峰值、Polars 处理峰值),明确 `peak_memory_gb` 必须真实写入审计日志。 |
||
| 45 | * **SHA-256 校验闭环**:确认按年份文件逐个计算 Hash 并落盘至 `processed_hash.json` 的调用时机。 |
||
| 46 | |||
| 47 | ### 议程六:Redmine 任务拆解与强卡控验收标准录入(20 分钟) |
||
| 48 | |||
| 49 | * 将 S2-01 至 S2-05 拆解录入 Redmine。 |
||
| 50 | * 将本 Agenda 议程三、四、五中确认的所有“规约硬性指标”,直接作为“自定义字段-验收标准”写入对应的 Redmine 任务卡片中(如:M2 Done 标准中的 5 条绝对卡点)。 |
||
| 51 | * 明确 S2-05(Gitea `/docs` 同步)的交付时机,确保不触发 CI 软预警。 |
||
| 52 | |||
| 53 | ### 议程七:Q&A 与 签收确认(10 分钟) |
||
| 54 | |||
| 55 | * 清理会议遗留的模糊表述。 |
||
| 56 | * 三方(PM、研发、数据方)签字确认 Sprint 2 目标锁定,研发正式领受任务进入开发阶段。 |