# P0-1 SPI 参数深入调研报告(step1) > 日期:2026-05-04 > 触发:Neo 在 `04a-conflicts-P0-detail.md` § P0-1 反馈,要求"先深入调研后实施" > 调研者:子代理(SPI 深入调研专项) > 范围:仅 step1(A 实现 PRD 全集 + B 历史变更 + C 当前实现),step2 实施由 Neo 拍板后另开 > 结论先行:测试库实际 27 行 SPI 参数,与代码 DEFAULT_PARAMS、BD 手册三方一致; > 文档矛盾根源:`docs/prd/specs/00-数据依赖矩阵.md` L272 写"26 个" 是文档过期, > `scripts/ops/run_seed_spi_params.py` L62 写"期望 28 个" 是脚本设计期未对齐最终值。 --- ## 一、SPI 是什么(业务定位摘要) **SPI**(Spending Power Index,消费力指数)是 NeoZQYY 指数体系第 7 个指数(继 WBI/NCI/RS/OS/MS/ML 之后),粒度为 `(site_id, member_id)`,**衡量会员在门店内的综合消费力层级**。 **业务回答的问题**: - 这个客户整体消费能力在门店内属于什么层级? - 近期消费推进速度是否明显变快? - 是稳定高消费,还是偶发冲高? **运营定位**(与其他指数的分工): - NCI/WBI:决定"要不要优先触达"(紧迫度) - **SPI:决定"投入多大资源、用什么档位策略"**(消费力分层) - OS/RS/MS/ML:决定"谁来做、什么时候、谁更容易做成"(关系归属) **算法结构**:主分(SPI_raw)= w_L × Level + w_S × Speed + w_P × Stability,默认权重 0.60/0.30/0.10。三子分各自由"金额压缩 + 加权"得到原始分,再经 BaseIndexTask 统一映射为 [0, 10] 展示分。 --- ## 二、SPI 三子分参数清单(基于 PRD + SPEC + 代码 + DB 四方对照) > 列说明: > - **PRD 默认值** = `docs/prd/SPI 消费力指数.md` § 8.2 的取值(部分基数标"按门店分布校准",此处用"校准"表示) > - **SPEC 默认值** = `docs/specs/spi-spending-power-index/design.md` 中 DEFAULT_PARAMS 的取值 > - **代码默认值** = `apps/etl/connectors/feiqiu/tasks/dws/index/spending_power_index_task.py` L70-L106 > - **DB 实际值** = 测试库 `test_etl_feiqiu.dws.cfg_index_parameters` 当前取值(2026-05-04 查) > - 本表共 27 行,与代码 DEFAULT_PARAMS、BD 手册、测试库 DB 三方一致 ### 2.1 窗口与平滑(3 个) | # | 参数 key | 含义 | PRD | SPEC | 代码 | DB | |---|---------|------|-----|------|------|-----| | 1 | `spend_window_short_days` | 短窗口(速度) | 30 | 30 | 30 | 30 | | 2 | `spend_window_long_days` | 长窗口(层级/稳定性上限) | 90 | 90 | 90 | 90 | | 3 | `ewma_alpha_daily_spend` | 日消费 EWMA 平滑系数 | 0.3 | 0.3 | 0.3 | 0.3 | ### 2.2 金额压缩基数(6 个,可被门店中位数自动校准覆盖) | # | 参数 key | 含义 | PRD | SPEC | 代码 | DB | |---|---------|------|-----|------|------|-----| | 4 | `amount_base_spend_30` | 30 天消费压缩基数 | 校准 | 500.0 | 500.0 | 500.0 | | 5 | `amount_base_spend_90` | 90 天消费压缩基数 | 校准 | 1500.0 | 1500.0 | 1500.0 | | 6 | `amount_base_ticket_90` | 90 天客单压缩基数 | 校准 | 200.0 | 200.0 | 200.0 | | 7 | `amount_base_recharge_90` | 90 天充值压缩基数 | 校准 | 1000.0 | 1000.0 | 1000.0 | | 8 | `amount_base_speed_abs` | 绝对速度压缩基数 | 校准 | 100.0 | 100.0 | 100.0 | | 9 | `amount_base_ewma_90` | EWMA 速度压缩基数 | 校准 | 50.0 | 50.0 | 50.0 | ### 2.3 总分权重(3 个) | # | 参数 key | 含义 | PRD | SPEC | 代码 | DB | |---|---------|------|-----|------|------|-----| | 10 | `weight_level` | 总分中 Level 权重 | 0.60 | 0.60 | 0.60 | 0.60 | | 11 | `weight_speed` | 总分中 Speed 权重 | 0.30 | 0.30 | 0.30 | 0.30 | | 12 | `weight_stability` | 总分中 Stability 权重 | 0.10 | 0.10 | 0.10 | 0.10 | > 校验:0.60 + 0.30 + 0.10 = 1.00 (`run_seed_spi_params.py` 第 96-103 行 SQL 已覆盖此校验) ### 2.4 Level 子分内部权重(4 个) | # | 参数 key | 含义 | PRD | SPEC | 代码 | DB | |---|---------|------|-----|------|------|-----| | 13 | `w_level_spend_30` | Level 子分中 30 天消费项 | 0.30 | 0.30 | 0.30 | 0.30 | | 14 | `w_level_spend_90` | Level 子分中 90 天消费项 | 0.35 | 0.35 | 0.35 | 0.35 | | 15 | `w_level_ticket_90` | Level 子分中 90 天客单项 | 0.20 | 0.20 | 0.20 | 0.20 | | 16 | `w_level_recharge_90` | Level 子分中 90 天充值项 | 0.15 | 0.15 | 0.15 | 0.15 | > 校验:0.30 + 0.35 + 0.20 + 0.15 = 1.00 ### 2.5 Speed 子分内部权重(3 个) | # | 参数 key | 含义 | PRD | SPEC | 代码 | DB | |---|---------|------|-----|------|------|-----| | 17 | `w_speed_abs` | 绝对速度项 | 0.50 | 0.50 | 0.50 | 0.50 | | 18 | `w_speed_rel` | 相对速度项(加速) | 0.30 | 0.30 | 0.30 | 0.30 | | 19 | `w_speed_ewma` | EWMA 速度项 | 0.20 | 0.20 | 0.20 | 0.20 | > 校验:0.50 + 0.30 + 0.20 = 1.00 ### 2.6 稳定性参数(2 个,90 天上限) | # | 参数 key | 含义 | PRD | SPEC | 代码 | DB | |---|---------|------|-----|------|------|-----| | 20 | `stability_window_days` | 稳定性窗口(固定上限 90) | 90 | 90 | 90 | 90 | | 21 | `use_stability` | 是否启用稳定性子分(0/1) | 1 | 1 | 1 | 1 | > PRD § 8.2 还列了一个 `stability_mode`(默认 1=周覆盖率),**但 SPEC/代码/DB 均未实现**。当前只有"周覆盖率"一种实现,因此 `stability_mode` 落地时被合理省略——这不是缺失。 ### 2.7 映射与平滑(5 个,复用 BaseIndexTask) | # | 参数 key | 含义 | PRD | SPEC | 代码 | DB | |---|---------|------|-----|------|------|-----| | 22 | `percentile_lower` | 下分位 | 5 | 5 | 5 | 5 | | 23 | `percentile_upper` | 上分位 | 95 | 95 | 95 | 95 | | 24 | `compression_mode` | 压缩模式(0/1/2) | 1 | 1 | 1 | 1 | | 25 | `use_smoothing` | 是否分位 EWMA 平滑 | 1 | 1 | 1 | 1 | | 26 | `ewma_alpha` | 分位 EWMA 平滑系数 | 0.2 | 0.2 | 0.2 | 0.2 | ### 2.8 速度计算辅助(1 个,代码新增) | # | 参数 key | 含义 | PRD | SPEC | 代码 | DB | |---|---------|------|-----|------|------|-----| | 27 | `speed_epsilon` | 防除零小量 | (隐含) | 1e-6 | 1e-6 | 1e-6 | > PRD § 5.3 公式 V_rel = ln((v_30 + ε) / (v_90 + ε)) 用了 ε,但 § 8.2 没把 ε 单列为参数。SPEC 与代码把它显式化为 `speed_epsilon=1e-6`,这是工程合理的"PRD 隐含→代码显式"补全,不是参数膨胀。 ### 2.9 期望参数总数对比 | 来源 | 期望数量 | 是否与实际(27)吻合 | 备注 | |------|---------|-------------------|------| | PRD § 8.2 表格累加 | 27(若把 stability_mode 算上则 28) | 否(差 1,stability_mode 未落地) | PRD 写了 stability_mode 默认 1,但工程未实现 | | SPEC `P2-etl-dws-miniapp-extensions.md` § AC6 | 26 | **否(少 1)** | T3 任务清单又写"27 个",**SPEC 内部前后矛盾** | | SPEC `P2-etl-dws-miniapp-extensions.md` § T3 | 27 | **是** | 与代码 DEFAULT_PARAMS 一致 | | SPEC `design.md` DEFAULT_PARAMS | 27 | **是** | 27 行清单 | | `docs/prd/specs/00-数据依赖矩阵.md` L272 | 26 | **否(少 1)** | 文档过期,当前 P0-1 冲突的源头 | | BD 手册 `BD_Manual_dws_member_spending_power_index.md` § 5 | 27 | **是** | 表格 27 行 | | 代码 `DEFAULT_PARAMS` | 27 | **是** | 真理之源 | | 运维脚本 `run_seed_spi_params.py` L62 | **28** | 否(多 1) | 脚本写"期望 28",但实际表里只有 27;若该脚本最近未跑,则只是脚本 stale | | 测试库 `test_etl_feiqiu.dws.cfg_index_parameters` | **27** | (基准) | 实际值 | > 真理之源:**测试库 27 行 = 代码 DEFAULT_PARAMS 27 项 = BD 手册 27 行 = SPEC § T3 / SPEC design 27 项**。 > 所有偏差都集中在两份文档(00 矩阵 26、SPEC AC6 26)和一个脚本(`run_seed_spi_params.py` 28)上。 --- ## 三、历史变更时间线 > 数据来源:`git log --all -- "**spending_power**" "**SPI**"` + `docs/audit/changes/*.md` Grep > 注:本仓库历史 commit 较粗(多为周累积合流),无 SPI 单独 commit。下表按审计文件粒度还原。 | 日期 | 提交 / 审计文件 | 摘要 | |------|----------------|------| | 2026-02-22 ~ 02-23 | commit `b25308c` "feat: P1-P3 全栈集成" | SPI 任务初次落地:`spending_power_index_task.py` 入仓、`dws.dws_member_spending_power_index` 表创建、cfg_index_parameters 27 行 SPI 种子数据初始化(测试库)。SPEC `P2-etl-dws-miniapp-extensions.md` AC6 标注"effective_from=2026-02-23" | | 2026-02-27 | `docs/audit/changes/2026-02-27__biz-day-cutoff-prd-sync-check.md` | 营业日切点(`BUSINESS_DAY_START_HOUR=8`)全栈贯通,SPI 任务被列入 20+ DWS 任务批量重构清单——`tasks/dws/index/spending_power_index_task.py` 引入 `biz_date_sql_expr` 适配营业日分割。**只改代码,未改参数** | | 2026-03-02 | `docs/audit/changes/2026-03-02__spi-calibration-nonzero-median.md` | **SPI 基数校准改用非零样本中位数**:`_CALIBRATE_MIN_SAMPLE = 10`,零消费会员不再拉低中位数。验证 6/6 回退 → 4/6 有效校准 + 2/6 安全回退。**只改代码,不改 cfg_index_parameters 内容** | | 2026-03-15 | `docs/audit/changes/2026-03-15__ddl-baseline-consolidation-bd-manual-reorg.md` | DDL 基线合并 + BD 手册重整,SPI 表 DDL 从迁移目录被合并到 `docs/database/ddl/etl_feiqiu__dws.sql`。**只动 DDL/文档,不动参数** | | 2026-03-20 | `docs/audit/changes/2026-03-20__rns13-board-apis-e2e-fix.md` 等 | board-customer 看板用到 SPI 展示分,联调修复。**未触参数** | | 2026-03-24 | `docs/audit/changes/2026-03-24__lookback_days_60_to_90.md` | RS/MS/ML 的 `lookback_days` 60→90,**与 SPI 无关**(SPI 用 `spend_window_long_days=90` 而非 lookback_days),但同时间段有人改过指数体系参数,需注意 | **关键观察**: 1. SPI 自 2026-02-23 落地以来,**参数总数 27 没变过**,只动过代码(校准逻辑改进、营业日切点适配)。 2. 历史会话档案(`docs/ai-env-history/` 与 `docs/claude-history/`)Glob 不命中 SPI 关键词——本机历史会话归档主要按时间分目录,无 SPI 专项会话。 3. 没有"参数从 26 加到 27"或"从 27 减到 26"的迁移脚本或审计记录。**00 矩阵的 26 是早期文档草稿值,未随后续 27 项落地而更新**。 --- ## 四、当前测试库实际数据 ### 4.1 总数 ```sql -- 测试库 test_etl_feiqiu @ 2026-05-04 SELECT COUNT(*) FROM dws.cfg_index_parameters WHERE index_type='SPI'; -- 结果: 27 SELECT COUNT(DISTINCT param_name) FROM dws.cfg_index_parameters WHERE index_type='SPI'; -- 结果: 27 (无重复 param_name) ``` ### 4.2 全部 param_name 清单(按字母序,实际查询结果) ``` 1. amount_base_ewma_90 = 50.000000 2. amount_base_recharge_90 = 1000.000000 3. amount_base_speed_abs = 100.000000 4. amount_base_spend_30 = 500.000000 5. amount_base_spend_90 = 1500.000000 6. amount_base_ticket_90 = 200.000000 7. compression_mode = 1.000000 8. ewma_alpha = 0.200000 9. ewma_alpha_daily_spend = 0.300000 10. percentile_lower = 5.000000 11. percentile_upper = 95.000000 12. speed_epsilon = 0.000001 13. spend_window_long_days = 90.000000 14. spend_window_short_days = 30.000000 15. stability_window_days = 90.000000 16. use_smoothing = 1.000000 17. use_stability = 1.000000 18. w_level_recharge_90 = 0.150000 19. w_level_spend_30 = 0.300000 20. w_level_spend_90 = 0.350000 21. w_level_ticket_90 = 0.200000 22. w_speed_abs = 0.500000 23. w_speed_ewma = 0.200000 24. w_speed_rel = 0.300000 25. weight_level = 0.600000 26. weight_speed = 0.300000 27. weight_stability = 0.100000 ``` ### 4.3 与 PRD/SPEC 期望对比 - **缺哪几行**: 0 行(代码 DEFAULT_PARAMS 27 项全部存在) - **多哪几行**: 0 行 - **值偏差**: 0 项(每一项的 `param_value` 都与 PRD § 8.2 + SPEC design.md DEFAULT_PARAMS 完全一致) - **结论**: **DB 当前状态是干净的、与代码默认值完全对齐** ### 4.4 权重归一化校验(运维脚本逻辑搬运) | 校验项 | 实际值 | 预期值 | 通过? | |-------|-------|-------|-------| | `weight_level + weight_speed + weight_stability` | 1.00 | 1.00 | ✓ | | Level 内部权重之和(spend_30 + spend_90 + ticket_90 + recharge_90) | 1.00 | 1.00 | ✓ | | Speed 内部权重之和(abs + rel + ewma) | 1.00 | 1.00 | ✓ | --- ## 五、代码兜底默认值清单 > 来源:`apps/etl/connectors/feiqiu/tasks/dws/index/spending_power_index_task.py` L70-L106 `DEFAULT_PARAMS` > 兜底机制:`execute()` L181-L182 `params = {**self.DEFAULT_PARAMS, **db_params}`,**DB 缺失时用代码默认值** | param_key | 代码 default | PRD/SPEC default | 一致? | |-----------|-------------|-----------------|-------| | spend_window_short_days | 30 | 30 | ✓ | | spend_window_long_days | 90 | 90 | ✓ | | ewma_alpha_daily_spend | 0.3 | 0.3 | ✓ | | amount_base_spend_30 | 500.0 | (PRD: 校准/SPEC: 500.0) | ✓(SPEC 一致) | | amount_base_spend_90 | 1500.0 | (PRD: 校准/SPEC: 1500.0) | ✓ | | amount_base_ticket_90 | 200.0 | (PRD: 校准/SPEC: 200.0) | ✓ | | amount_base_recharge_90 | 1000.0 | (PRD: 校准/SPEC: 1000.0) | ✓ | | amount_base_speed_abs | 100.0 | (PRD: 校准/SPEC: 100.0) | ✓ | | amount_base_ewma_90 | 50.0 | (PRD: 校准/SPEC: 50.0) | ✓ | | w_level_spend_30 | 0.30 | 0.30 | ✓ | | w_level_spend_90 | 0.35 | 0.35 | ✓ | | w_level_ticket_90 | 0.20 | 0.20 | ✓ | | w_level_recharge_90 | 0.15 | 0.15 | ✓ | | w_speed_abs | 0.50 | 0.50 | ✓ | | w_speed_rel | 0.30 | 0.30 | ✓ | | w_speed_ewma | 0.20 | 0.20 | ✓ | | weight_level | 0.60 | 0.60 | ✓ | | weight_speed | 0.30 | 0.30 | ✓ | | weight_stability | 0.10 | 0.10 | ✓ | | stability_window_days | 90 | 90 | ✓ | | use_stability | 1 | 1 | ✓ | | percentile_lower | 5 | 5 | ✓ | | percentile_upper | 95 | 95 | ✓ | | compression_mode | 1 | 1 | ✓ | | use_smoothing | 1 | 1 | ✓ | | ewma_alpha | 0.2 | 0.2 | ✓ | | speed_epsilon | 1e-6 | (PRD 隐含 ε,SPEC 显式 1e-6) | ✓ | **结论**:**代码兜底默认值 100% 与 PRD/SPEC 一致**。即使 cfg_index_parameters 表被清空,SPI 任务也能用 DEFAULT_PARAMS 跑出与当前 DB 完全相同的结果。 --- ## 六、step2 推荐更新方案(给 Neo 拍板) > 调研结论:DB(27)、代码(27)、BD 手册(27)、SPEC § T3(27) 完全对齐。**实际没有"参数缺失"问题,只有"两份文档 + 一个脚本写错数字"的文档维护问题**。 ### 选项 A:仅改文档(推荐,工作量最小) **动作**: 1. 改 `docs/prd/specs/00-数据依赖矩阵.md` L272: "26 个参数" → "27 个参数" 2. 改 `docs/prd/specs/P2-etl-dws-miniapp-extensions.md` AC6: "26 个参数" → "27 个参数",与同文件 T3 任务清单的"27 个参数"对齐 3. 改 `scripts/ops/run_seed_spi_params.py` L62: 期望 28 → 27,并修正注释 "应为 28 个" → "应为 27 个" 4. 在 `docs/audit/changes/2026-05-04__spi-param-count-doc-fix.md` 写审计 **优点**:零代码风险、零 DB 风险,5 分钟完成。 **劣势**:依赖"DB 当前 27 是正确的"这一事实,所以**前提是 Neo 接受 step1 调研结论**(已在第四节用三方对照证明)。 ### 选项 B:加 CI 校验脚本(配合选项 A,长期保险) **动作**:在选项 A 基础上,新增 `scripts/audit/verify_spi_params.py`,实现"对照代码 DEFAULT_PARAMS keyset 与 cfg_index_parameters DISTINCT param_name keyset",有差异时退出码非零,可挂到 pre-commit 或 CI。 **优点**:防止未来再次出现"代码加了参数但 DB 没补 / DB 残留 deprecated 参数"的漂移。 **劣势**:本次冲突解决周期略增,需要一份新脚本 + 测试。 ### 选项 C:补 step2 提到的"更新所有每日 SPI 参数"(最大动作) > 关键澄清:Neo 反馈写"完成后更新所有每日的 SPI 参数",这条措辞需要 Neo 进一步明确意图,有两种解读: > > **解读 1**:把"每日跑出来的 SPI 分数"重算一遍。但 SPI 任务本身就是 delete-before-insert 全量刷新,**不存在"历史每日参数"这个概念**——`cfg_index_parameters` 不分天,只有 effective_from。除非 Neo 想做参数版本化(表结构都得改)。 > > **解读 2**:把现在 27 行参数依据真实业务数据重新校准、调权重(产品/算法层调优)。这不是"P0-1 文档冲突"的范畴,而是 SPI 算法迭代,工作量很大,需要单独立项。 > > **建议先与 Neo 对齐:**P0-1 的目标只是"让文档与现状一致" → 选项 A(+ 选项 B 加保险)就够了。如果 Neo 想做参数调优,应当独立提出 Phase 2 任务,有自己的 SPEC、影子跑数、效果评估。 ### 推荐最终路径 1. **Neo 拍板**:确认"DB 27 行是正确状态"(基于本报告第四节)。 2. **执行选项 A** + **选项 B**:5 分钟改文档 + 新增 ~50 行校验脚本。 3. **关闭 P0-1**:在 `docs/_overview/04a-conflicts-P0-detail.md` 标注已解决。 4. **如有 SPI 算法调优需求**:独立立项,与本次冲突无关。 --- ## 七、调研中发现的其他问题(可选,Neo 自行判断是否处理) 1. **`db/etl_feiqiu/seeds/seed_index_parameters.sql` 文件实际不存在** - `run_seed_spi_params.py` L28 引用此文件,但仓库内查无此文。 - BD 手册 § 1 也写"种子数据:`db/etl_feiqiu/seeds/seed_index_parameters.sql`"——同样指向不存在的文件。 - 影响:此运维脚本若被运行,会在 L125-L127 因文件不存在直接 `sys.exit(1)`。但这不影响生产,因为 SPI 任务的 27 行参数已经在测试库存在(可能是历史另一种方式 INSERT 进去的,或在已删除的 commit 中有过 seed 文件)。 - 建议:在选项 A 中顺手把脚本与 BD 手册的文件引用注释为 "(历史 seed 已合并,本脚本仅作幂等校验)"。 2. **PRD § 8.2 列了 `stability_mode`,但代码/SPEC/DB 均无** - PRD 默认 `stability_mode=1`(周覆盖率),意图是"留 mode=2/3 供未来切换其他稳定性算法(如 CV/Gini)"。 - 当前只实现了周覆盖率(mode 1),所以参数没有意义因此被合理省略。 - 建议:不补,但在选项 A 修文档时把 PRD § 8.2 标注 "stability_mode 暂未启用,v2 启用多种稳定性算法时再加",避免将来再被读者误判为"缺失参数"。 3. **`run_seed_spi_params.py` 的"期望 28" 不仅与 DB 27 不符,与代码 27 也不符** - 推测:脚本被写出来时,原作者打算同时插入 SPI(27) + 一个特殊标记参数(如 `_meta_version`)。但最终未实现这第 28 项,脚本期望值未同步回 27。 - 建议:选项 A 修脚本时一起改正。 4. **`docs/prd/specs/00-数据依赖矩阵.md` L123 "指数总览(WBI/NCI/SPI)" 缺 RS/OS/MS/ML** - 与本次 P0-1 不直接相关,但矩阵在指数枚举上不完整,顺手可补。 - 建议:与本次 P0-1 解耦,转 P2 矩阵补充任务。 --- ## 附录:调研用到的文件清单(便于复核) ### A.PRD / SPEC - `c:\Project\NeoZQYY\docs\prd\SPI 消费力指数.md`(主 PRD,706 行) - `c:\Project\NeoZQYY\docs\prd\specs\P2-etl-dws-miniapp-extensions.md`(实施 SPEC) - `c:\Project\NeoZQYY\docs\prd\specs\00-数据依赖矩阵.md`(冲突源 1,L272) - `c:\Project\NeoZQYY\docs\specs\spi-spending-power-index\design.md` - `c:\Project\NeoZQYY\docs\specs\spi-spending-power-index\requirements.md` - `c:\Project\NeoZQYY\docs\specs\spi-spending-power-index\tasks.md` ### B.代码 - `c:\Project\NeoZQYY\apps\etl\connectors\feiqiu\tasks\dws\index\spending_power_index_task.py`(SPI 任务实现,837 行) - `c:\Project\NeoZQYY\scripts\ops\run_seed_spi_params.py`(运维脚本,冲突源 2,L62 期望 28) ### C.数据库 / 文档 - `c:\Project\NeoZQYY\apps\etl\connectors\feiqiu\docs\database\DWS\changes\BD_Manual_dws_member_spending_power_index.md`(BD 手册 27 行清单) - 测试库 `test_etl_feiqiu.dws.cfg_index_parameters` WHERE index_type='SPI'(实际 27 行) ### D.审计记录 - `c:\Project\NeoZQYY\docs\audit\changes\2026-02-27__biz-day-cutoff-prd-sync-check.md`(SPI 营业日切点适配) - `c:\Project\NeoZQYY\docs\audit\changes\2026-03-02__spi-calibration-nonzero-median.md`(SPI 基数校准改进) - `c:\Project\NeoZQYY\docs\audit\changes\2026-03-15__ddl-baseline-consolidation-bd-manual-reorg.md`(SPI DDL 合并) - `c:\Project\NeoZQYY\docs\audit\changes\2026-03-20__rns1-ai-autonomous-decision-risk-audit.md`(SPI 提及,非主体) - `c:\Project\NeoZQYY\docs\audit\changes\2026-03-20__rns13-board-apis-e2e-fix.md`(看板用 SPI 联调,无参数变更) - `c:\Project\NeoZQYY\docs\audit\changes\2026-03-24__lookback_days_60_to_90.md`(同时段动指数参数,非 SPI) --- > 本报告 step1 部分到此为止。step2 实施待 Neo 拍板"选项 A / A+B / 其他" 后开新会话执行。