# 需求:下载量分不清谁在下-按-IP-去重出独立机器数并剔出自家出口(兼修-analyze-的-T-1-序列错位)
状态: done(2026-10-14 已落地:探针 8 个数据日逐日对照 MATCH(tools/compare_ip_caliber.py,合计次数与 10-10 原探针读数值日相等=加 clientIP 维度未降采样;台数≠次数已实证:10-07 14次/6台、10-12 27次/18台);collect_r2 落 downloads_ips/_own/_external/_updater 四字段,拿不到 clientIP 时为 None 不排 0 台;自家出口白名单 sha256[:8] 四条入 config.json,同一台 Windows 当日实测三出口→external 只作陌生台数上界(五处文案已写明);analyze 量词改台日+剔自家<5 台日标样本不足,老快照无字段退回「次」;日报新增台数行、驾驶舱经 parse_report 继承未另写卡片;测试 test_download_caliber 10 例含变异对照 + test_auto_findings +6 例 + test_report_fake_zero +4 例,ops 全量 469 passed/1 skipped;口径三处落纸(README 数据口径/config.json notes/当日 metrics 行 note),历史行未回改;台数按票面「新行起计」自 2026-10-15 08:00 快照行自然落地,未回填、未重跑今日采集)
归属: 公司运营
来源: 数据自动发现(ops/data/auto-findings.json#2026-10-10#1)
日期: 2026-10-10
建议: 做,auto-finding 连日报「近3天下载 N 次/新增注册 0」,今日实测证明这个数既没被更新器刷(同日轮询 feed 又拉包的 IP 几乎为零)、也不是自家监控 HEAD 混入(R2 支持 HEAD,探活不产生 GET),真正缺的是「谁在下」——独立机器数与自家出口剔除这两个字段根本没有,断点结论无从判定

## 现状

- 自动发现 2026-10-10#1:漏斗断点|近 3 天下载 14 次,新增注册 0|建议 排查安装→注册转化断点(登录入口触达/注册动机)
- **口径现状**:`ops/collect.py::tally_downloads` 把 updates 域上「GET + 安装包/更新包扩展名」计为下载,`ops/analyze.py::downloads_series` 据此出「近 3 天下载 N 次」。N 是**请求数**,不是台数,也不分是谁。
- **今日实测(只读探针 `tools/funnel_ip_probe.py`,查同一张 CF `httpRequestsAdaptiveGroups` 表加 `clientIP` 维度)**:探针与生产逐日吻合——数据日 10-06=15、10-07=14、10-08=4、10-09=1,与快照行 `downloads_total` 完全一致(注:快照行是 T-1 口径,`r2.date` 才是数据日),所以探针可信,下面三条结论建立在同一份数据上。
- **排除污染①「老用户自动更新刷量」**:同日既轮询 feed 又拉包的 IP —— 10-06 为 1 个(9 个下载 IP 中)、10-07/10-08/10-09 均为 **0 个**;`.sig` 请求四天全 0。→ 更新器流量在这个数里占比接近零,skill 里「大概率是更新包 GET」这句对当期**不成立**(已按实测纠正,不是把判据换掉,是把一条未验证的假设换成量出来的数)。
- **排除污染②「自家每日盘点混入」**:安装包 URL 实测 `HEAD → 200`(不是 405),而 `products.py::probe_url` 只在 403/405/501 才回落 GET → 每日探活不产生 GET。**自曝一条**:本单元为验证 HEAD 支持,打过一次带 `-r 0-0` 的 GET,会给数据日 10-10 的下载数 +1,记在这里以便日后对账。
- **真缺口(三条,都卡住「断点」这个结论)**:①没有**独立机器数**——10-07 是 6 台机器 14 次请求,「下载 14」在语义上等于把 6 台说成 14 个意向;②没有**归属**——自家 Windows/mac 测试机与陌生人无法区分,而 10-06 与 10-07 两天的下载 IP 哈希**零重合**,这个形态既可能是每天来六七个新人,也可能是几台换了出口的自家机器,现有字段判不了 → 「安装→注册断了」今天**不能下结论**;③`downloads_series` 拿**快照日期**当键,值却是 **T-1 数据日**,整条序列错位一天,「近 3 天」实际覆盖的是更早的三天。

## 方案

1. **collect 侧出台数**:`collect_r2` 的下载查询加 `clientIP` 维度(实测免费 plan 可用,且加维度前后 `downloads_total` 一致=不引入降采样),新增三字段:`downloads_ips`(独立 IP 数)、`downloads_ips_updater`(同日轮询过 feed 的 IP 贡献的包请求数)、`downloads_ips_external`(剔自家出口后的台数)。**IP 原值不落盘**,只在内存里比对。
2. **自家出口白名单**:`ops/config.json` 加 `own_egress_ip_hashes`(boss 的 Windows 机与 mac 机各一条,sha256 前 8 位,不写明文 IP),来源=当场取一次出口 IP 算哈希后填入;以后新增机器同样只填哈希。
3. **序列对齐**:`analyze.downloads_series` 的键改用 `r2.date`(数据日),`README` 数据口径节写明「下载量按数据日计,快照日=数据日+1」。
4. **文案与门槛**:`auto_findings` 断点句改为「近 3 个数据日 N 台独立机器下载(剔自家后 M 台),新增注册 0」,且 M<5 时明写「样本不足,仅提示不作结论」。
5. **纪律顺序**:先改 `ops/README.md`「数据口径」+ `ops/config.json` notes + 当日 `metrics.jsonl` 行 note,再动代码(与今日「采不到与真 0」那条同流程)。
6. **范围**:全部在 company 仓 `ops/`(collect.py / analyze.py / config.json / README),不涉及任何产品仓,无跨仓代做项。探针脚本本轮留在 `tools/`(一次性取证),口径若落地,判据搬进 `ops/test_download_caliber.py`。

## 验收标准

- [x] 探针四条读数(合计/独立 IP/更新器重叠/sig 占比)对 10-06~10-09 四个数据日与 `collect.py` 落盘字段逐项一致,作为正本对照 —— ✅ 10-14 `tools/compare_ip_caliber.py` 对 10-06~10-13 八个数据日逐日跑,合计/台数/更新器贡献 8/8 MATCH
- [x] 加 `clientIP` 维度与不加维度的 `downloads_total` 差异为 0 —— 单测钉住「不降采样」这条前提 —— ✅ 10-06~09 合计 15/14/4/1 与 10-10 探针逐日相等;`test_download_caliber.py` 钉「同一批行带/不带 clientIP,downloads_total 必等」
- [x] `collect_r2` 新增 `downloads_ips` / `downloads_ips_updater` / `downloads_ips_external` 三字段,历史行不回改、新行起计 —— ✅ 四字段(含 `downloads_ips_own`)已进 `collect_r2`,拿不到 clientIP 时为 None 不排 0 台;历史行未回改,今日 08:00 行无字段、明早 10-15 行起计
- [x] `downloads_series` 按数据日对齐:构造「快照日与 r2.date 差一天」的用例锁住错位不再回来 —— ✅ 10-10 已修;本轮新增 `downloads_ip_series()` 同样按 `r2.date` 取数,`test_auto_findings.py` fixture 带「快照日与数据日差一天」用例锁死
- [x] auto-finding 文案量词从「次」变「台」,且 external 台数 <5 时带「样本不足」标注 —— ✅ 量词改「台日」(同机跨日不合并),剔自家后 <5 台日自动带「样本不足,仅提示不作结论」,无字段的老快照退回「次」
- [x] 口径变更三处落纸(`ops/README.md` 数据口径节 / `ops/config.json` notes / 当日 metrics 行 note)后才算完成 —— ✅ `ops/README.md`「数据口径」新行 + `ops/config.json` `own_egress_ip_hashes`/note + 今日 `metrics.jsonl` 行 `note`,均已写
- [x] `python -m pytest . -q`(ops 全量)绿,日报与驾驶舱「业务数字」页同步新口径 —— ✅ ops 全量 470 passed / 1 skipped;日报第一节新增台数行,驾驶舱经 `parse_report` 继承(未另写卡片),9 页已 deploy 且线上 md5 与本地全等
