gh-gongjin/dsh-plugin-gh-trending

dsh-plugin-gh-trending

dsh 插件:GitHub 日/周/月热榜监控 + 仓库详情中文描述与 README 节译(全程只读 GET)

待分类deepseek-harnessdshgithub-trending

DSH(deepseek HARNESS)的 GitHub 热榜监控插件:在侧边栏「插件」下方增加一个入口,盯三件事 —— 日榜 / 周榜 / 月榜各自怎么变、哪些仓库同时在多张榜上、本机第一次见到的仓库。变化只记录在本插件面板里,不推任何外部通知。

对 github.com 全程只读 GET(每轮三发 = 三张榜各一发;只有传输类失败——连不上/超时——才对那一榜补发,单榜含补发最多 3 发,成功即停):不带 key、不带 cookie、不 POST、不下载 zip、不 clone。 ★ 第二十三轮(10-09)加的那一路有尾巴:开了「全站高星」那一档 ⇒ 一轮最坏四发(三榜 + /search/repositories 一发),那一发每轮上限一枚、不补发、不重试,且出厂关着 ⇒ 关着时上面那句"每轮三发"照旧一字成立;填了 GitHub 令牌时它也走同一条 Authorization 请求头那一路(只进请求头,不进 URL)。 ★ 同日就地改判(用户裁定「开启的时候默认拉取一次」):把开关从关拨到开的那一趟 ⇒ 另加一发、当场花(它不属于任何检查轮,所以那一轮的"四发"账不因为它变成五发)。口径钉三条:认的是库里的转换(已经开着再存一次 true、改别的键时顺带带上、连点 ⇒ 一律不派),回执之前发完(保存偏好的响应回来时那一批已经在库里也在载荷里,不留"点完了但结果在别处"),发过就追帧(坏轮的故障三格同样当场让界面看见)。匿名 search 一小时才 10 发 ⇒ 这一发是用户点下去授权的,不是插件自己起的。 ★ 同日第二条裁定(「上次间隔时间范围内已经拉取过就不要拉取了」):那一趟从"必发"改成当场决定发不发 —— 库里最后一次成功取回(ok===true 的 at)距此刻不到一份检查间隔(prefs.intervalMin,设置页那一格,出厂 60 分)⇒ 0 发,直接把库里那一批端上来(挡下的一趟不写库、不追帧,开关位跟着同一次回执上屏)。窗口不另造常数、界面上看得见的那个数字就是它;⚠️ 上一发是坏的(403 / 超时)时照旧重试 —— 判据吃 at 而不是 lastFetchAt,不许让用户为了重试去等下一轮检查;这一道闸只挂在开启那一趟,检查轮"每轮一发"的节律一字不动。 需要代理时走插件自己的 CONNECT 隧道(lib/services/net.js):它不改本机任何代理设置,也不起监听端口,只在需要时向代理发起一条 CONNECT github.com:443,之后仍是标准 TLS + HTTPS GET。

它是什么

  • 三张榜独立闸门:日 / 周 / 月各一份状态,坏在哪一榜就只冻结哪一榜,绝不连冒横幅。
  • 变化流水:board_enter / board_exit / board_move / first_on_board / renamed / rising_cross / cooling_cross / source_error / source_recover / baseline(枚举与中文标签只在宿主侧 lib/domain.js,界面只查表)。位次挪动日/周 ≥3、月 ≥2 才记 board_move。
  • 跨榜同现:同时出现在 ≥2 张榜 = 持续升温,只剩 1 张 = 热度回落。三张榜在同一次检查里拿到,这块分析零额外请求。
  • 明星仓库那一屏(★ 第二十三轮(10-09)新增,第七个页签):答「哪些仓库反复上榜、谁在往上走」,原料全在本地(三榜这一轮的行 + 观测史 seen)⇒ 打开这一签零请求;七列里「今日新增」只吃日榜、证据不足 3 轮时「在榜」那一列整列置灰并说清为什么(不藏列)。另有一档「全站高星」(GET /search/repositories)出厂关着 —— ★ 10-09 改判:点「开」的那一刻宿主立刻发一发(不等下一轮检查),之后每轮最多一发、结果进缓存,关掉不删已攒的那批,详见「界面」那节;★ 10-10 第三条裁定:开着时它那一批行也参与描述列的现译(与榜面共享那 12 发,关掉只是不上屏、不删译文)。
  • 改名识别:靠条目里的 record_id 认出同一个仓库换了 owner/name ⇒ 记 renamed 而不是「掉榜 + 新进」两笔假账。
  • 项目收藏(★ 第三十二轮(10-13)新增,第八个页签):三榜每一行的末尾、明星仓库那一屏的每一行、以及详情弹框的标题行,共三处入口摆同一枚 ☆(同一个组件、点它只改收藏 ⇒ 不跳转、不开弹框、不滚动);收进来的仓库进「收藏」那一屏,七列 # / 仓库 / 描述 / 语言 / 累计 ★(那一刻)/ 收藏于 / ★(★ 第三十五轮(10-13)撤掉「这一轮」那一列:用户指着屏上那一列说「去掉这个」,裁定「只删那一列,右侧那枚 ★(取消收藏的入口)照旧留着」⇒ 八列变七列,屏上不再有「在日榜 / 在月榜 / 未上榜」那个读数;宿主侧那一格派生、载荷格、相关判据与台账一并撤干净,不留死码)。★ 第三十三轮(10-13)描述那一格换成"本机已有的那一份中文":内置预译或已付过额度的现译,命中判据与榜面同一个函数(lib/board-zh.js 的 descZhHits,这一屏不重写第二遍)⇒ 周榜上有中文的那一行,收藏那一屏逐字同;中文长在载荷那一行的 descZh 那一格(★ 旧台账叫它「第 11 格」,那个序号吃的是「那一行共有十一格」—— 第三十五轮撤掉末尾的「这一轮」之后只剩十格,序号名一并作废,改叫格名),desc 那一格恒是收藏那一刻的原文(覆盖掉就没有第二处能证明"快照不刷新"了)。这一路零出网、零新增额度:那一格是被动的 —— 本机哪天译过那句原文它就上屏,没译过就念原文,屏上永远不欠一次请求。 两条口径决定这一屏的形状:① 存的是收藏那一刻的快照,不是引用 —— 星数与描述不随榜面刷新(所以那一列表头写着「那一刻」,卡脚那句 note 把这件事说明白,要新值点仓库名走详情那条链)⇒ 打开这一签与收藏那一发都恒零出网(★ 第三十二轮的出网账裁定:收藏这一路 0 发,不为了补快照去问 GitHub);② 「这一轮」那一格是宿主本地比出来的成品句(拿收藏键与同一帧屏上那几批行比,命中念「在日榜 / 在周榜 / 在月榜 / 在明星」的优先级单值,没命中念「未上榜」),★ 比键时把榜行的 renamedFrom 一起铺进去 —— 仓库改名后不铺就会把"明明在榜"念成"未上榜"(用户收的默认:误念比缺念更糟) ★ 第三十五轮(10-13)这一条整条作废(用户指着屏上那一列说「去掉这个」,裁定「只删那一列,右侧那枚 ★ 照旧留着」):那一格连同它的派生一起撤 —— 优先级单值、renamedFrom 归一、FAV_ON_BOARD_PRIORITY、FAV_COL_ON_BOARD、FAV_OFF_BOARD_CELL 全部零出处(留入参就是死接口,favs 那套里有一条专门喂旧的那三档原料验它长不出那一格)⇒ 这一屏的形状现在只剩上面那一条律,屏上不再有「在日榜 / 未上榜」那个读数,收藏与榜面的关系只从「来自 <榜名>」那一枚出处牌读。 收藏不裁行、不设上限、不参与 LRU(10-13 裁定:与 repo / trans 那两张表故意不同 —— 按时刻裁等于"收藏久了被系统悄悄删掉"),那一行的五格读数由宿主派生(favSeedOf 四路:三榜切片行 → 全站高星那一批 → 榜史 seen → 详情缓存 repo 表),浏览器只递 {repo, action} 两个字段;形状细节与判据见 docs/design-spec.md §8.15。
  • 仓库详情按需取:点榜面条目的仓库名才弹出一张详情对话框,并在这一下点击去 api.github.com 要元数据 + README,把 GitHub 自己给的字段拼成一张结构化段表(sections[] 四段:项目是什么 / 热度与元数据 / 仓库自己怎么介绍它 / 中文摘要,★ 第十一轮起替代旧的那一整句 narrative;段序、段名、哪句摆在哪一段、哪句算小字全在宿主拼死,客户端只按 kind 摆),并探测仓库自己写的中文 README(★ readmeSource 五档:zh_default 默认 README 本身就是中文 / zh_file 仓库另写了一份中文 README(★ 第十五轮起这一档有两条路:根目录列表里命中 README-zh_CN.md 那类,或默认篇首屏那行语言切换里写着的相对路径命中(真机 docs/i18n/README.zh-CN.md 那一类,根目录压根没有)—— 两条路共用同一发正文请求,编排仍是 4 发封顶) / zh_section 默认篇是外文但整篇里嵌着一段中文小节(第十一轮新增,吃已经在手的那份正文,零额外请求)/ en_default 只有英文篇 / none 没 README)。 描述那一句若命中内置离线词表,会在「项目是什么」那一段里多一个块「中文描述(内置离线预译 · <日期>,不是现译)」,原文紧跟着另起一块照给;没命中而现译开关开着时,换成「中文描述(<这一行当初是谁译的> · <日期 时刻>)」(免费接口 / 百度 / 腾讯 / 阿里 / 模型现译 五选一,库里旧行还可能有历史档名 官方接口,§8.4),原文照样另起一块(译文不替换仓库自己写的那句)。
  • 描述列中文(内置离线预译表,lib/desc-zh.js):榜面与详情里的仓库描述,命中表里的就给一句人工预译的中文,没命中就只显示原文。三条口径: 离线(这份文件是死数据,零 import、零 fetch、零模型调用,dz-6 从源码钉住);带来源与时间戳(卡头与悬停都念「内置离线预译 · 2026-10-06」,界面不自己编日期); 原文改过就不译(命中判据是「仓库主键 + 原文与表里记的那一句逐字相同」,仓库把描述改了 ⇒ 静默退回原文显示,绝不拿旧译文指鹿为马)。 表由脚本生成、不是手抄(tmp/gen-desc-zh.mjs:src 那一列由解析器从真榜面逐字取出,中文那一列是人工写好再合并进去的),当前 73 条;★ 覆盖面会随时间衰减 —— 表只认整理那天在榜上的那些仓库,掉榜/新上榜的描述就是原文。 ★ 第二十二轮(10-08)起,榜面那一列不再只靠这张表:内置表没命中的那几行由每轮检查后的补译批次接上(现译那一路、同一张 trans 表、同一把逐字复用判据)⇒ 一列里从此可能两种来源并存, 所以落款跟着每一行走(悬停给「原文 + 这一行自己的来源 + 注」),卡头那句「描述中译为…」换成宿主按这一张榜算好的条数(内置预译 N 条 · 现译 M 条)。B 那三条口径一个字没动,表命中的行照旧不重发。 ★ 10-10 第三条裁定起,这一路吃的参与行变成两组:三榜那一批 +「全站高星」那一档开着时它那一批(同一张 trans 表、同一把逐字复用判据、同一份 12 发共享预算,榜面先吃饱)⇒ 那一屏的描述列从此也可能两种来源并存;关掉那一档就一行都不进(已攒的译文留着但不上屏)。"参不参与"这件事的出处只有一处(descZhRows),视图与批次两处都调它。 ★ 第三十三轮(10-13)起,"命中判据"也只剩一处:那一圈「内置优先 → 与库里那行原文逐字比对」从 descZhView 抽成导出的纯函数 descZhHits(rows, transRows) ⇒ {hits, counts},榜面读 descZhView 里的那一份、收藏读这一份 ⇒ 两侧一旦漂移,屏上就会出现"榜面有中文、收藏没中文"(你报的正是这一形)。★ 抽函数而不是复制粘贴:lib/favs.js 与 client.js 从此连比对的口径都不认(hc-23 拿四类判据字面 + 合成正样本 + import 名单三头钉住);「哪些行去排队补译」仍由 descZhRows 单独管,收藏那批行不进那个集合 ⇒ 抽函数没有把出网账抽多一根线。
  • 现译引擎五档(D,2026-10-06 第九轮加三档、同日第十轮扩成五档,lib/services/web-translate.js + lib/services/llm.js):内置表没命中的那一句描述(以及 README 英文节选的摘要),交给你在设置页选的那一档现译: 免费接口 = Google 网页版翻译(免注册免密钥,★ 不是官方授权接口,且这台机器直连不通、必须经代理)/百度 = 百度翻译开放平台通用文本翻译(AppID + 密钥,签名 MD5,境内直连可达)/腾讯 = 腾讯云机器翻译 TextTranslate(Version 2018-03-21、地域广州;SecretId + SecretKey,签名 HmacSHA1 v1,直连可达)/阿里 = 阿里云机器翻译通用版 TranslateGeneral(Version 2018-10-12;AccessKeyId + AccessKeySecret,签名 RPC V2 的 HMAC-SHA1,直连可达)/宿主模型 = 第八轮那一路(lib/services/llm.js,花宿主的模型额度)。默认落免费接口(用户裁定「两条都做,设置页选」+「与宿主模型并存,二选一」+「分段器并排五档」)。★ 三家云要不要花钱、有多少免费额度以官网计费页为准(这一轮没能复核到可引用的数字,所以界面上不念数字,只把注册入口摆出来)。五条口径五档共用: 只在点开详情那一刻、只译当前这一条(榜面永远零现译,一轮三发榜面照旧) ★ 第二十二轮(10-08,用户回「按C来」)改判这一条:现译发生在两处 —— 点开详情那一刻译当前这一条(原样)+ 每轮检查之后给榜面上内置表没命中的那几行补一批(用户三条裁定:「检查轮次后补」/「每轮 12 发 · 并发 2」/「复用「描述现译」这一档」⇒ 设置页不新增开关)。 ★ 改判的是什么时候发,不是发多少:读路径恒零发(打开面板 / 重开面板 / SSE 首帧一发都不派 ⇒ 界面永不"因为翻译而转圈"),配额严格按检查节拍花(出厂 60 分钟一轮,手动「重新取一次」也算一轮,一轮最多 12 发、同时在途 2 发、同一行失败 30 分钟内不再试);榜面那三发 GitHub 请求照旧(补译不打 github.com)。形状见 docs/design-spec.md §8.7; B 优先(表命中的行压根不派活,两个来源不会在同一屏打架); 三道源侧闸门(★ 第十一轮加两道、第十九轮补第三道,都排在派活之前:仓库自己写的描述就是中文 ⇒ 不派描述那一发;README 已经有中文 ⇒ 不派摘要那一发 —— ★ 第十八轮把这一句点名到三档:zh_default 默认篇整篇是中文 / zh_file 仓库另写的那份中文篇(根目录名或默认篇里的语言切换行指到的)/ zh_section 整篇里嵌一段达标中文小节,只有默认篇是英文(en_default)才译;none 由"没有节选"挡。★ 第十九轮(用户改判「这两种也算有中文」)补第三道 readmeZhOnScreen(节选):即便档名是 en_default,只要要派出去的那段节选里 CJK ≥ 8(中英混排篇,真机 thedotmack/claude-mem 9 字)或出现「中文」两字(中文篇在子目录没抓到、只剩那行语言切换字样)⇒ 摘要那一发也不派,self 段名跟着补那半句实话(「(节选里已有中文)」/「(这行写着有中文版)」)。★ 第三十轮(10-12,你那句「我开了摘要现译,这个点开没有翻译」)把这一道收窄成只认 cjk 那一支(api.js 派活那侧读 .via !== 'cjk'):「这行写着有中文版」是个推测,推测兑现的仓库档名本来就会落在 zh_file / zh_section(上面那道档名闸已经挡住),推测没兑现的(真机 debpalash/VoiceStudio:中文那份在根目录、库里那行又被 304 冻在 en_default)被它挡下来的结果就是"屏上既没中文、也没摘要"⇒ 派。⚠️ 段名后缀那两支照旧都给(那半句说的是关于这篇 README 的事实,与派不派活是两件事,这一轮第一次把两种用途分列)。★ 判节选不判档名:README_ZH_MIN_CJK = 20 那条一字未动(它管的是「默认 README 本身就是中文」这句档名敢不敢说,降到 8 会把只有一行切换标签的英文篇改名成中文);「日本語」不算中文、国名「中国」不算声明、英文 Chinese 不认(挡了就是删了用户在用的那一屏)。三道都在源上挡,不是译完了再挑译文。★ 第十五轮的第三道闸门不在这里,在那一路服务自己声明的 kinds() 里:免费 / 百度 / 腾讯 / 阿里只有翻译能力,「整理成一段简体中文摘要」那一路只派给 宿主模型 ⇒ 那四档连 enabled('readme') 都问不到,设置页那一行开关也跟着不摆 ★ 第十七轮(10-07)这一条被用户改判:那一发放回来了,五档都派两发(原话「我前面是有摘要现译的,你在哪一次改坏了,给我放出来」);kinds() 那道口与三道源侧闸门都还在,只是翻译四档现在也报 readme。保留的只有措辞:那四档给的是节选的节译,段名与设置页那句说明跟着档位走,只有宿主模型那档叫「摘要」); 落库复用(按「仓库主键 + 原文逐字相同」判,仓库改了描述就重译,绝不拿旧译文指鹿为马。★ 第十一轮把「换了引擎,旧译文照样复用」这一条钉成裁定:现行行为就是要的行为 ⇒ 零代码改动,只补判据与文档,落款署的是那一行当初的来源,不冒充新引擎);两档开关各开各的(描述出厂开、摘要出厂关,都关掉时那一屏与 C/D 之前逐字相同。★ 第十五轮:那两行不再是写死的两行 —— 摆几行由当前那一路自己声明的 kinds() 决定,载荷从 descOn / readmeOn / switchLabels 三格换成一张 switchRows[]。★ 第十七轮(10-07)改判后那份机制一字未动,动的是服务那份声明:翻译四档现在也报 readme ⇒ 五档都摆两行)。 ★ 选路只有一处(pickTranslator):没选中的那四路连"你开着吗"都不问,五路服务互相不知道对方在 ⇒ 不会变成一次点击发五发。 ★ 落款跟着那一行自己的引擎:换了引擎不作废旧译文,也不拿新引擎的名字盖它 —— 库里那行署它当初的来源(trans 表行内 engine 字段)。 ★ 额度分两本账:宿主模型 那一发不打任何 HTTP(走宿主连接);另外四发在插件的出网账里(同一份 net.js、同一档 15s 超时),但不吃 GitHub 那 60 次/小时(另四个域名)。 ★ 密钥的边界(第十轮把这一格从"只有百度一家"扩成三家 × 六格):密钥本体只参与摘要那一步,出网 URL 里只有各家的标识符 + 一次性数 + 签名 (appid/salt/sign、SecretId/Nonce/Signature、AccessKeyId/SignatureNonce/Signature);密钥不进 URL、不出网、不回显、不进日志, 界面上只看得到「库里已存(留空不改动)」那一句。★ 标识符能进查询串是翻译域的例外,GitHub 那一域默认零凭据(★ 第二十一轮改判那句"仍然零凭据":出厂 ghToken 空 ⇒ 与旧版一样一发凭据头都不带;填了才带一条 Authorization: Bearer,只进请求头、绝不进 URL,且这一把密钥与那三把走同一套回显闸门 PREF_SECRET_KEYS;cookie 那三类头全域仍禁,全程仍只读 GET)。 失败的话各说各的:模型那八档(开关没开 / 宿主没给模型 / 没设默认模型 / 超时 / 答错 + 回执原话 / 读不出中文 / 太长 / 没存下来)+ HTTP 那四路九档(多出的三档是 no_credential、http、bad_json —— 网页接口改了形状必须点得名,不许混进"没中文"),一律原文照给。
  • 语言过滤:可配一档语言(prefs.language,页面 slug 的小写形式),保存时就地 GET 一张周榜验 <title>,站点不认这个 slug 就拒收并说明原因。空 = 全站榜。
  • 出网方式:跟随系统(先环境变量 HTTPS_PROXY/ALL_PROXY/HTTP_PROXY,再 Windows 注册表的系统代理)/ 自定义地址(只认设置页那一行,形如 127.0.0.1:7897,只支持 http 代理的 CONNECT 隧道)/ 直连。默认 跟随系统 —— 这台机器上直连 github.com 会超时,而注册表里就写着 127.0.0.1:7897。
  • 设置:检查频率(1 / 3 / 12 / 24 小时)、榜单条数(525,默认 15)、事件保留条数(502000,默认 300)、详情缓存(★ 第十二轮立起、★ 第二十七轮(10-10 用户亲手)整行撤掉、★ 第三十一轮(10-12 用户再次亲手改判)摆回来:6 / 12 / 24 / 72 小时 四档分段器,出厂 24 小时,裁定原文「还是改成以前那种模式,默认缓存24小时,可以配置,不要用60秒这种」 ⇒ TTL 之内一发都不问(连验证器都不问),改档下一发详情就按新档判新鲜(getTtlMs() 现取现算,装配时锁死是第十二轮那笔账的形状),失败档那 5 分钟照旧不进设置页):那一档的存与废走的是同一条链的五个点(domain 那三个名字 + DEFAULT_PREFS 那格 + prefsRecord 声明 + clampPrefs 名单 + index.js 的 getTtlMs 接线与 prefsView 初始格 + api.js 的 400 校验 + hc-11 键表 + 设置页那一行与 hc-20 那条正则),缺一处就是第二真相;★ 那一段键从没真正消失过(第二十七轮只是让 open() 静默丢弃它 ⇒ 删格方向由 tmp/probe-schema-drop.txt 实测安全、域 version 恒 1、零迁移),本轮改回 optionalInt 声明把它收住(追加/恢复键一律 optional,requiredInt 那条 10-07 血案律照守),POST 脏档照旧 400 拒收(不像第二十七轮那一版走白名单丢弃 —— 它现在决定"这一问出不出网");替代物 DETAIL_RECHECK_MS(固定 60 秒防连点)整键删掉,hc-20 反过来钉「domain 那一侧一个字都不许认得它」⇒ 界面上多回一个控件、少一条出网承诺,语言过滤、出网方式、现译引擎(并排五档分段器,出厂「免费接口」;选中「百度 / 腾讯 / 阿里」任何一家时才多出一行那一家的两格(标识符 + 密钥,密钥框是 password)带「保存」/「清除」,并另起一行给出那家的注册地址(要注册才用得着,链接新开标签页、不带走面板))、现译开关行(★ 第十五轮改口径:摆几行由当前那一路服务的 kinds() 决定,不是客户端写死两行;★ 第十七轮(10-07)用户改判放回:翻译四档的 kinds() 现在也报 readme ⇒ 五档都摆两行(描述现译 出厂开、摘要现译 出厂关),那一行行名不变、"这一段是什么"跟着档位走 —— 翻译四档那句说明念「这一段是节译不是摘要」,只有 宿主模型 那档念「另给一段中文摘要」(domain.switchRowLabel);每行 {key,kind,row,label,on} 五格、客户端只念 key/row/label/on,点一下即存。真机那两屏 tmp/shots/68-r15-set-keyless.png / 69-r15-set-host-llm.png 是第十五轮那一版的读数(免费档只有一行开关),第十七轮放回后还没重拍 ⇒ 挂在 §9.3 那条走查清单上,要重启宿主才看得见新那两行)、GitHub 令牌那一行 + 「创建令牌」那一行(★ 第二十一轮新增,用户裁定「设置页加一个 GitHub token,配额抬到 5000/h」:它不在现译那一叠分段器里,是 GitHub 那一域的凭据、与翻译无关 ⇒ 单独两行,全部读 snap.github:框是 password + autoComplete:'new-password'、maxLength 与字段名来自那张派生表、密钥格 value 恒空(存过只把 placeholder 换成「库里已存(留空不改动)」)、库里存过才摆「清除」(点了只发 {ghToken:''} 这一格)、「保存」只在草稿 ≠ 库里那份时可用;下面那一行给 github.com/settings/tokens 那条网址(target=_blank rel=noreferrer,★ 与三家云同一条律:那句额度话不替 GitHub 承诺数字)。⚠️ 这两行还没在真机上看过,与第十七、十九、二十轮那几屏挂在同一条走查清单上),外加一张只读的「运行环境」表(最近那一发的传输路径 + 宿主能力位)。

它不是什么

  • 不是 GitHub 官方工具,与 github.com 无隶属关系;榜单是趋势页页面自己排的名次。
  • 不做 AI 解读(零 ctx.llm) —— 2026-10-06 第八轮由用户拍板改判为「默认零调用 + 句柄只许一个使用者」:现译只在点开详情那一下、只在开关开着的那一档发生。 ★ 同日第九轮再改一次:现译默认不再走模型 —— 出厂档换成免密钥的翻译接口,宿主模型降为设置页分段器里的一档(上面「现译引擎五档」那条;★ 第十轮那一档旁边又多了两家云,从三档变五档)。两次改判都没动这条铁律的另一半: ★ 第二十二轮(10-08)改判的是那一次的"什么时候发"(「只在点开详情那一下」→「详情那一刻 + 每轮检查后给榜面补一批」),这条铁律的另一半照旧一个字没松:句柄仍只许 lib/services/llm.js 一个使用者(新落点 lib/board-zh.js 只吃装配层给的 getTranslator(),认不到句柄),开关关着 / 引擎没就绪 ⇒ 两处都零发。 不发通知、不写会话日志、不动宿主定时器之外的任何东西照旧成立;要通知请用宿主自己的机制,本插件不代作决定。 真机口径(2026-10-05 第六轮为「描述译中文」跑过一次临时宿主 LLM 探针,跑完即撤、现已撤净):这台宿主的 ctx.llm 关不掉思考 —— 官方那两个关思考的字段被静默吞掉、reasoningEffort 看不出起作用,20 来字的译文照烧 209~318 outputTokens ⇒ 真要做现译只能默认关闭 + 从调用次数省。 10-06 01:16 那一轮把它翻案了:思考能关,走 reasoningEffort:'off' —— 同模型同题两发对照:outputTokens 260 → 12、耗时 1.9s → 0.9s、思考字符 1342 → 0(归零才算关掉,耗时和观感都不算判据); 顶层那两个官方关思考字段照旧传了不生效,因为适配器只认 reasoningEffort 这一个入口。★ 这句"还没有排期"也一并作废:10-06 同日第八轮就做了, 发的每一发固定 reasoningEffort:'off'(LLM_REASONING_EFFORT 单点在 domain)。 五发读数与两发对照、判据全在 docs/design-spec.md §9.4 / §9.4.1。

一个必须先说清的口径

数据源是 https://github.com/trending?since=daily|weekly|monthly 的页面 HTML,属于非官方接口:对方改版即失效。 (为什么不选 Search API:要 key,而且"趋势榜"是站点自己算的一张榜,API 复现不了你在 github.com 上看到的那个名次。为什么不选第三方镜像:多一层可用性风险,数据也不可追溯。)

第二个数据源只在点详情时才出现:https://api.github.com/repos/{owner}/{name}(+ /readme、必要时 /contents/)。它是官方 REST,字段稳定,但额度默认是匿名那一档:60 次/小时/IP(实测历轮每一发都回 x-ratelimit-limit: 60。★ 第二十一轮(10-07)改判那半句"硬的":设置页可以填一个 GitHub 令牌 ⇒ 详情那四发各带一条 Authorization: Bearer <token>,只进请求头(不进 URL、不回显、不进日志、不进快照,空白格等于没填、照旧匿名发), 官方文档口径带令牌是 5000 次/小时(★ 本机没有 GitHub 账号也没有令牌 ★ 10-10 只读对账改口:库里 ghToken 那一格非空(只报"非空 + 40 字",值不打印)⇒ 详情那两发带着 Bearer 在发;但那一档仍是零真回包 —— 历次真回包只见过 60,5,000 那一格从来没从 GitHub 头上落到本机,所以那一形状到现在还是合成的)⇒ 屏上那句「匿名配额 / 已认证配额 剩 N / 上限」的上限与那两个字的标签都由 GitHub 自己回的那一格决定:填了却被拒(撤销、拼错)就照旧念「匿名配额」,代理把那一格吞了就退回保守的 60 —— 宁可梦见 60,不可梦见 5000。★ 发数一发没多(一次点击仍 ≤4 发),而 github.com/trending 榜面那三发永远匿名(gh.js 连这一格的键名都不许认得)。 所以一次点击最多 4 发(元数据 1 + README 1 + 只在默认篇不是中文时补 根目录列表 1 + 中文文件 1;★ 第十五轮第二路没加这个数 —— 那一发中文文件正文照发,只是路径改从已经在手的默认 README 那行语言切换里抽,零额外请求,命中才发), ★ "隔多久才肯再问"这一格现在是三层叠起来(★ 第二十七轮 10-10 收成两层、★ 第三十一轮 10-12 用户改判回三层):① TTL(设置页那一档,出厂 24 小时) ⇒ 这一期内一发都不问,连验证器都不问;② 过档那一问走条件请求(元数据与 README 各带自家 If-None-Match,原样转发弱标 W/"…";验证器只存两格、不设长度上限,截断的钥匙永远换不回 304);③ 手动「重新取一次」裸发全量(?refresh=1,一个字都不喂 prev)。失败档 5 分钟(不进设置页),同人连点两下在途去重,界面还如实显示「这一小时还剩几次」。 ★ 出网账(第三十一轮改口的就是这一条):TTL 内点开同一个仓库 = 0 发;过档那一问若正文没变 = 2 发各回 0 字节、单发 ≈100ms、但配额照扣 1 —— 官方文档那句「304 不计入速率限制」被本机 9 发匿名探针推翻(§9.1 那张表),★ 这条实测正是"为什么不能每次点开都问"的依据(匿名档 60/小时下,每次点开都问会把一小时压成约 15~30 次点击;已认证那一档本机零样本,用户裁定「不测,边界如实登记」);⚠️ 代价也照实登记:不回源就不知道 README 改了,正文最长滞后 = 用户自己选的那一档。唯一一条 TTL 例外:库里那一行自称中文 README 那一档还没探完(zhProbed 缺或 false,第三十轮那半截结论)⇒ 过档那一问必须真出网重判,否则中文那一档要等满 24 小时才自愈、第三十轮那条修复当场白做。 两个时刻各有各的说话权:at 只在真拿到正文时推进、checkedAt 每问必推 ⇒ 那句落款念「正文取回于 3 天前 · 刚核对过」(那两截词来自 domain,客户端不造缺位符、相对时间仍由浏览器算,§8.10);★ 第三十一轮把「刚核对过」收窄成只在真核对过那一问才念(cached === true 时恒 false ⇒ TTL 命中那一屏只有第一截,屏上不许出现"第三截"那种东西)。⚠️ TTL 判的是 checkedAt(缺这格的老行回退 at)—— 判 at 会让"最省额度"那一类行(304 后 at 是刻意冻住的)每次都出网,那正好把用户要的东西反着做。★ 第十一轮的 zh_section 那一档不在这个数里加东西:默认篇是外文时,先在已经在手的那份整篇 README 里找中文小节(零额外请求,那条路实测 3 发封顶),找到了就不再往现译那一路派活;「仓库自己写的描述本身就是中文」(descSelfZh)同理;★ 第十九轮的第三道闸门同样不在这个数里加东西 —— 它吃的是要派出去的那段节选(/readme 那一发已经回来的字),既不许多打一发去猜路径,也不新增载荷键或存储字段 ⇒ 三闸门省的都是翻译那本账,GitHub 这本账一克没动。详情读的是仓库自己写的话(description 两路中文都没有时那句原样标「原文,未翻译」—— 开关关着、那一档发不出去、或接口答错了都落在这档),命中内置离线词表时多一句人工预译的中文(带来源与时间戳,原文照给,见上面「描述列中文」那条与 docs/design-spec.md §8.2),现译命中时同理(落款是「<这一行当初是谁译的> · <时刻>」,原文同样照给,§8.3 / §8.4)。 ★ 第二十二轮(10-08)起这本账有两处:详情那一路仍是「一次点击最多两发 = 描述 + 摘要」,榜面那一路新增「一轮检查后最多 12 发、同时在途 2 发、只补描述那一档」(用户裁定的额度闸门)。 ★ 10-10 起榜面那一路分成两组,但 12 发仍是共享的那一份:全站高星 那一档开着(prefs.allStarsEnabled === true)时它那一批行也进补译的参与集合,排序上榜面先吃饱、全站那批排在后面(两个 rank 不同轴:榜内名次 vs 全站名次)。真机口径(脚本回算,不是估的):库里那一批发 30 行,其中 2 行本来就在三榜可见切片上(所以旧版那两行有中文)⇒ 本轮新并入的参与行是 28 行,ceil(28 / 12) = 3 轮才补齐,按生效的 intervalMin = 60 ≈ 180 分钟。★ 这笔支出花的是翻译那本账(host_llm 那一路连 HTTP 都不打),GitHub 的 REST 与 search 两本账一克没动;关掉那一档 ⇒ 已攒下的译文仍躺在 trans 表里,只是不在参与集合里所以不上屏,重开立刻上屏且不重烧额度(那是这一档"开关"的真实代价形状)。 ★ 读路径恒零发 —— 打开面板、重开面板、SSE 首帧都只读库不算活 ⇒ "面板开合"这个动作一发都不花钱,配额严格按检查节拍花(出厂 60 分钟一轮,手动「重新取一次」也算一轮)。 ★ 第二十八轮(10-10)起,那两本账之外多出第三本,而且它是用户按下去才开的:详情弹框 self 段段名那一行右侧那三枚常驻按钮 —— 展开全文 = 1 发 GitHub(整篇裸取,一个字都不带验证器、不落库、也不受详情那一档 TTL 挡:那一发要的是正文,不是"问一次有没有变");译整篇 = 1 发 GitHub + 最多 40 发翻译/模型(段落边界分块、同时在途 2 发、到 MANUAL_LEG_MAX 闸就停手并把已跑的拼回去);整篇摘要 = 同一本账,但预算先扣 1 发留给末尾那一发汇总 ⇒ 块最多 39、汇总恒轮得到、总发数 40 封顶。★ 这三枚不受设置页那两个开关管(用户原话「不受参数设置控制」),但照吃就绪态与能力位:没选引擎 / 那家云凭据没填 / 宿主没给句柄 / 这一档不会摘要 ⇒ 置灰并说一句各自的话(四形四句,不许互相冒充)。⚠️ 上面那句「读路径恒零发」一字未动 —— 手动这一路是写(POST /api/repo/readme),只有按下去才出发,渲染期一个字节都不派。 闸门的闭嘴形状各有名字、各有判据:那一路没接(no_engine)/本地库不在(no_store)/开关关着(off)/引擎没就绪(unavailable)/账本读不出来(read_failed ⇒ 整轮作废,不是当新行重烧 12 发)/屏上全命中(nothing)。 ★ 第三十二轮(10-13)多出第四个写入口(POST /api/fav,那枚 ☆),而它是这本账上唯一一本"零出网"的:收藏那一刻的五格读数(显示名 / 描述 / 语言 / 语言色 / 星数)全部由宿主从本地四张表派生(favSeedOf 的查找序 = 屏上那几屏的顺序:三榜切片行 →「全站高星」那一批 → 榜史 seen → 详情缓存 repo 表),★ 第四路刻意读表而不是读 repoService.load() —— 后者会在 TTL 之外真问 GitHub 一发,而这一趟的出网账钉的是 0。四路都没有 ⇒ 那一行照落库,出处念「详情」、四格在屏上是 —("本机一个读数都没见过它"的实话,不是缺格)。这一路同时不派现译(★ 第三十三轮改口:那一屏的描述格摆的是本机已有的那一份中文 —— 内置预译或库里已付过额度的现译,命中判据吃榜面那同一个函数;「不派」这一半一个字没动,读它不花一分钱,也永远不欠一次请求)、不写 events(流水的判据是"榜变了什么")。 ★ 10-06 之后这里多出第二个出网账:现译开关开着且内置表没命中时,那一句会交给设置页选中的那一档(一次点击最多两发 = 描述 + 摘要;★ 第十五轮曾把翻译四档砍成只剩描述那一发,第十七轮(10-07)用户改判放回 ⇒ 五档又都吃满这个上限,那道能力声明 kinds() 与源侧闸门都还在(★ 第十九轮又补一道,见上面那条))。五档里只有 宿主模型 那一发不打 HTTP(走宿主自己的模型连接与额度); 免费接口 / 百度 / 腾讯 / 阿里 那四发是插件自己经同一份 net.js 出的网(代理仲裁与 15s 超时都不另建一套),打的却是另四个域名(translate.googleapis.com / fanyi-api.baidu.com / tmt.tencentcloudapi.com / mt.aliyuncs.com,白名单由 TRANSLATE_ENDPOINTS 派生成 TRANSLATE_HOSTS,判据不手抄清单) ⇒ GitHub 那一域的配额五档都不占(★ 第二十一轮之前那句写的是「那 60 次/小时」;现在那一域是"匿名 60 那一档,填了令牌则是按账号那一档",但翻译那四发一格都不占这件事没变),运行环境 与页脚那句配额说的还是 GitHub 那一头,跟翻译成没成是两条独立的线(别在文案里混成"配额用完了所以没译出")。判据与口径见 §8.3 / §8.4。 ★ 全程只读 GET 这条铁律一个字没松:腾讯云与阿里云那两路接进来用的是它们官方签名里能走 GET 的那一档(腾讯 v1 签名把参数放查询串、阿里 RPC V2 是查询串签名), 所以改判的是"翻译域的查询参数里允许出现厂商标识符"那一格,不是 method。★ 后半那句「也不是 GitHub 那一域的零凭据」第二十一轮就地改判(原句留着当历史):现在写的是「默认零凭据 —— 库里 ghToken 空着(出厂态)时那一域一发凭据头都没有,与旧版逐字节一致;填了才带一条 Authorization,只进请求头、绝不进 URL,且只给 api.github.com 的详情那一路」;cookie / client_secret / access_token 三类头全域仍然一律禁(判据 hc-7 按域收窄成三道硬界,逐条证伪见 §9.2 第二十一轮)。

探针实测的三件事决定了解析器的形状(完整读数见 docs/design-spec.md §9.1):

  • 每个数值 span 前内嵌约 700 字符的 <svg> ⇒ 锚点必须跨 </svg> 取文本,定长窗口会静默取空。
  • 未登录页每行都带 /login?return_to=… 的 star 按钮 ⇒ 仓库名必须从 <h2 起找,不然每个仓库都解析成 login。
  • ?since=bogus 不报错,逐字节返回日榜;语言 slug 不存在也只给 200 + 0 条 ⇒ 白名单与「空榜 / 无效语言」的判据(<title> 念没念语言名)只能守在宿主侧。

因此:

情况面板表现
某一榜本轮抓不到 / 解析失败该榜卡就地写「故障 · <原因>(显示 <多久> 前的上次成功数据)· 已连续 N 轮」,行数据冻结在最后一次成功轮,其他两榜照常
连不上 / 超时(传输类)先补发(同榜最多 3 发),仍不通则卡上多一条来源提示,按最近那一发的实际路线说:经代理 http://127.0.0.1:7897 未通 / 直连未通 / 配置坏到根本没出网(三种情况绝不并成一句「网络不通」);同时写明「下次自动检查 X 后」
代理地址填错 / 解析不出来记为配置错误(不补发、不静默回落直连),榜面冻结在最后一次成功轮,运行环境 · 传输路径 一行红点写明原因
语言 slug 站点不认记为配置错误(不是源故障),但仍然冻结该榜并写清原因;保存时直接 400 拒收
语言合法但这一档今天没榜合法空榜:ok=true + 「这一档今天没有上榜仓库」,不冒红点
条件请求拿到 304只推「最近取回」时间,榜面数据时间不动(304 只证明整页字节没变,"今日新增"是累计值)
点详情时 api.github.com 给 404 / 限额用尽 / 传输失败 / 配置坏四种各给一句话(REPO_ERROR_LABELS + 接口原话),榜面照常;失败行 5 分钟内复读同一仓库不再出网,免得把坏名字刷爆额度
详情在设置页那一档 TTL 内再点同一个仓库(★ 第三十一轮:那一档摆回来,第二十七轮的固定 60 秒窗口 DETAIL_RECHECK_MS 整键删掉;⚠️ 第三十轮那句落款第三截「· 60 秒内没再问 GitHub」跟着撤,词表回两格)载荷标 cached: true + ageMs,连验证器都不问、这一问 0 发出网 ⇒ 底部那句配额读数不往下走;落款只念第一截「正文取回于 <多久> 前」,revalidated 恒 false(这一问压根没核对过,念「刚核对过」就是谎);★ 唯一不受这一挡的成功行是 zhProbed 不是 true 那一类(见下一行的例外);重取走 ?refresh=1 —— 它绕过缓存且一个字都不带验证器(带着旧 ETag 去问就大概率换回 304 的老正文,那颗按钮写着「不走缓存」就会说谎)
点开详情、已过档且仓库一个字没改(★ 形状 B 自第二十七轮起在,★ 第三十一轮起这一支只在"过档那一问"才走到)照样出网 2 发、各回 0 字节(≈100ms,配额照扣 1),载荷 revalidated:true ⇒ 底部那句念「正文取回于 <上一刻> · 刚核对过」,正文沿用本地那一份、一个字没换;README 变了才走满 2~4 发;★ 没带钥匙却回了 304(中间代理 / 接口改版)⇒ 当场裸发重问一发,绝不把空正文端给界面;⚠️ ★ 第三十轮那道例外在第三十一轮升格成 TTL 的例外:库里那一行若自称中文 README 那一档还没探完(zhProbed 缺或 false —— 上一版把探测那一发超时/5xx 留下的半截结论连同整行一起冻住,用户每问一次都命中同一个「没有中文版」),freshEnough() 直接判假 ⇒ 这一问一个字都不喂验证器、裸发四发重判一次,探完才写回 true ⇒ 代价是一次性的,三问内回到 0 发(TTL 命中);⚠️ 那一格的口径不许写成"来过 probeReadme 一趟就算探完"(那是把同一个冻结换个地方继续冻),八形逐形钉(六 true 两 false)
三榜连坏节拍按 2^N 翻倍退避,指数封顶 4 轮、绝对封顶 4 小时;任何一榜成功即归零。(2026-10-05 真机改造前:启动抖动连坏三轮,未封顶的指数退避把下一轮推到 24 小时,面板一整天空着。改造后同一场景实测 backoffExp:1 → effectiveMs 顶到 4 小时,第三轮自愈)
宿主没有 ctx.storageDomain / 存储域 open 失败榜面照看,能力位与状态卡如实写「变化史留不下来」。绝不谎报存储在位

安装

⚠️ 当前状态:页签化 + 传输补发 + 插件内代理隧道 + 仓库详情(数据源与详情对话框)+ 描述列内置离线预译 + 模型现译(C)+ 现译引擎五档(D,第九轮三档、第十轮扩到五档并接上腾讯 / 阿里云)+ 自带中文探测与结构化段表(A,第十一轮)+ 详情屏撤废话与详情缓存时长可配置(第十二轮)+ 名次徽章分档(第十四轮)+ 节选与判据窗口分家 / 句子边界收口 / 摘要能力跟着那一路 / 语言切换行找中文 README(第十五轮,★ 其中「摘要能力跟着那一路」已被第十七轮用户改判放回)+ 回执带上厂商请求号 / 同屏一条失败句只念一次(第十六轮)+ 摘要现译放回来(第十七轮)+ README 有中文就不派摘要(第十八轮,闸门本就在)+ 屏上那段节选里已有中文也不派摘要(第十九轮,★ 同一轮"库里那条旧译文行删"那一件没做成** —— 删掉后被在跑的宿主写回,要等宿主关掉重删)+ 多份中文篇并存时挑简体那一份(第二十轮)+ 设置页 GitHub 令牌那一行 / 详情配额那句跟着 GitHub 自己回的那一格(第二十一轮,★ 这轮动的是文首那条铁律的"不带 key":改判为默认零凭据 + 填了只进请求头)+ 榜面描述列接上现译(第二十二轮,★ 这一列从此是「内置预译 + 每轮检查后补的现译」两种来源并存)+ 明星这一屏(第二十三轮:第七个页签 + 形状 B 薄快照 + 那一发的闸门与落库)+ 点「开」的那一刻默认拉一次(第二十四轮)+ 检查间隔之内已经成功取回过就不重发(第二十五轮)+ 全站高星那一档接上描述列现译(第二十六轮,★ 与榜面共享每轮那 12 发、榜面先吃饱)+ 详情改条件请求 / 固定 60 秒防连点 / 撤掉「详情缓存」那一档(第二十七轮,★ 本轮把「隔多久才肯再问」从"按设置页那一档"改成"每次点开都问、只问验证器";⚠️ 第二十七轮那两件事已被第三十一轮用户亲手改判:条件请求留下、"每次都问"换成"过档才问"、60 秒窗口整键删除)+ 详情弹框那三枚手动按钮:展开整篇 / 译整篇 / 整篇摘要(第二十八轮,★ 第一条由浏览器发起、当场花模型额度的写,也是「不受参数设置控制」那半句的落地)+ 面板选中态落盘:切走再回来还在原页签、原档位(第二十九轮,★ 只动浏览器半边 client.js —— 宿主 main 那个 keyed 席位切走就是整棵树重建,而选择态里躺着的东西不该进库、更不该进快照)+ 中文 README 那一档不再被 304 冻住 / 摘要那一发不再被"推测有中文"挡掉 / 60 秒防连点窗口命中那一屏有可见结果(★ 第三十轮,你那两问「1.我开了摘要现译,这个点开没有翻译;2.截图里写着有中文,为什么没有拉取到中文版」—— 修法是让库里那一行说自己"探完了没有":repo 表追加 zhProbed 那一格(口径 = 判定输入齐了才算探完),缺或 false ⇒ 下一问一个字都不喂验证器、裸发重判一次,探完写回 true ⇒ 代价是一次性的;另两处是闸门只认屏上真中文,与那句落款补第三截「60 秒内没再问 GitHub」;⚠️ 那第三截已被第三十一轮撤掉)+ 详情缓存那一档摆回来(默认 24 小时 / 四档可调)· 固定 60 秒防连点整键删除 · TTL 之内连点 0 发 · zhProbed 那半截结论不受 TTL 挡(★ 第三十一轮,你那句「我说还是改成以前那种模式,默认缓存24小时,可以配置,听不懂吗,不要用60秒这种」—— 这是你亲手撤销自己 10-10 那次撤档裁定的改判,不是新功能;落款第三截跟着撤、词表回两格,「刚核对过」收窄成只在真核对过那一问才念)+ 项目收藏:那枚 ☆ 三处入口 + 第八个页签「收藏」+ 第八张表 fav(★ 第三十二轮,你那句「增加一个项目收藏功能」—— 三条形状是这一屏的骨架:存的是收藏那一刻的快照而不是引用(星数与描述不随榜面刷新,所以表头念「那一刻」、卡脚那句 note 把这件事说白)⇒ 打开那一签与点那枚 ☆ 都恒零出网;「这一轮」那一格是宿主本地比出来的成品句(三榜 → 明星的优先级、单值、比键时把 renamedFrom 一起铺进去 ⇒ 改名后不把"在榜"念成"未上榜") ★ 第三十五轮整条作废(用户裁定「去掉这个」⇒ 那一列连同 domain 那四个名字、favView 的三档原料入参一起撤,屏上七列;这三条形状只剩两条,另立新立的那四读与判据出处见上面第三十五轮当前读数与本节第 419 行那条);那一行的五格读数由宿主派生(favSeedOf 四路读本地表,浏览器只递 {repo, action});收藏不裁行、不设上限、不参与 LRU)+ 收藏那一屏接上本机已有的那一份中文(★ 第三十三轮,你那句「为什么收藏过来的项目描述没有翻译的」+ 回「按 A 开工」:零出网被动上屏,★ 「这句中文该不该上屏」从此只有一处判据 descZhHits)+ 详情缓存那把尺只留一处(★ 第三十四轮:repo 表裁行键换成「最后一次问过 GitHub」的 repoAskedAt,TTL / 裁行 / list() 三处读同一个函数;同轮把内置表那个批取函数改名 builtinDescZhMap 消歧)+ 收藏那一屏撤掉「这一轮」那一列(★ 第三十五轮,你划界「只删那一列、右侧那枚 ★ 留着」⇒ 八列变七列,domain 那四个名字与 favView 的三档原料入参一并撤干净、不留死码)+ 全站项目检索那一屏(★ 第三十六轮,你那句「加一个全站项目检索功能」:第九个签「检索」+ 第十条路由 POST /api/search,★ 形状是零入库 —— 一次性载荷、切页签或重启就没了、不 broadcast,那一屏的中文只念本机已有的那一份;行尾那枚 ☆ 把「那一刻的三格」seed 随收藏一起存下(你的 B 案),而出处那一格从此与读数解耦),这几件已过 671 项用例(★ 口径:含那两条要真出网的;SKIP_LOCAL=1 下是 669 过 / 0 挂 / 2 跳;套件 16 → 17(★ 第三十二轮到 16,第三十六轮到 17 —— 中间那三轮都是"条数变、套件数不变"))(★ 第十三轮把基线从 356 推到 357(差的那一条是事故补的回归判据)、第十四轮推到 358、第十五轮推到 368、第十六轮推到 371、第十七轮推到 372、第十九轮推到 376、第二十轮推到 378、第二十一轮推到 391、第二十二轮推到 415、★ 第二十三轮推到 494、第二十四轮推到 504、第二十五轮推到 514、第二十六轮推到 521、第二十七轮推到 530、★ 第二十八轮推到 565(套件 14 → 15)、★ 第二十九轮推到 568(套件仍 15,差额 +3 全在 client 66→69)、★ 第三十轮推到 573(套件仍 15,差额 +5 分两套:repo 101→105 / client 69→70)、★ 第三十一轮推到 574(套件仍 15,差额 +1 只落 repo 105→106)、★ 第三十二轮推到 626(套件 15 → 16,差额 +52 分五套:store 47→57 / api 89→99 / client 70→77 / host-compat 21→22 / 新开 favs 24))(★ 口径更正:跑测器 test/_helpers.mjs 数的是用例(check)条数**,不是 assert 条数,旧文档写"项断言"是把这两件事混成一件了;10-07 10:0x 本机复跑:SKIP_LOCAL=1 下 354 过 / 0 挂 / 2 跳,那两条跳的是要真出网的口径(hc-17 与 wt-27);不带 SKIP_LOCAL 那一份是 355 过 / 1 挂 / 0 跳,挂的是 wt-27 免费接口真出网那一发回 `HTT