Analytics
类型化产品事件、Umami adapter、Consent 门禁、撤回清理与 Admin 状态边界。
Analytics 是 Manifest 控制的可选模块,默认关闭。业务组件只能调用 @tanplate/analytics 的类型化 facade,不能直接调用 Umami;Observability 继续负责系统错误,Analytics 不接收 stack、correlation ID 或运维日志。
事件与隐私
catalog 包含 page.view、邮箱注册/登录结果、Projects 搜索/收藏变化、Newsletter 订阅结果与 allowlist 产品失败。每个事件运行时都验证完整 key 集合;未知事件、额外字段、URL query、自由错误文本,以及 email、Project 正文、token、secret、Cookie、stack、correlation ID、user ID 会被拒绝。
页面只发送不含 query/hash 的 route ID。Projects 搜索只发送筛选数量和结果数量桶,不发送 query/tag;收藏变化只发送 add/remove,不发送账号或 Project ID。首版不关联账号身份。
Consent 与 Provider
Web 先读取严格 Consent 快照。只有 Manifest 启用且 Analytics 选择为 true 时,客户端才请求同源 /api/analytics-config,随后加载 Umami script;拒绝、未配置、关闭模块或 Provider 失败都不请求、不排队事件,也不阻断页面、认证或 Projects 操作。
撤回后立即停止后续事件,移除注入脚本,并删除浏览器中名称以 umami 开头的 Provider storage/cookie。跨标签页撤回复用 Consent 的 fail-closed 同步流程。
启用模块后,为 Web Worker 的 Local、Preview 和 Production inventory 配置:
UMAMI_SCRIPT_URL=https://cloud.umami.is/script.js
UMAMI_WEBSITE_ID=<public website id>两者是公开配置,不是 secret,但仍由三环境 preflight 检查;Manifest 未启用时没有配置 route 或变量要求。
Admin 边界
Analytics 启用时,Admin Sidebar 增加只读状态页,只显示 feature、Provider、Consent/preflight 状态和 Umami 外链。Admin 不查询事件、不复制 Dashboard、不提供图表或 Provider 控制面。
验证
pnpm --filter @tanplate/analytics test
pnpm --filter web test
pnpm --filter web exec playwright test tests/consent-preferences.spec.tsCI 使用 fake adapter 和 jsdom,不向真实 Umami 发送数据。默认关闭 profile 证明同意 Analytics 后仍没有配置请求、外部脚本、route 或 Admin 导航要求。