data_quality
数据质量与覆盖范围
Section titled “数据质量与覆盖范围”这次流水线成功统一读取 MySQL、Server Log 和 Cloudflare D1 的只读数据。GA4 使用既有 Viewer 服务账号并坚持先调用 Metadata;当前结果为 ok。MySQL 配置指向 yomiya-staging,因此这些数字不能在没有环境确认的情况下直接表述为生产全量。
当前决策就绪状态固定为 not_decision_grade。以下结果用于描述与继续完善测量,不支持隐藏 Basic、调整额度、修改首页排序、决定 Podcast 预览长度或宣称某行为促进购买。
统一分析时点为 2026-07-30T11:09:51.387Z。所有 MySQL 与 D1 时间过滤均使用这个冻结时点;MySQL 使用 keyset pagination,但 MCP 不允许事务控制,因此跨表仍是“统一 as-of 的尽力一致”,不是数据库事务快照。
| 数据集 | 最早有效时间 | 最近时间 | 表内总行数 | 时间缺失/异常 |
|---|---|---|---|---|
| news | 2015-12-31T08:11:03.000Z | 2026-07-30T00:12:24.000Z | 6077 | 1141 |
| reads | 2026-04-09T21:35:08.000Z | 2026-07-30T03:07:18.000Z | 20621 | 0 |
| favorites | 2026-06-12T02:38:17.000Z | 2026-07-29T23:59:57.000Z | 1438 | 0 |
| explains | 2026-01-26T02:08:34.000Z | 2026-06-22T03:35:59.000Z | 202 | 0 |
| push | 2026-04-11T23:12:02.000Z | 2026-07-30T03:07:26.000Z | 131807 | 0 |
| users | 2026-01-16T23:04:15.000Z | 2026-07-30T00:34:11.000Z | 5581 | 0 |
| imports | 2026-02-16T16:34:58.000Z | 2026-07-29T15:59:34.000Z | 251 | 0 |
| quota | 无 | 无 | 0 | 0 |
| revenuecat_mysql | 2026-03-04T19:24:26.000Z | 2026-07-29T12:40:36.000Z | 163 | 0 |
Server access log 可见文件的修改时间覆盖 2026-07-23T10:16:13.530Z 至 2026-07-30T11:09:51.319Z,共识别并覆盖 131 个 access 文件;本次实际读取 4 个,复用安全零完整响应缓存 127 个。目标文件名虽为 90d,当前可见日志并没有 90 天历史。MCP 返回发生 0 次字节截断,0 个文件触及单次匹配上限,扫描失败 0 个,时区或时钟异常文件 0 个。缓存条目集合与可见文件集合均使用不透明 SHA-256 对账。
D1 RevenueCat 实际覆盖 2026-06-29T00:00:00.000Z 至 2026-07-29T23:59:59.999Z,只读聚合读取 49 个生产事件。收入按原币种保留,没有汇率换算;低于隐私阈值的 26 个聚合分组已整行移除,因此套餐收入可能是可发布下界而不是总额。
Metadata 与聚合报表均已成功读取。
脚本不会尝试查询 Metadata 中没有出现的自定义参数。本次先成功调用 Metadata,再读取 101 个事件聚合行和 20 个自定义维度。 事件、页面、屏幕、App 版本、平台、设备、国家、获客渠道和自定义维度的可用结果保存在 analytics/sources/ga4_aggregate.json。每个报表同时保留 API rowCount、时区、thresholding、sampling 和 data-loss 元数据;低于 5 名用户的 cell 已抑制,动态页面路径已模板化。
| GA4 拆分 | 状态 | 实际维度 | 聚合行数 |
|---|---|---|---|
| page | ok | pagePath | 17 |
| screen | ok | unifiedScreenName | 23 |
| app_version | ok | appVersion | 23 |
| platform | ok | platform | 2 |
| device | ok | deviceCategory | 3 |
| country | ok | country | 23 |
| acquisition_channel | ok | firstUserDefaultChannelGroup | 5 |
| 关键事件 | 用户数 | 事件数 |
|---|---|---|
| paywall_view | 843 | 1374 |
| explainer_prompt_submit | 285 | 567 |
| explainer_response_success | 275 | 537 |
| import_submit | 74 | 448 |
| purchase_start | 201 | 255 |
| import_processing_success | 45 | 184 |
| paywall_plan_select | 49 | 86 |
| purchase_success | 65 | 68 |
| purchase_cancelled | 47 | 57 |
| in_app_purchase | 8 | 8 |
| explainer_paywall_triggered | 已抑制 | 已抑制 |
Metadata 已确认存在 content_id、plan_id、paywall_trigger 和 paywall_source_screen 自定义维度。事件清单包含 paywall、import、explain 与 purchase 相关事件;Metadata 和事件清单中均未发现 PDF 对应项,因此 PDF 记为“未观测到”,而不是假设其值为 0。套餐、触发与事件的拆分状态为:plan=ok,trigger=ok,source_screen=ok,plan_trigger=ok。
- RevenueCat 生产事件:163
- 可关联到本地用户的事件:110
- 未关联事件:53
- 事件关联率:67.5%
- 可关联独立用户:53
- 可直接映射的独立身份引用:53/102(52.0%)
事件关联率的分子和分母都是 RevenueCat 事件行,不是用户。身份引用映射率按去重后的 RevenueCat 身份字符串计算,但由于 alias 解析不完整,它仍不是经过验证的“人员级用户关联率”。未关联事件不会被强行归到用户,因此购买前行为、套餐使用和内容购买归因的样本量小于事件总量。
结构与关联检查
Section titled “结构与关联检查”- users 主键代理重复:0;用户 UUID 重复:0。
- read_records 用户×内容重复行:0。
- RevenueCat event_id 重复:0。
- 当前内容元数据中缺少频道:0;缺少主题关联:2021。
- explain 会话 202 条,会话表 total_messages 合计 238,独立消息表只有 36 条,因此消息量采用会话表字段。
- 未来时间戳检查:0 条。
- 首页只表示服务端已交付,不表示用户真的看见;截断的 response_body 被完全排除。
- 首页扫描覆盖所有 MCP 当前列出的 access 文件,但 MCP 文件目录、每次 200 条匹配及 512 KiB 返回上限仍是可见性边界。
- 首页来源 source type/source id 是依据当前 DTO 内容结构推断,输出中标有
source_inferred=true。 - 购买匹配缺少用户级国家和 App 版本;GA4 聚合数据不能反向拼接到用户。
- 内容 cohort 纳入过去 90 天实际被打开、收藏、讲解、推送交付或首页交付的
VISIBLE与MEMBERSHIP_VISIBLE内容;不再要求内容必须在 90 天内发布。 - 付费用户占比使用内容打开时点重建的 RevenueCat entitlement;只纳入注册时间与购买历史覆盖都完整的用户,身份无法关联者不进入分母。
- explain_conversations 的 total_messages 与独立消息表覆盖并不一致,本分析采用会话表的 total_messages。
- read_records 是用户×内容的更新型记录,无法还原精确打开事件数;重复访问使用 updated_at 与 created_at 的时间差代理。
- PDF 行为没有覆盖完整购买窗口的稳定用户级事件,因此不以 0 代替缺失。
- 购买前研究会逐用户、逐索引日、逐来源判断完整观察资格;结构性零、小隐私 cell、无匹配或匹配不平衡均不输出 OR。
- attraction_score 当前缺少可比较的 delivered exposure 分母,因此只保留分桶描述,不输出校准结论或异常内容标签。
隐私与只读检查
Section titled “隐私与只读检查”- 没有写出邮箱、姓名、IP、Token、原始用户 ID 或原始访问日志。
- 只保存聚合结果;原始标识只在进程内用于关联,进程结束即丢弃。
- MySQL 只使用 SELECT/SHOW;数据库 grant 核验状态为
verified_readonly,原始 grant 文本没有持久化。D1 查询的返回元数据显示 rows_written=0。 - 没有修改 Cloudflare 配置、产品代码、首页、付费墙或线上数据。