跳转到内容

README

这套分析只读取现有数据,不修改产品行为、首页、付费墙、Cloudflare 配置或线上数据。

  • MySQL Readonly MCP:内容、阅读、收藏、讲解、推送、用户、额度和 RevenueCat webhook。
  • Server Log Access MCP:首页接口 delivered impression 与后续内容打开归因。
  • GA4 Analytics Data API:先调用 Metadata,再查询 Metadata 明确支持的聚合维度。
  • Cloudflare D1:RevenueCat 事件的只读聚合收入。
  • yomiya-servicefirebase-ga4-slack:字段含义、接口返回结构和查询实现。

准备好本地只读凭据后,从 Root 仓库执行统一刷新,并显式指向包含既有 MCP 本地 配置的 yomiya-service checkout:

Terminal window
YOMIYA_SERVICE_REPO=/absolute/path/to/yomiya-service \
node product/YomiyaProductAnalytics/engineering/yomiya-service-analytics/scripts/refresh-analysis.mjs \
--mode incremental

统一入口会拉取数据、重建分析并运行独立验收。脚本只把聚合结果写入 analytics/exports/analytics/reports/analytics/sources/。原始访问 日志、原始用户 ID、邮箱、IP、Token、服务账号私钥和数据库密码都不会写入这些 目录。

需要强制重扫所有当前可见访问日志时执行:

在同一命令中将 --mode incremental 改为 --mode full

run-analysis.mjsvalidate-analysis.mjs 仍可分别用于调试。验收会检查必需 文件、CSV 粒度、数据源状态、数据库只读 grant、GA4 Metadata-first、D1 rows_written=0、首页可见日志文件覆盖、增量缓存结构、逐来源观察资格、匹配 平衡、订阅时点状态、隐私小样本、来源/产物哈希和敏感信息。

若终端网络路由无法连接 Google,但受控的 Codex 应用进程可以连接,可先通过同一 exportGa4Aggregate 实现生成一个只含聚合数据的本地快照,再显式传入:

Terminal window
YOMIYA_GA4_AGGREGATE_INPUT=analytics/private/cache/ga4-readonly-snapshot.json \
node analytics/scripts/refresh-analysis.mjs --mode incremental

该入口只接受同一 property、已完成 Metadata-first、生成时间不超过 30 分钟的 快照,并记录输入 SHA-256。文件位于 Git 忽略的 analytics/private/,不能用旧 快照绕过 GA4 实时验收,也不能包含服务账号 JSON。

  • Server Log:默认只读取新增或发生变化的 access 文件。只有已完整搜索、请求响应 在同一文件内配对、且没有可解析首页响应的文件才能复用缓存。
  • MySQL:继续精确重算限定窗口。购买匹配、去重用户、首次购买和 D1/D7 随访不能 在不保存用户级历史的前提下安全相加。
  • GA4:每次先调用 Metadata,再精确重算限定窗口。totalUsers 不能按天直接相加, 否则会重复计算跨天用户。
  • D1:聚合查询很小,每次重新执行只读 SELECT,并校验 rows_written=0

因此这里是“安全的混合增量”,不是用近似值替代精确结果。忽略目录 analytics/private/cache/ 只保存不透明文件指纹和聚合计数,绝不保存原始日志、 路径、响应体或用户 ID。第一次运行用于建立缓存,耗时可能接近全量。

也可以在 Codex 中直接调用 Root 仓库 Skill:

$yomiya-product-analytics 增量刷新全部 Yomiya 数据并总结与上次相比的变化

分析代码由 Root 维护;yomiya-service checkout 只提供既有的只读 MCP 配置和 本地输出/缓存位置。不要把本目录复制回服务仓库,不要修改 Admin MCP、数据库权限 或 Cloudflare 配置。

  • 首页曝光是服务端已交付的 delivered impression,不是 viewable impression
  • 首页扫描当前 Server Log MCP 能列出的全部 access 文件;MCP 文件目录、匹配数和 返回字节上限继续作为明确的数据可见性边界。
  • 文件名中的 90/180/365d 是目标观察窗;实际数据覆盖由 analytics/reports/analysis_context.jsondata_quality.md 明确说明。
  • 内容表现只纳入观察窗内实际被打开、收藏、讲解、推送交付或首页交付的 VISIBLEMEMBERSHIP_VISIBLE 内容,不要求内容本身在 90 天内发布。
  • 收藏、讲解、推送、阅读、购买与随访分别声明观察资格;来源窗口不完整时字段 留空,不把“尚未采集、停止更新或不可用”写成 0。
  • 购买前研究使用逐购买时点 risk set:未来购买者在其购买前仍可作为对照、对照 不复用、协变量窗口不与暴露窗重叠,并输出匹配平衡与 FDR。结构性零和小样本 直接标为不可估计。
  • 套餐 D30/D60/D90 只使用该时点之前已经发生的 RevenueCat 事件重建 entitlement;未来续订或重新订阅不能改写过去状态。
  • 额度按“用户 × 完整周期 × 资源”输出分布,不再使用跨周期 pooled used/limit
  • GA4 始终先读取 Metadata,只查询已确认存在的维度;套餐、付费墙触发和来源屏幕 拆分是聚合结果,不能与 RevenueCat 购买者逐人连接。
  • 购买前行为与购买的统计关联不能解释为因果关系。
  • attraction_score 在缺少跨内容可比较的 delivered exposure 分母时只保留描述, 不输出校准或异常内容标签。
  • 不同币种收入不做未经授权的汇率换算。
  • D1 低于隐私阈值的分组整行移除;只要存在被移除分组,套餐收入明确标为 partial,不表述为总收入。
  • 当前 MySQL 配置为 yomiya-staging,在没有独立证明其为生产镜像前,整套结果 固定标为非决策级。