Files
climperor/CHANGELOG.md
T

944 lines
45 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
本文件记录 **上分帝(Climperor** 的用户可见变更。格式参考 [Keep a Changelog](https://keepachangelog.com/)。
## [Unreleased]
## [0.5.110] - 2026-07-30
### Fixed
- 主播直播状态:线上与本地预览均执行平台探测;探测失败或过期状态不再沿用旧的“直播中”结果,只有本轮确认开播才显示直播角标。
## [0.5.109] - 2026-07-30
### Changed
- 英雄页:定位筛选迁至网格与详情之间(Valve 图标斜角按钮);去掉详情 Chip;未选英雄时隐藏详情占位。
- 提高英雄详情固定高度(约至 640px 上限),压缩网格与详情之间的多余空白;Tab 切换高度不跳动。
- 技能 Tab:演示视频与文案强制左右排布;去掉图标与详情之间的中间分割线。
- 核心装备 / 被克装备:详情区上下分割线统一为全宽。
## [0.5.108] - 2026-07-30
### Fixed
- 技能 Tab:演示视频与文案强制左右排布(不再因中间栏偏窄折行上下叠);详情固定高度提至约 560px,常规技能默认可视区内完整展示。
## [0.5.107] - 2026-07-30
### Changed
- 技能 Tab:去掉技能图标与详情之间的中间分割线(装备 Tab 保留)。
## [0.5.106] - 2026-07-30
### Fixed
- 核心装备 / 被克装备:详情区上下分割线统一为全宽(合成线不再缩在 720px 文案栏内)。
## [0.5.105] - 2026-07-30
### Fixed
- 技能 / 核心装备 / 被克装备等 Tab 切换时详情区高度不再跳动(恢复固定高 + 禁止压缩)。
## [0.5.104] - 2026-07-30
### Changed
- 缩小英雄详情固定高度,给网格与定位栏留更多空间;走势 / 对位等长内容仍在详情区内滚动。
## [0.5.103] - 2026-07-30
### Changed
- 未选中英雄时隐藏详情占位条,不再显示提示文案。
## [0.5.102] - 2026-07-30
### Changed
- 战斗属性补全转身速率:OpenDota 缺省时按引擎默认 `0.6` 显示(与官网一致);
`heroes.json` 回填 82 名英雄。
## [0.5.101] - 2026-07-30
### Changed
- 选中英雄时定位栏不再点亮「全部」,只高亮该英雄定位。
## [0.5.100] - 2026-07-30
### Changed
- 去掉英雄定位栏上下分割线。
## [0.5.99] - 2026-07-30
### Changed
- 英雄详情技能区去掉定位 Chip;选中英雄时在上方定位栏高亮对应选项(不影响网格筛选)。
## [0.5.98] - 2026-07-29
### Changed
- 英雄详情战斗属性(攻击 / 防御 / 机动性)改为官网同款图标 + 数值横排;图标取自
dota2.com.cn `herostatic/stats`,视野显示为「白天 / 夜晚」。
## [0.5.97] - 2026-07-29
### Changed
- 英雄定位筛选移至英雄网格与详情面板之间,改用 Valve 风格图标与斜角按钮;保留多选,
暂不展示「幻象」筛选。
## [0.5.96] - 2026-07-29
### Changed
- 加长主导航选中下划线至 44px;hover 改为仅文字提亮,移除与斜切分隔冲突的矩形冷光底。
## [0.5.95] - 2026-07-29
### Changed
- 移除顶栏品牌 Logo 右侧斜线,仅保留暗红内光,减少品牌区与导航之间的装饰噪声。
## [0.5.94] - 2026-07-29
### Changed
- 放大宽屏顶栏比例:主导航改为 16px / 76px 最小宽 / 44px 点击高,品牌 Logo 提升至
32px;≤1200px 自动恢复 15px / 40px 紧凑规格,筛选 Chip 保持次级尺寸。
## [0.5.93] - 2026-07-29
### Changed
- 顶栏轻度借鉴 Dota 2 国服官网:加入近黑金属横梁、暗红品牌内光与斜切细分隔;
保留青色短下划线和定位 Chip,不复刻门户式梯形按钮、厚重贴图与高顶栏。
## [0.5.92] - 2026-07-29
### Changed
- 主导航放弃连续按钮外框,改为轻量文字 Tab:透明背景、低噪 hover 与青色短下划线选中态;定位筛选继续使用独立 Chip,强化两级导航层次。
## [0.5.91] - 2026-07-29
### Changed
- 顶部导航改为紧凑双层:首行品牌 | 居中主导航 | 搜索+邮件;次行仅英雄定位筛选。
去掉品牌/邮件绝对悬浮与搜索贴边,减少横向空洞;窄桌面收紧 Tab/搜索并隐藏品牌标题。
## [0.5.90] - 2026-07-29
### Changed
- 对位页底部文案简化为「数据来自 STRATZ(相对优势,全局聚合)。」
## [0.5.89] - 2026-07-29
### Changed
- 英雄「对位」统一只使用 STRATZ(`stratz_matchup_tops.json`);移除 OpenDota
对位交叉与页面「来源一致 / 分歧」提示;`audit_relations` 改为 STRATZ 单源审计。
## [0.5.88] - 2026-07-29
### Changed
- 根目录 `DESIGN.md` 改为上分帝 Web 视觉设计规范([design.md](https://github.com/google-labs-code/design.md) 格式);
原技术方案迁至 `ARCHITECTURE.md`
- Web 统一设计令牌:色板、字号层级、4/8 间距、圆角、内容宽度档位与焦点态;
排行 / 比赛 / 主播 / 物品补齐页标题;版本号展示降至 32px;断点收敛为 640 / 900 / 1200。
## [0.5.87] - 2026-07-29
### Fixed
- 技能/物品文案填充:Valve 中文 `%token%``special_values` 名称大小写不一致、
以及魔晶/神杖 `%bonus_<sv>%` 指向升级通道时不再留下 `?`(如乌尔萨震撼大地
「减速4秒」、祸乱蚀脑魔晶冷却)。
- 技能详情有演示视频时加宽右侧文案列、收窄视频上限,空间够时技能介绍尽量单行。
- 技能详情特殊数值标签不再露出 Valve `<font>` 原文(如「眩晕时间」);数值级差
保持单行;冷却/文案同底栏下沉,避免介绍区窄列竖排与多余滚轮。
- 技能详情底栏蓝量靠右,不再贴着冷却时间。
- 版本页笔记剥离 Valve `<font>` / `<span class="New|Subtitle">` 等标签,只保留换行。
## [0.5.86] - 2026-07-29
### Changed
- 「比赛」场次摘要移到分页按钮下方。
## [0.5.85] - 2026-07-29
### Changed
- 「比赛」场次摘要「共 N 场 · 第 X/Y 页」移到底部分页区,与页码同栏。
## [0.5.84] - 2026-07-29
### Fixed
- 「比赛」侧栏「全部 / 职业 / 国服」与选手按钮宽度对齐。
## [0.5.83] - 2026-07-29
### Added
- 上分帝 Web「比赛」侧栏顶部增加「全部 / 职业 / 国服」筛选;选手列表随类型联动;
URL `#/matches[/account_id][?origin=pro|china][&page=N]`(默认全部、第 1 页省略参数)。
## [0.5.82] - 2026-07-29
### Changed
- 仓库重组为 `pc/`(局内识别)、`web/`(上分帝 Web)与 `shared/`(共享包)三层
monorepo;保留脚本直跑方式,站点内容与 `SITE_VERSION` 不变。
- 上分帝 Web 飞书日报卡片精简:去掉模块列表;地区/状态码并入「访问」;
「刷新与部署」扁平展示版本、Actions、Pages。
- 上分帝 Web 定时刷新增加跨档位并发锁与可恢复缓存;补丁详情、近期比赛、
STRATZ 等增量数据不再因 checkout 清理而反复全量拉取。
- 刷新部署改为按业务内容判定变化,并统一原子写 JSON;STRATZ 请求失败保留旧
数据并标记陈旧,OSS 未同步时阻止 Pages 发布。
- 飞书日报新增刷新摘要、生产数据新鲜度和 `/api/live-status` 探针;Pages 发布后
自动验证数据快照与 Function,避免“任务绿色但线上未更新”。
## [0.5.81] - 2026-07-29
### Added
- 上分帝 Web「比赛」页分页:每页 20 场,底栏页码;URL `#/matches[/account_id][?page=N]`
- 明星比赛可选拉取天梯(`lobby_type=7``--include-pubs`daily 默认开启);卡片标
「职业 / 天梯 / 国服」。
### Changed
- 明星名单对照 Dotabuff / Liquipedia 补全主要战队与国服昔日明星(如 Somnus/Maybe、
Chalice/查理斯、YB、Falcons 缺席等);`fetch_pro_matches` 按每种 lobby 各保留
`--limit` 场,避免联赛挤掉天梯。
- 「比赛」卡片列宽统一(约 30 级技能条 + 余量),右侧「详情」对齐。
## [0.5.80] - 2026-07-29
### Changed
- 上分帝 Web「主播」卡片资料区定稿:头像行 = 头像 \| 昵称 + 抖音号/获赞/粉丝
(B 站为 UID/关注/粉丝)\|「关注」;签名(主页留言)独立全宽行(最长 3 行),
不再夹在中间栏。
## [0.5.79] - 2026-07-29
### Changed
- 上分帝 Web「主播」直播角标按抖音网页版实测对齐:`bottom: -6px` 叠在粉环底部
(无间距)、粉渐变底、无描边阴影;粉环色改为 `rgb(254, 44, 85)`
## [0.5.78] - 2026-07-29
### Added
- 上分帝 Web:移动端拦截页(手机/平板提示改用 PC 访问)+ 「催更移动端」需求计数
`/api/mobile-demand`;同设备只计一次)。
## [0.5.77] - 2026-07-29
### Changed
- 上分帝 Web「主播」资料行强化数值层级与分隔节奏。
## [0.5.76] - 2026-07-29
### Changed
- 上分帝 Web「主播」取消头像悬浮窗;抖音号 / 获赞 / 粉丝与签名收进头像与「关注」
之间的中间栏;直播角标与粉环间距加大,避免贴边。
## [0.5.75] - 2026-07-29
### Changed
- 上分帝 Web「主播」抖音号 / 获赞 / 粉丝改为头像悬停卡片展示(不再占卡片正文
一行);有直播间时附「直播中 · 点击进入」或「点击前往直播间」。
## [0.5.74] - 2026-07-29
### Fixed
- 上分帝 Web `/api/live-status`:正确读取 `data.json``streamers.streamers`
列表(此前读顶层数组导致探测目标为空);冷启动用 daily `is_live` 作软失败
兜底;同 isolate 并发请求合并探测。
- 部署时从 `dist/` 目录跑 wrangler,确保 `functions/`Pages Function)被编译
上传;此前从仓库根部署会漏掉 Function,线上接口回落到 `index.html`
## [0.5.73] - 2026-07-29
### Changed
- 上分帝 Web 时间展示统一为人性化混排:近时「刚刚 / N分钟前 / N小时前 /
昨天 / N天前 / N周前」,更早显示「6/13 19:00」(跨年带年份);悬停可见完整
绝对时间。覆盖比赛开场、排行/主播/走势/对位「更新于」、版本日期等。
## [0.5.72] - 2026-07-29
### Fixed
- 上分帝 Web「主播」取消静音后默认音量改为约 35%(不再直接开到最大);用户之后
用原生滑条调大仍生效。
## [0.5.71] - 2026-07-29
### Added
- 上分帝 Web:明星选手 watchlist`web/data/pro_player_watchlist.json`);
`fetch_pro_matches.py` 默认按名单拉近期联赛/锦标赛对局,写入
`pro_matches.json`gitignore,daily 现拉);英雄详情「近期比赛」与顶层
「比赛」页合并展示。
- 上分帝 Web 顶层「比赛」Tab`#/matches[/account_id]`):侧栏筛选选手,
卡片含出装/加点(同英雄详情),可点英雄头像跳转详情。
- 主播高光同名 JPG 封面(`streamer_videos/<id>.jpg` → OSS `streamer-video/`);
未开播先显示封面,避免整块黑屏。
### Changed
- 顶栏顺序改为:英雄 → 排行 → 主播 → 比赛 → …
- 「主播」视频改为视口分档加载:远处不请求、近约 1 屏只 `metadata`、中部
`canplay` 即播且同时仅 1 路 `preload=auto`(取代整页队列式
`canplaythrough`);超大 mp4 再压缩以缩短首播等待。
- 收录抖音主播「雷泽」(`leize`)及精选高光。
## [0.5.69] - 2026-07-29
### Changed
- 上分帝 Web「主播」常用英雄头像同样 `eager` + `fetchPriority=high`,并与主播
头像一并等加载完成后再启动视频预载,避免只露出 `alt` 中文名、图未出。
## [0.5.68] - 2026-07-29
### Changed
- 上分帝 Web「主播」常用英雄只保留头像,去掉头像下方中文名(悬停 `title` /
`alt` 仍可辨认)。
## [0.5.67] - 2026-07-29
### Changed
- 上分帝 Web「主播」头像改为 `eager` + `fetchPriority=high`,等头像加载完成
(或 2.5s 超时)后再启动视频逐个预载,避免大 mp4 占满连接导致头像只显示
`alt` 文字;视频骨架占位改为标准 16:9 横屏高度。
## [0.5.66] - 2026-07-29
### Changed
- 上分帝 Web「主播」视频未就绪时改为矮骨架占位(约 88px +「视频加载中」),
不再默认铺满 9:16 大黑框;元数据到达后再按真实比例展开,并隐藏占位期原生播放钮。
## [0.5.65] - 2026-07-29
### Fixed
- 上分帝 Web「主播」视频队列:建卡时网格尚未挂到 DOM,`isConnected` 为假会把
队列条目全部丢掉,导致既不预载也不自动播放;改为未挂载时下一帧重试。
## [0.5.64] - 2026-07-29
### Changed
- 上分帝 Web「主播」精选视频改为队列逐个预载:按卡片顺序先拉第一个,
`canplaythrough`(或失败)后再拉下一个;播放仍跟视口中心卡。避免十余个
大 mp4 同时抢带宽导致首屏长时间转圈。
## [0.5.63] - 2026-07-29
### Changed
- 上分帝 Web「主播」精选视频改为延迟挂载 `src``preload="none"`),为逐个
预载做准备(随 0.5.64 队列逻辑完善)。
## [0.5.62] - 2026-07-29
### Fixed
- 上分帝 Web「对位」STRATZ 抓取默认改为全量刷新(`--resume-matchups` 仅中断续跑);
单英雄失败保留上一版并标 `stale`,原子写入避免半截缓存。版本档软触发
`--matchups-only` 刷新(无 token 不阻断)。
### Changed
- 「对位」面板标明全局聚合口径(不跟随走势页段位/分路/周),展示 STRATZ 相对优势
与原始对局胜率、场次、拉取日期;胜率低于 50% 但相对优势为正时不再误读为错误。
- 有 OpenDota `matchups.json` 时对克制/被克行做基线校正交叉提示(来源一致/分歧);
样本不足标为暂无可靠交叉结论。Dota2ProTracker 仅作文档化人工复核参考。
### Added
- `shared/matchup_cross.py` + `audit_relations``web_matchup_tops_cross` 报告段;
单元测试 `shared/tests/test_matchup_cross.py`
## [0.5.61] - 2026-07-29
### Added
- 上分帝 Web「主播」访问触发的实时在播状态:新增 Pages Function
`GET /api/live-status``web/frontend/functions/api/live-status.js`),首位访客触发
全量探测,经边缘 Cache API 合并请求(5 分钟新鲜窗口内共享结果,无需 KV);
探测逻辑与 `fetch_streamer_live.py` 一致(抖音 SSR `roomStore` + B 站
`Room/get_info`);单个探测失败沿用旧缓存值并标 `stale`,全失败回陈旧快照或空表,
永不 500。前端每页加载至多请求一次,合并 `is_live` 后就地更新「直播」角标/动效;
接口不可用时回退 `data.json` 的 daily 探测值。本地开发 `serve_relations.py`
提供空 stub 避免 404。
## [0.5.60] - 2026-07-29
### Added
- 上分帝 Web「主播」真实在播探测:`fetch_streamer_live.py`(抖音解析直播间 SSR 页
`roomStore` 状态;B 站 `Room/get_info`)回写 `data/streamers.json`
`is_live` / `live_probed_at`,探测失败保留旧值;进 `refresh_web --tier daily`
### Changed
- 主播卡片「直播」角标与脉冲动效只在 `is_live` 探测为真时显示(此前以 `live_url`
存在作代理,不准确);头像在有 `live_url` 时仍可点击进直播间,未开播也可访问。
## [0.5.59] - 2026-07-29
### Added
- 上分帝 Web「被克装备」观测证据:`fetch_item_counter_stats.py`OpenDota Explorer
对阵购买率/条件胜率减同装备全局队伍基线)→ `data/item_counter_stats.json`
`item_fears.py` 对全部英雄已有机制候选小幅调序;显著新组合须机制复核后写入 overrides。
- 上分帝 Web 日活飞书推送:`notify_site_traffic.py` + Gitea Actions
`site-traffic-notify`(每日 09:00 CST;真实访问按已知浏览器 UA 打开 `/` 估算;
卡片含自动刷新:`web-daily`/`weekly`/`patch` 结论 + 当日 Pages 生产部署)。
- 上分帝 Web 顶层「走势」`#/trends[/bracket]`:近 8 周高胜率/上场率榜(初期 / 迷你走势 / 末期 / 变化;STRATZ;无禁用率)。
- 上分帝 Web 接入 STRATZ`fetch_stratz_meta.py`token 经 `.env` / keyzoo):
- 英雄详情「走势」优先 STRATZ:勋章条 + **最近 1 周**三卡 + 分路 + **近 8 周**逐周列表(OpenDota 作兜底)
- 新子 Tab「对位」`#/heroes/<key>/matchups`:克制 / 被克 / 搭档三列 STRATZ Top(与网格机制「克/怕/搭」分开展示)
- 缓存:`data/stratz_hero_meta.json` / `data/stratz_matchup_tops.json`gitignore;仅 Web,不进 recommend / relations
- 上分帝 Web「近期比赛」Tab`#/heroes/<key>/matches`):同英雄近期局终局出装 +
加点顺序;展示选手昵称/段位勋章与外链;
`fetch_hero_matches.py``data/hero_matches.json`
`--source league|public|both``--workers``--enrich-item-times`;仅 Web,不进局内推荐)。
- 选将规则阵容画像(不接 AI):识别敌方推进/全球流、敌我缺口(缺控制/爆发/输出/先手);
全网格标 **克 / 搭 / 补**;叠加层显示一句阵容分析;每英雄短推荐原因写入日志与
`results` JSON`draft_archetypes.py` + `recommend.suggest_marks`)。
### Changed
- 上分帝 Web「被克装备」卡片有对阵证据时显示购买率角标;显著新组合补入 overrides
(帕克紫怨、幻影刺客/编织者/石鳞剑士鬼杖、编织者 Eul、石鳞剑士/虚无之灵羊刀);
剑圣移除林肯法球并补入幽魂权杖。
- 上分帝 Web 英雄详情「走势」:三卡 / 分路统一 **当前选中勋章 · 最近 1 周**
布局为勋章条 → 提示 → 三卡 → 分路 → 近 8 周列表。
- 文档与注释统一称呼:`web/relations/` 子项目改称 **上分帝 Web**(不再称「关系预览」);路径与脚本名(如 `serve_relations.py`)暂保持不变。
- 「近期比赛」公开对局默认优先国服;展示最近 10 场胜局;外链改 Dotabuff。
- 选将推荐不再限 Top-3 名次青标;非定位局也可推克/搭/补(无分路字则不过滤)。
## [0.5.58] - 2026-07-28
### Added
- 上分帝 Web「主播」新增 B 站沙王主播,收录主页、直播间、关注与粉丝数。
### Changed
- 主播卡片元信息按平台显示:抖音显示获赞/粉丝,B 站显示 UID/关注/粉丝。
## [0.5.57] - 2026-07-28
### Fixed
- 上分帝 Web「主播」竖屏精选视频黑边:不再依赖 canvas 扫边;竖屏统一用内容框 +
`object-fit: cover`,按上下黑边比例设 `object-position`;亚瑟归来 / 大地瓜写入
`video_aspect`(横屏仍 `contain`)。
## [0.5.56] - 2026-07-28
### Changed
- 上分帝 Web「主播」精选视频:滚动自动播放默认静音;不再因页面任意点击/按键全局开声,需在各视频原生控件中主动取消静音。
## [0.5.55] - 2026-07-28
### Fixed
- 上分帝 Web「主播」竖屏精选视频黑边:修正 `object-position` 方向;`preload=auto` +
首帧检测失败时对竖屏启用 16:9 启发式裁切(canvas / OSS CORS 不可用时仍生效)。
## [0.5.54] - 2026-07-28
### Changed
- 上分帝 Web 英雄详情「主播」子 Tab:卡片宽度与顶层 `#/streamers` 一致(`880px` 居中),竖屏/横屏精选视频比例不变。
## [0.5.53] - 2026-07-28
### Changed
- 上分帝 Web「主播」精选视频:竖屏且文件内嵌上下黑边时,首帧自动检测内容区并裁切显示;
横屏视频仍为 `contain`。可选 `video_fit` / `video_crop` / `video_aspect` 手工覆盖。
## [0.5.52] - 2026-07-28
### Added
- 上分帝 Web「主播」页卡片精选高光视频:手工 `video`/`video_title` +
`assets/streamer_videos/`(本地 `/streamer-video/`OSS `streamer-video/`);
滚入视口中部自动播放(原生 controls;多卡时播最靠近中心者);10 人收录。
- 直播态头像:抖音式粉红外圈脉冲 + 头像呼吸动画;有 `live_url`(或将来
`is_live`)时点击头像进直播间;角标「直播」。
### Changed
- 上分帝 Web「主播」卡片改版:抖音式资料区(昵称行 + 全宽元信息/签名)、
约 880px 宽、元信息竖线分隔、放大英雄标签;右侧仅「关注」;不显示视频标题。
## [0.5.51] - 2026-07-28
### Changed
- 上分帝 Web 英雄详情:定位标签从标题下方移到「技能」Tab 中间列顶部(技能图标上方)。
## [0.5.50] - 2026-07-28
### Added
- 上分帝 Web 顶层「主播」`#/streamers` + 英雄详情「主播」子 Tab:手工维护直播间/主页与常用英雄,
`fetch_streamers.py` 从抖音主页补全昵称/签名/关注粉丝获赞/头像;首版仅抖音;
`data/streamers.json`;仅 Web,不进 recommend;进 `refresh_web` daily 软失败刷新。
## [0.5.29] - 2026-07-28
### Added
- 上分帝 WebSTRATZ 走势 / 对位 Tab(见 Unreleased 明细;站点版本 `0.5.29`)。
## [0.5.28] - 2026-07-28
### Added
- 「近期比赛」出装图标叠加购买时间(MM:SS,支持负值);数据来自 OpenDota
`purchase_log`(未解析对局无时间)。中立装用 `neutral_item_history`
- `fetch_hero_matches.py --enrich-item-times`:只补时间字段,无需全量重拉列表。
### Changed
- 「近期比赛」出装布局对齐 OpenDota:主栏一行、背包第二行(背包轮廓图标),去掉竖分隔线。
## [0.5.27] - 2026-07-28
### Changed
- 「近期比赛」卡片头:昵称旁不再显示段位文字(如「冠绝」);保留勋章图标,排行榜 # 放进勋章 tooltip。
## [0.5.19] - 2026-07-28
### Fixed
- 排行页标题「Immortal 排行榜」与 info 图标保持同一行不换行。
## [0.5.18] - 2026-07-28
### Changed
- 排行页「Immortal 排行榜」标题旁增加与走势页一致的 info 气泡提示(官方 Immortal 地区榜 · 各区分数不可比)。
## [0.5.13] - 2026-07-28
### Changed
- 排行榜按视口居中(不含右侧说明);说明绝对定位贴在榜单右侧。
## [0.5.12] - 2026-07-28
### Fixed
- 排行表分割线错位(去掉选手列 flex)。
## [0.5.11] - 2026-07-28
### Changed
- 排行页右侧说明贴紧榜单(与榜单成组居中),不再贴屏幕右缘。
## [0.5.10] - 2026-07-28
### Changed
- 排行页国籍列显示中文国名(未知代码仍回退为原代码)。
## [0.5.9] - 2026-07-28
### Changed
- 排行页战队 / 国籍无数据时留空,不再显示「—」。
## [0.5.8] - 2026-07-28
### Changed
- 排行页:榜单单独居中,右侧说明贴屏幕右缘(不再与榜单成组居中)。
## [0.5.7] - 2026-07-28
### Changed
- 排行页新增「战队」列(原选手行内战队标签拆出)。
## [0.5.6] - 2026-07-28
### Changed
- 排行页新增「国籍」列(原选手行内国旗代码拆出)。
## [0.5.5] - 2026-07-28
### Changed
- 排行页去掉官方榜说明文案。
## [0.5.4] - 2026-07-28
### Changed
- 排行页副标题去掉地区名与「Top 100」,仅保留更新时间。
## [0.5.3] - 2026-07-28
### Changed
- 排行页:榜单居中,标题 / 地区切换 / 说明贴在右侧。
## [0.5.1] - 2026-07-28
### Added
- 上分帝 Web「排行」页(`#/rankings`,插在英雄之后):Valve Immortal 四区榜
Top 100(中国 / 欧洲 / 美洲 / 东南亚);`fetch_leaderboards.py`
`data/leaderboards.json`(仅排名+昵称等,无 MMR/账号 ID)。
## [0.5.0] - 2026-07-28
### Added
- 上分帝 Web「走势」Tab`#/heroes/<key>/trends`):OpenDota 近约 7 天各段位
胜率 / 上场率 / 场次;顶部勋章条(先锋→冠绝)切换段位。
- `fetch_hero_stats.py``data/hero_stats.json`(含 `totals` / `window_*`);
仅 Web 站点,不进 `relations.json` / 局内推荐。
- 核心装备图标显示列表内相对使用率 %OpenDota popularity 归一化)。
- 冠绝勋章旁说明:样本过小则与超凡合并展示。
### Changed
- 走势布局居中:勋章条 + 三卡,无段位列表 / 被禁率;勋章约 90px。
- 静态资源增加 `/rank/``assets/rank_icons/rank_icon_1..8.png`
## [0.4.2] - 2026-07-27
### Changed
- 上分帝 Web静态图标(头像 / 装备 / 技能 / 属性等)改由阿里云 OSS 同桶托管;
`config.js` 新增 `STATIC_ASSET_BASE`,生产 Pages 包体约 **2 MB**(仅
HTML/JS/data),换机部署无需本地 fetch 图标。同步脚本
`_oss_static_assets.py upload`
### Added
- 新增 `_oss_static_assets.py`:将 portrait/item/ability 等图标同步到 OSS。
## [0.4.1] - 2026-07-27
### Changed
- 线上上分帝 Web技能演示视频改由阿里云 OSS 托管(桶 `climperor`
`https://climperor.oss-cn-shanghai.aliyuncs.com/ability-video/...`),不再打进
Cloudflare Pages;本地 `serve_relations.py` 仍读 `assets/ability_videos/`
导出写入 `config.js``ABILITY_VIDEO_BASE``export_relations_site.py
--ability-video-base` / `deploy_relations.py` 默认 OSS 地址)。
### Added
- 版本页底部居中显示站点版本号(`config.js``SITE_VERSION`,如 `v0.4.1`)。
### Fixed
- 版本页熊灵(spirit bear)头像:静态导出包含 `portrait/spirit_bear.png`
## [0.4.0] - 2026-07-27
### Added
- 新增 `deploy_relations.py`:一键把上分帝 Web静态站点部署到 Cloudflare Pages
—— 串联导出(`export_relations_site.py`)→ 资产完整性预检(缺图则中止)
`wrangler pages deploy` 直传 `dist/relations/` → 绑定自定义域名。凭据
经 keyzoo 注入(`refining/cloudflare` 的 Global API Key)或手动
`CLOUDFLARE_EMAIL` / `CLOUDFLARE_API_KEY` 环境变量;默认项目
`climperor-relations`、域名 `dota2.refining.dev`,均可参数覆盖。
- 新增 `_cf_status.py`:只读查询 Cloudflare Pages 项目 / 部署 / 自定义域名
状态(凭据经 keyzoo 注入),部署后核对用;另有一次性辅助脚本
`_cf_domain.py`(探测域名/ DNS 记录)与 `_cf_add_cname.py`(补建缺失的
CNAME,幂等)。
- 物品页搜索框进 URL`#/items?q=...`,刷新保状态、可分享;英雄页与物品页
搜索各用独立 debounce 计时器,互不干扰。
- 版本页支持非英雄单位:Valve patchnotes `heroes[]` 中的熊灵(id 1961)等
伪英雄 id 现解析为中文名 + 本地头像(`fetch_patches.py``UNIT_NAMES`
静态导出一并拷贝头像)。
### Fixed
- 修复 `serializeHash` 生成 `#heroes`(缺 `/`)导致刷新后路由解析异常的
问题,现统一为 `#/heroes` 形态。
- 版本日志中未知单位 id 不再显示 `# 1961` 原始数字,回退为「其它单位」。
- 本地开发服务 `serve_relations.py` 增加 CSP 响应头(`default-src 'self'` 等),
限制资源只从本站加载。
- `data.json` 加载失败时显式抛出 HTTP 状态错误,不再静默进入异常渲染。
### Performance
- 上分帝 Web缓存英雄技能条目(`skillEntriesFor`)与血蓝条量程
`resourceBarScale`)计算结果,数据重载时失效,减少重复遍历。
## [0.3.0] - 2026-07-27
### Added
- 上分帝 Web「版本」页改为默认展示**最新版本**的完整改动详情(综合 / 物品 / 中立物品 /
英雄),顶部下拉可切换近一年内的其它版本;`fetch_patches.py` 重写为抓取近一年
(默认 365 天,`--days` / `--since` 可调)版本列表 + 逐版本 `patchnotes` 详情,
构建 `lookup`ability_id / hero_id → 名称 + 图标 key)并下载引用到的物品 / 技能
图标到 `assets/`,静态导出与本地开发服务均自包含、不联网。
- 版本页排版对齐官网:左大标题「游戏性更新 {版本}」+ 右选择框,内容居中窄列;
物品图标按 Steam CDN 88×64 比例(66×48)显示(修复正方形框上下黑边);英雄头像
复用英雄页 16:9 宽卡(`?v=wide``object-fit:contain`)不再裁切面部;图标放大
(物品 56、技能 48、头像 112,对齐技能页 68 / 商店 70)。
- 英雄详情区新增 **版本变更** 标签:列出该英雄近一年各版本的改动(版本号 + 日期 +
属性 chip + 各技能改动),内容居中、可滚动;与版本页共用技能块渲染逻辑。
- 版本日志先天技能图标修复:先天技能(如剑心犹在、狙击瞄准)CDN 404,现复用英雄
技能页 bundled `innate.png`(从 `hero_abilities.is_innate` 构建先天 key 集合判断),
覆盖 117 个被引用的先天技能。
- `hero_notes` 属性标签补全 `movement` → 「移速」(修复原始英文 `movement` 漏显示)。
- 新增 `export_relations_site.py`:一键导出上分帝 Web为纯静态站点(`dist/relations/`),
内含 `data.json` 快照 + 前端 + 图片资源,可直接部署到任意静态托管;
`--with-videos` 可选拷贝技能演示视频(体积数 GB)。
- 上分帝 Web前端资源路径改为相对路径(`data.json` / `attr/` / `portrait/` / `item/` 等),
静态托管在子路径下也能正常工作;`serve_relations.py` 同时提供 `/data.json` 路由,
本地开发服务行为不变。
- 上分帝 Web技能详情:左侧播放官网技能演示视频(`assets/ability_videos/` 本地缓存,
`/ability-video/<英雄>/<技能>.webm` 路由),右侧为技能名与描述(对齐官网左右分栏);
未缓存的技能自动隐藏视频,描述列占满整行。
- 英雄详情的装备详情区不再重复显示大图(上方装备行已有图标)。
- 上分帝 Web技能详情新增「施法前摇」「吟唱时间」两行(取自 Valve `cast_points` /
`channel_times`,逐级相同则合并为单值);`fetch_hero_abilities.py` 全量重抓后生效。
- 上分帝 Web技能详情按 dota2.com.cn 版式重排:移除右上重复的技能大图标(上方技能列表
已高亮选中项);属性值(技能/伤害类型/免疫/驱散/施法距离等)双列网格、特殊数值
自适应多列网格(消除右列大片空白);冷却/蓝量移到带图标的底栏——冷却用官方
`cooldown.png`(新增 `assets/ui_icons/` + `/ui-icon/` 路由,静态导出一并拷贝),
蓝量沿用官方 CSS 渐变方块;`serve_relations.py` 字段投影补齐 `cast_point` /
`channel_time`
- 技能详情布局适配 `.detail` 定值高度链:视频改 `height:100%` + `object-fit:cover`
自适应填满可用高度(`align-self:stretch` 无法压过被替换元素的 16:9 固有高度,曾
导致视频下方留白 / 顶出滚轮),`main` 钉到列高、内容超高时仅在详情列内细滚,视频
不再被牵连出滚轮;压缩参数行距使典型技能在高屏零滚轮(无头 Chrome + CDP 实测
`scrollHeight == clientHeight` 验证)。整块宽度上限 1000→1320px、视频 700→820px、
详情列 720→760px。
- 上分帝 Web顶栏左上角新增 Dota 2 logo +「上分帝」标题(`assets/ui_icons/dota2_logo.png`
透明 emblem),经 `/ui-icon/` 路由与静态导出统一分发;窄屏自动隐藏标题或整组标识,
不影响居中分页布局。
- 上分帝 Web新增 **Hash 路由**:顶层标签(英雄 / 物品 / 版本)、选中英雄 + 详情子标签
(技能 / 核心装备 / 被克装备 / 版本变更)、物品页选中物品、版本页选中版本均同步进
URL;英雄页的定位标签筛选与搜索框文本以 query 参数(`?tags=核心,辅助&q=axe`)进
URL。形态如 `#/heroes/axe/core``#/items/black_king_bar``#/patches/7.41`
`#/patches` = 最新版,序列化时省略与最新同名的版本号)。刷新保状态、可分享 /
深度链接、浏览器前进后退还原;搜索框 300ms debounce + `replaceState`(不刷历史栈),
标签筛选用 `replaceState`,其余离散选择用 `pushState`。坏链接(未知英雄 / 物品 /
版本)优雅降级为丢弃该项。新增 `web/relations/router.js``parseHash` /
`serializeHash` / `installRouter`),`app.js``main()` 装载并首屏 `applyUrlToState`
`export_relations_site.py` 静态导出列表补入 `router.js`,静态站点深度链接同样可用
(可部署 GitHub Pages,无需 rewrite)。Hash 路由不命中后端路径,`serve_relations.py`
零改动。
### Fixed
- `fetch_hero_abilities.py``has_scepter`/`has_shard` 不再 `or bool(scepter_loc/shard_loc)`
Valve 移除某项升级后**仍保留**旧 `scepter_loc`/`shard_loc` 文案,但
`ability_has_scepter`/`ability_has_shard` 已变为 `False`;旧 fallback 把残留文案
当成「有升级」,导致本地数据与 dota2.com 不一致。改为只信显式 flag 并清空残留
文案,全量重抓后修正 **10 个过期 A 杖 + 20 个过期魔晶**(主宰/剑刃风暴、
影魔/支配死灵、幻影长矛/灵魂之矛、斯拉达/鱼人碎击、术士/暗言术、哈斯卡/沸血之矛、
殁境神蚀者/奥术天球、熊战士/灵魂链接、玛尔斯/护身甲盾、破晓辰星/熠熠生辉;
剃刀/静电连接、沙王/尾刺、暗影萨满/禽戏 等)。
- `fetch_ability_videos.py`A 杖/魔晶**赋予**的技能(`granted_by_scepter`/
`granted_by_shard`CDN 视频名是 `<hero>_aghanims_scepter`/`<hero>_aghanims_shard`
而非技能 key(如 `juggernaut_swift_slash``juggernaut_aghanims_scepter.webm`)。
之前脚本用技能 key 拼 URL 导致 **69 个赋予技能视频全部 404**。新增 `_cdn_name()`
映射,本地文件名仍用 ability key(前端 `app.js` 按 ability key 请求,无需改动)。
重抓后 69 个视频全部到位(迅风斩、水晶克隆、雷云 等)。
## [0.2.0] - 2026-07-27
### Changed
- 代码审查重构:提取 `http_utils.py` 公共模块,统一所有 fetch 脚本的 HTTP 请求、
UA、超时与图标下载逻辑;移除 `requests` 依赖(`requirements.txt`)。
- 合并 `fetch_stratz_matchups.py` + `fetch_synergies.py``fetch_stratz.py --mode matchups|synergies`
- `fetch_cdn_templates.py` / `fetch_hero_portraits.py` 改用 `http_utils`(不再依赖 `requests`)。
- `loc_format.py` 新增导出 `strip_html`,统一 HTML 清理逻辑(`fetch_hero_abilities.py` /
`fetch_items_meta.py` 原各有一份重复实现)。
- fetch 脚本 JSON 输出统一为 `indent=2`(原 `indent=1` / 紧凑 `separators` 混用)。
- `fetch_hero_abilities.py` 主循环改为每 10 个英雄写一次 JSON(原每英雄写一次,O(n²) I/O)。
- `fetch_hero_items.py` 循环内 `collect_used_ids` 改为增量更新(原全量重算)。
- `data/relations.json` meta 中本机路径 `C:\Users\...` 脱敏为 `dota2.xlsx`
### Fixed
- `fetch_items_meta.py`:删除 `strip_html` 死代码(未导入 `unescape`,若被调用会 `NameError`)。
- `audit_relations.py`:删除重复 `missing_cache` 死代码块;JSON 加载加 try/except 防文件损坏崩溃。
- `app.js``renderBoard``state.data` null 守卫(防 fetch pending 期间搜索触发崩溃)。
- `relations.py`:删除 `EXTRA_NAMES``"圣堂/TA"` 重复项(与 `"圣堂/ta"` 归一化后相同)
`"axe":"axe"` 等冗余自映射项。
- `hero_tags.py`:注释「幻想系」→「幻象系」(与代码 `TAG_ORDER` 一致)。
- `item_fears.py``enrich_override_items``not isinstance(row, dict)` 分支的 `cost` 死条件简化。
- `import_relations_xlsx.py``"a仗" in t.lower() or "A仗" in t` 冗余条件简化。
### Removed
- `web/relations/style.css`:删除未引用的 `.item-row` / `.item-phase` / `.item-phase-fear` 规则。
- `web/relations/app.js`:删除死回退函数 `onItemClick`、死类名(`hero-stats-left` /
`shop-group-*` / `shop-column-*`)、合并 `state.selectedSkillId``state.inspect`
### Added
- 上分帝 Web英雄详情:基础属性条(力量/敏捷/智力 + 成长、初始生命/魔法与恢复;
附攻击/护甲/移速/攻击距离)。数据来自 OpenDota(`fetch_cdn_templates.py`
`data/heroes.json`),主属性高亮。
- `fetch_ability_videos.py`:从 Steam CDN 批量拉取官网技能演示(webm/mp4),
默认限速约 1.5s+抖动,支持断点续传与 404 缓存;输出 `assets/ability_videos/`(不入库)。
- 装备说明填充 Valve `%token%` 数值(如飓风长戟「飓风之力」);
`fetch_items_meta.py --reformat-desc`,共用 `loc_format.py`
- 上分帝 Web英雄详情底部分页:**技能** / **核心装备** / **被克装备**
- 上分帝 Web新增顶级 **物品** 页(与英雄同级):对齐 dota2.com.cn 商店物品
**11 列竖排**(基础分类 / 合成分类),详情在右侧;目录来自官网
`itemscategory/json``fetch_item_shop.py``data/item_shop.json`),
并展示合成组件(含卷轴)与「可升级为」。
- 英雄页固定上方英雄网格高度;技能 / 核心装备 / 被克装备均可点击,
详情(含装备合成)展示在下方详情区(非弹窗)。
- 「害怕」装备规则完善:莲花 `spell_reflect`、点目标技能自动关联莲花/林肯;
`data/hero_fear_overrides.json` 补经典克制(如剑圣→莲花)。
- 上分帝 Web技能区对齐官网:可点选技能 / 魔晶 / 神杖升级,右侧显示描述;
下方展示天赋树(25→10)。数据来自 Valve herodata`fetch_hero_abilities.py`)。
- 上分帝 Web选中英雄后展示技能(图标 + 名称;可驱散角标;悬停看描述);
数据来自 `data/hero_abilities.json`,图标按需缓存到 `assets/ability_icons/`
- 上分帝 Web「怕的装备」:`fetch_items_meta.py`Valve/OpenDota 描述 → 机制标签)、
`fetch_hero_abilities.py`(技能驱散等汇总)、`item_fears.py`(规则映射)→
`data/items_meta.json` / `hero_abilities.json` / `hero_item_fears.json`
详情区在「核心」下增加「怕」行。例外标签见 `data/item_tag_overrides.json`
本阶段仅 Web 站点,无对局内出装推荐。
- 上分帝 Web选中英雄后,下方展示中文定位 `tags` 与核心成品装备(不再分阶段);
`fetch_hero_items.py`OpenDota 热度合并 + Valve 中文名,Steam CDN 图标 →
`data/hero_items.json` / `assets/item_icons/`(过滤消耗品/中立/廉价件;
坚韧球/夜叉等中间件若该英雄常继续合成则隐藏,停在该件则保留)。
- GSI 全量落盘:默认把每包 POST 追加到 `samples/raw/<matchid>/gsi.jsonl`
`gsi.dump_payloads` / `--dump-gsi` / `--no-dump-gsi`)。
- 前台窗口检测:`gsi.require_foreground`(默认 true)。选将跟踪时若前台不是
`dota2.exe` 则跳过本帧截屏/识别,且不消耗 `strategy_tail_polls`;切回后继续。
- 选将角色标签悬浮层:`overlay.enabled`(默认 true)。跟踪过程中在顶栏已确认
英雄下方显示角色图标(Carry / Nuker / Initiator 等);点击穿透。
- `data/heroes.json` 增加 `roles` 字段(来自 dotaconstants);`fetch_cdn_templates.py` 同步拉取。
- `data/heroes.json` 增加中文口语别名 `aliases`(如斯拉达→大鱼人、主宰→剑圣);
`fetch_cdn_templates.py` 重拉时按 `key` 合并保留,不覆盖手工收录。
- `data/heroes.json` 增加英文缩写 `abbr`(小写列表,如 nec / vs / pa);
上分帝 Web搜索支持缩写且不区分大小写;重拉模板时保留该字段。
- `fetch_stratz_matchups.py` + `audit_relations.py`:拉取 STRATZ 对位并与 OpenDota
交叉审计定性关系,输出 `data/relations_audit.json`
- 定性关系库 `data/relations.json`(克制有向边 + 搭档 + 理由);
`import_relations_xlsx.py` 可从选将笔记导入;`serve_relations.py` 三视图只读预览(改 JSON 后刷新)。
- `fetch_hero_portraits.py` 下载 dota2.com/heroes 竖版头像到 `assets/hero_portraits/`
供上分帝 Web网格使用(与匹配用 `templates/cdn/` 分离)。
- 英雄中文定位标签 `tags`(核心/辅助/推进/逃生/爆发/先手/控制/耐久/幻象);
上分帝 Web 页可筛选,不参与推荐打分。
- 上分帝 Web属性图标改用 dota2.com 官方素材(`assets/attr_icons/`),不再手绘。
- 选将 Top-3 推荐改为读定性关系:+克制敌方 / −被敌方克 / +己方搭档;
叠层左上角青方标显示名次 1/2/3。
- draft JSON / GSI `self` 透传 `accountid``steamid`
### Changed
- 上分帝 Web英雄详情(`#detail`):贴视口底部展示(`margin-top: auto`,高度仍按内容收缩);
与上方英雄选择区保留约 16px 间距;标题 / 属性条 / 分页 / 技能与装备行 / 检视区整体水平居中(最大宽约 820px),长描述在居中容器内仍左对齐。物品页布局未改。
- 上分帝 Web技能详情区不再重复放大技能图标;顶栏选中态即可识别,详情只保留名称 / 标签 / 驱散 / 描述(核心/怕装详情仍显示装备大图)。
- 上分帝 Web先天技能统一使用共用金色水滴图标 `assets/ability_icons/innate.png`
(多数 innate 在 Steam `dota_react/abilities` 上 404),技能行与详情区不再破图占位。
- 上分帝 Web英雄详情:技能图标与核心/怕装列表图标加大(技能 68px、装备 72×54),
便于点选;商店页 `.shop-item` 尺寸未改。
- 物品页详情面板改为与 11 列商店并排居中集群(`sticky`),贴在商店右侧约 16px
不再固定贴视口右缘;窄屏仍堆叠置顶。
- 物品页:`#items-view` 限制为视口内滚动容器,避免 `sticky` 详情随窗口滚动盖住商店列;
空状态去掉过大 `min-height`,面板高度随内容收缩。
- 上分帝 Web天赋树改为官网弹层风格(居中「天赋树」、25→10 圆形等级徽标、左右选项行)。
- `heroes.json` 迁至 `data/heroes.json`;可再生成的对位/审计/报告文件改由 `.gitignore` 忽略。
- `assets/role_icons/` 改用 Valve 游戏内选人筛选图标(`filter_*`);灰蓝底板 + 深色
符号,透明角填品红 chroma,叠层不再出现黑边。
- 项目定名:**上分帝** / **Climperor**(目录 `climperor`),由 `dota2-draft-vision` 迁出独立仓库。
- **放弃 real 实拍模板库**:删除 `build_library.py``templates/real/`;匹配仅使用 CDN 层。
- 移除 `match.cdn_penalty``evaluate.py --cdn-only`(双层库对比已无意义)。
- 模板加载 API 简化为 `(hero_key, image)`
- GSI 会话截图按对局写入 `samples/raw/<matchid>/`
- 运行产物纳入 `.gitignore``preview/``results/``failures/``samples/raw/`
- 文档拆分为 `README`(操作)、`DESIGN`(决策)、`AGENTS`(协作)、`CHANGELOG`(变更)。
- `DESIGN.md` / `AGENTS.md` 补录原型会话结论:顶栏皮肤时机、决策禁改判原因、
real 库审计结论、无法靠 GSI 卡「皮肤前」单帧等。
- 本人顶栏槽位只使用 GSI `team_slot`;移除截屏名字亮度识别「自己是第几格」。
### Removed
- real 库补充流水线与相关验收指标。
- 仓库内历史 `preview/``results/` 调试产物。
- `roles._detect_self` 视觉认槽位备用路径。
### Fixed
- 上分帝 Web英雄卡片 title 垃圾清理:`data/relations.json` 的 counters 被
`relations_patch_draft.json` 注入 100 条 reason 为 `opendota_adv/stratz_adv`
胜率数值的边(违反 `meta.note: no winrate` 与 AGENTS.md「不要用胜率/场次表达
机制克制」),拼进 hover title 显示为「opendota_adv=0.13; stratz_adv=4.47」
之类。删除这 100 条 numeric-reason 边(含水人 axe/hoodwink/windrunner →
morphling 三条),保留 5 条定性 + 149 条空 reason counters + 11 条
synergies(空 reason 经 `.filter(Boolean)` 不进 title)。
- 上分帝 Web英雄页:`#detail` 不再 `flex: 1` 撑满网格下方剩余视口(短内容时大片黑底空白);
改为按内容收缩(`fit-content`),并用 `max-height` 限制长文案在面板内滚动。
- 上分帝 Web技能行对齐官网:左起「天赋树图标 → 先天圆形图标 → 方形技能」;天赋详情改为
悬停/点击浮动弹层(不再内联占高);图标见 `assets/ability_icons/talent_tree.png`
- 上分帝 Web天赋树数值修复:天赋 `name_loc``{s:bonus_<sv>}` token 原全部
显示为 `+?`/`-?``format_loc` 只读 `values_float``talent_rows` 只传天赋
自身空 `special_values`)。改为跨技能按 talent key 索引 `bonuses` + sv 名
/单 token 配对两层兜底填 `bonus.value`;重生成 `data/hero_abilities.json`
1016 条全部恢复。naga_siren「捕捞速度」上游缺 bonus,经
`data/talent_overrides.json` 手工补 `+125`
- 上分帝 Web核心装备「阿哈利姆福佑」→「阿哈利姆神杖」:`ultimate_scepter_2`
(id 271) 是神杖 (id 108) 的激活形态,OpenDota 分开计数导致 37 个英雄
核心装备列表出现「福佑」甚至神杖+福佑并存。`fetch_hero_items.py` 新增
`fold_blessing_into_scepter` 把 blessing 计数按 max 合并入 scepter
重生成 `data/hero_items.json` 统一显示「阿哈利姆神杖」。
- (继承自原型)CDN 头像按顶栏窗口裁切,而非中心正方形;CDN-only 即可高准确率。
- (继承自原型)天梯段位条 / 勋章遮罩匹配;选人多帧 + 决策禁改判规避皮肤;
best 帧优先选人阶段;本人英雄以 GSI 覆盖。
## [0.1.0] - 2026-07-25
### Added
- 决策时间顶栏 10 格模板匹配识别。
- 相对坐标 ROI、自动标定(玩家颜色条)。
- Steam CDN 全英雄模板拉取(`fetch_cdn_templates.py`)。
- GSI 触发的选将会话跟踪(`gsi_watch.py` / `draft_session.py`)。
- 位置文字、禁用网格、模式字辅助识别。
- 天梯 UI 遮罩与会话层皮肤策略。