# Changelog 本文件记录 **上分帝(Climperor)** 的用户可见变更。格式参考 [Keep a Changelog](https://keepachangelog.com/)。 ## [Unreleased] ## [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_%` 指向升级通道时不再留下 `?`(如乌尔萨震撼大地 「减速4秒」、祸乱蚀脑魔晶冷却)。 - 技能详情有演示视频时加宽右侧文案列、收窄视频上限,空间够时技能介绍尽量单行。 - 技能详情特殊数值标签不再露出 Valve `` 原文(如「眩晕时间」);数值级差 保持单行;冷却/文案同底栏下沉,避免介绍区窄列竖排与多余滚轮。 - 技能详情底栏蓝量靠右,不再贴着冷却时间。 - 版本页笔记剥离 Valve `` / `` 等标签,只保留换行。 ## [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/.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//matchups`:克制 / 被克 / 搭档三列 STRATZ Top(与网格机制「克/怕/搭」分开展示) - 缓存:`data/stratz_hero_meta.json` / `data/stratz_matchup_tops.json`(gitignore;仅 Web,不进 recommend / relations) - 上分帝 Web「近期比赛」Tab(`#/heroes//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 - 上分帝 Web:STRATZ 走势 / 对位 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//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 视频名是 `_aghanims_scepter`/`_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//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//`。 - 运行产物纳入 `.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_}` 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 遮罩与会话层皮肤策略。