Commit Graph

21 Commits

Author SHA1 Message Date
浅念 87261abf16 fix(server): PV统计加event_name过滤——增量停留事件不再灌倍PV(gzip 4817B记录:0.1.0为3838,增量989)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-18 15:16:05 +08:00
浅念 5e024b814b fix(server): v2入口加固——page_id孤代理/NaN区间值拒绝,共享ISO解析
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-18 11:53:02 +08:00
浅念 8459e6fa13 feat(server): ingest v2事件级归属+session_resume+stay区间并集重算+响应明细契约
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-18 11:14:06 +08:00
浅念 5881046a2d feat(server): URL清洗三轨制+共享测试向量(D08)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-18 10:15:42 +08:00
浅念 132e2feb75 fix: 来源冲突比较升级为广告家族归一(meta/google/bing/yandex 家族)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-17 11:23:02 +08:00
浅念 22d89a3f42 feat: 移动端设备信息最大化采集(型号/UA-CH/视口/方向/触点/内存/网络/深浅色)
SDK:buildEnvContext 同步扩展 12 键(dpr/viewport/orientation/maxTouchPoints/
deviceMemory/languages/colorScheme/standalone/network downlink·rtt·saveData/
微信版本),逐键 try/catch 静默缺则不挂;新增 collectHighEntropyHints(UA-CH
model/platformVersion/architecture/bitness),init 后 Promise.race 2s 超时
异步并入 __ctk_ctx——批次 context flush 时读取,不阻塞首屏。

后端:Visitor 加 device_model/env_extra(迁移 0005);ingest 首批快照
EXTENDED_ENV_KEYS 白名单(值截 100),非首批不覆盖、唯 device_model 空且
本批有值时补填一次(晚到 hints);列表/详情 API 随行输出。

前端:详情访问环境卡设备行升级显示型号(手机 · Pixel 7),追加像素比/
视口/屏幕方向/触点/内存/网络质量/深浅色/微信版本行(env_extra 逐键判空,
旧数据整块不显示);列表设备列主行拼型号(手机·Pixel 7)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-16 19:12:20 +08:00
浅念 7f2a746f66 fix: 排序作用于组内事件+时间线限高滚动+UTM别名归一消冲突误报
- attribution.py:新增 _canon 归一(小写/去协议与域名后缀/别名表 fb→facebook、百度→baidu 等/仅留字母数字汉字),
  冲突判定改为两路各自归一后比较——同源升级 combined 并在 detail 记 utm_source 原文,仍不同才 conflict
- detail.vue:orderedDays 组内会话/事件同步翻转(desc=组与组内都最新在前,asc=都最早在前);
  .tl-body 限高 calc(100vh - 380px) 卡内滚动,日期组头随内容滚动
- test_attribution.py:+4 用例(fb↔facebook、chatgpt.com↔ChatGPT、google↔facebook 仍冲突、百度↔baidu)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-16 18:39:02 +08:00
浅念 59de51c062 feat: 来源归因规则引擎(渠道/AI/搜索词/诚实状态/历史重算)
- constants 规则库 v1:AI/引擎/社交域名表、搜索词参数白名单、付费点击参数、
  应用内 UA 标记、CHANNELS 枚举;page_view 白名单开 nav_type/prerendering
- services/attribution.classify 纯函数:付费>AI>引擎>社交>referral 分层,
  UTM 证据叠加(combined/conflict/label_only),应用内 UA 叠加/兜底,
  引擎 TLD 国家 variant,搜索词白名单提取(Google 恒空不虚构)
- SourceClassification 派生表(迁移 0004):first_touch/session_entry 双 scope,
  rule_version 可追溯
- ingest 增量 best-effort:首访客/新会话时分类落库(savepoint+静默,
  失败不影响采集);validation 对 page_view referrer 完整 URL 参数清洗+截500
- recompute_attribution 命令:全量/按站幂等重算
- API:访客列表归因五字段+channel 筛选、详情 attribution 块(含最近5会话入口)、
  dashboard channels 聚合(sources 原口径保留);TS VisitorListParams 加 channel
- 测试 97 → 124(引擎20 + 集成/接口7)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-16 17:03:15 +08:00
浅念 21ca43248a feat: 原始上报数据存储(raw_batch 表/脱敏/访客关联/详情页 Tab/30天清理)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-16 15:42:06 +08:00
浅念 e56f252ffd fix: ingest 落库 SDK timezone 到 Visitor.timezone_name(Task16 联调发现)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 16:59:24 +08:00
浅念 cf925e8763 refactor: stats 提取共享 daily_counts
refresh_daily 四指标口径提取为模块级 daily_counts(site, date),
site=None 时聚合全部站点,为 dashboard 今日实时位复用做准备
(Task8 审查结论:防两处口径漂移)。语义不变,既有 stats 测试全绿。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 14:50:09 +08:00
浅念 77a7f568b2 fix: new_visitors 排爬虫+日界/爬虫口径回归测试
- refresh_daily new_visitors 加 is_bot=False(爬虫不是受众,四指标口径统一)
- test_refresh_daily_shanghai_boundary:固定 UTC 时间戳钉死上海自然日界
- test_refresh_daily_excludes_bots:事件/会话/访客 is_bot 均不计入
- refresh_stats 删未使用的 stat = 赋值

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 13:55:13 +08:00
浅念 cc1ea6805b feat: 日聚合服务与命令 + 索引迁移打包(Task3 审查结论)
- refresh_daily:按上海自然日聚合 pv/uv/sessions/new_visitors,update_or_create 幂等
- refresh_stats 管理命令:回刷近 N 天(生产由 1Panel 每日 00:10 调度,见 Task 22)
- 索引打包(0002):Event/VisitSession 增加 (site, 时间) 日聚合索引;
  删 5 个冗余单列 FK 索引(Event.site/session、VisitSession.site/visitor、DailyStat.site),
  保留 Event.visitor/Visitor.site;sqlite PRAGMA 实证级联索引完整、EXPLAIN 走新索引
- test_models:IntegrityError 断言收紧 + Site 级联删除测试

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 13:38:01 +08:00
浅念 173d13dbf3 fix: ingest 同批去重/会话族切分修复/xdb 无关测试/边界加固
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 12:59:13 +08:00
浅念 6147f2b9ff feat: 批量入库服务(幂等/首触/会话兜底/聚合更新)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 12:44:33 +08:00
浅念 e880dbe458 fix: geo 收口(模块单例/IPv6测试/降级日志)
- 导出模块级 resolver 单例:Task 6 起 import resolver 使用,
  防多实例各持 ~11MB xdb 副本、lru_cache 按实例分片
- 补公网 IPv6→None 测试,锁定 M1 v4-only 决策
- __init__ 降级路径(文件过短/结构无法识别/except)均记
  warning 日志,运维可区分「没部署 xdb」与「库 API 崩了」
- 删掉测试未使用的 monkeypatch 参数

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 12:39:08 +08:00
浅念 138b472485 feat: ip2region 离线地理解析(优雅降级)
GeoResolver 进程级单例,c_buffer 模式一次读入内存(线程安全)。
适配 py-ip2region 3.0.4 实际 API:new_with_buffer(version, buff) 需
Version 对象,由 xdb 头 256 字节探测(2.0 老库自动归 IPv4)。
数据段布局按结构版本分派:3.0 新库 国家|省|城市|ISP|国家代码,
2.0 老库 国家|区域|省|市|ISP——错位会把 ISP 串进 city。
包/xdb 缺失或损坏时 resolve 一律返回 None,测试全绿。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 12:28:01 +08:00
浅念 7b26c7e14a fix: 孤代理三入口堵漏+精确断言+截断清洗换序
- _utf8_ok 助手:event_id/path/title 含孤代理("\ud800")在入口即拒
  (原会流到下游 encode 必 500);props 字节守门 try/except 归入 properties_invalid
- 补零覆盖原因码测试:path=123 → invalid_field_type;utm 三层嵌套 → properties_depth
- 子串断言("sensitive" in r 等)全改精确等值断言,码即 API
- path 改为先 sanitize_url 再截 500:中文查询参数 urlencode 膨胀最多 3 倍,
  先截后洗会破坏出门 ≤MAX_PATH_LEN 不变量(实测汉*200 查询洗后截回 500)
- docstring 写明就地写回契约(Task 6 ingest 依赖)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 12:20:27 +08:00
浅念 c5f900f3bd fix: 校验守门按字节+递归长度+非dict拒绝
- 体积守门改 UTF-8 字节数(原按字符数,"汉"*1500 约 4.5KB 可绕过 4096 上限)
- 字符串长度检查并入 _walk_props 递归,嵌套字符串同样受 MAX_STR_LEN 约束
  (顺序:体积先行,故同一值既超长又超体积时报 properties_too_large)
- properties 传了但非 dict([]/""/0/None)不再被 or {} 静默放行,缺省键仍放行

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 12:10:56 +08:00
浅念 f2a5f7611a fix: 校验加固(嵌套敏感键/naive时间防御)
- _depth_ok 与敏感键扫描合并为单次递归 _walk_props,dict 所有层级键均过
  _SENSITIVE(此前嵌套键不扫描,utm 白名单内可夹带敏感键)
- occurred_at 为 naive datetime 时返回 invalid_occurred_at(原为 TypeError 500)
- 删除未使用的 timedelta 导入
- 深度超限即停止下探,10 万层嵌套不爆栈

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 12:04:40 +08:00
浅念 cb57e67179 feat: 事件校验服务(白名单/敏感键/时间窗/URL清洗)
TDD:7 测试先红(ModuleNotFoundError)后绿。与计划的一处偏差:
敏感键扫描移至属性白名单之前——白名单内无任何键命中敏感模式,
原顺序下 sensitive_field 不可达,test_sensitive_property_rejected
(user_password 非白名单键)将得到 property_not_allowed 而失败。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 12:01:45 +08:00