🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

GitHub 热榜监控 gh-gongjin/dsh-plugin-gh-trending

DeepSeek Harness
gh-gongjin27 天前有提交已提供中文文档扫描:含敏感能力

盯日周月三榜变化,点开仓库看中文详情

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/8 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add gh-gongjin/dsh-plugin-gh-trending
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/11/04·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 27 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令发起外部网络请求
查看扫描证据(共 5 处,展示前 5 条)
  • 发起网络请求
    client.js:506
    const res = await fetch(`${API_BASE()}${path}`, opts);
  • 发起网络请求
    client.js:548
    const res = await fetch(`${API_BASE()}/stream`);
  • 执行外部命令固定命令
    lib/services/net.js:182
    execFile('reg', ['query', key], { windowsHide: true, timeout: timeoutMs, maxBuffer: 64 * 1024 },
  • 发起网络请求
    lib/services/net.js:422
    const req = httpsMod.request({
  • 发起网络请求
    lib/services/net.js:508
    async function fetch(url, init = {}) {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 监控日周月热榜
  • 查看仓库中文详情
  • README节译

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

README

由 DeepSeek 最新模型翻译生成
dsh-plugin-gh-trending DSH(deepseek HARNESS)的 GitHub 热榜监控插件:在侧边栏「插件」下方增加一个入口,盯三件事 —— 日榜 / 周榜 / 月榜各自怎么变、哪些仓库同时在多张榜上、本机第一次见到的仓库。变化只记录在本插件面板里,不推任何外部通知。 对 github.com 全程只读 GET(每轮三发 = 三张榜各一发;只有传输类失败——连不上/超时——才对那一榜补发,单榜含补发最多 3 发,成功即停):不带 key、不带 cookie、不 POST、不下载 zip、不 clone。 需要代理时走插件自己的 CONNECT 隧道(lib/services/net.js):它不改本机任何代理设置,也不起监听端口,只在需要时向代理发起一条 CONNECT github.com:443,之后仍是标准 TLS + HTTPS GET。 它是什么 - 三张榜独立闸门:日 / 周 / 月各一份状态,坏在哪一榜就只冻结哪一榜,绝不连冒横幅。
展开完整文档(README 剩余 1 节)
dsh-plugin-gh-trending

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

对 github.com 全程只读 GET(每轮三发 = 三张榜各一发;只有传输类失败——连不上/超时——才对那一榜补发,单榜含补发最多 3 发,成功即停):不带 key、不带 cookie、不 POST、不下载 zip、不 clone。
需要代理时走插件自己的 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 张 = 热度回落。三张榜在同一次检查里拿到,这块分析零额外请求。
- 改名识别:靠条目里的 record_id 认出同一个仓库换了 owner/name ⇒ 记 renamed 而不是「掉榜 + 新进」两笔假账。
- 仓库详情按需取:点榜面条目的仓库名才弹出一张详情对话框,并在这一下点击去 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 那三条口径一个字没动,表命中的行照旧不重发。
- 现译引擎五档(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 段名跟着补那半句实话(「(节选里已有中文)」/「(这行写着有中文版)」)。★ 判节选不判档名: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 一张周榜验 ,站点不认这个 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 小时)、榜单条数(5~25,默认 15)、事件保留条数(50~2000,默认 300)、详情缓存(★ 第十二轮:6 / 12 / 24 / 72 小时 四档分段器,出厂 24 小时,改档后下一发详情就按新档判新鲜;失败档那 5 分钟不进设置页)、语言过滤、出网方式、现译引擎(并排五档分段器,出厂「免费接口」;选中「百度 / 腾讯 / 阿里」任何一家时才多出一行那一家的两格(标识符 + 密钥,密钥框是 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 账号也没有令牌 ⇒ 那一形状是合成的,零真回包)⇒ 屏上那句「匿名配额 / 已认证配额 剩 N / 上限」的上限与那两个字的标签都由 GitHub 自己回的那一格决定:填了却被拒(撤销、拼错)就照旧念「匿名配额」,代理把那一格吞了就退回保守的 60 —— 宁可梦见 60,不可梦见 5000。★ 发数一发没多(一次点击仍 ≤4 发),而 github.com/trending 榜面那三发永远匿名(gh.js 连这一格的键名都不许认得)。
所以一次点击最多 4 发(元数据 1 + README 1 + 只在默认篇不是中文时补 根目录列表 1 + 中文文件 1;★ 第十五轮第二路没加这个数 —— 那一发中文文件正文照发,只是路径改从已经在手的默认 README 那行语言切换里抽,零额外请求,命中才发),成功档缓存按设置页那一档(★ 第十二轮:6 / 12 / 24 / 72 小时,出厂 24 小时,改档下一发就按新档判新鲜——TTL 是调用时现取现算、不在装配时锁死)、失败档 5 分钟(不进设置页),同人连点两下在途去重,界面还如实显示「这一小时还剩几次」。★ 第十一轮的 zh_section 那一档不在这个数里加东西:默认篇是外文时,先在已经在手的那份整篇 README 里找中文小节(零额外请求,那条路实测 3 发封顶),找到了就不再往现译那一路派活;「仓库自己写的描述本身就是中文」(descSelfZh)同理;★ 第十九轮的第三道闸门同样不在这个数里加东西 —— 它吃的是要派出去的那段节选(/readme 那一发已经回来的字),既不许多打一发去猜路径,也不新增载荷键或存储字段 ⇒ 三闸门省的都是翻译那本账,GitHub 这本账一克没动。详情读的是仓库自己写的话(description 两路中文都没有时那句原样标「原文,未翻译」—— 开关关着、那一档发不出去、或接口答错了都落在这档),命中内置离线词表时多一句人工预译的中文(带来源与时间戳,原文照给,见上面「描述列中文」那条与 docs/design-spec.md §8.2),现译命中时同理(落款是「<这一行当初是谁译的> · <时刻>」,原文同样照给,§8.3 / §8.4)。
★ 第二十二轮(10-08)起这本账有两处:详情那一路仍是「一次点击最多两发 = 描述 + 摘要」,榜面那一路新增「一轮检查后最多 12 发、同时在途 2 发、只补描述那一档」(用户裁定的额度闸门)。
★ 读路径恒零发 —— 打开面板、重开面板、SSE 首帧都只读库不算活 ⇒ "面板开合"这个动作一发都不花钱,配额严格按检查节拍花(出厂 60 分钟一轮,手动「重新取一次」也算一轮)。
闸门的闭嘴形状各有名字、各有判据:那一路没接(no_engine)/本地库不在(no_store)/开关关着(off)/引擎没就绪(unavailable)/账本读不出来(read_failed ⇒ 整轮作废,不是当新行重烧 12 发)/屏上全命中(nothing)。
★ 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 字符的 ⇒ 锚点必须跨 取文本,定长窗口会静默取空。
- 未登录页每行都带 /login?return_to=… 的 star 按钮 ⇒ 仓库名必须从 <h2 起找,不然每个仓库都解析成 login。
- ?since=bogus 不报错,逐字节返回日榜;语言 slug 不存在也只给 200 + 0 条 ⇒ 白名单与「空榜 / 无效语言」的判据( 念没念语言名)只能守在宿主侧。

因此:

| 情况 | 面板表现 |
| 某一榜本轮抓不到 / 解析失败 | 该榜卡就地写「故障 · <原因>(显示 <多久> 前的上次成功数据)· 已连续 N 轮」,行数据冻结在最后一次成功轮,其他两榜照常 |
| 连不上 / 超时(传输类) | 先补发(同榜最多 3 发),仍不通则卡上多一条来源提示,按最近那一发的实际路线说:经代理 http://127.0.0.1:7897 未通 / 直连未通 / 配置坏到根本没出网(三种情况绝不并成一句「网络不通」);同时写明「下次自动检查 X 后」 |
| 代理地址填错 / 解析不出来 | 记为配置错误(不补发、不静默回落直连),榜面冻结在最后一次成功轮,运行环境 · 传输路径 一行红点写明原因 |
| 语言 slug 站点不认 | 记为配置错误(不是源故障),但仍然冻结该榜并写清原因;保存时直接 400 拒收 |
| 语言合法但这一档今天没榜 | 合法空榜:ok=true + 「这一档今天没有上榜仓库」,不冒红点 |
| 条件请求拿到 304 | 只推「最近取回」时间,榜面数据时间不动(304 只证明整页字节没变,"今日新增"是累计值) |
| 点详情时 api.github.com 给 404 / 限额用尽 / 传输失败 / 配置坏 | 四种各给一句话(REPO_ERROR_LABELS + 接口原话),榜面照常;失败行 5 分钟内复读同一仓库不再出网,免得把坏名字刷爆额度 |
| 详情命中缓存(设置页那一档,出厂 24 小时) | 载荷标 cached:true + cacheAgeMs,这一发请求都不发;重取走 ?refresh=1(绕过 TTL,但仍吃服务端限额) |
| 三榜连坏 | 节拍按 2^N 翻倍退避,指数封顶 4 轮、绝对封顶 4 小时;任何一榜成功即归零。(2026-10-05 真机改造前:启动抖动连坏三轮,未封顶的指数退避把下一轮推到 24 小时,面板一整天空着。改造后同一场景实测 backoffExp:1 → effectiveMs 顶到 4 小时,第三轮自愈) |
| 宿主没有 ctx.storageDomain / 存储域 open 失败 | 榜面照看,能力位与状态卡如实写「变化史留不下来」。绝不谎报存储在位 |

安装

⚠️ 当前状态:页签化 + 传输补发 + 插件内代理隧道 + 仓库详情(数据源与详情对话框)+ 描述列内置离线预译 + 模型现译(C)+ 现译引擎五档(D,第九轮三档、第十轮扩到五档并接上腾讯 / 阿里云)+ 自带中文探测与结构化段表(A,第十一轮)+ 详情屏撤废话与详情缓存时长可配置(第十二轮)+ 名次徽章分档(第十四轮)+ 节选与判据窗口分家 / 句子边界收口 / 摘要能力跟着那一路 / 语言切换行找中文 README(第十五轮,★ 其中「摘要能力跟着那一路」已被第十七轮用户改判放回)+ 回执带上厂商请求号 / 同屏一条失败句只念一次(第十六轮)+ 摘要现译放回来(第十七轮)+ README 有中文就不派摘要(第十八轮,闸门本就在)+ 屏上那段节选里已有中文也不派摘要(第十九轮,★ 同一轮"库里那条旧译文行删"那一件没做成 —— 删掉后被在跑的宿主写回,要等宿主关掉重删)+ 多份中文篇并存时挑简体那一份(第二十轮)+ 设置页 GitHub 令牌那一行 / 详情配额那句跟着 GitHub 自己回的那一格(第二十一轮,★ 这轮动的是文首那条铁律的"不带 key":改判为默认零凭据 + 填了只进请求头)+ 榜面描述列接上现译(第二十二轮,★ 这一列从此是「内置预译 + 每轮检查后补的现译」两种来源并存),这几件已过 415 项用例(★ 第十三轮把基线从 356 推到 357(差的那一条是事故补的回归判据)、第十四轮推到 358、第十五轮推到 368、第十六轮推到 371、第十七轮推到 372、第十九轮推到 376、第二十轮推到 378、第二十一轮推到 391、第二十二轮推到 415)(★ 口径更正:跑测器 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 免费接口真出网那一发回 HTTP 429;那是外部限流的读数,离线 354 不受影响,细节与归因见下面「测试」那节与 docs/design-spec.md §9.2)(★ 第十三轮(10-07,修完第十二轮那格 requiredInt 之后):基线推到 357 项、SKIP_LOCAL=1 下 355 过 / 0 挂 / 2 跳,逐套差值只在 store 39→40;而第十二轮落地当天界面上是三榜全红「故障 · 存储不可用」——离线那一份满绿测不到那一发(假设施 open() 不跑 schema),见下面第十三轮那条与 §9.3 那条病历)(★ 第十四轮(10-07,名次徽章分档:前三名金/银/铜、第 4 名起中性,色值与兄弟插件 modelwatch 对表):基线推到 358 项、SKIP_LOCAL=1 下 356 过 / 0 挂 / 2 跳,逐套差值只在 client 53→54;这一件只动浏览器半边 client.js(宿主半边 / 载荷 / schema 一字未动),界面上要等宿主重新加载那份 client 源(重载面板,不行就重启 dsh desktop);无头量了逐档计算样式与徽标 rect(tmp/probe-rank.mjs),但活宿主那一屏仍未截图)(★ 第十五轮(10-07,四件合并:节选与判据窗口分家 / 句子边界收口 / 摘要能力跟着那一路 / 语言切换行找中文 README):基线推到 368 项、SKIP_LOCAL=1 下 366 过 / 0 挂 / 2 跳(直跑 368 / 0 / 0),差值在 repo +7 / api +1 / llm +1 / web-translate +1,另两套(client / host-compat)条数不变、内容改判;这一件过真机(图 68~70 + 第二路真回包 + 配额 55→51 那一屏四发),逐条读数见下面第十二件那条与 §9.3 第十五轮;★ 第十四轮欠的那张活宿主名次徽章屏仍未截 ⇒ 还挂在那条清单上)(★ 第十六轮(10-07,两件旧账收尾:vendorErr 把厂商请求号排在回执最前 / 详情同屏一条失败句只念一次):基线推到 371 项、SKIP_LOCAL=1 下 369 过 / 0 挂 / 2 跳(直跑 371 / 0 / 0),差值 repo 63→64、client 54→55、web-translate 28→29;证伪电池 tmp/r16-falsify.mjs 11 条 / 未抓到红 0 条;★ 这一轮没有真机截图,也不是「过了真机」 —— 那两屏各要一个现场:请求号那一屏要一次真的厂商失败(要么用你库里的真凭据发坏签名,要么等你自己撞上),去重那一屏要 host_llm 档两路同时挂(本机模型是就绪的,我不动它)。逐条读数与边界见下面第十三件那条)(★ 第十七轮(10-07,用户改判第十五轮③「摘要现译放回来」):基线推到 372 项、SKIP_LOCAL=1 下 370 过 / 0 挂 / 2 跳(直跑 371 过 / 1 挂 / 0 跳,挂的仍是 wt-27 免费档真出网那发回 HTTP 429 —— 与本轮改动无关的外部限流),差值 api 56→57(新那条钉的是「说明句跟着档位走」),repo / client / host-compat / web-translate 条数不变、内容改判;证伪电池 tmp/r17-falsify.mjs 12 条 / 未抓到红 0 条,末行 [还原 ok],读数 tmp/r17-falsify-out.txt。★ 这一轮没有真机截图:那一屏要重启 dsh desktop 宿主才看得到(改的是宿主半边 lib/,link: 挂载下浏览器半边重载不算),两屏(设置页两行开关 + 详情弹框「中文节译」那一段)挂在 §9.3 那条走查清单上,等你重启后截给我)(★ 第十八轮(10-07,你那条「README 有中文就不许译」):行为一字未改(那道闸 readmeSource === 'en_default' 自第十一轮就在,本轮把 zh_default / zh_file / zh_section 三档各自钉上能承重的现场 —— 旧形状摆在只开描述档的桩下等于没钉,被电池判出一条假绿);基线仍 372 项、SKIP_LOCAL=1 下 370 过 / 0 挂 / 2 跳(逐套与上一份同数,api 那条就地改判);电池 tmp/r18-falsify.mjs 7 条 / 未抓到红 0 条;真库存对账 tmp/probe-readme-zh-rows.txt 抓到一条旧行残留(alibaba/open-code-review 库里有一条 12:24 的 readme:keyless 译文,而它现在记 readmeSource=zh_file —— 那是第二路落地前那一版判成「英文篇」时发的;★ 闸门排在 translate() 之前,这种旧行读不出来也不会显示,我没动你那行库存))(★ 第十九轮(10-07,你改判「这两种也算有中文,旧译文行删」):这是真行为改动 —— 新立第三道源侧闸门 readmeZhOnScreen(节选)(节选 CJK ≥ 8 ⇒ 中英混排篇;出现「中文」两字 ⇒ 中文篇在子目录没抓到、只剩那行语言切换字样),★ 而 README_ZH_MIN_CJK = 20 那条档名律一字未动(两条律分家:8 管「别派」,20 管「档名敢不敢说」);反面三条钉死(「日本語」不算中文、国名「中国 / 中國」不算声明、英文 Chinese 不认 —— 误挡一类就是删了你在用的那一屏)。基线 372 → 376 项、SKIP_LOCAL=1 下 374 过 / 0 挂 / 2 跳(差值 api 57→59 / repo 64→66);电池 tmp/r19-falsify.mjs 8 条 / 未抓到红 0 条(★ 首跑第 ③ 条挂在别人先炸的断言上 ⇒ 把反例拆成独立 check 才算验成,同族第八次)。旧行删过一次、又被在跑的宿主写回来了(★ 详见下面第十六件那圈 ④ 与「假读数」那两条):tables.trans["readme:alibaba/open-code-review"] 19:24 摘掉(回执 trans 9 → 8|其余各格逐字一致 ok、那一刻对账 readme: 5 条全 en_default),19:26:37 宿主那一写把内存态整份落回文件 ⇒ 现在仍是 9 行 / 6 条,这一件没做成,要等你关掉 dsh desktop 再删。★ 我自己的假读数一并登记:动手前用 tasklist 过滤 dsh / electron 判「宿主没在跑」,而它的进程名是 DeepSeek Harness.exe(镜像名里两个词都没有)⇒ 那个条件结构上抓不到它,判「宿主在不在跑」要按 CommandLine 匹配。本轮零额外出网(闸门吃已在手的那段节选),也没新增载荷键 / 存储字段(repo schema 未动)。⚠️ 没有真机截图:又是宿主半边 ⇒ 要重启 dsh desktop,两屏(那两类不再多出摘要段 + 日文篇照旧给摘要)与第十七轮那两屏一起挂在 §9.3 等你重启后截给我)(★ 第二十轮(10-07,你裁定「只做屏上有中文/那行写着有中文版,不猜路径」+「使用 README.zh.md 这种」):第一条 = 零改动(那种形状没法零请求识别,猜路径要加一发、撞 60 次/小时那条红线 ⇒ 保持不做);第二条 = 真行为改动(多份中文篇并存时旧写法两路各自 .sort() 取首个,'-'(0x2d) 排在 '.'(0x2e) 前 ⇒ 真机 thedotmack/claude-mem 挑中了 README.zh-tw.md 那份繁体,读数 tmp/probe-zh-link-shape.txt)。落地形状是一份优先档、两路共用:zhVariantRank(文件名) 出 0 明写简体 / 1 不带变体 / 2 明写繁体,比较器只此一处,pickZhReadme 与 pickZhReadmeLink 都挂它;三条边界各有反向用例(只排序不过滤(只有繁体时繁体照旧上屏)/切文件名词元不切路径不按子串/同档内仍按字面)。基线 376 → 378 条、SKIP_LOCAL=1 下 376 过 / 0 挂 / 2 跳,差额只在 repo 66→68(★ pickZhReadmeLink 那一圈条数不变、内容改判:旧断言把繁体钉成了规矩);电池 tmp/r20-falsify.mjs 9 条 / 未抓到红 0 条 + [还原 ok](★ 首跑第 ⑥ 条的植入顺手把大小写归一也丢了 = 一发变异动两维 ⇒ 改成单因再跑)。本轮出网 0 发、载荷与 schema 零增量。⚠️ 仍然没有真机截图:又是宿主半边 ⇒ 要重启 dsh desktop;那一屏是点开 thedotmack/claude-mem 后 self 段的路径念 docs/i18n/README.zh.md(★ 库里它那行 at=10-06 08:42 早于第二路,所以不能拿旧库存当"验过"),与第十七、十九轮那几屏挂在同一条清单上;第十九轮那件"旧行删"这一轮复跑对账照旧 6 条(宿主还在跑))
(★ 第二十一轮(10-07,你问「匿名 60/h ⇒ 一小时最多 15 个仓库,能不能提升?比如设置页加一个 GitHub token」+ 对方案点头「可以」):这一轮动的是文首那条铁律的一半 —— 「对 github.com / api.github.com 全程只读 GET:不带 key」改判为「默认零凭据;填了才带一条 Authorization: Bearer,只进请求头、绝不进 URL;只给 api.github.com 的详情那一路,榜面那一路恒匿名」。只读 GET / 不 POST / 不下载 zip / 不 clone 一个字没松,发数一发没多(仍 ≤4 发)。配额那一格的上限与「匿名 / 已认证」那两个字的标签一起跟着 GitHub 自己回的 x-ratelimit-limit 走:填了却被撤销 ⇒ 照旧念「匿名配额」;代理吞了那一格 ⇒ 退回保守的 60(宁可梦见 60,不可梦见 5000);客户端旧那句 || '匿名配额' 的兜底整段删掉(同一屏不许有第二个真相)。★ 它同时是"第四把密钥":ghToken 并进 PREF_CRED_FIELDS 那张派生表 ⇒ schema / clampPrefs / publicPrefs / POST 白名单 / hc-19 五处一处手抄就红(store 那条"新增键必须 optional"的第十三轮律照守,域 version 仍 1、零迁移)。基线 378 → 391 条、SKIP_LOCAL=1 下 389 过 / 0 挂 / 2 跳(差值 repo 68→76 / api 59→61 / client 55→57 / host-compat 20→21,store 条数不变、两条内容改判);电池 tmp/r21-falsify.mjs 16 条 / 未抓到红 0 条 + [还原 ok](去向 6 / 读数 4 / 派生 4 / 接线与界面 2;★ 同一个"令牌进 URL"的植入钉了两次 —— 行为侧 + 静态侧各红一次)。★ 诚实两条:① 5000 那一形状本机零真回包(没有 GitHub 账号,历轮每一发都是 60)⇒ 它是官方文档口径、夹具里标注为合成,真机上要读的是那两个字的标签换没换而不是那个数;可验的那半是"填一个坏令牌 ⇒ 那句必须仍念『匿名配额』"。② 本轮零真出网、没截屏,且没动你的 prefs、没替你填令牌;那两屏(设置页新增那两行 + 详情弹框那句配额)与第十七、十九、二十轮一起挂在 §9.3 等你重启 dsh desktop 后截给我)
(★ 第二十二轮(10-08,你那张截图 +「我开了翻译,为什么这些没有翻译」+「按 C 来」):现场是设置页「现译引擎=宿主模型 / 描述现译=开」,而日榜那一列全是英文、卡头还念着「描述中译为内置离线预译 · 2026-10-06」—— 因为旧口径把现译只派给「点开详情那一刻」,榜面永远零现译。★ 这一轮把那一列改成两种来源并存,三条口径按你的裁定原话落地:「检查轮次后补(推荐)」(补译只挂在检查服务那一次 update 之后 ⇒ 读路径零发:GET /api/snapshot 与 SSE 首帧一发不派,面板不会因为翻译而变慢;补成真了才推第二帧)、「每轮 12 发 · 并发 2(推荐)」(常数只在 lib/domain.js,同仓库三榜同现只烧一发额度)、「复用「描述现译」这一档(推荐)」(设置页一行都不加,开关关着 ⇒ 榜面这一路零发)。B(内置离线预译)优先级一个字没松;界面逐行念它自己的落款(两种来源说的不是一件事,不许拿卡头那句套每一行),卡头念宿主按这一张榜算好的整句,另加一句只在四格同时成立才非空的「现译这一路这会儿发不出去」;失败冷却只在进程内存、runner 一个字不写库(落库归 translate() 自己)。基线 391 → 415 条、SKIP_LOCAL=1 下 413 过 / 0 挂 / 2 跳(差值新开 board-zh 19 + api 61→65 + client 57→58,另两圈条数不变、内容改判:api 那条 hits 形状、client-47 的行内落款;★ 设置页那句 TRANSLATE_COMMON_NOTE 改了文案而判据是从 domain import 的 ⇒ 测试面零改动,这就是「不许手抄句子」那条律在兑现);电池 tmp/r22-boardzh-falsify.mjs 25 条 / 未抓到红 0 条 + [还原 ok]。★ 首跑有两条没红,两条都登记:拆掉单闸那发让 busy 用例挂在没释放的 gate 上(顶层 await 不结算 ⇒ 套件不打印 ⇒ 电池拿不到失败信号,判据自己补了 200ms 竞速才响),另一发把分隔符改成无条件摆(只是多一个「 · 」,没有任何断言在乎 ⇒ 换成「界面自己数条数」这种真变异)。⇒ 「漏网」有两种:没判据,和判据在但拿不到失败信号。 载荷只把 descZh.hits 的值从「一句译文」升成 {zh,via,label,note,src} 并新增 heads/liveNote,version 仍 1、零迁移。本轮出网 0 发(所有补译形状吃假 translator),⚠️ 没截真机屏:动的还是宿主半边 + client.js,而本插件在宿主里是 github: 复制副本(改源码不即时生效)⇒ 本机已把六个文件覆盖进那份副本(覆盖前的原文件备份在 tmp/host-copy/r22-before/),剩下的只有重启 dsh desktop + 硬刷新面板;那两屏(榜面出现带「现译」落款的那几行 + 现译发不出去时榜面上那一句)与第十七、十九、二十、二十一轮一起挂在 §9.3 等你重启后截给我。你的 prefs 与库存行一个字没动)(末尾另修了六条你递过来的真机问题:定时器崩溃、榜单表列宽、页头字号、页签条那条没意义的滚动条、注册链接被推到行尾、★ 以及 10-07 那张「存储不可用」截图);前面那四件在真机(挂 web profile + 无头浏览器逐签截图)走过三轮,其后又有第四~第七轮(第四轮定时器崩溃、第五轮列宽、第六轮内置离线预译、第七轮模型现译,下面几段各记一件),逐轮记账都在 §9.3。第一轮含一次真故障往返:三榜连坏三轮时界面读到 (共尝试 3 次) / 已连续 N 轮 / 传输提示 / 下次自动检查 4 小时后,退避 effectiveMs 实测顶到 4 小时封顶。
第二轮(2026-10-05 12:17)验的是隧道本身:宿主的 dsh 进程里 reg query 读得到系统代理,三档(跟随系统 / 自定义 / 直连)各查一轮, 运行环境 · 传输路径 逐档改口,三榜 16 / 19 / 23 条真数据经隧道取回。截图又抓出一个断言全绿看不见的问题(外链吃浏览器默认蓝 + 下划线),逐条记账见 docs/design-spec.md §9.3。
详情这一层数据源与弹框都过了真机:tmp/probe-repo-service.mjs 经隧道跑通 vite(英文篇,3 发)、ant-design(另有中文 README,4 发)、ruanyf/weekly(默认篇本身就是中文,2 发);第三轮走查(tmp/shot-detail.mjs + tmp/shot-detail2.mjs,图 tmp/shots/18~26-.png)在挂出来的面板里点仓库名逐档核对:遮罩盖住整视口且压过 sticky 页签条(顶栏 hit-test 落在遮罩上)、底色是 color(srgb … / .26) 不是黑块、900×800 下对话框完整在视口内、横向溢出 0;中文篇那一屏读到「这个仓库的 README 本身就是中文写的,下面是节选。」+ 中文正文;Esc / × / 点空白关得掉、点框内不关;缓存命中 14ms 落地(GitHub 侧 0 发)、「重新取一次」实测改发 &refresh=1 且配额 60→57(英文篇三发); ok:false 与 HTTP 503 两档各给一句话、不给元数据也不给中文叙述。截图另抓出一个断言全绿看不见的问题(落款把整篇原文长度念成节选字数),逐条记账见 docs/design-spec.md §9.3。
另有一条真机崩溃已修(2026-10-05 14:54,desktop host 被拖崩,IDE 弹「应用无法启动或已意外停止」):定时器回调里调的是裸 run(),而 run 当时只是 return {…} 上的一个方法 ⇒ 挂上定时器不报错、响的那一刻必抛,ReferenceError 从 Timeout.tick 落进宿主的 uncaughtException。闸门提成闭包里的具名函数,另加三条「把回调摘下来真的调一遍」的回归用例(两档后端各一条 + 撞忙时一条);病历与复现读数见 docs/design-spec.md §9.3 第四轮。桌面 profile 是以 link:F:/dsh-plugins/dsh-plugin-gh-trending 挂的这同一份目录 ⇒ 修复已在原地生效,重启宿主即可(不用重挂载,也不必走「禁用第三方插件」那条按钮);说实话:这一版没在 desktop 里活满一个节拍再观察过(那要等一整个档位,而且得由你决定什么时候重启)。
另外,你截图递过来的列宽问题已经修了(同日第五轮):日榜表前三列被截成 ~100px、今日新增 整列不见、余量全灌进最后一列 ——根因不是宽度数值,是 和格子里的 撞名,单元格那条 display:block 把 col 踢出了列布局,后面每列拿到的宽度整体左移两格。
列宽类改成带前缀的 gt-col-repo / gt-col-desc,数值按「尽量显示全」重配(# 46 / 仓库 268 / 描述吃余量 / 语言 112 / 累计★ 64 / 今日新增 72 / 较上轮 56,≤1000px 反过来),四档视口的量宽读数和截图见 tmp/probe-cols.mjs / tmp/shots/27-cols-.png,病历见 §9.3 第五轮。同样一句实话:这一版只在离板夹具(真 CSS + 真榜面解析结果)上量过,没在挂出来的宿主面板里重走。
(同日第六轮补了一半:真宿主面板的截图里八列各有值、今日新增 不再是 0 宽 —— 那是肉眼看过、没量过,逐列 px 仍然只有离板读数。)
第五件(描述列内置离线预译,2026-10-06):离线 266 项 + 真机截图都走过了。 lib/desc-zh.js(73 条,死数据)+ snap.descZh + 弹框那句「中文描述(内置离线预译 · <日期>,不是现译)」,离线 266 项全绿、十一条证伪各挂各的现场(台账与证伪读数 §9.2,功能口径 §8.2),另外用 10 发 GET /repos/{owner}/{name} 对账过 api 的 description 和表里 src 逐字相同(命中 10/10)。
真机那一遍(同日 08:49~08:51,你重启 desktop 宿主后先读了它的 snapshot,再把同一份目录挂进 web profile 起实例、无头浏览器截图):卡头「描述中译为内置离线预译 · 2026-10-06」在日 / 周 / 月三张卡上各出现一次,日榜 13 行里 11 行中译 / 1 行无描述 / 1 行未命中照给原文,周榜与月榜各 15 行里 14 行中译;弹框命中档与未命中档两屏都在(§9.3 第六轮,图 tmp/shots/30~32-.png)。
第六件(模型现译 C,2026-10-06):离线 305 项 + 真机截图都走过了。 lib/services/llm.js 是宿主模型句柄的唯一使用者(改判后的 hc-8:那个文件由 index.js 的 createLlmTranslator 接线派生,不是手抄清单),你四条裁定落在实现上就是「点开详情只译当前这一条 / 描述出厂开、README 摘要另开关 / 落 trans 表按「仓库键 + 原文逐字」判复用 / B 命中绝不重发」。
离线 305 过 / 0 挂(SKIP_LOCAL=1 下 304 / 0 / 1 跳),六发证伪各挂各的现场(F4 分两味,所以是七发读数:F1 重拼吃 base ⇒ repo 46/1 + api 46/1、F2 provider:undefined ⇒ llm 17/1、F3 模型闸门提到缓存前 ⇒ llm 17/1、 F4a 回执被洗成 errText ⇒ llm 17/1、F4b 回执整个丢掉 ⇒ llm 16/2、F5 descErr 不给 ⇒ repo/api 各 46/1、F6 客户端不渲染「回执:」⇒ client 50/1),台账见 §9.2。
真机那一遍(同日 10:19~10:4x,脚本 tmp/shot-llm.mjs、读数全文 tmp/walk-llm3.txt、图 tmp/shots/40~46-llm-.png + 42-detail-{②,③,④,⑤}.png,§9.3 第七轮)抓出三条断言全绿、真机一跑才现形的毛病并都修了: ① 点了「开」而高亮还停在「关」(保存偏好不推 update 帧);② 每一次现译都失败在 NO_ADAPTER no adapter registered for provider "undefined"(旧的离线用例还把 provider 缺省钉成了规矩); ③ 模型命中那一档的叙述头一句塌成「这是一个 GitHub 仓库。」(重拼吃了错的源对象)。修好后的屏上原文:m-abozaid/esp32-c3-adblock 那一屏头一句是 这是一个用 C++ 写、MIT 许可证、累计 1,342 星的项目。最近一次推送在 2026-10-04,建档 2026-06-19。,译文与原文两句并排(中文描述(模型现译 · 10-06 10:25):… / 仓库自己写的描述(原文):…),摘要段段名 中文摘要 · 模型现译 · 10-06 10:29;复用那一次是按你裁的「逐字」来核的 —— 两次点同一条,两个落款逐字相同、trans 表之后没有新增行; 两档一起关那一屏读到「模型」字样 = false、摘要段 = false、仓库自己写的描述(原文,未翻译):… 照在 ⇒ 关掉的那一档不是「翻译失败」,是压根没派活; 900px 窄视口 + 出厂态是描述段中文照在而摘要段不在(各开各的),横向溢出 {"over":0}。
本轮出网账:api.github.com 0 发(三屏页脚都是「缓存于 1 小时前」),模型 2 发(描述 92 字 / 摘要 189 字)—— 花的是宿主的模型额度,不占 GitHub 那 60 次/小时。
走查后环境已拆净(实例关掉、web profile 里那个 junction 用 cmd rmdir 摘掉、package.json 与 cordis.patch.yml 从备份还原并 cmp 逐字节一致、偏好回出厂态)。
说实话:C 的失败四档(no_model / unavailable / timeout / store)在真机一格样本都没有,那四句文案目前只有离线判据;「两档全关 ⇒ 句柄零调用」在宿主上也只有屏上层证据。
另外,你截图递过来的页头字号问题已经修了(同日第八轮):红框圈住「GitHub 热榜」那句「这个字感觉太小了点,比其他插件的小」——先对表不猜:同一台 desktop 里 modelwatch / stock-analysis / sysops / it-tools 四家的 -title 规则都是 font-size:17px;font-weight:600,只有 api-catalog 与旧的我们是 16px(卡头 13px、页签与 .X-sub 都跟 modelwatch 逐字同源 ⇒ 偏的就页头那一格)。
.gt-title 改 17px,墨迹读数 17px ⇒ ink 17 / 宽 97 / 盒 98.8×25.5、16px ⇒ ink 16 / 宽 91.3(zoom:1、transform:none,缩放那条解释排除了),脚本 tmp/probe-title.mjs、并排图 tmp/shots/47-title-parity.png,判据就地挂在 client-31(掉回 16px 当场红,证伪读数 [client] pass 50 / fail 1)。
同样一句诚实话:这一条没在挂出来的宿主面板里重截(离板夹具量的是真 CSS 与各家真规则);client.js 是浏览器半边,刷新页面即生效、不必重启宿主,最后一屏还得你自己看。
第七件(现译引擎三档 D,2026-10-06 第九轮):330 项离线断言 + 真机截图都走过了。 你两条裁定落在实现上就是「两条都做,设置页选」+「与宿主模型并存、二选一、默认落免费接口」: lib/services/web-translate.js(免密钥那一路 + 百度那一路,同形换体)与 lib/services/llm.js(第八轮那一路)并存,选路只有一处(pickTranslator 读 prefs.translateEngine),没选中的那两路连"你开着吗"都不问。trans 表行内多一个 engine ⇒ 落款跟着那一行自己的来源,换引擎不作废旧译文(也不冒充新引擎)。
离线 330 过 / 0 挂 / 2 跳(SKIP_LOCAL=1,跳 hc-17 与 wt-19),新套件 web-translate 19 条 + api 6 条 + client-52 + hc-7 改判 + hc-19 新增; 十六发证伪各挂各的现场(十发在免费/官方那两路:去 dt=t / 把密钥当参数发 / 不遮 sign / 复用不看原文 / 开关闸门漏 / 引擎闸门漏 / 超时不响 / 没汉字也算成功 / 落款不看行引擎 / 库里存截断原文;六发在凭据与只读 GET 那两条铁律上:三个出口不再摘密钥 ×3 / 翻译那一路改调用名从派生名单溜走 / 带 cookie 头 / 发 POST),台账与逐发读数见 §9.2。
★ 这一轮把 hc-7 的出网名单从手抄两个文件名改成由"谁真的调用 fetchFn("派生 —— 手抄那一版对新增的 web-translate.js 零覆盖还照样全绿,和 §0 第七轮那个洞同一个形状、换了个位置复发。
真机那一遍(同日 12:05~13:2x,脚本 tmp/probe-sbar.mjs / tmp/probe-engine.mjs / tmp/probe-detail-keyless.mjs,读数 tmp/probe-.out|txt,图 tmp/shots/48-sbar-live-1440.png + 50~57-.png,§9.3 第八轮):出厂屏高亮在「免费接口(免密钥)」且没有凭据行;点官方档 ⇒ 真发 {translateEngine:'official'}、凭据行出现、说明换成「官方接口还没填 AppID 与密钥…(零出网)」;存过凭据后 placeholder 念「库里已存(留空不改动)」并出现「清除」,切回宿主模型 ⇒ 凭据行整行撤掉,清除那一发是 {baiduAppid:'',baiduKey:''}; 渲染完的那一屏全文搜密钥 ⇒ found:false(hc-19 的真机对照);详情弹框第 3 行 michael-denyer/pstack-claude 读到 中文描述(免费接口 · 10-06 13:21):…,同屏前两行是「内置离线预译」⇒ B 优先在真机上仍然排在新档前面。
本轮抓出的那条只有截图看得见:密钥框 placeholder 第一版太长被裁掉半句 ⇒ 缩短 SECRET_SAVED_HINT 并重启宿主复拍(⚠️ "改前"那张被同名复拍覆盖了、没留档,下次换文件名)。
诚实一句:官方那一档真机零样本(本机没 AppID,那一发从没发出去过;test/fixtures/trans-official.json 里 "synthesized": true 登记的就是这件事,签名靠 wt-7 在用例里独立复算对账。★ 那一份第十轮已按厂商拆成三份,登记方式改成逐条 provenance,见下面「第八件」末尾); transport / http / bad_json / empty / too_long / store 六档失败文案在真机也一格样本都没有;而「免费接口」那一路是网页接口、不是官方授权接口(ToS 不覆盖程序化调用,对方随时可能改形状)—— 把它做成默认档是你的裁定,风险登记在 §9.3。
另有一条你截图递过来的滚动条问题已修(同日第九轮):「这个滚动条没有意义」—— 真宿主上量到 .gt-tabs 的 scrollWidth 1088 === clientWidth 1088(没有横向溢出可防)而 scrollHeight 34 > clientHeight 33(溢出的是当前签那条 :after{bottom:-1px}), ⇒ 撤掉那句 overflow-x:auto(flex:none 留着:第一轮那条 column flex 收缩压力还作数,不许顺手一起删),判据就地改强挂在 client-38(那条规则里出现任何 overflow 即红)。
第八件(现译引擎五档:接上腾讯与阿里云 + 切换时显示注册地址,2026-10-06 第十轮):342 项断言 + 真机 13 张截图都走过了。 你那句原话是「腾讯,阿里都接上,切换官方接口时,下面显示去哪个网址注册key」,两条落点是「改判铁律,两家都接」+「分段器并排五档」: 免费接口 / 百度 / 腾讯 / 阿里 / 宿主模型 五枚按钮并排(短名,谁译的、要不要注册、离不离得开代理由下面那句当前档的话说),选中三家云任何一家 ⇒ 下面出现那一家的两格(标识符 + 密钥)与那一家的注册地址(百度 1 条、腾讯 2 条、阿里 2 条,target=_blank rel=noreferrer;额度那句不念数字 —— 这一轮没复核到官网的可引用读数,一律「以官网计费页为准」)。
★ 只读 GET 那条铁律一个字没松:两家云用的都是官方签名里能走 GET 的那一档(腾讯 v1 把参数放查询串、阿里 RPC V2 是查询串签名),改判的只是「翻译域的查询参数里允许出现厂商标识符」;密钥本体仍然只进摘要,不进 URL、不出网、不回显、不进日志,GitHub 那一域仍然零凭据(★ 第二十一轮改判的就是这半句:现在念作「GitHub 那一域默认零凭据;设置页填了令牌才带一条 Authorization: Bearer,只进请求头、绝不进 URL」—— 本条第十轮其余口径原样留着当历史,见文首那条铁律与 §8.6)。
旧档名 official(第九轮只有百度那一档时存的)在读的那一刻先搬家成 baidu 再判脏,库里那批 engine:'official' 的旧译文继续读得出来、不改写(TRANS_ROW_ENGINES)。
离线 340 过 / 0 挂 / 2 跳(SKIP_LOCAL=1,跳的还是 hc-17 与那条真发,编号已从 wt-19 漂到 wt-27),直跑 342 / 0 / 0;本轮 +10:web-translate 18→26(两路签名各一条 + 一次性数 + 非 2xx 先读回包 + 旧档名行 + 命中缓存不组 URL + 档名归一 + 夹具逐家口径),store 36→38(搬家顺序 + 旧行继续读); client / api / host-compat 条数不变、内容改判(client-52 整条重写成五档 + 逐家凭据 + 注册行 + CSS 那七段判据,hc-19 从扫一把密钥改成扫三把)。
十四发证伪全红到位(tmp/r10-falsify.mjs,逐发还原并逐字节比对,读数 tmp/r10-falsify-out.txt):出口少摘一把 / 干脆不摘 / 视图带出 value / 字段表不看档名 / 搬家排在判脏之后 / 腾讯改成编码后再签 / 阿里出网改用 URLSearchParams / 阿里一次性数写死 / 日志不遮签名 / 密钥框退成明文 / 没存也念「库里已存」 / 留空密钥进 patch / 注册行不摆 / 草稿收口拆掉。
★ 首跑抓出一条假绿:「阿里一次性数写死」当场全绿 —— wt-11 当时只钉腾讯那个 Nonce 键名,判据没跟着新覆盖面走;扩成两家各发两发再比之后重跑才 14/14。
真机那一遍(同日 19:2x,web profile + 无头 Chrome,脚本 tmp/probe-engine10.mjs / tmp/probe-regrow.mjs,读数 tmp/probe-engine10.txt / tmp/probe-regrow.txt,图 13 张 tmp/shots/60~66-engine10-.png,§9.3 第十轮):逐档走查每一发真 POST 的 body 都记了档(切档只发 {translateEngine:'…'}、保存只发当前档两格、清除只发当前档两格空串,带 body 的共 9 发); 免费接口 与 宿主模型 两档两行都不摆(连输入框都不给);三家空凭据时屏上多一句新写的 no_credential(原话点名「AppID 与密钥」,那两家的字段名不是这个);存过之后标识符明文回填、密钥框空白 + 「库里已存(留空不改动)」+ 出现「清除」; 渲染完那一屏搜三把密钥 ⇒ found:[](收尾那一屏再搜仍是空)。本轮抓出的那条还是只有截图看得见:注册链接被 .gt-link 那条 margin-left:auto(卡头「完整榜单 →」用的)推到行尾 ⇒ 加一条例外 .gt-setrow .gt-link{margin-left:0},活宿主上复量标签到第一枚链接的间距 10px(改前那一大片空是几百 px),前后两张图这次都留着(62-engine10-03-腾讯-已存.png / 66-engine10-07-注册行贴标签-腾讯.png)。

诚实三句:两家云的签名本机零真机样本(无凭据那一发只走到"查标识符"那一步:腾讯 AuthFailure.SecretIdNotFound、阿里 HTTP 404 + InvalidAccessKeyId.NotFound ⇒ 服务端先查标识符后验签名,签名对不对这台机器测不出来,只有离线独立复算那一条腿); 额度数字没复核到出处,所以界面不念(第三方转述的数字含第九轮那句"百度 5 万字符/月",本轮从文档与界面一起撤了); 腾讯取的是 v1 签名,有第三方转述说部分新账号会被要求改 POST + TC3 —— 官方文档这轮没复核到这条明文,真撞上时要按规矩另开一次改判,不在实现里偷偷 POST。
第九件(自带中文探测 + 结构化段表 A,2026-10-06 第十一轮):350 项离线断言走过了,真机截图这一件还没走。 你那句原话是「自带中文探测 + 结构化摘要,换引擎后旧译文照样复用,按这个做」,三条落点是「只做零额外请求那两处」+「宿主模板分段,不新增调用」+「拆进段里,整段撤掉」⇒ 这一轮没改判任何铁律、出网预算增量为零(详情那一层编排仍是最多 3 发,读数 tmp/probe-zh-readings.txt),动的是"详情那一屏由谁拼、拼成什么形状": ① readmeSource 多出第五档 zh_section —— 默认篇是外文时,在已经在手的那份整篇 README 里找中文小节(splitReadmeSections + pickZhSection,判据吃 CJK 个数、与默认篇那一档同一条律 README_ZH_SECTION_MIN_CJK=20;围栏代码块里的 # 行不算语义标题,这条状态机的真形取自榜上那篇 token_ids… 代码注释);找不到就保持 en_default,不硬凑一段; ② 两道源侧闸门(都排在派活之前,不是译完再挑):descSelfZh(仓库自己写的描述本身就是中文,DESC_SELF_ZH_MIN_CJK=8)⇒ 不派描述那一发;命中 zh_section ⇒ 不派摘要那一发; ③ 详情载荷从"一整句 narrative"换成结构化段表 sections[](四段 what/heat/self/summary,块只有 p/sub/num/excerpt 四种 kind,段序只认 REPO_SECTION_KEYS、数字只进 heat.facts 各一次)——旧那五格 narrative / facts / flags / readmeLabel / readmeMeta 连同 repoNarrative() 整段撤掉,narrativeFields 改名 sectionFields 且只在宿主内部、api 一进来就解构删掉 ⇒ 载荷 26 键 → 21 键(repoView 21 含 sectionFields、出边界 21 含 zh 不含它);段表与 sectionFields 都不落库,缓存命中与刚取回两条路同走 repoView→applyZh,逐字同形; ④ 「换引擎旧译文照样复用」钉成裁定 = 保持现状,所以这一条零代码改动,只补判据与文档(落款署的是那一行当初的来源,命中只比原文不比引擎,§8.4)。
离线 350 过 / 0 挂 / 2 跳(SKIP_LOCAL=1,跳的还是 hc-17 与 wt-27),10-06 当晚直跑 352 / 0 / 0;本轮 +10(repo 47→56:围栏状态机、pickZhSection 两条、两个阈值两侧余量、zh_section 那一路仍三发封顶、descSelfZh 入库行、段序只认常量、数字只出现一次、描述五种来源的字面分档、summary 段成功带落款/失败给 note 与回执;api 53→54:第一道闸门那条), client / store / check / host-compat 条数不变、内容改判(client-41 整条改吃段表:四种 kind 各自类名逐字、p ⊂ sub ⊂ num 逐级加重、一张 gt-modal-facts、旗标句落 heat 段的 sub 块;client-51 改判:摘要失败照摆段、段名说「没取到」)。
十三发证伪全红到位(tmp/r11-falsify.mjs,四个源文件逐发还原并逐字节比对,读数 tmp/r11-falsify-out.txt):围栏失效 / 小节阈值放宽到 1 / zh_section 编排整块撤 / 那句落款删 / descSelfZh 阈值失效 / 段序改手写表 / 数字并回 what 段 / applyZh 不删 sectionFields / 两道闸门各拆 / B 优先拆 / num 退成 sub / excerpt 与正文同形。
★ 首跑又抓出一条假绿:「B 优先拆除」当场全绿 —— 那条用例把 enabled 写成只开 readme,"描述那一发没派"是开关挡的、不是 B 优先挡的;改成两档都开并在派活矩阵补一行「B 命中 + 只开描述档 ⇒ 零调用」后才是 [api] 52 / fail 2(同一条律第二次抓到"断言没承重",§9.2)。
★ 本轮还第一次抓到用例名把用例杀掉:那条围栏用例原名带「真机」二字,而 test/_helpers.mjs:12 的机制是用例名含「真机」⇒ SKIP_LOCAL=1 时整条静默跳过 ⇒ 离线那 350 里压根没有它;改名「(榜单上真出过的形状)」才进覆盖面(同一条律第三次撞,判据是复跑时盯 skip 那一位)。
诚实两句:这一件没有真机截图 —— 详情弹框重排改的是"一屏四段、句子分主次"的形状,按验收口径该在活宿主上逐段量 getBoundingClientRect(每段吃多高、sub/num 墨迹深浅差、excerpt 的边框与内边距),只数 DOM 节点或断言 CSS 字符串都算没验过;那要把这份目录重挂进 web profile 并重启 dsh desktop 宿主,本轮没做(要你点头),所以 §9.3 未验证清单第十一轮那条还挂着。
zh_section 命中侧零真机样本:榜上仓库里唯一候选 QwenLM/Qwen,按"认围栏"口径重跑后那三段 CJK≥8 的"中文小节"全是代码注释 ⇒ 退回零样本;全链路吃的是合成夹具 test/fixtures/repo-zh-section.json(标 synthetic、逐条 shapeSources),真回包那一路没吃过(探针与出网账见 §9.1,其中 probe-zh-fixture.mjs 的发数没留档,是本轮唯一的读数缺口)。
第十件(详情屏撤掉废话 + 详情缓存时长进设置页,2026-10-07 第十二轮):356 项离线用例走过了(★ 同轮事故修复后基线是 357 项、第十四轮起 358 项,见下面第十三轮那条),真机截图这一件还没走。 你那句原话是「1.把这个页面上的废话都去掉,2.缓存时长可以配置吗,调整为默认24小时」,两条落点是「四段来源落款全撤」+「进设置页,默认 24 小时」: ① 段对象从五格缩成四格(key/label/blocks/facts)—— 四句 source 落款("这一段读的是 api.github.com 的 description / language / license / topics 字段"、"这些数字与日期是元数据字段,不是本插件算的"、"下面是仓库自己写的 README 正文…不是译文"、"这一段是现译给的,不是仓库自己写的中文")整格撤, REPO_SECTION_SOURCE_NOTES 那张表连带删掉;「是谁写的 / 是谁译的」改由段名说(仓库自己怎么介绍它 · 默认 README 是英文、中文摘要 · 免费接口 · 10-07 09:5x),self 段那两句(README 五档说明句 + zh_section 的小节名)并进段名,readmeNote() 整函数删除; ② 撤的是解释,不是事实:保留「不是现译」那个标签、仓库原文那一句(译文永不替换原文)、页脚那行 GitHub 配额; ③ README 那行落款压成一行短字面 节选 54 / 整篇 4,235 字 · 已去标记 · README(两个口径的数都留着,差在哪由那道斜杠交代,不另起一句解释;两个数相等时写「整篇就这么多」,不许把同一个数念两遍); ④ 详情缓存 TTL 从常量 REPO_CACHE_TTL_MS(12 小时)改成封闭四档 REPO_CACHE_HOURS=[6,12,24,72] + repoCacheTtlMs() 单点换算,出厂 REPO_CACHE_DEFAULT_HOURS=24;设置页多一行分段器(与检查频率同形状、话术全吃载荷), POST /api/prefs 档位外直接 400(★ 不许悄悄回落 24 —— 那等于库里一个值、分段器上另一个值,同 translateEngine 那条理由),clampPrefs 只认名单(缺这格的旧库由出厂值补回 24); ★ 服务侧吃的是 getTtlMs() 调用时现取现算:装配时把毫秒锁死会让"改档"到宿主重启才认,而屏上分段器已经显示成新档(两份真相,hc-20 同时钉这条接线与"装配处不许出现 ttlMs:");失败档那 5 分钟不进设置页(那是故障保护,不是给用户调的配置)。
离线 354 过 / 0 挂 / 2 跳(SKIP_LOCAL=1,跳的还是 hc-17 与 wt-27),同轮直跑 355 过 / 1 挂 / 0 跳(挂的仍是 wt-27 那一发真出网回 HTTP 429);本轮 +4(api 54→55:档位封闭与越界 400;client 52→53:那一行分段器 / 选中读库里那份 / 旧载荷整行不摆;store 38→39:越界回落 + 旧库补格;host-compat 20→21:hc-20 TTL 接线), repo 56 条条数不变、内容改判(段对象只四格、self/summary 段名、readmeMeta 新字面、'note' in zh.summary === false、TTL 那两条从 12 小时口径改口到 24 小时 + 现取现算)。
十九发证伪全红到位(tmp/r12-falsify.mjs,六个源文件逐发还原并逐字节比对,末行 [还原 ok]):source 格加回 / self 段名不带档名 / summary 段名不带引擎 / note 塞回载荷 / 落款压回旧长句 / 两数相等仍报整篇 / 客户端把撤掉的落款摆回屏上 / 装配时锁死 TTL / 服务侧抄毫秒常量 / prefsView 初值漏格 / 出厂档不是 24 / 档位多出第 5 档 / 话术表少一档 / clampPrefs 不认档 / 入口载荷不发档位 / api 闸门拆除 / 设置页那行撤掉 / 旧载荷仍摆空行 / 选中项读出厂值。
★ 首跑有一条不算证伪过(电池自己的缺陷,不是判据漏洞):那条把 self 段名的跨行模板串只吃了上半句 ⇒ 植入后源文件直接 SyntaxError,跑挂了却没有一条红用例。补全锚点后 19/19,并给电池加一档显式读数「植入改坏源文件(判据没跑到)」—— 免得下次把脚手架的坏消息读成判据的红(同一条律第四次:判据要在自己的现场上挂)。
诚实两句:这一件没有真机截图 —— 撤废话改的是那一屏的句子密度、加的那一行是设置页的分段器,按验收口径要在活宿主上截两屏并逐段量 getBoundingClientRect,而 index.js 动了装配半边 ⇒ 得重启 dsh desktop 宿主;第十一轮那条未验证清单还挂着,本轮把"详情弹框 + 设置页缓存行"并成一次走查。
「改小到 6 小时那一档之后,库里那批 12 小时时代存的行怎么办」真机零样本(只有离线那两条:24h 档下 7 小时的行仍算新鲜,切到 6h 档同一行当场过期重取)。

★ 第十件落地当天就撞出一发真机事故(10-07 第十三轮,用户递截图问「怎么回事」):desktop 上三榜全红「故障 · 存储不可用」、每榜 0 条。
根因就在这件的第四个落点里:新偏好键 repoCacheHours 当时写成 requiredInt('详情缓存时长(小时)'),注释理由是"与邻居 intervalMin 同形状"——可 intervalMin 是首建就存在的必填键、对它自己的老库合法;追加的必填键对第十二轮之前写下的那一行就是坏行。
而宿主只在 open() 读存量时跑这套 schema,一条坏行被 kv-records-base.js 包成 UNAVAILABLE ⇒ 一整域不可用(榜面走降级路径所以还看得见,但状态与榜史全读不出来)。
修法两处,零新键 / 零迁移 / 域 version 仍钉 1:那一格改回 optionalInt(缺格由 clampPrefs 补出厂 24 小时,语义不丢),并往 test/store.test.mjs 末尾加一条跑真宿主生效那一步的回归判据(拿 GHT_DOMAIN.tables[t].valueSchema.parse 吃上一版库存里真实存在的行形状;两头钉 —— 不抛 = 域还开得上,不凭空造格 = 补默认只许 clampPrefs 一处)。
⚠️ 为什么"离线 354/0/2 全绿"跟"界面上全线红"能同时成立:test/_helpers.mjs 的假设施 open() 不跑 schema、seed() 明写"未经 schema 校验" ⇒ 那套假设施结构上碰不到这一发。★ 同一条律第九轮的 engine 与第十一轮的 readmeSection / descSelfZh / zhCjk 都守住了(全部 optional,注释里写着同样的理由),第十二轮这一格是自己破的。
读数(10-07 11:0x 复跑,tmp/rerun-r12-fix.txt):store 39→40、离线全量 355 过 / 0 挂 / 2 跳(基线从 356 项推到 357 项);同一块证伪电池扩到 20 条 / 未抓到红 0 条(新那一发"把这格写成 required"当场 [store] pass 39 / fail 1,tmp/r12-falsify-out3.txt);真库存只读探针 tmp/probe-storage-open.mjs 报六表 239 行、读不出 0 行,并自证真缺那一格(prefs 缺 repoCacheHours / repo 缺 readmeSection / trans 缺 engine)—— 它只报行数与缺哪一格,绝不打印行值(prefs 那一行躺着你的真凭据)。
⚠️ 界面上什么时候退红,取决于你什么时候重启 dsh desktop 宿主(link: 挂载下宿主半边在进程启动时加载;修复在树里,但那个进程还拿着旧 schema)。我没替你重启。
★ 顺手补的第三处:lib/stores.js 里 /export function createPrefsStore 那个被第十二轮吃掉的换行(全树只有这一处,改的只有这一行)。
★ 第十一件(名次徽章分档,2026-10-07 第十四轮):你递了一张 modelwatch「本周前三」的截图(红框圈住 1/2/3 三枚圆徽),口径「榜单前三名也加上这种徽标和颜色,好区分一点」。
落法:.gt-rank 退成纯底座(22×22 / 圆角 8 / 11px·700 / tabular-nums),底色一律由档类给 —— 金 #e8b530 / 银 #c3c9d2 / 铜 #cf9a63(字色 #3d2c00 / #2f353c / #3a2410),第 4 名起 .gt-rank-n 走宿主令牌;三档色值与 modelwatch 的 .mw-rank-1/2/3 逐字相同(观感口径跟兄弟插件对表)⇒ 改一处要连着改另一处,这条对表关系由 client-54 的色值正则钉着。榜页 8 列表格与总览速览共用同一个 RankBadge,两处渲染点各自验(只钉组件不算:调用点自己拼类名就把档吃掉了)。
读数(10-07 11:2x–11:3x,tmp/rerun-r14.txt):client 53→54、离线全量 356 过 / 0 挂 / 2 跳(基线 357→358 项,差额只有那一条新用例 ⇒ 数据面 / 载荷 / schema 一字未动);新电池 tmp/r14-falsify.mjs(只圈 client.js)7 条 / 未抓到红 0 条,末行 [还原 ok]。
无头那一遍(tmp/probe-rank.mjs → tmp/shots/67-rank-medals.png)量到:三档计算样式 rgb(232,181,48) / rgb(195,201,210) / rgb(207,154,99)、第 4 名与第 15 名 rgb(250,250,251) + 1px 边框,五枚徽标恒 22×22(中性档那 1px 边框没把它撑大,靠 .gt-root {box-sizing:border-box})、46px 首列内右缘留 8px、nowrap 没触发折行、两位名次不撑列。
★ 这一轮踩到两条自己的律:① CSS 是模板串 —— 在 const CSS = \…\ 里写的注释带了反引号 ⇒ 整份 CSS 当场截断,报的是「rank is not defined」这种八竿子打不着的错([client] pass 4 / fail 50);② 断言钉前提 —— client-54 首跑挂在它自己的前提上(夹具的日榜只到第 3 名 ⇒ "第 4 名走中性"空跑),补成 5 行才落到位。另剔掉一条自等价植入(Number(rank) 换 parseInt(rank,10)||rank 抓不到任何红)。
⚠️ 诚实一句:这一件同样没有活宿主截图 —— 上面那一遍量的是从 client.js 逐字抠出来的那份 CSS + 复刻的表(宿主真令牌与深色外观没覆盖,表体其余七列是占位文本),而本轮只动浏览器半边 ⇒ 界面上要等宿主重新加载那份 client 源(重载面板,不行就重启 dsh desktop)。我没替你重启,也没挂 web profile 走查;这一屏并进上面那条欠着的走查清单(详情弹框 + 设置页缓存行 + 名次徽章)。
★ 第十二件(节选与判据窗口分家 + 句子边界收口 + 摘要能力跟着那一路 + 第二路找中文 README,2026-10-07 第十五轮):368 项离线用例 + 真机三张截图都走过了。 你递的是两屏现场:alibaba/open-code-review「这种项目有中文文档,为什么没有获取到」(那份中文 README 在 docs/i18n/README.zh-CN.md,根目录压根没有),和详情屏那句断在 Install Ask your a 的硬切节选;裁定「照你说的,把这几处修复合并在一轮里完成」⇒ 四件并成一轮: ① 分家:readmeZhVerdict 交两样东西 —— head(去标记后前 600 字,只用来数 CJK 判那五档)与 clean(去标记后的整篇);旧版拿 head 当节选交出去 ⇒ README_EXCERPT_MAX=1600 那道预算从来没生效(入库、上屏、喂摘要三者都恒 ≤600)。现在节选吃 clean、bodyChars 钉的是节选出自的那一篇的整篇长度(命中中文篇时指那一篇,zh_section 那一档仍指默认篇)。★ schema 那一格的 maxLength 一字未动、域 version 仍钉 1 ⇒ 零迁移(库里旧的 600 字行读回来还是 600 字,下一发按新档重取才变长)。
② 收口:excerptOf() 切到 1,600 后往回退到窗口内最后一个句子收尾(回退上限 EXCERPT_SENT_BACK_MAX=200,窗口里一个句末都没有就宁可硬切),EXCERPT_SENT_END_RE 中西文两支各写各的(中文那句没有空格可依赖);硬切与回切都退掉半个代理对(1,398 个 x + end. + 200 枚 emoji ⇒ 长度恰为 1,599,切在半枚 emoji 上就红)。
③ 能力下沉:lib/services/web-translate.js 的 SERVED_KINDS=['desc'] + kinds()(enabled(kind) 第一行就查这张表)⇄ lib/services/llm.js 的 kinds() => [...LLM_KINDS](两路都 serve)⇒「整理成一段简体中文摘要」那一路只派给 宿主模型;设置页那几行开关跟着变成载荷 switchRows[](每行 {key,kind,row,label,on} 五格,客户端只念四格),当前那一路做不了摘要 ⇒ 那一行压根不摆,不再留一个点了没用的控件。 ★ 第十七轮(10-07)这一条被用户改判(原话「我前面是有摘要现译的,你在哪一次改坏了,给我放出来」):SERVED_KINDS 现在报 ['desc','readme'] ⇒ 五档都派摘要那一发、设置页那行开关五档都摆;本段原样留着当第十五轮当时的口径与读数(图 68/69 是那一版的屏,不是现状),保留的只有"不挂假名"那半:那四档给的是节选的节译,段名与说明句跟着档位走(domain.summarySectionLabel / switchRowLabel)。
④ 第二路:pickZhReadmeLink(默认篇 raw 原文) 吃那行语言切换,markdown 文字 与 HTML href="路径" 两种写法都认(真机那一行用的是后一种,只写前一种等于没做),多条命中按名排序(★ 这一条已被第二十轮改判:现在先按"明写简体 / 不带变体 / 明写繁体"三档、同档内才按名 —— 见下面第十七件);zhReadmeRelPath 的闸门全排在造 URL 之前(scheme / 站内绝对 / / # / 反斜杠 / 空段与 . .. / 非 .md / 超 README_ZH_LINK_MAX=200 一律不放行),返回原始路径(encodeURIComponent 只在出网那一发逐段做,界面上 readmePath 念的也是原始那份),那一发 404 就回落 en_default 不炸。★ 编排没加发数:那一发中文正文本来就是第 4 发,只是路径换了来源。
读数(10-07 12:5x,tmp/rerun-r15.txt):SKIP_LOCAL=1 下 366 过 / 0 挂 / 2 跳,基线 358 → 368 项(逐套过数:repo 56→63、api 55→56、llm 18→19、web-translate 26→27(跳的还是 wt-27,所以项数 27→28)、client 54 与 host-compat 20 条数不变、内容改判 —— 前者现译那一屏的夹具改成吃 translatorView 现造的 switchRows,后者 hc-18 从读 translator.descOn 改成遍历 switchRows;只报条数就会把这两套的改判漏记账)。
十二发证伪全红到位(tmp/r15-falsify.mjs,圈 repo.js / domain.js / web-translate.js / api.js / llm.js 五个文件,逐条还原并逐字节比对,读数 tmp/r15-falsify-out.txt):[证伪] 12 条 / 未抓到红 0 条,末行 [还原 ok]。★ 首跑抓出两条自己的假绿:「绝对 URL 闸门撤掉」当场全绿 —— // 那种被"空段"那一支冗余挡住了,补上无 // 的 mailto: / http: 坏形状才让这一支成为唯一防线;「宿主模型谎报只 serve desc」那一发指错了套件(植在 llm.js 却跑 api)—— 判据在另一套件里,等于没验。逐条归因表在 §9.2。
真机那一遍(10-07 12:5x~13:2x,tmp/shot-r15.mjs,读数全文 tmp/r15-walkthrough.txt,图 3 张 tmp/shots/68~70-r15-.png,宿主日志 tmp/r15-host.log,第二路真回包两份 tmp/r15-ocr-live{,2}.json):出厂「免费接口」那一屏只有「描述现译」一行(图 68)、点「宿主模型」当场多出一行 摘要现译 关/开[on] 且引擎行提示同步换话(图 69)、切回 免费接口 又恢复成一行(★ 这一读数是第十五轮那一版的现状,第十七轮已改判:现在五档都摆两行,那一屏待重启宿主后重拍);详情弹框(tester-army/e2e,图 70)节选 textLen:1,594、endsAtSentence:true、尾巴逐字 …report them to security@tester.army.,框 650×319 / maxHeight:400.8px / ownScroll:false / dialogScrollable:false;第二路真回包 readmeSource:zh_file / readmePath:docs/i18n/README.zh-CN.md / 整篇 8,869 / zhCjk 330 / 节选 1,586 且落在「。」上,两次相邻 refresh=1 之间配额 55 → 51 ⇒ 那一屏真发四发,与「4 发封顶」对上。本轮出网账 api.github.com 10 发匿名 GET、翻译那四个域名 0 发。
⚠️ 诚实三句:中途差点读错一次 —— 13:09 那一屏回的是 cached:true + 节选 600 字,那行是 12:24 旧进程写进库的(cacheAgeMs 2,716,250),不是新代码产的;"库里那行旧"和"代码没生效"在两屏读数里长得一模一样,分清它俩的是 cached + cacheAgeMs + 进程创建时间三个数(tmp/r15-ocr.json 就是那份旧读数,原样留着别当本轮证据)。★ 第二路这一发补的是"详情载荷那一屏的 zh_file 真回包"那一格(zh_file 此前只在 §9.1 的数据源探针里过过 —— ant-design 那份 README-zh_CN.md 走的是根目录列表命中那一版,本轮第一次是第二路命中的),它补的不是 zh_section(后者本机仍 0 命中)。而 第二路那两发吃的是合成档(语言切换行按真机形状手写,只有"根目录没命中"那一头用 vitejs/vite 的真清单,那一发 404 态真接口压根触发不了)⇒ alibaba/open-code-review 的真回包只留在 tmp/,没落进 test/fixtures/。逐段 getBoundingClientRect 仍欠(上面界面那节那条)。走查后环境已拆净(探针宿主 PID 12144 连同四枚无头 chrome 关掉、junction 先验 ReparsePoint/Junction 再 [System.IO.Directory]::Delete 摘掉、package.json 从 tmp/bak/web-package.json.r15-before 还原并 cmp 逐字节一致、prefs 只读回 translateEngine:keyless、一次性 DOM 探针与浏览器目录删掉);desktop 那台宿主我没替你重启。
★ 第十三件(回执带上厂商请求号 + 同屏一条失败句只念一次,2026-10-07 第十六轮):371 项离线用例走过,真机那一屏没造。 这两件都是我自己上一轮递给你的旧账,你回的是「按你推荐的来」⇒ 按下面这两条落地;★ 顺带认一条:我上一轮那句"request id 常正好被 .slice(0,200) 切掉"说得不准 —— 旧 vendorErr 只拼 code + msg,那串号压根没进过回执(三家还各放在不同格:腾讯 Response.RequestId、阿里顶层 RequestId、百度叫 log_id),所以本轮的修法不是放宽那 200,而是把号认出来并排在最前。
① 请求号进回执且砍不掉:vendorErr 现在拼 请求号 <号> <msg>,号先截 VENDOR_ID_MAX=64 再排最前 —— 调用点那句 ${statusNote}${errText} 的 slice(0, 200) 砍的是尾巴,号排在 HTTP 403 + 请求号 + 64 = 77 字之内,错误体再长也砍不到它;没有号(百度那条真回包就没有 log_id)时那三个字一个都不摆,不许拼出「请求号 」那种半截话。屏上那一行是 回执:HTTP 403 请求号 …,用户找客服时报得出号。
② 同屏只念一次:repoSections 里摘要段的 sub(失败句)与 num(回执:…)两块按字面跟着描述段去重 —— 两路现译走的是同一个当前档(pickTranslator 只选一个服务),它挂掉时两处逐字相同,那句话讲的是那一档的事实不是这一路各自的事实。★ 去重只按"已在屏上的字面"逐格判:原因不同(描述挂在传输、摘要 too_long)时各说各的;两块都撤了段仍摆,段名「中文摘要 · 没取到」本身是新信息(撤成整段不摆就是把一次失败说成没失败;★ 第十七轮那一句段名跟着档位走,失败行没有引擎 ⇒ 现在念「中文现译 · 没取到」,成功行才分「中文摘要 / 中文节译」)。载荷键一格没撤(summaryNote / summaryErr 照给,只是不再重复上屏)。
读数(10-07 15:4x,tmp/rerun-r16.txt):SKIP_LOCAL=1 下 369 过 / 0 挂 / 2 跳,基线 368 → 371 项(repo 63→64、client 54→55、web-translate 项数 29(过数 28,跳的仍是 wt-27);api / host-compat / llm 一字未动);★ 不带 SKIP_LOCAL 的直跑(tmp/rerun-r16-full.txt):371 过 / 0 挂 / 0 跳(hc-17、wt-27 这一次都通,满绿不保证复现)。
十一发证伪全红到位(tmp/r16-falsify.mjs,只圈 lib/services/web-translate.js 与 lib/services/repo.js,读数 tmp/r16-falsify-out.txt):[证伪] 11 条 / 未抓到红 0 条,末行 [还原 ok]。★ 这一轮的电池专门做了两头:repo.js 那五条改动先在 repo 套件里红,其中两条另在 client 套件各跑一遍(同一条屏上的话由宿主拼、由客户端摆,第十五轮踩过"植入的文件与跑的套件对不上 ⇒ 判据等于没验");「号排回正文尾巴」那一发当场红在 wt-29 的顺序那一头(三家夹具各断一句 startsWith('请求号 …')),而同一用例的第二头钉的是预算 —— 最坏那一发(403 + 64 字顶满的号 + 约 700 字错误体真走假 net)断言回执 ≤200 且 ^HTTP 403 请求号 R{64} :只写头一头会漏另一头。
⚠️ 诚实两句:这一轮没有真机截图,也不能写成"过了真机" —— ①那一屏要一次真的厂商失败,本机发得出它的只有你家库里那三把真凭据(我不会拿它去发坏签名);②那一屏要 host_llm 档两路同时挂,而你这台宿主的模型是就绪的,我不会为了造现场把它弄成不可用。两屏都并进那条欠着的走查清单(详情逐段 rect + 深色外观 + 6/72 小时档 + 第十四轮那张名次徽章活宿主屏):哪天你自己撞上"翻译接口回了错误",那一行开头就该是 回执:HTTP xxx 请求号 … —— 那串号能直接报给厂商客服,截图给我我就把这格划掉。代码本轮只动这两个文件,载荷形状、schema、出网账一字未动。
★ 第十四件(摘要现译放回来,2026-10-07 第十七轮):372 项离线用例走过,真机那一屏没截。 你递的是设置页那一屏:切到腾讯、阿里、百度、免费接口任何一档,「摘要现译」那一行都不在(那张聊天截图没落进 tmp/shots/,本轮没编号 —— 它是这轮要修的现场,不是本轮的验收读数),原话「我前面是有摘要现译的,你在哪一次改坏了,给我放出来」+「前面我使用免费接口都翻译了摘要,什么做不了」⇒ 这一轮是把第十五轮③那道档侧能力闸撤掉,不是加新功能: ① 放回那一发:lib/services/web-translate.js 的 SERVED_KINDS 从 ['desc'] 改回 ['desc','readme'] ⇒ kinds() 两路都报,enabled('readme') 仍只看 llmReadme 开关(放回不等于自动派活,额度还是用户点开的);api.js 那道 want('readme') 与两道源侧闸门(descSelfZh、readmeSource === 'en_default')一字未动 ⇒ 中文篇 README 依旧不白花那一发。
② 不挂假名(本轮唯一保留的口径):翻译四档给的是节选的逐字节译,不是「整理成一段」的摘要 ⇒ 段名 summarySectionLabel(engine)(host_llm 念「中文摘要」,其余四档念「中文节译」,失败行没有引擎、切不出档 ⇒ 念「中文现译 · 没取到」),设置页那句说明 switchRowLabel(key, engine) 跟着档位走(行名仍是「摘要现译」,那正是你要放回来的那一行)。落款 engine 吃的是那一行自己的(applyZh 里 ?? 'host_llm' 只兜第八轮那批没这格的旧行),换档不会把旧的免费档译文署成模型口吻。
读数(10-07 16:0x,tmp/rerun-r17.txt / tmp/rerun-r17-full.txt):SKIP_LOCAL=1 下 370 过 / 0 挂 / 2 跳,基线 371 → 372 项(差值只在 api 56→57:新那条钉的是"说明句跟着档位走、行名不跟着变";repo 64 / client 55 / web-translate 28 / host-compat 21 条数不变、内容改判 —— 前两套改成吃三档段名与两行开关,hc-18 从"翻译档只有一行"改成"两行",wt-28 整条重写为"这一档 serve 两路");★ 不带 SKIP_LOCAL 的直跑:371 过 / 1 挂 / 0 跳,挂的仍是 wt-27 免费档真出网那一发回 HTTP 429(外部限流,与本轮无关;上一轮同一条是通的 ⇒ 满绿不保证复现)。
十二发证伪全红到位(tmp/r17-falsify.mjs,圈 domain.js / web-translate.js / repo.js / api.js / client.js 五个文件,读数 tmp/r17-falsify-out.txt):[证伪] 12 条 / 未抓到红 0 条,末行 [还原 ok]。★ 首跑没验成一条:客户端那条锚点缩进抄错 ⇒ 报「锚点失效」而不是假绿(这条如实登记,改正后 12 条全红);③④那两组刻意做了两头(宿主拼段名跑 repo、客户端摆段名跑 client;服务的能力声明跑 web-translate 与 api 两套)。
⚠️ 诚实一句:这一轮没有真机截图 —— 本轮动的是宿主半边 lib/,link: 挂载下重载面板不算,要重启 dsh desktop 才看得见那两行开关与「中文节译」那一段(我不会替你重启,也不动你库里的 prefs 与缓存行)。两屏(设置页五档各两行开关 + 详情弹框那一段的段名与落款)并进那条欠着的走查清单(详情逐段 rect + 深色外观 + 6/72 小时档 + 第十四轮那张名次徽章屏 + 第十六轮那两屏):你重启后截给我,我就把这格划掉。 ★ 第十五件(README 有中文就不许译 —— 判据覆盖面补齐,2026-10-07 第十八轮):零行为改动,372 项复跑同数,抓出一条我自己的假绿。 你的原话「如果项目 readme 有中文,即使开摘要现译也不要翻译,只有英文的才翻译」。核对结果是:这条口径代码里已经在(lib/api.js:356 那道闸 view.readmeSource === 'en_default' ⇒ 三档"已经有中文"的都不派:zh_default 整篇中文 / zh_file 抓到仓库另写的那份中文篇 / zh_section 整篇里嵌一段达标中文小节),所以本轮没改行为,改的是判据与文档三处: ① 判据覆盖面:api 那圈派活矩阵原先只在「只开描述档」的桩下摆中文形状 ⇒ want('readme') 恒假,那种行测不到摘要闸门(我第一版就往里加了一行 zh_file,电池当场报它假绿 —— 同族第七次:断言钉住了文本、没钉住前提)。改成在「只开摘要档」那一圈里三档中文各钉一发「jobs 必须为空」+ 各钉一发 self 段的档名,en_default 那一发仍派且喂的是节选。
② 真库存对账(tmp/probe-readme-zh-rows.mjs,只读、零出网、只打键与枚举不打行值,读数 tmp/probe-readme-zh-rows.txt):trans 表 6 条 readme: 里有一条对不上档 —— alibaba/open-code-review 有 engine:keyless 的摘要译文行,而它 repo 行现在记的是 readmeSource=zh_file(zhCjk=330)。对得上的解释:那行 src 是 600 字(第十五轮"节选与判据窗口分家"之前的旧上限),行时刻 12:24、repo 行时刻 18:26 ⇒ 它是第二路还没落地那一版判成"英文篇"时留下的旧行。★ 关键是它现在不会被读出来:闸门排在 translate() 之前,不派活就连查表都不查 ⇒ 我不去删你那行库存(旧行留着还是"曾经谁译的"的账,删它得你点头)。
③ 口径落档:lib/api.js 那段注释原先只点名 zh_section,现在三档都点名并写清"只有默认篇是英文才译"。
读数:全量复跑与第十七轮逐套同数(SKIP_LOCAL=1 下 370 过 / 0 挂 / 2 跳,api 仍 57 —— ★ 条数不变、内容改判的那一套:矩阵那一圈从 1 档中文扩到 3 档,加进去的行不增 check() 数,只报条数就会把这次改判漏记账)。证伪电池 tmp/r18-falsify.mjs(圈 lib/api.js + lib/services/repo.js,读数 tmp/r18-falsify-out.txt)7 条 / 未抓到红 0 条,末行 [还原 ok]:闸门给 zh_file/zh_default/zh_section 各单独开侧门(三发,验三档各自都真有现场、不是只有一条承重)、放宽成"有来源就派"(一发)、readmeZhVerdict 永说不是中文(repo 6 红)、pickZhSection 阈值抬死(repo 4 红)、第二路整条断掉(repo 2 红)全被抓回。
⚠️ 两条没动的边界(要动得先有真样本,别凭我判):一是阈值 README_ZH_MIN_CJK = 20 —— 整篇里汉字不足 20 且没有一段达标小节的中英混排篇仍算 en_default(会译),当初定 20 的真读数是英文侧 ant-design 2 / 中文侧 30、195、297;二是中文篇名字状 README_ZH_NAME_RE 与语言切换行 —— 仓库把中文篇放在子目录又没在默认篇里写链接时找不到(仍算只有英文 ⇒ 会译)。你说"这两种也要算有中文"我就去收窄,否则我留着这两个口径不动。 ★ 下一轮(第十九轮)你就说了,这两条边界当场作废,见下面第十六件。本轮行为一字未改 ⇒ 没有新真机现场,第十七轮那两屏照旧欠着(要重启宿主)。
★ 第十六件("这两种也算有中文" + 旧译文行删,2026-10-07 第十九轮):这次是真行为改动,376 项离线用例走过,同样没真机屏。★ 两件事里只做成了第一件 —— 旧行删掉后被在跑的宿主用内存态写回(④b/④c 记的是这一笔)。 你的原话「这两种也算有中文,旧译文行删」⇒ 上一轮那两条"没动的边界"由你裁定作废,本轮做了两件事: ① 第三道源侧闸门 readmeZhOnScreen(节选)(判据在 lib/services/repo.js,常量在 domain.js,api.js 派活前调用)。两条来路各管你说的那一种:via='cjk'(节选里中日韩字符 ≥ 8 ⇒ 中英混排那档,真机 thedotmack/claude-mem 节选 9 字)/via='lang'(节选里出现「中文」两字 ⇒ 中文篇在子目录、第二路没抓到、手上只剩那行语言切换字样,真机 ant-design 英文篇整篇才 2 个 CJK)。★ 零额外请求:吃的还是默认 README 那一发已经拿回来的那段节选,不猜路径、不许多打一发(60 次/小时那本账本轮没动);★ 零新增载荷键、零新增存储字段、repo 表 schema 一字未动(第十轮那条「存储不可用」事故的律)。
② ★ 档名律与闸门律分家(本轮最要紧的一条裁定):README_ZH_MIN_CJK = 20 一个字没动 —— 那 20 管的是「默认 README 本身就是中文」这句档名敢不敢说;新的 8 只管「这段节选里已有中文 ⇒ 别派」。拿 8 去改 20 的后果是真读数:ant-design 英文篇整篇 2 个 CJK、claude-mem 那 9 个字全是语言切换行的标签(tmp/probe-zh-link-shape.txt)⇒ 那样改名等于档名说谎。两条律问的不是同一件事,阈值就该分开。
③ 反面三条钉死(误挡一类就是删了你在用的那一屏):「日本語」不算中文(CJK 计数含假名,那 3 个字够不着 8 也不含「中文」⇒ 真机 m-abozaid/esp32-c3-adblock 照旧派摘要);国名「中国 / 中國」不算声明;英文 Chinese 不认(Chinese tea 一大把)。命中时 self 段名补那半句实话,两档各有字面(「(节选里已有中文)」/「(这行写着有中文版)」,宿主单点拼、客户端不重拼,client 那套黑名单盯着),★ 且不许写成「所以没译」—— 开关关着时同样不译,那句会把"没开"说成"不该译";zh_ 三档不补(中文由档名自己说)。
④ 旧译文行删了一次,被在跑的宿主写回来了(你点头的那一件,这一件没做成):库里 trans 表那条 readme:alibaba/open-code-review(engine:keyless,而该仓现在记的是 zh_file / zhCjk=330)。做法两道闸都守住了:整文件备份 tmp/gh_trending.json.bak-20261007-192307(sha256 逐字节一致)+ 只有「JSON.parse 再 stringify(按库存自己的缩进档)与原文逐字节相同」才落盘,否则一字不改地退出(脚本 tmp/delete-stale-readme-row.mjs,默认干跑,只打键与枚举、不打行值)。19:24 的回执 trans 9 → 8|repo 16 行未动|其余各格逐字一致 ok,那一刻对账 readme: 5 条全部 en_default。
④b ★★ 但 19:26:37 宿主那一写把整份内存态落回文件(同批新增 37 条 events、state 三行刷新、seen +4 —— 它就在那儿跑着),19:33 复跑对账回落到 trans 9 行 / readme:* 6 条,那一行原样在 ⇒ 文件层删一格而内存里那格还在,下一次落盘就还原。删它必须先把 dsh desktop 关掉(我没替你关,也不动你的进程)。
④c ★ 本轮最该记的一条是我自己的假读数:动手前我用 tasklist 过滤 dsh / electron 判"宿主不在跑",据此把"可能被内存态覆盖"那句风险划掉了 —— 而宿主的进程名是 DeepSeek Harness.exe(PID 9500,10-07 18:25:01 创建),镜像名里 dsh 与 electron 两个词都没有 ⇒ 那个过滤条件结构上抓不到它,判"宿主在不在跑 / 哪一版在应答"要按 Get-CimInstance Win32_Process 的 CommandLine 匹配。★ 而「闸门排在 translate() 之前 ⇒ 旧行不查、不读、不上屏」那句仍然成立,所以它躺在库里不影响本轮行为。
⑤ 读数(19:24 本机,tmp/rerun-r19.txt):SKIP_LOCAL=1 下 374 过 / 0 挂 / 2 跳,基线 372 → 376 项。差额四条按圈记:api 57→59、repo 64→66。★ 本套第 8 次撞自己立的坑:新那条 repo 用例名字里带「真机」⇒ SKIP_LOCAL=1 下静默跳过并打 skip 1,我一度以为它在跑 ⇒ 改名「两侧各用一条本机真读数钉边界」后才真进矩阵(要真出网的口径仍只归 hc-17 / wt-27)。
⑤b 本轮出网账:api.github.com 4 发(tmp/probe-zh-link-shape.mjs:thedotmack/claude-mem 与 m-abozaid/esp32-c3-adblock 各两发 = /contents/ + /readme,只读、只打路径形状与 CJK 计数,不打正文也不打凭据),★ 另有 2 次失败尝试没打出可用读数(探针接线错,如实报差额不藏);闸门与删行那两件事各 0 发(闸门吃已在手的那段节选、删行是本地读写)。60 次/小时那本账本轮花 4。
⑥ 八发证伪(tmp/r19-falsify.mjs,圈 api.js / domain.js / services/repo.js,读数 tmp/r19-falsify-out.txt):[证伪] 8 条 / 未抓到红 0 条,末行 [还原 ok]:闸门撤除/阈值抬死/阈值降到 1/「中文」字样认法失效/放宽到 Chinese·中国/段名不补/那半句不分档乱补/闸门改吃库存 zhCjk 全被抓回。★ 首跑第 ③ 条挂在别人的现场上(阈值降到 1 时,同一个 check() 里 lang 那条断言先炸 ⇒ "误挡日文"这个现场永远轮不到报红)⇒ 按「证伪要在自己的现场上挂」把反例拆成独立用例(api / repo 各一圈),拆完复跑才有那两行"红在自己的用例上";★ 拆圈的代价是条数上涨(api 58→59、repo 65→66),只报"新增一条用例"会漏记这一笔。
⑦ ★ 一条能力边界如实登记(本轮没做):「中文篇在子目录、默认篇里连那行都没写」这种形状没法零请求识别 ⇒ 猜路径就要多加一发,撞的是 60 次/小时匿名配额那条红线 ⇒ 只做「屏上那段有中文/那行写着有中文版」,不猜路径。另登记一条没动的发现(你裁定范围外):pickZhReadmeLink 按名字排序取第一个 ⇒ claude-mem 那种形状会挑中 docs/i18n/README.zh-tw.md(繁体)而不是 README.zh.md('-'(0x2d) 排在 '.'(0x2e) 前面)。 ★ 第十七件(第二十轮)把这条发现接住了:你裁定「使用 README.zh.md 这种」⇒ 已落地,见下面那件;「不猜路径」那一条你也裁定了 保持不做。
⚠️ 诚实一句:这一轮没有真机截图 —— 本轮动的又是宿主半边 lib/,link: 挂载下重载面板不算,要重启 dsh desktop 才看得见(我不替你重启,除了④那一格是你点头才动的库)。要看的两屏是「混排篇/只剩切换行那两类仓库不再多出摘要段,且 self 段名尾巴上有那半句」+「日文篇那一屏照旧给摘要」,与第十七轮那两屏一起并进欠着的走查清单:你重启后截给我,我就把这格划掉。**

★ 第十七件(多份中文篇并存时挑简体那份 + 「不猜路径」保持不做,2026-10-07 第二十轮):一条真行为改动、一条零改动,378 项离线用例走过,同样没真机屏。 你上一轮那两条"没动的"这轮都有了答复(原话「只做"屏上有中文/那行写着有中文版",不猜路径」+「使用 README.zh.md 这种」): ① 零改动那一条:那种「中文篇在子目录、默认篇里连那行都没写」的形状不做路径猜测 —— 猜就要多加一发 contents,撞 60 次/小时匿名配额那条红线 ⇒ 第十九轮那道闸门的两条来路(节选 CJK ≥ 8/出现「中文」字样)就是最终覆盖面,能力边界继续如实登记(界面上永远不会为那种形状凭空多出一段中文)。
② 真行为改动那一条:两条路命中多份中文篇时,旧写法都是 .sort() 取第一个,而 '-'(0x2d) 排在 '.'(0x2e) 前面 ⇒ 真读数 tmp/probe-zh-link-shape.txt 第 8~9、40 行:thedotmack/claude-mem 那行语言切换同时写着 docs/i18n/README.zh.md 与 docs/i18n/README.zh-tw.md,繁体那份被挑中了。
③ 形状 = 一份优先档、两路共用:domain.js 两份封闭词元名单(简体 ['hans','cn','chn']/繁体 ['hant','tw','hk'])→ zhVariantRank(文件名) 出 0 明写简体 / 1 只写 zh、chinese / 2 明写繁体,比较器 byZhPreference 只此一处,pickZhReadme(根目录列表)与 pickZhReadmeLink(语言切换行)都挂它。★ 单点不是洁癖:第十五轮那条发现就是"两处各写一次排序"里第二处单独露出来的;电池第 ①② 条分两条钉,就是为了"只接一路时另一路那条必须还红得起来"。
④ 三条边界各有反向用例:只排序不过滤(只有繁体时那份繁体照旧上屏 —— 把它过滤掉等于撤掉你在用的那一屏,同第十七轮"不许对任何一档说做不到"那条律;两档同时出现在一个名字里 ⇒ 保守按繁体算)/切文件名的词元,目录名不参与(docs/tw/README.zh.md 还是"不带变体"那份)、不按子串(拼错的 README.zh-cnother.md 不许冒充简体)/同档内仍按字面排序("稳定比聪明重要"没改判 —— 丢掉 tie-break 的话,GitHub 目录序一变你看到的那一份就换一份)。
⑤ 出网账 0 发 / schema 账零增量:挑到哪一份都是原来那一发正文(详情编排仍 ≤4 发),载荷键、repo 表字段与域 version 一字未动。判据吃的是第十九轮那 4 发留下的读数+本地库存两行(只读)。
⑥ 读数(20:1x 本机,tmp/rerun-r20.txt):SKIP_LOCAL=1 下 376 过 / 0 挂 / 2 跳,基线 376 → 378 条,差额只在一套:repo 66→68(zhVariantRank 一圈 + 「两路共用同一条优先档」一圈);★ pickZhReadmeLink 那一圈条数不变、内容改判 —— 旧断言「多条命中按名排序」把"繁体那份赢"钉成了规矩,本轮当场翻案(同第八轮 provider:undefined 那一族:离线断言把坏行为钉成规矩)。
⑦ 九发证伪(tmp/r20-falsify.mjs,圈 domain.js / services/repo.js,读数 tmp/r20-falsify-out.txt):[证伪] 9 条 / 未抓到红 0 条,末行 [还原 ok]:两路各退回字面排序/两路各把排序做成过滤/词元从整条路径切/词元换子串/简繁先后调换/丢掉 tie-break/两份名单撞车,各红在自己的断言上。★ 一条自我 correction:首跑第 ⑥ 条的植入写成 /tw|hant|hk/.test(base) —— 顺手把大小写归一也丢了,一发变异同时动了两维(连带把 pickZhReadmeLink 那一圈也炸了)⇒ 改成 base.toLowerCase() 只动"词元还是子串"这一维再跑。变异也要单因,否则读数在同时说两件不同的事。
⑧ ★ 对照读数(只读、零出网):库里 thedotmack/claude-mem 那行 repo 记的是 readmeSource=en_default / readmePath=README / zhCjk=9 / at=2026-10-06 08:42:21 ⇒ 那发早于第十五轮第二路,它身上第二路从来没跑过。所以"改完挑简体那份"这一条不是验证过,是重启后要点开它看的那一屏。
⚠️ 诚实一句:这一轮也没有真机截图(又是宿主半边 lib/ ⇒ 要重启 dsh desktop,我不替你重启)。要看的那一屏只有一处:点开 thedotmack/claude-mem,self 段元数据里的路径念 docs/i18n/README.zh.md;顺带 alibaba/open-code-review 应仍是 docs/i18n/README.zh-CN.md(它只有一个候选 ⇒ 若它变了,就是我把排序做成了过滤)。★ 第十九轮那件"旧译文行删"这一轮照旧没做成:20:0x 复跑对账仍是 trans 9 行 / readme: 6 条(宿主 5 个 DeepSeek Harness.exe 进程在跑,18:25 起)⇒ 等你关掉 dsh desktop 我再删一次,脚本与逐字节备份都在 tmp/。
★ 同一轮 21:3x 再对一次账(只读、零出网),有两处要把旧读数划掉:宿主在 21:10:33 被重启过(5 个 DeepSeek Harness.exe 全为新进程,库存文件 21:12:15 落过一盘)⇒ 上面那句「18:25 起」只对那一遍成立;而那一版加载的是 client.js(16:43)/ lib/api.js(19:26)/ 第十九轮那两份 lib/ ⇒ 第十七、十九轮那几屏现在就在应答,不必再重启就能截;本轮 21:20:06-07 落地的 lib/domain.js / lib/services/repo.js 晚于那次重启 ⇒ 只有第二十轮那一屏还欠一次重启。同一遍对账:readme: 仍 6 条(含那条 zh_file 的旧摘要行)⇒「旧译文行删」照旧挂着。

下面的挂载步骤是给你确认用的。

方式 A:官方 CLI

dsh plugin --profile desktop add github:gh-gongjin/dsh-plugin-gh-trending

CLI 内部走 pnpm,需要 pnpm 在 PATH 里。本地目录同样可装:dsh plugin --profile desktop add <本仓库的绝对路径>。

方式 B:手工两步(不需要 pnpm)

1. 编辑 profile 的 package.json(桌面版是 ~/.dsh/profiles/desktop/package.json,Windows 为 %USERPROFILE%\.dsh\profiles\desktop\package.json):
- dependencies 增加:"dsh-plugin-gh-trending": "link:<本仓库的绝对路径>"
- dsh.profile.bundles 数组末尾追加 "dsh-plugin-gh-trending"
2. 在 profile 的 node_modules 下建目录联接:

New-Item -ItemType Junction
-Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-plugin-gh-trending"
-Target "<本仓库的绝对路径>"

3. 重启 dsh(宿主半边在启动时加载)。只改 client.js 的话刷新页面即可。

停用 / 卸载

临时停用:在 ~/.dsh/profiles/desktop/cordis.patch.yml 里加

- id: gh-trending
disabled: true

界面

S2 起是六页签(交互照 modelwatch 的同源实现):页头(三榜状态胶囊 + 「立即检查」+ 该操作的回执)与页签条包成一块 sticky 常驻,滚到榜底也切得动签;六个签 总览 / 日榜 / 周榜 / 月榜 / 变化记录 / 设置,签上带该榜条数徽标(0 条、总览与设置不带徽标 —— 拿 0 冒充有数最坏)。

- 总览:三榜状态 → 每榜前 3 名速览(名次徽章 + 仓库 + +新增)→ 跨榜同现,一屏看完「要不要点进某一榜」;卡头的「完整榜单 →」就是切页签。总览原先收尾在一张「最近变化」小结(前 4 条 + 「全部 →」),2026-10-05 用户口径去掉——流水就归「变化记录」那一签管,总览不重复养一份影子。
- 日 / 周 / 月榜:各自一张 8 列大表(table-layout:fixed + :# 46 / 仓库 268 / 描述吃余量 / 语言 112 / 累计★ 64 / 本轮新增 72 / 位次变化 56 / 兜底 0,≤1000px 时仓库吃余量、描述定 160),卡头一行给「榜面数据 <age> · 最近取回 <age>」(坏榜改口「最近尝试」)与 显示 / 榜面 计数,这一张榜真有命中的描述时再追一句「· 描述中译为内置离线预译 · <日期>」(没命中就整段不出现,载荷的 label 换成别的界面就跟着变 —— 那句话读的是 snap.descZh.label,客户端不许自己编日期)。描述列:命中的行显示译文、悬停看得见原文(译文是预译的,读的人有权核对它翻的是哪一句),没命中的行仍是原文。
★ 第二十二轮(10-08)这一列与卡头跟着改判(§8.7):卡头那一句现在读 snap.descZh.heads[board](按这一张榜算好的整句,宿主给什么念什么:描述中译为内置离线预译 · <日期> / 描述中文为现译 M 条 / 描述中文:内置预译 N 条 · 现译 M 条,都没命中给空串 ⇒ 整段不出现;client-48 两头钉死"界面不数条数、不拼句子、不拿别榜的句子挂本卡")。
描述列从此一列两种来源并存 ⇒ 落款跟着每一行走:descZh.hits[repo] 是 {zh, via, label, note, src} 五格,悬停给「原文 + 这一行自己的来源 + 注」(拿卡头那一句套每一行就串了 —— 内置预译与每轮补的现译说的不是一件事);再加一句 descZh.liveNote(只在「有欠着的行 + 库存得下 + 开关开着 + 这一路此刻给不出」四格同时成立时非空:「榜面这一列只显内置预译:现译这一路这会儿发不出去…下一轮检查会自动再试」),榜面一行都没空榜也不唠叨(client-58)。
- 变化记录:全量流水。设置:偏好 + 只读「运行环境」表(环境跟在设置里,不占一个签)。偏好里 出网方式 那行下面是现译引擎五档分段器(免费接口 / 百度 / 腾讯 / 阿里 / 宿主模型,★ 档名、顺序、当前档、这一档那句 engineHint、以及「这一档现在发不出去」那句 notReadyHint 全从 snap.translator 读,点一下即存,客户端不排表);只在选中有凭据那三家之一时多摆一行凭据(每档恰好两格、由 credFields[] 给出:AppID+密钥 / SecretId+SecretKey / AccessKeyId+AccessKeySecret。标识符那格是普通框、value 等于库里那份,密钥那格 type=password 且 value 恒空、从不回显 —— placeholder 说「库里已存(留空不改动)」而不是给你看那几个字;旁边那个「清除」只在库里这一档真有凭据时才出现(credStored),点了只发当前档那两格的空串,没凭据时它压根不摆;留空的密钥框不进 patch,进了就等于清除,那是旁边那个按钮的语义);凭据行下面紧跟注册那一行(百度 1 个链接、腾讯/阿里各 2 个 —— 开通入口与密钥管理分开,全部 target=_blank rel=noreferrer,★ 只跟当前选中的那一家,别家的 URL 出现在这一屏即红;那句额度话不念具体数字,只指向官网计费页);再下面才是现译开关行(★ 第十五轮:行清单是载荷给的 —— snap.translator.switchRows[],每行 {key,kind,row,label,on} 五格,客户端只念 key/row/label/on 四格,一行代码都不排表;当前那一路 kinds() 报什么 ⇒ 屏上就摆什么(★ 第十五轮那四档只报 desc、只有 描述现译 一行;第十七轮用户改判放回 ⇒ 五档的 kinds() 都报 desc+readme,两行开关五档都在,行名 摘要现译 不跟着档位变,只有那句 label 跟着变:翻译四档念「README 英文节选译成中文(这一档只做翻译,这一段是节译不是摘要)」,宿主模型 念「README 英文节选另给一段中文摘要」)。同一套分段器类名 .gt-seg,点一下即存,没有草稿态;这些行只管「要不要」,「能不能」只在上面引擎那一行说一次;「这一路压根没有摘要能力」这件事由那一行不出现来说(★ 第十五轮那句作废:现在由那一行的说明句来说 —— 撤掉一行等于删了用户在用的那一屏;仍然不许客户端自己补行:载荷没给 switchRows 的旧宿主整段不摆,点了没用的控件比没有更糟 —— 那说的是载荷里没这一格,与档位无关)。出网方式 是三档分段器 + 一个地址框(草稿,点「保存」才发),切到 自定义地址 时模式与地址一起发——只发模式会拿旧地址出网,只发地址则可能压根没在用自定义。详情缓存那一行(★ 第十二轮)与检查频率同形状:四档分段器 6 小时 / 12 小时 / 24 小时 / 3 天、出厂 24 小时,档位与话术都从入口载荷读(cacheHours / cacheHourLabels,客户端一个字不写)、点一下即存;★ TTL 在服务侧调用时现取现算 ⇒ 改档后下一发详情就按新档判新鲜,不必重启宿主;档位外的值 POST /api/prefs 直接 400(不许悄悄回落 24 —— 那等于库里一个值、分段器上另一个值);失败档那 5 分钟不进设置页(故障保护不是给用户调的配置)。运行环境第一行是 传输路径:最近那一发到底走了哪条路(代理隧道 · Windows 系统代理 · http://127.0.0.1:7897 / 直连 · 设置页选了直连 / 没能出网 · <原因>),整句由宿主拼好,客户端只搬字;没出过网之前这一行干脆不出现。
- 没有自动弹出的提示层(toast / 通知):所有错误、降级、保存反馈一律就地落在那张卡上;「立即检查」的回执落在页头,因为按钮在页头 —— 页签化之后若回执仍只活在某一签里,点完按钮的人当场看不到下文。唯一的浮层是点仓库名才出现的详情对话框:它不自己冒现。★ 对话框的内容从第十一轮起是段表直通:宿主把 sections[] 一次拼死(四段 项目是什么 / 热度与元数据 / 仓库自己怎么介绍它 / 中文摘要,每段一组带 kind 的块 p/sub/num/excerpt),客户端只按 kind 挑类名摆(.gt-modal-sec 装段、.gt-modal-h2 是段名、.gt-modal-p / gt-sub / gt-num 逐级加重、excerpt 走带框那条 .gt-modal-readme),不重拼句子、不自己排段序、数字只从 heat 段那一张 gt-modal-facts 出来(同屏一个数只出现一次);现译那两句(中文描述 / 中文摘要)也落在段里,不另立一套视觉语言。
★ 第十二轮(用户裁定「把这个页面上的废话都去掉」)把四段各自的"来源落款"整句撤了:段对象只剩 key/label/blocks/facts 四格(source 那一格连同 REPO_SECTION_SOURCE_NOTES 那张表一起删), "这一份是谁写的 / 那一句是谁译的"并进段名说(仓库自己怎么介绍它 · 默认 README 是英文、仓库自己怎么介绍它 · 默认 README 里有一段中文说明(小节「…」)、中文摘要 · 免费接口 · 10-07 09:5x ★ 这一个是第十五轮之前的真读数,那时段名不分档;第十七轮(10-07)起段名跟着那一行自己的引擎走:宿主模型 才念「中文摘要」,翻译四档念「中文节译 · 免费接口 · …」,失败行念「中文现译 · 没取到」),README 那行落款压成一行短字面 节选 54 / 整篇 4,235 字 · 已去标记 · README。
★ 第十五轮:那一行短字面没改形状,改的是节选本身 —— 旧版拿"数中文的那 600 字窗口"当节选交出去,README_EXCERPT_MAX=1600 那道预算从来没生效;现在窗口只服务判据,节选吃去标记后的整篇,并且在句子边界收口(真机那屏断在 Install Ask your a)。真读数:节选 1,594 / 整篇 4,802 字 · 已去标记 · README(tmp/shots/70-r15-detail-excerpt.png)与 节选 1,586 / 整篇 8,869 字 · 已去标记 · docs/i18n/README.zh-CN.md(第二路真回包 tmp/r15-ocr-live.json)。
撤的是解释,不是事实:「不是现译」那个标签、仓库原文那一句(译文永不替换原文)、页脚那行 GitHub 配额,三件都照旧在屏上。
⚠️ 诚实一句:「四段摆出来好不好读」的判据这一件(类名逐字 + 块序 + facts 归属 + 段对象只四格 + 那四句旧落款一句都不在屏上)在第十一、十二轮只有离线判据,旧那三张 tmp/shots/42-detail-.png 是第八轮「一整句叙述」那一版的图、别拿它们当第十一轮的读数;★ 第十五轮(10-07)补上了活宿主那一屏的截图与弹框几何(tmp/shots/68~70-r15-.png:设置页两档各有几行开关、详情弹框 650×319 / maxHeight 400.8px / 弹框自身不滚),但"逐段 getBoundingClientRect"仍然欠着 —— 每一段吃多高、sub/num 墨迹深浅差、excerpt 的边框与内边距,那一遍没量 ⇒ 挂在 §9.3 未验证清单第十一轮那条。
- 名次徽章、新面孔 标签(本机首次上榜)、原 owner/name 标签(改名)、无描述显示 —;数值列走 tabular-nums 并用 fixed 表模板定宽(余量给描述列,不是给末尾空列 —— modelwatch 的真机大空隙事故)。
★ 第十四轮起徽章分四档(用户口径「榜单前三名也加上这种徽标和颜色,好区分一点」,附 modelwatch 截图):.gt-rank 只做底座(22×22 / 圆角 8 / 11px·700 / tabular-nums),底色一律由档类给—— .gt-rank-1/2/3 金 #e8b530 / 银 #c3c9d2 / 铜 #cf9a63(三档色值与 modelwatch 的 .mw-rank-1/2/3 逐字相同,改一处要连着改另一处),.gt-rank-n(第 4 名起)走宿主令牌 --gt-soft/--gt-faint/--gt-line;
选档单点在 RankBadge(Number.isFinite(n) && n>=1 && n<=3,坏名次一律落中性档,不许把 NaN 拼进类名),榜页 8 列表格与总览速览两处渲染点共用它(判据 client-54 三头:单点类名 / 两处渲染点各带档类 / CSS 规则逐字)。
- 「榜面数据 <age>」与「最近取回 <age>」分两条写:拿到 304 时只有后者在动,混成一条就会把陈旧数据念成新数据。反过来,取回失败那一轮 lastFetchAt 也照推(它是发起时刻),所以坏榜上这条改口念「最近尝试」,不然就把没取到的东西念成了刚取到。
- 当前签靠字重 + 近黑下划线(--gt-fg)分主次,不拿招牌色表意(蓝色留给链接、红/黄留给状态);页签条不留横向滚动(第九轮撤掉了那句 overflow-x:auto —— 六个签在 1088px 的栏里 scrollWidth === clientWidth,那条竖 scrollbar 是纯噪声,判据挂在 client-38),三榜速览靠 auto-fit 收列,不新增断点。页头的回执同样走中性档:跑完一轮是告知不是状态,三榜全红时再抹一道绿就是两头打脸。

节拍与存储

默认 1 小时一轮,档位封闭集合 [60, 180, 720, 1440];启动 5 秒后自动跑第一轮(autoCheckOnStart 可关)。
连坏时节拍按 2^N 翻倍,指数封顶 4 轮、绝对封顶 4 小时:封顶只算绝对毫秒,不改用户的档位语义(选 24 小时的就真是 24 小时起)。
传输类失败(连不上/超时)在同一次检查内先补发(单榜最多 3 发,间隔 1 秒,成功即停),补发次数拼进故障文案,界面照读。
配置类失败(代理地址解析不出来)一律不补发:同一份坏配置补发三次只是把三发变九发。
出网前每一发先仲裁一次路线(设置页自定义 > 环境变量 > Windows 注册表 > 直连):注册表读一次缓存 60 秒,改偏好即作废;读不到注册表如实写「读不到系统代理」并按直连走 —— 读注册表失败不是网络故障,别把两件事混成一条红。
宿主 ctx.timer.interval 优先,缺了退 setInterval(unref + dispose 显式清 —— 宿主给的是 disposer 函数,对它调 clearInterval 是静默 no-op)。
本机口径(2026-10-05 19:12:41 从运行中的 desktop 宿主拉的 snapshot):实测走的是宿主那一档(caps.timer:true)⇒ setInterval 兜底档在本机没有真机样本,而修复版已在真机上活满了一个节拍:20:05:37 那一拍响,20:06:35 读到 nextCheckAt 前移到 21:05:37(整 +60 分钟)、events 70→71(新那条 board_exit 带 20:05:40.839),崩溃日志目录 19:05 之后无新文件;兜底档那半仍然没验过,两档不许说成"都验过"。原文 snapshot 留在 tmp/snapshot-desktop-20261005.json,响后那份与逐分钟读数留 tmp/tick-desktop-after.json / tmp/tick-watch.log。
★ 挂进定时器的那个回调只能调闭包里的具名函数:真机 desktop host 上它响了一次,回调里的裸 run() 找不到(那时 run 只是 return {…} 里的一个方法)⇒ ReferenceError 从 Timeout.tick 直接落进宿主的 uncaughtException,整个 IDE 弹「应用无法启动或已意外停止」。
闸门的忙时分支仍是 rejected promise,被回调自己的 .catch 接走 ⇒ 定时轮撞上手動轮只留一行告警。诊断与三条回归用例见 docs/design-spec.md §9.3 第四轮。

存储走 ctx.storageDomain,域 gh_trending,六张表同域:state(按榜分行)/ events(只追加 + 裁老)/ prefs / seen(观测史)/ repo(仓库详情缓存,LRU 裁到 REPO_CACHE_MAX 行)/ trans(现译译文,键 kind:小写 owner/name,LRU 裁到 TRANS_MAX 行)。
域名排他(同名重复 open 报 already-open),所以 open 收口成 WeakMap + refcount 登记表,最后一个持有者放手才真关域。
★ 域 version 保持 1:加一张表不是抬版本的时机。宿主整档布局按 stored !== descriptor.version 直接抛 version-mismatch(@deepseek-ai/dsh-storage-json 的实现,实测口径),compatibleVersions 只管 per-record 布局 ——抬到 2 会让本机已经攒下的榜史与偏好整个打不开,而库里少一张表本来就是空表起步。

API 面

GET /gh-trending/api/snapshot、GET /api/stream(SSE,首帧 snapshot、检查完 update = 全量快照)、POST /api/check、 GET /api/events?limit=&board=、GET|POST /api/prefs、GET /api/repo?name=owner/name[&refresh=1]。
写操作只接受本机回环(连 x-forwarded-for 链每一跳都要是回环),纯读面板的 GET 不闸以便排障; 唯一一条闸的 GET 是 /api/repo —— 它读的是本地缓存,但缓存过期那一发要打 api.github.com,花的是匿名按 IP 计的额度,让局域网邻居点你的面板刷额度不合理。
/api/repo 的载荷是 applyZh 出边界的那 21 键(★ 第十一轮撤掉整段叙述那五格后从 26 变 21;整句中文与段落形状由宿主拼:sections(四段段表,唯一句子出口)/ error,旧的 narrative / facts / flags / readmeLabel / readmeMeta 五格已整段撤掉,客户端不补判定); zh 那七格恒在(开关关着、B 命中、模型没回都给齐七键,空的是 '' / null,不是缺键),而 repoView 自己那一格 sectionFields(宿主重拼段表唯一能吃的口径)在 applyZh 一进来就被解构删掉、不出边界(缓存命中与刚取回两条路在 builder 里同形、sectionFields 两边都留着,那一刀只在 api 边界切);坏名字(不是 owner/name 形状)在造 URL 之前就被拦下,回 ok:false + errKey:'bad_key',一个字节都不出网(也不去喂模型)。

GET /api/snapshot 是界面的唯一一份真相:每榜带 transport(本轮失败是不是传输类)、顶层带 transportHint(那句话的宿主单点文案)、 net = {via, viaLabel, source, sourceLabel, proxy, reason, targetHost, at, status, text}(最近一发仲裁出来的路线,整句 text 由宿主拼好)与 cadence = {intervalMin, effectiveMs, backoffExp, nextCheckAt, fetchAttempts}(检查服务缺位则给 null)。客户端只渲染这些字段,不自己补判定。
net.status 是 ok|err|idle 三档圆点:判的是"这条路通没通"(有榜且坏榜都属传输类才算红),不是"这一榜有没有数据"——transportHint 仍只在坏榜 transport===true 时才念那句来源。

测试

零依赖:node:assert/strict + 自研 check(name, fn),node test/<x>.test.mjs 直跑,无测试框架、无 npm script。

for f in test/.test.mjs; do node "$f"; done # 415 项用例(十二套;含两条要真出网的口径)—— ★ 直跑那两份通与不通都出现过,见下面读数
SKIP_LOCAL=1 node test/host-compat.test.mjs # 跳 hc-17(声明真机口径)
SKIP_LOCAL=1 node test/web-translate.test.mjs # 跳 wt-27(真发一发免费档)

当前读数(2026-10-08 本机复跑,第二十二轮「我开了翻译,为什么这些没有翻译」⇒ 榜面描述列接上现译那一遍,原文 tmp/rerun-r22.txt):SKIP_LOCAL=1 下 413 过 / 0 挂 / 2 跳,逐套 gh 19 / net 22 / store 40 / repo 76 / check 39 / api 65 / client 58 / host-compat 21(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳)/ board-zh 19(★ 新开一套)⇒ 基线 391 → 415 条。
★ 差额 +24 分三套:board-zh 0→19(圈 lib/board-zh.js + domain 那几格)= 两套行集各管各的(批次吃"同仓库三榜只留名次最好那条"去重的那份,视图吃"每一行都在场"不删的那份 ⇒ 同现仓库只烧一发额度、三张卡照旧各有中文)+ B 优先压过库里的现译行(第八轮那句原样成立)+ 逐字命中才算数(原文变了 ⇒ 旧译文当场作废并重新排队)+ 空白描述与仓库自己写的中文都不算欠账 + 同仓库两榜 desc 不同时"谁对上算谁、命中过的不再排队" + 失败冷却只挡排队、不改读数(过了冷却自动放回)+ 卡头句子两路混排并报 / 都没命中给空串 / 内置那一句逐字沿用旧文案 + 条数只算这一张榜 + 四种闸门理由各返回一次且一发不派 + 闸门顺序(库不可用排在开关之前:无存储时"下一轮自动再试"是假话)+ 一轮 12 发 / 在途 2 发 + 出厂常数那一格(改它要跟着改判据)+ 单闸 busy + 读库失败整轮作废(不当新行重烧额度)+ 落库归 translate() 自己做(runner 一个字不写库)+ 落款与那句实话来自 domain(用例里不出现手抄句子)。api 61→65 = 榜面那一列吃库里的现译行(★ hits 的值从「一句译文」升成「译文 + 它是谁译的」)+ liveNote 只在三格同时成立才说、其余几种闭嘴各有各的理由 + 读路径零发(GET /api/snapshot 与 SSE 首帧一发不派,补译只挂在一次 update 之后,补成真推第二帧)+ 闸门与上限那一圈(20 行屏上只补 12 发)。client 57→58 = client-48(就地改判,整句逐字读载荷 ⇒ 钉「客户端不许自己数条数、也不许编日期」)+ client-58 新(现译发不出去时榜面一句 .gt-notice,其余三种情形一个字都不多)。
★ 另有两圈条数不变、内容改判:api 那条「内置预译的 hits 只覆盖屏上那些行」(hits 的值从「一句译文」升成 {zh,via,label,note,src} ⇒ 断言跟着改,用例名不动)、client-47(同一列并排两种来源后,行内落款必须念它自己那一句,不许拿卡头那句盖下去)。★ 设置页那句说明 TRANSLATE_COMMON_NOTE 从"现译只发生在详情"翻成「现译发生在两处」,而判据侧是 import 那个常量、不是手抄句子 ⇒ 文案改口、测试面零改动(同族那条律第二次兑现:手抄的那份才会红)。
★ 证伪电池 tmp/r22-boardzh-falsify.mjs(圈 lib/board-zh.js 11 / lib/api.js 8 / client.js 6)25 条 / 未抓到红 0 条、末行 [还原 ok](读数 tmp/r22-falsify.log):每轮上限、并发、五种闸门各调顺序、B 优先、逐字命中、按榜算条数、两套行集各退回另一套那半边、读路径派活、轮次后不派、不推第二帧、卡头自己拼句、topN 截断、liveNote 两个条件、界面六条"只渲染载荷"。★ 首跑有两条没红,如实登记:① 拆掉 if (running) 之后那条 busy 用例挂在没释放的 gate 上(顶层 await 不结算 ⇒ 进程静默退出、套件不打印 ⇒ 电池拿不到失败信号)⇒ 判据自己补一次 200ms 竞速才响;② 把卡头分隔符改成无条件摆,只多出一个「 · 」,没有任何断言在乎 ⇒ 换成"界面自己数条数"与"借用别榜那一句"两条真变异。⇒ "漏网"有两种:没判据,和判据在但拿不到失败信号。 ★ 工具账(本轮踩到、写下来给下一轮):lib/api.js / client.js 在盘上是 CRLF,本轮新建的 lib/board-zh.js 是 LF ⇒ 多行植入必须按各自 EOL 拼,不然静默"植入失败";还原只走内存字节副本,不走 git stash(本机 autocrlf=true,往返会把文件整体改写成 CRLF)。
★ 本轮出网 0 发:所有"补译"形状吃假 translator 与假库。⚠️ 没截真机屏(动的是宿主半边 index.js + lib/ 加 client.js ⇒ 要重启 dsh desktop* 并硬刷新才看得见;本插件在宿主里是 github: 复制副本,改源码不即时生效 ⇒ 本机已把六个文件覆盖进副本,原文件备份在 tmp/host-copy/r22-before/)。我不替你重启、也没动你的 prefs 与库存行 ⇒ 挂在 §9.3 那条清单上(第十七、十九、二十、二十一轮同列)。

上一份读数(2026-10-07 21:0x 本机复跑,第二十一轮「匿名 60/h ⇒ 一小时最多 15 个仓库,设置页加一个 GitHub 令牌抬到 5000/h」那一遍,原文 tmp/rerun-r21.txt):SKIP_LOCAL=1 下 389 过 / 0 挂 / 2 跳,逐套 gh 19 / net 22 / store 40 / repo 76 / check 39 / api 61 / client 57 / host-compat 21(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳,项数 29)⇒ 基线 378 → 391 条。
★ 差额 +13 分四套(按圈记,不是"新增十三条用例"这么轻):repo 68→76 = 默认零凭据那一圈(不填 ⇒ 每一发没有 authorization)+ 填了 ⇒ 四发各带一条 Bearer 且 URL 一个字节不变、域也不变 + 空格等于没填(请求头与视图两侧 trim 同口径)+ 上限吃 x-ratelimit-limit 那三种形状(回 5000 换档 / 仍回 60 照念匿名 / 代理吞头退回保守那一格)+ 门面 rate() 的 limit 与 label 跟着换档 + 令牌现取现算(改偏好不用重启,清空后下一发就不带);api 59→61 = githubView 只给 has 布尔不给 value(说明句与「去哪创建」全来自 domain)+ 快照里 github 那一格恒在(客户端没有兜底表,缺键就是白屏不是少一行);client 55→57 = client-56 令牌行三形状全吃 snap.github、密钥格永不回填、「清除」只在存过时摆 + client-57 配额那句只从宿主的 rate.label 来;host-compat 20→21 = hc-21 接线(装配处出现 const token = 那种抄死即红、令牌读者清单从 import 边派生、界面不许抄「匿名/已认证」那两个词)。
★ 另两圈条数不变、内容改判:store 那两条(凭据格清单从手抄六格改成吃 PREF_CRED_FIELDS 那份派生表 + 那条新增键自查改用「上一版行形状只缺 ghToken」—— 拿第十三轮那起「存储不可用」血案当尺子);api 旧那条「密钥不回显」里的 secretKeys.length === 3 翻成 deepEqual 派生四把(★ 手抄一个数就等着漏扫新增那把)。
★ 证伪电池 tmp/r21-falsify.mjs(圈 domain.js / lib/stores.js / lib/api.js / lib/services/repo.js / index.js / client.js)16 条 / 未抓到红 0 条、末行 [还原 ok](读数 tmp/r21-falsify-out.txt):① 无条件带头 ② 接线漏发 ③ 令牌拼进 URL(行为侧)③b 同一个植入换 hc-7 那条静态判据(★ 这一发是"那条静态判据不是摆设"的非空转证明,同族第八次兑现)④⑤ 两侧 trim 各缺一半 ⑥ 上限钉死不看头 ⑦ 把"带没带头"排在响应头之前(坏令牌报成"已认证"= 把没生效说成生效)⑧ 丢掉吞头那条退路(少报也是谎)⑨ 读不到上限不退回出厂那一格 ⑩⑪⑫ 三处清单退回手抄 ⑬ 视图多给一格 value ⑭ 装配时锁成常量 ⑮ 界面自己抄那两个字。★ ⑩ 首跑红在另一条断言上(记录校验失败:GitHub 令牌…过长(318 字,上限 256 字),不是我预期的那格)⇒ 挂反了也是挂,这一条如实登记。
★ 本轮出网 0 发:本机没有 GitHub 账号也没有令牌,一切"填了令牌"的形状都吃假 net.fetch。★ 5000 那个数字在本机是合成的(历次真回包只见过 60,那条 5000 的头是喂进去的)⇒ 界面上「已认证配额 / 5000」这一屏永久验不到,可验的那半是"填一个坏令牌 ⇒ 那句必须仍念『匿名配额』"(repo 那一圈第 5 条钉的就是它)。载荷只多 github 一格、repo schema 未动、version 仍钉 1(ghToken 走 optional + clampPrefs 补默认,第十三轮那条律一个字没松)。
⚠️ 同样没截真机屏(动的还是宿主半边 index.js + lib/ ⇒ 要重启 dsh desktop** 才看得见,我不替你重启、也没动你的 prefs 与库存行),第十七、十九、二十、二十一轮那几屏挂在 §9.3 同一条清单上。

上一份读数(2026-10-07 20:1x 本机复跑,第二十轮「使用 README.zh.md 这种」挑篇优先档那一遍,原文 tmp/rerun-r20.txt):SKIP_LOCAL=1 下 376 过 / 0 挂 / 2 跳,逐套 gh 19 / net 22 / store 40 / repo 68 / check 39 / api 59 / client 55 / host-compat 20(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳,项数 29)⇒ 基线 376 → 378 条。
★ 差额只在一套:repo 66→68 = zhVariantRank 那一圈(三档封闭 + 目录名不参与 + 子串不算命中 + 两份名单不许交集 + 简繁同时命中按繁体)+ 「两路挑篇共用同一条优先档」那一圈(同一件事在 pickZhReadme 与 pickZhReadmeLink 各钉一次,外加"只有繁体时照旧挑中"那两条反面)。★ 另有一圈条数不变、内容改判:pickZhReadmeLink 那条旧断言「多条命中按名排序」把"繁体那份赢"钉成了规矩 ⇒ 本轮就地翻案(同第八轮 provider:undefined、第十七轮 wt-28 那一族)。
★ 证伪电池 tmp/r20-falsify.mjs(圈 domain.js / services/repo.js)9 条 / 未抓到红 0 条、末行 [还原 ok](读数 tmp/r20-falsify-out.txt):两路各退回字面排序 / 两路各把排序做成过滤 / 词元从整条路径切 / 词元换子串 / 简繁先后调换 / 丢掉 tie-break / 两份名单撞车。★ 一条自我 correction:首跑第 ⑥ 条(词元换子串)的植入写成 /tw|hant|hk/.test(base) —— 顺手丢了大小写归一,一发变异同时动两维、连带把 pickZhReadmeLink 那一圈也炸了 ⇒ 改成单因(base.toLowerCase())复跑后,红只落在该落的那条断言上。变异不单因,读数就在同时说两件不同的事。 ★ 同轮只读对账(零出网,吃本地库存):thedotmack/claude-mem 那行 repo 记 readmeSource=en_default / readmePath=README / zhCjk=9 / at=2026-10-06 08:42:21 ⇒ 早于第十五轮第二路,所以"改完挑简体那份"在活宿主上从来没跑过,这一条是待截图不是已验。★ 第十九轮那件"旧译文行删"这一轮 20:0x 复跑对账照旧是 trans 9 行 / readme:* 6 条(宿主 5 个 DeepSeek Harness.exe 进程 18:25 起在跑)⇒ 仍未做成,等你关掉 dsh desktop。
★ 本轮出网 0 发(判据吃第十九轮那 4 发留下的读数 + 本地库存),载荷键与 repo schema 零增量;⚠️ 同样没截真机屏(宿主半边 ⇒ 要重启 dsh desktop,我不替你重启),第十七、十九、二十轮那几屏挂在 §9.3 同一条清单上。
★ 顺手抓到一条旧账(如实登记,不藏):下面那张逐套表里 repo 与 api 两格的数字停在第十八轮(64 / 57),而第十九轮其实已经是 66 / 59 —— 那一轮只在正文记了差值、没补表头。本轮已按现读数补齐(68 / 59)。⇒ 台账里"正文与表格是两处真相"这种形状和代码里的同一句,判据一样:改一处必须扫另一处。

上一份读数(2026-10-07 19:24 本机复跑,第十九轮「这两种也算有中文」第三道闸门那一遍,原文 tmp/rerun-r19.txt):SKIP_LOCAL=1 下 374 过 / 0 挂 / 2 跳,逐套 gh 19 / net 22 / store 40 / repo 66 / check 39 / api 59 / client 55 / host-compat 20(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳,项数 29)⇒ 基线 372 → 376 项。
★ 差额四条按圈记(不是"新增两条用例"这么轻):api 57→59 = 第三道闸门命中圈(两形状各钉 jobs 为空 + 段名后缀)+ 反面独立一圈;repo 64→66 = readmeZhOnScreen 命中圈(真读数钉两侧余量:9 挡 / 3 不挡、7 不算 / 8 算)+ 反面独立一圈(日本語 / 纯英文 / 空串 / 中国·中國 / 英文 Chinese)。
★ 本套第 8 次撞「用例名含『真机』⇒ SKIP_LOCAL=1 静默跳过」:新那条 repo 用例一度报 skip 1 而我以为它在跑 ⇒ 改名「两侧各用一条本机真读数钉边界」;要真出网的口径仍然只归 hc-17 / wt-27 两条,别的用例名里不许再出现"真机"两字。
★ 证伪电池 tmp/r19-falsify.mjs(圈 api.js / domain.js / services/repo.js)8 条 / 未抓到红 0 条、末行 [还原 ok](读数 tmp/r19-falsify-out.txt)。★ 首跑第 ③ 条挂在别人的现场上(阈值降到 1 时同 check() 里 lang 那条先炸,"误挡日文"轮不到报红)⇒ 反例拆成独立 check 后复跑,③ 现在红在「attachZh:第三道闸门的反面 —— 「日本語」…」」、⑤ 红在「readmeZhOnScreen 的反面:…」—— 这是「证伪要在自己的现场上挂」那条律的第 8 次兑现。
★ 同轮库存对账(tmp/probe-readme-zh-rows.mjs 只读、零出网):19:24 删掉那一行后 trans 表 5 条 readme: 全部 readmeSource=en_default([对账 ok]),★ 但 19:26:37 被在跑的宿主用内存态写回(19:33 复跑 ⇒ readme: 又 6 条,alibaba/open-code-review 那一条原样在)⇒ "旧译文行删"这一件没做成,要等宿主关掉再删(下面第十九轮那份读数与第十六件 ④b 记的是同一件事)。
★ 本轮没截真机屏(动的又是宿主半边,link: 挂载要重启 dsh desktop,我不替你重启),下面那两份读数的"欠截图"账一起挂着。

上一份读数(2026-10-07 18:3x 本机复跑,第十八轮「README 有中文就不派摘要」补判据那一遍,原文 tmp/rerun-r18.txt):SKIP_LOCAL=1 下 370 过 / 0 挂 / 2 跳,逐套 gh 19 / net 22 / store 40 / repo 64 / check 39 / api 57 / client 55 / host-compat 20(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳,项数 29)⇒ 基线仍是 372 项,与上一份逐套同数。
★ 同数不等于同内容:api 那一套里 attachZh…摘要档只认 en_default 那条改判了 —— 三档中文(zh_default / zh_file / zh_section)原先只在「只开描述档」的桩下摆(那种形状 want('readme') 恒假,闸门坏了也测不到 ⇒ 我第一版新加的那行被电池当场判成假绿),现在各在「只开摘要档」那一圈钉「jobs 为空」+ 各自的 self 段档名。check() 条数因此不变(矩阵里的行不是新用例)。证伪电池 tmp/r18-falsify.mjs 7 条 / 未抓到红 0 条(三档各单独开侧门 + 整闸放宽 + 两处中文判据 + 第二路断掉,读数 tmp/r18-falsify-out.txt),末行 [还原 ok]。★ 本轮行为一字未改 ⇒ 没有新真机现场,第十七轮那两屏照旧欠着。

上一份读数(2026-10-07 16:0x 本机复跑,第十七轮摘要现译放回那一遍,原文 tmp/rerun-r17.txt):SKIP_LOCAL=1 下 370 过 / 0 挂 / 2 跳(hc-17 与 wt-27,逐套 gh 19 / net 22 / store 40 / repo 64 / check 39 / api 57 / client 55 / host-compat 20(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳,项数 29))⇒ 基线 371 → 372 项。
★ 差额一条:api +1(新那条 switchRows 那句说明跟着档位走 钉的是本轮仅剩的那道口 —— 行名不变、说明句与段名跟着档位走;外加一条反向:服务没声明 kinds() 时一行都不摆,而这与档位无关)。四套条数不变、内容改判:repo(段名三档词都收:中文摘要 / 中文节译 / 中文现译 · 没取到)、client(client-49 两行开关 + 说明句跟档位、client-51/55 找段改吃 summaryAny)、host-compat(hc-18 翻译档也返回两行)、web-translate(wt-28 整条重写:这一档 serve 两路,llmReadme 开着就真译、关着连网都不碰)。
★ 本轮电池 tmp/r17-falsify.mjs(圈 domain.js / web-translate.js / repo.js / api.js / client.js 五个文件)12 条 / 未抓到红 0 条,末行 [还原 ok],输出原文 tmp/r17-falsify-out.txt。★ 首跑有一条压根没验成:客户端那条的锚点缩进我抄错(12 空格 vs 文件里 10 空格)⇒ 电池报的是「锚点失效」而不是假绿,改正后重跑才成 12 条 —— 这一条如实登记:锚点命中数必须打出来,否则"改动没落地"和"判据没承重"在输出里长得一样。③④两组做了两头(宿主拼段名跑 repo、客户端摆段名跑 client;服务能力声明跑 web-translate 与 api 两套),其中"真服务只报 desc"那一发红在 api 的桩=真服务对齐那条上,不是我以为的选路那条。
★ 同轮不带 SKIP_LOCAL 的直跑(原文 tmp/rerun-r17-full.txt):371 过 / 1 挂 / 0 跳 —— 挂的是 wt-27 免费档真出网那一发回 HTTP 429([web-translate] pass 28 / fail 1),与本轮改动无关,是外部限流;上一轮同一条是通的 ⇒ 口径照旧:满绿在任何一份上都不保证复现。

上一份读数(2026-10-07 15:4x 本机复跑,第十六轮两件旧账那一遍,原文 tmp/rerun-r16.txt):SKIP_LOCAL=1 下 369 过 / 0 挂 / 2 跳(hc-17 与 wt-27,逐套 gh 19 / net 22 / store 40 / repo 64 / check 39 / api 56 / client 55 / host-compat 20(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳,项数 29))⇒ 基线 368 → 371 项。
★ 差额三条一条一件的两头:web-translate +1(wt-29 请求号那条,含"最坏情况"那一发:403 + 64 字顶满的号 + 700 字错误体,量的是那串号在调用点 slice(0,200) 之后还活不活着)、repo +1(同屏去重那条:同字面撤、原因不同照给、只重一句时按格撤、描述没派活时一句不少)、client +1(client-55:同一句话在整屏文本里只出现一次,夹具走的是真的 applyZh + repoSections —— 手搓两份"看起来一样"的载荷就测不到宿主那份去重)。
★ 本轮电池 tmp/r16-falsify.mjs(只圈 lib/services/web-translate.js 与 lib/services/repo.js 两个文件)11 条 / 未抓到红 0 条,末行 [还原 ok],输出原文 tmp/r16-falsify-out.txt。★ 这一轮的电池刻意一套植入跑两套:repo.js 那五条里的两条另在 client 套件里各跑一遍(同一条屏上的话,宿主拼与客户端摆是两套判据,第十五轮踩过"植入的文件与跑的套件对不上 ⇒ 判据等于没验")。两条旧口径的假绿顺带清掉:上一轮我说".slice(0,200) 正好切掉 request id"—— 实测旧 vendorErr 压根没把那串号拼进回执(三家位置还各不相同),所以「只认 RequestId 不认 log_id」这一发才是百度那一档的真防线。
★ 同轮不带 SKIP_LOCAL 的直跑(原文 tmp/rerun-r16-full.txt):371 过 / 0 挂 / 0 跳 —— hc-17 与 wt-27 那两条真口径又通了一次(口径照旧:满绿在任何一份上都不保证复现,同一用例同一天里通与不通都出现过)。

上一份读数(2026-10-07 12:5x 本机复跑,第十五轮四件合并那一遍,原文 tmp/rerun-r15.txt):SKIP_LOCAL=1 下 366 过 / 0 挂 / 2 跳(hc-17 与 wt-27,逐套 gh 19 / net 22 / store 40 / repo 63 / check 39 / api 56 / client 54 / host-compat 20(+1 跳)/ desc-zh 7 / llm 19 / web-translate 27(+1 跳))⇒ 基线 358 → 368 项。
★ 差额四处都在数据面与能力面上:repo +7(分家两条、句子边界一条含代理对那一发、第二路三条含 404 回落、pickZhReadmeLink 一条)、api +1(假那两路桩的能力声明 = 真服务的声明 —— 跨边界两头都要断言)、llm 与 web-translate 各 +1(两档各自的 kinds():LLM_KINDS 两路全 serve ⇄ SERVED_KINDS=['desc'] 摘要即使开关开着也不派。★ 后半那句是第十五轮当时的口径,第十七轮已改判回 ['desc','readme'],wt-28 那条判据整条重写见上面第十四件)。
★ client / host-compat 条数不变、内容改判(test/client.test.mjs 现译那一屏那条用例的夹具改成吃 switchRows、两处桩各自声明 kinds();test/host-compat.test.mjs 的 hc-18 从读 translator.descOn 改成遍历 translator.switchRows)—— 只报条数就会把这两套的改判漏记账。(★ 这条与 §9.3 那几处旧行号一并记:行号会随用例增删漂移,指向某条判据要认用例名不认行号) ★ 本轮电池 tmp/r15-falsify.mjs(圈 repo.js / domain.js / web-translate.js / api.js / llm.js 五个文件)12 条 / 未抓到红 0 条,末行 [还原 ok],输出原文 tmp/r15-falsify-out.txt。★ 首跑抓出两条假绿:「绝对 URL 闸门撤掉」当场全绿(// 那种被"空段"那一支冗余挡住 ⇒ 补无 // 的 mailto: / http: 坏形状才承重)、「宿主模型谎报只 serve desc」那一发指错了套件(植在 llm.js 却跑 api)—— 判据在另一套件里等于没验。
★ 同轮不带 SKIP_LOCAL 的直跑(原文 tmp/rerun-r15-full.txt,10-07 13:4x):368 过 / 0 挂 / 0 跳 —— hc-17 与 wt-27 那两条真口径这一次都通了(免费档真出网那发没撞 429)。★ 第十二轮那条口径照旧作数:满绿在任何一份上都不保证复现(同一用例同一天里通与不通都出现过),别把任何一份总数当"永远如此"。

上一份读数(2026-10-07 11:2x–11:3x 本机复跑,第十四轮名次徽章分档那一遍,原文 tmp/rerun-r14.txt):SKIP_LOCAL=1 下 356 过 / 0 挂 / 2 跳(hc-17 与 wt-27,逐套 gh 19 / net 22 / store 40 / repo 56 / check 39 / api 55 / client 54 / host-compat 20(+1 跳)/ desc-zh 7 / llm 18 / web-translate 26(+1 跳))。
★ 与下面 11:0x 那份的唯一差额是 client 那一条 client-54(三头判据:单点类名 / 两处渲染点各带档类 / CSS 规则逐字)⇒ 这一轮改的是纯观感,数据面、载荷、schema 一字未动。
★ 本轮新电池 tmp/r14-falsify.mjs(只圈 client.js 一个文件)7 条 / 未抓到红 0 条,末行 [还原 ok];输出 tmp/r14-falsify-out.txt,★ 第二版 tmp/r14-falsify-out2.txt 把挂掉那一条的断言消息一起打出来 —— 只报"挂了哪条用例"不够,本轮一条用例里有三头,得看得见是哪一头抓到的。
★ 一条自等价植入当场被剔(const n = Number(rank) 换成 parseInt(rank,10) || rank 抓不到任何红 —— 坏名次仍旧落中性档),位置让给「榜页表格那一处自己拼徽标」。
★ 这一条用例首跑挂在它自己的前提断言上:夹具的日榜只排到第 3 名 ⇒ "第 4 名走中性"那一档空跑,补成 5 行才落到位(assert.equal(boardBadges.length, 5, '前提:…'))。

上一份读数(2026-10-07 11:0x 本机复跑,第十三轮修完「存储不可用」那一遍,原文 tmp/rerun-r12-fix.txt):SKIP_LOCAL=1 下 355 过 / 0 挂 / 2 跳(hc-17 与 wt-27,逐套 gh 19 / net 22 / store 40 / repo 56 / check 39 / api 55 / client 53 / host-compat 20(+1 跳)/ desc-zh 7 / llm 18 / web-translate 26(+1 跳))。
★ 与下面 10:0x 那份的唯一差额是 store 那一条新回归判据(跑真 valueSchema.parse 吃上一版库存行形状,见上面第十三轮那条)⇒ 这次修复没碰行为。
★ 同一块证伪电池(tmp/r12-falsify.mjs)本轮扩到 20 条 / 未抓到红 0 条,输出原文 tmp/r12-falsify-out3.txt(前三份 r12-falsify-out.txt / -out2.txt 是第十二轮那 19 条的,原样留着)。

上一份读数(2026-10-07 10:0x 本机复跑,第十二轮收尾这一遍):SKIP_LOCAL=1 下 354 过 / 0 挂 / 2 跳(hc-17 与 wt-27,逐套 gh 19 / net 22 / store 39 / repo 56 / check 39 / api 55 / client 53 / host-compat 20(+1 跳)/ desc-zh 7 / llm 18 / web-translate 26(+1 跳)); 不带 SKIP_LOCAL 的那一份这次是 355 过 / 1 挂 / 0 跳 —— 挂的还是 wt-27(免费档那一路真出网那一发回 HTTP 429,[web-translate] pass 26 / fail 1)。
★ 口径一句(本轮更正):这里数的是用例(check)条数,不是 assert 条数 —— 跑测器 test/_helpers.mjs 只按用例打 pass/fail/skip,没有断言计数器;旧文档写「352 项断言」是把两件事混成一件了。
★ 上一轮的 350/0/2(第十一轮收尾,原文 tmp/rerun-r11.txt)、第十二轮收尾的 354/0/2 与本轮(第十三轮)的 355/0/2 都只说明"离线这一些绿";满绿在任何一份上都不保证复现(10-06 当晚直跑 352/0/0,10-07 三个时刻里 429 挂过两次),这正是"免费档不是授权接口、随时可能限流"那句判据的读数;别把任何一份总数当"永远如此"。
★ ⚠️ 但"离线满绿"连界面是否亮着都不保证 —— 10-07 第十二轮落地当天就有过一发:354/0/2 全绿的那一会儿,用户 desktop 上是三榜全红「故障 · 存储不可用」(假设施 open() 不跑 schema,测不到那一发;判据与修法见上面第十三轮那条与 docs/design-spec.md §4 末尾)。
★ 同日 13:5x 那一次(第九轮收尾)直跑是 331 过 / 1 挂:挂的是当时唯一真打免费接口的 wt-19(现编号 wt-27),translate.googleapis.com 连回两发 HTTP 429(等 20 秒再打仍 429)⇒ 那是外部限流的读数,不是代码坏了(离线那些全绿,插件侧的表现是降级:原文照给 + 一句「翻译接口回了错误状态」)。
本轮 19:5x 复跑那一发又通了 ⇒ 同一个用例在同一天里通与不通都出现过,这正是"免费档不是授权接口、随时可能限流"那句判据的读数;别把任何一份总数当"永远如此"。逐轮台账与证伪读数(每条新判据都改坏一次看它挂不挂)在 docs/design-spec.md §9.2。

| 文件 | 项数 | 覆盖 |
| gh.test.mjs | 19 | parseCount 缩写量级返回 null(不交假数)、<h2 起找仓库名、跨 取数值、丢行率判改版、304 分支、脏 slug 不出网、四档语言判定、代理配置错标 configError(不补发)而连不上代理仍算传输类 |
| net.test.mjs | 22 | 插件内隧道全套(全离线:假 socket / 假 runReg / 注入的 tunnelRequestFn):地址解析四类报错、凭据掩码、环境变量优先序、注册表三行只认那三行、例外命中转直连、路线仲裁四档各有记法、CONNECT 请求行字节逐个钉死、200 后同包 TLS 字节 unshift 不丢、407/502/关闭/连不上/超时各给一句话、跟满 maxRedirects 就把最后一个 3xx 交回、注册表缓存 60s 与 invalidate、坏配置绝不静默回落直连 |
| store.test.mjs | 40 | 域登记表(refs 计数 / 关完才摘牌 / open 失败可重试)、写串行队列、close() 后写报 CLOSED、无设施报 UNAVAILABLE、prefs 宽容档 vs strict 档、代理模式只认封闭集合(地址能解析就原样留含凭据,坏地址清空留 warn)、seen 首见钉住 first、六表同域且 version 钉在 1(抬版本 = 本机榜史整个打不开)、repo 表小写主键 / schema 拒脏行 / maxRows LRU 裁行、trans 表:键是 kind:小写仓库(描述与摘要两档互不覆盖)、schema 挡脏行(kind 只认封闭集合,空原文空译文进不来)、无设施时 available=false 且读写报 UNAVAILABLE(现译层据此走"只译不存")、超 TRANS_MAX 按最老裁、★第十轮两条:现译引擎旧值 official 在 clampPrefs 里先搬家再判脏(顺序反了会把库里那份抹回出厂档,而凭据还躺着没人念)+ 六格凭据只钳长度、内容不归一化;trans 那一格吃的是 TRANS_ROW_ENGINES(现行五档 + 历史档名),旧档名那一行仍然读得出来 —— 换档名不等于把用户库里的译文全废、★第十二轮:repoCacheHours 只认 REPO_CACHE_HOURS 那四档(5 / 0 / 100 / 'abc' / null 一律回落出厂 24),库里缺这格的旧档案读回来是 24 而不是 undefined(⚠️ 这一条当时只走到 clampPrefs,没走 schema —— 同轮那格写的是 requiredInt,真宿主 open() 读老库存行时当场抛、整域不可用 ⇒ 这条用例在假设施上绿而界面上红)、★第十三轮补的那条:★ schema 的 open 校验:每张表都必须吃得下"上一版库存里真实存在的那一行"(缺新增键 ≠ 坏行) —— 吃的正是真宿主那一步(GHT_DOMAIN.tables[t].valueSchema.parse,三份上一版行形状 prefs / repo / trans),两头钉:不抛(否则整域「存储不可用」)+ 'repoCacheHours' in parsed === false(补默认只许 clampPrefs 一处,两处都补就是两份真相);★第二十一轮 就地改判(条数不变)两条:凭据格那圈的清单从手抄六格改成吃 PREF_CRED_FIELDS 那份派生表(GitHub 令牌自动进来,且"空格等于没填"这一条与 repo.js 那条 trim 同源)、★ 那条新增键自查换成"上一版那一行 —— 出厂值齐全、只缺 ghToken"必须被 open() 吃得下(拿第十三轮那起「存储不可用」血案当尺子:写侧不校验、读侧一行坏行拖死整域)|
| repo.test.mjs | 76 | 仓库详情那一层全套(全离线,喂 test/fixtures/repo-api.json 的真字节):owner/name 形状闸门(坏名字零出网)、stripReadme 四种方括号写法(徽章串 / 引用链接 / 嵌套图片链 / 链接定义行)削到不留一个方括号、CJK 判据钉三档真读数(周刊 297 / antd 英文篇 2 / 中文篇 30)与 19-vs-20 边界、pickZhReadme 吃真根目录列表、2/3/4 发的请求路径与每发的 header/timeoutMs/signal、README-404 与 meta-404 分档、403 带 remaining:0 才算限额、proxy_config 与传输错分开、repoCacheRow 只落 schema 字段、readmeMeta 落款四个口径(节选字数吃屏上那段、整篇长度另说、两个数相等时不报整篇)、缓存命中与刚取回两条路键集与整句中文逐字一致、★TTL 按设置页那一档现算(repoCacheTtlMs 封闭四档 + 出厂 24h;改档后同一行的下一发就按新档判新鲜,不在装配时锁死)/ 失败档 5min、refresh 绕 TTL、在途去重、无存储时降级、脏行出边界时折成可用形状、内置预译命中时叙述三段(中文描述(<来源·时间戳>,不是现译):… 单独一句 + 原文另起一句),三条非命中形状仍分别说「原文,未翻译」与「仓库没有写描述。」、现译落款与 B 的字面分离(C 那一句里不许出现「内置离线预译」)、applyZh 两路并载荷 + B 命中不重拼 + 坏载荷不炸、两条旧用例的夹具改吃真的 repoView() 产物(夹具自己拼形状就测不到"少一格")、★第十一轮 +9(A):splitReadmeSections:围栏代码块里的 # 行不算语义标题(真形取自榜上那篇 token_ids…,原名带「真机」⇒ 被 SKIP_LOCAL 静默跳过、改名才进覆盖面)/ pickZhSection 两条(文档顺序取第一段、语言切换行与赞助者名单算噪声)/ descIsZh 阈值 8 的两侧余量 7 与 48 / 默认篇外文 + 整篇嵌一段中文小节 ⇒ zh_section,仍三发封顶(逐条点名请求路径 = 出网预算那条)/ descSelfZh ⇒ 入库行带 true 且这一档不靠翻译接口 / repoSections:段序只认 REPO_SECTION_KEYS / 数字只在 heat 段出现一次 / 描述那一句有五种来源,字面必须分得开 / self 段按 README 五档各给一句 + summary 段成功带落款、失败给 note 与回执两行;★同轮就地改判(条数不变):repoCacheRow(sections / sectionFields 两格一个字都不进库,先断"这格在 view 里存在"再断"库里没有"—— 反手抄)、缓存命中与刚取回两条路逐键同形(比的是 sections 整体 JSON.stringify,且两条路都留着 sectionFields 且逐字相等 ⇒ 删那一刀在 api 边界不在 builder)、库里躺着外部改过的脏行(段表只两段的期望改判);★第十五轮 +7:第十五轮分家:判据窗口 600 只用来数 CJK,节选吃去标记后的整篇(旧版拿窗口当节选 ⇒ 1,600 的预算从没生效)/ 第十五轮分家在载荷上兑现:长英文篇的节选真的到 1,600 / 节选在句子边界收口:回退到窗口内最后一个句末;中西文断句形状不同,中文那句没有空格(同一条里含代理对那一发:1,398 个 x + end. + 200 枚 emoji ⇒ 长度恰为 1,599,切在半枚 emoji 上就红)/ pickZhReadmeLink:第二路吃语言切换行 —— markdown 与 href 两种写法都认,多条命中按名排序 / 第二路的闸门在造 URL 之前:绝对 URL / 站内绝对 / 片段 / 反斜杠 / 非 .md / 穿越 / 超长一律不放行 / 第十五轮第二路:根目录那一层没有中文篇、但语言切换行写着路径 ⇒ 只在命中时补一发(共四发封顶) + 第二路那一发 404 ⇒ 回落 en_default,详情不炸 / ★第十六轮 +1:同一句失败话在一屏上说两遍 ⇒ summary 段那两块逐字撞上屏上已有的字面就不摆(四档:note+回执都与描述那一段相同 ⇒ 两块全撤但段名照摆「中文摘要 · 没取到」(★ 第十七轮那句改念「中文现译 · 没取到」—— 失败行没有引擎,切不出是哪一档);原因不同 ⇒ 各说各的不许去重;只 note 相同 ⇒ 只撤 note、回执留下;描述那一路压根没派活 ⇒ 一个都不许撤)—— 去重吃的是已上屏的字面不是"两路是否同一个引擎",后者为真时前者未必相同(note 各有各的档位话术);★第十七轮 就地改判(条数不变):段序只认 REPO_SECTION_KEYS 那条对 summary 段收三个词(中文摘要 / 中文节译 / 中文现译,按档位与成败各念一个),成功段名新增 /中文节译 · 免费接口 · / 与 /中文摘要 · 模型现译 · / 两头 —— 段名跟着那一行自己的引擎走,不跟着当前设置走;★第十九轮 +2:readmeZhOnScreen:摘要闸门的两条来路,两侧各用一条本机真读数钉边界(9 字挡 / 3 字不挡、7 不算 / 8 算)+ 反面独立一圈(日本語 / 纯英文 / 空串 / 中国·中國 / 英文 Chinese);★第二十轮 +2:zhVariantRank:三档封闭(明写简体 0/不带变体 1/明写繁体 2),两份词元名单不许有交集(含"目录名不参与"与"子串不算命中"两头)+ 两路挑篇共用同一条优先档:榜单上同时有 README.zh.md 与 README.zh-tw.md 时挑简体那份(★ 两路各钉一次 + "只有繁体时照旧挑中"那两条反面);★同轮就地改判(条数不变):pickZhReadmeLink 那条旧断言「多条命中按名排序」把繁体那份钉成了规矩 ⇒ 改成「先按简繁档再按名」;★第二十一轮 +8:默认零凭据:不填令牌时详情的每一发都没有 authorization(抬的是上限,不是把凭据撒出去)+ 填了 ⇒ 四发各带一条 Bearer,令牌只在请求头里:URL 一个字节不变、域也不变(★ 反手把"进 URL"这条路钉死)+ 令牌格只有空格 = 等于没填:不发 Bearer 空头(与 githubView 那一侧 trim 同口径,两处各一半就是两份真相)+ 上限吃 GitHub 自己回的那一格:回 5000 ⇒ 读数与屏上那句一起换档 + 填了令牌但 GitHub 仍按匿名回 60 ⇒ 那句照旧念「匿名配额」(★ 撤销/拼错的令牌不许报成"生效了"—— 本机唯一可验的那半)+ 代理把 x-ratelimit-limit 吞了 ⇒ 退回保守的出厂那一格,绝不梦见 5000 + 限额读数(门面):带令牌那一发之后 limit 与 label 跟着换档 + 令牌现取现算:改偏好不用重启宿主,清空之后下一发就不带|
| check.test.mjs | 39 | 进出/位次/改名/首见判定、改名不报掉榜、三榜只记一条 first_on_board、跨榜翻转只在翻转轮记账、基线吃上轮成功 rows 而非 prevRows、坏轮冻结、304 只推 lastFetchAt、退避指数与 4 小时绝对封顶、传输类失败补发(次数 / 中途成功即停 / 非传输类不补发 / 关掉补发)、cadence 载荷与停表归零、单飞 409、传输层接线:custom 没地址时三榜各一发就收,故障里点名是配置坏了、端到端吃夹具、定时器响了:把挂进定时器的回调摘下来真的调一次(ctx.timer 档与 setInterval 兜底档各一条,真机崩的就是这一条路径),以及响了却撞上正在跑的一轮时 CHECK_BUSY 只落一行告警、绝不同步 throw |
| api.test.mjs | 65 | 回环闸门与 XFF 链、闸门表逐条点名:三条闸(两个写 + 花配额的 GET /api/repo)与四条不闸、错误码→HTTP、SSE 帧与心跳摘牌、update 帧形状 = GET snapshot 形状、流式 body 自拼(宿主 handler 只给 (req,res))、坏榜的旧档照样给得出、transport/cadence/transportHint 随快照走、net 说最近那一发的实话(经代理 / 没出网 / 还没出过网)与 net.status 判的是路通没通而不是数据新不新、/api/repo 的 name 透传与 refresh 写法、缺 name 400、详情服务没装配 501、坏名字保持 200(那是用户输入不是故障)、服务抛错按 code 翻 HTTP、descZh 三键恒在(空数据也是 {hits:{},label,note}),hits 只覆盖 topN 切片之后屏上那些行、现译装配 attachZh 八条:两档全关那一屏逐字不变 / B 命中不派描述那一路 / 描述档三条件与摘要档只认 en_default / 译文进叙述时来源与时刻由宿主写死 / 现译失败只换那一格且把原因带给界面 / ok:false 不派活(坏名字不去喂模型)/ refresh=1 把 force 传下去 / 没装配现译服务时 zh 是全空七键而不是缺键、快照 translator 视图(键恒在、开关读库里那份、三句文案来自 domain;★ 第十五轮:descOn / readmeOn / switchLabels 三格整格撤,换成一张 switchRows[],行的条数由当前那一路的 kinds() 决定)、POST /api/prefs 两个开关只吃严格布尔("true" / 1 / on 一律 400 —— 表单序列化烧的是用户的模型额度)、那六条(第九轮立、第十轮改到五档):translator 视图逐档说话(免费档缺代理与某家云缺凭据是两句不同的话)/ 派活按引擎选路(没选中的那四路连 enabled 都不问)/ 老库里没 translateEngine 那一格按出厂档 / 密钥不回显(POST 回执 + GET prefs + snapshot 三处与序列化全文)/ translateEngine 只认现行五档、旧档名与脏值一律 400 且把合法值念出来 / 凭据六格非字符串与超长各 400、★第十一轮 +1(A 的第一道闸门):attachZh:仓库自己写的描述本身就是中文 ⇒ 描述那一发压根不派(反向也钉:sectionFields 缺 descSelfZh 时照常派 ['desc']);★同轮就地改判:zh_section 那一档在只开摘要档的现场下 jobs 必须为空(第二道闸门)+ secText('self') 命中那句小节落款、旧那些吃 narrative / narrativeFields 的断言整体搬到 sections / sectionFields(含 'sectionFields' in d === false 这条边界)、路由那条改成现调 repoView() 现算期望段表再 JSON.stringify 全等(夹具不许手搓形状)、★B 优先那条补判据:enabled 从「只开 readme」改成「两档都开」并在派活矩阵补一行「B 命中 + 只开描述档 ⇒ 零调用」—— 旧写法下"没派描述"是开关挡的、不是 B 优先挡的,拆掉闸门照样全绿(证伪首跑抓出的假绿,[api] 52 / fail 2 才是承重);★第十二轮 +1:POST /api/prefs 的 repoCacheHours 只认封闭四档('72' 这种字符串认,5 / 0 / 100 / '' / 'abc' / null 一律 400 且不入库 —— 不许悄悄回落 24 让库里一个值、分段器上另一个值,并验库里那份没被污染)+ 同轮改判 zh_section 那条与引擎循环那条(旧断言读的是撤掉的 readmeNote 落款句与 zh.summary.note,现在钉的是段名与 'note' in d.zh.summary === false);★第十五轮 +1:假那两路桩的能力声明 = 真服务的声明(桩的 kinds() 必须逐字等于真那一份 ⇒ 否则"非 host_llm 不派摘要"这条判据测的是我编的桩,不是那道闸门;同轮改判派活矩阵那条:两路各派各的 —— 宿主模型档两路都做、免费/三家云那四档摘要那一发压根不派,且用例不再传 enabled: () => true 把摘要放行);★第十七轮 +1:switchRows 那句说明跟着档位走:四档翻译路念「节译」,只有宿主模型那档念「摘要」(钉本轮仅剩的那道口 —— 行名 摘要现译 五档都不变,变的是那句说明;另加反向那头:服务没声明 kinds() 时一行都不摆,而这与档位无关)+同轮改判「假 = 真服务」那条与派活矩阵那条(翻译四档现在也报 readme,五档两行开关都在);★第十八轮 就地改判(条数不变):attachZh…摘要档只认 en_default 里那圈中文形状搬到能承重的现场 —— 旧形状把 zh_default(和第一版新加的 zh_file)摆在只开描述档的桩下 ⇒ want('readme') 恒假、闸门坏了照样全绿(电池第 ① 条判它假绿),现在改成在只开摘要档那一圈三档中文各钉一发 jobs 为空(zh_default / zh_file / zh_section)+ 各钉一发 self 段的档名,en_default 仍派且喂的是那段节选;反向还多三发(闸门给任一档单独开侧门都得当场红,见 tmp/r18-falsify-out.txt);★第十九轮 +2:attachZh:第三道闸门(第十九轮)(混排 9 字与只剩切换行那两种形状各钉 jobs 为空 + self 段名后缀)+ 反面独立一圈 attachZh:第三道闸门的反面 —— 「日本語」是日文不是中文 ⇒ 那一屏照常被译(不许顺手挡)(★ 首跑电池第 ③ 条挂在同一 check() 里先炸的那条断言上 ⇒ 反例必须拆成独立用例才红得到自己的现场);★第二十一轮 +2:githubView:只给 has 布尔,不给 value;说明句与「去哪创建」外链全部来自 domain(客户端不排表)(★ 键集封闭 + 'value' in f === false + JSON.stringify(视图) 全文搜不到令牌本体 + 空格那一格也算没填,与 repo.js 那条 trim 同口径)+ 快照里 github 那一格恒在(客户端没有兜底表,缺了就是白屏而不是少一行)(格数从 GH_CRED_FIELDS.length 读,用例不抄数);★同轮就地改判(条数不变):「密钥不回显」那条从 secretKeys.length === 3 翻成 deepEqual 派生的四把清单(★ 手抄一个数就等着漏扫新增那把),且新增那把不跟着翻译档走 —— 选哪一档翻译它都在,因为它发的是 api.github.com 不是厂商;★ 第二十二轮 +4(榜面补译四面各一条):读路径零发(GET /api/snapshot 与 SSE 首帧一发不派 ⇒ 补译只挂在一轮检查之后、补成真才追推第二帧)/这一轮的闸门与上限(off·unavailable·选中的那一路没接 ⇒ 零发,一轮最多 BOARD_ZH_BATCH_MAX 发)/榜面那一列也吃库里的现译行(B 优先、逐字命中才算数、卡头两路并报)/liveNote 只在「开关开着 + 库存得下 + 这一路此刻给不出」三格同时成立时说,其余几种闭嘴各有各的理由。★ 同轮就地改判(条数不变):旧那条「hits 只覆盖屏上那些行」换吃 hits 的新形状 {zh, via, label, note, src}|
| client.test.mjs | 58 | vm 沙箱 + 假 React 渲染树:六页签各自成页 + 页签条常驻、页签计数徽标、总览速览小结(前 3 与跳转带键、不再摆流水小结)、故障口径(连续轮数 / 补发次数 / 下次自动检查 / 传输提示只在传输类出现)、设置卡的出网方式三档吃载荷、地址是草稿、切自定义得带着地址一起发、各卡分支文案、步进器到边界禁用、保存反馈看状态位、根 CSS 铁律(含外链不吃浏览器默认蓝、页头标题 .gt-title 必须是兄弟四家在用的 17px)、client 里宿主枚举字符串一个都不许出现、详情弹框:载荷由真的 repoView 造(段名 / 块 / 元数据对 / 配额行逐字照搬,客户端不数星不拼句)、三种"没内容"各说各的(还在取 / 请求坏了 / 宿主说没拿到)、Esc·×·遮罩·框内的开关语义、三个触发点各自只发一发 GET /api/repo?name=、遮罩挂在 .gt-root 之内、默认态一个浮层都不许在、描述列命中显示译文且悬停给原文与 note;「描述中译为…」只在该卡真有命中时出现,且逐字读 snap.descZh.label(换载荷文案就跟着变,客户端不许自己编日期)、设置卡现译那几段(引擎行 / 凭据行 / 注册行 / 开关那几行):状态读 snap.translator,ready:false 时那句 notReadyHint 只在「现译引擎」那一行念一次(★ 第十五轮:各行自己的行名与说明句从 switchLabels 那张表改成行内自带的 row / label,不重复念"能不能发"),宿主没给这个键时整段不摆、详情弹框的现译分段(描述段 + 摘要段 + 那句 summaryNote 落款)、回执有才念(回执:provider_error: bad response 上屏;errText 为空时那行不出现;zh 全空时详情里连「模型」两个字都不该出现)、★client-52(第十轮整条重写成七段判据):五档按钮的名字/顺序/高亮/disabled 全吃载荷(换 engineLabels 界面跟着改口,客户端不排表)+ 只念当前那一档的 hint(别档那句一个字都不许在屏上)+ 逐家凭据行的 type/maxLength/autoComplete 跟 credFields 走、标识符 value 等于库里那份而密钥 value 恒空、'value' in credFields[1]===false、keyless/host_llm 两档连输入框都不摆、留空密钥压根不进 patch、库里没凭据时不给「清除」、「清除」只发当前档两格、注册那一行只跟当前那一家(别家的 URL 出现在这一屏即红)且不念额度数字 + 源码侧三条(草稿收口那句在、三个密钥键名不许出现在 client.js、.gt-setrow .gt-link{margin-left:0} 那条 CSS 在);★同轮 client-38 就地改强:.gt-tabs 那条规则里出现任何 overflow 即红(撤掉那条没意义的滚动条的判据,不新增用例);★第十一轮条数不变、三条改判(A 的段表侧):client-41 整条改吃段表 —— 四种 kind 各自的类名逐字(p ⊂ sub ⊂ num 逐级加重、excerpt 走带框那条 .gt-modal-readme)+ 一张 gt-modal-facts + 同屏一个数只出现一次 + 旗标句落 heat 段的 sub 块 + readmeSource:'' ⇒ self 段整段不摆;client-50 改吃 what 段第一块与 self 段的 sub 块;client-51 改判:摘要那一发失败照摆 summary 段、段名说「没取到」,回执那行是段内 num 块(旧口径「失败就不摆」撤了)。★ 踩到的假绿形状:test/client.test.mjs:229 的 findByClass 只按单个 class token 匹配,拿 'gt-modal-p gt-sub' 整串去查永远查不到;★第十二轮 +1(client-53)与两条改判:设置页多一行「详情缓存」分段器 —— 四档文案全吃载荷(6 小时 / 12 小时 / 24 小时 / 3 天)、选中项读库里那份(不是出厂值)、点击只发 {repoCacheHours:那一档}、载荷没给 cacheHours 时整行不摆(一排没有文案的按钮比没有更难解释);client-41 加两头都钉(段对象只有四格 + 那四句旧落款一句都不许在屏上);client-50 / client-51 改判成读段名(旧断言读的是撤掉的 readmeNote 句与 zh.summary.note);★第十四轮 +1(client-54)名次徽标分档,三头:① RankBadge 单点类名逐字(1/2/3 → gt-rank-1/2/3,4 与 15/0/null/undefined/'abc' 全落 gt-rank-n,坏名次不许把 NaN 拼进类名)② 两处渲染点各自带档类(榜页 td.gt-r 走 5 行夹具 + 总览速览 gt-mini;只钉组件不算 —— 调用点自己拼类名就把档吃掉了)③ CSS 侧三档色值逐字(金 #e8b530 / 银 #c3c9d2 / 铜 #cf9a63,与 modelwatch .mw-rank-1/2/3 对表)+ 中性档必须吃宿主令牌 + .gt-rank 底座不许再上一次底色(两份真相);★第十五轮条数不变、现译那一屏改判:开关那几行的行清单改成吃载荷(translatorView 现造的 switchRows[],两处桩各自声明 kinds())—— 当前这一档没有摘要能力时那一行压根不摆(★ 那是第十五轮的口径,第十七轮用户改判放回:client-49 现在钉的是五档两行开关都在、行名仍是 摘要现译、说明句跟着档位换成「这一段是节译不是摘要」那一句,并加了一发反向夹具 —— 载荷只给一行时客户端不许自己补第二行;按钮序是 关/开,所以 llmDesc:false 那档量到的是 [true,false]),客户端写死两行就是把"点了没用的控件"留在屏上(同一轮 client-41 那些段表判据一字未动,本轮改的是段里那段节选有多长,不是段表形状) / ★第十六轮 +1(client-55):去重那条判据在真渲染树上的读数 —— 夹具走真的 applyZh + repoSections,用例只数「那句失败话在屏上出现几次」(= 1),不在段表那层自证:那里去掉了一块,这里才是那一句真的只剩一遍 / ★第十七轮 就地改判(条数不变):client-51、client-55 与 zh 全空 那三条找段的字面改吃 REPO_SECTION_LABELS.summaryAny(「中文现译 · 没取到」),client-49 另断 LLM_README_LABEL_TRANSLATE 在屏上、LLM_SWITCH_LABELS.llmReadme 不在屏上;★第二十一轮 +2:client-56 GitHub 令牌那一行 —— 格表 / 说明句 / 创建网址全吃 snap.github(格数不写死、type 必须是 password 且 autoComplete:'new-password'、maxLength 跟载荷、密钥格 value 恒空、存过才给「清除」、令牌本体不许出现在任何文案里)+ client-57 详情弹框那句配额只从 rate.label 来(给「已认证配额剩 4987 / 5000」就念这一串、两个词不许同屏、★ 且源码侧判据:client.js 里出现 匿名配额 / 已认证配额 任一字面量即红 —— 抄一份就有第二个真相,宿主报错读数时会被界面圆成"看着对"的那一句);★ 第二十二轮 +1(client-58):现译这一路发不出去时榜面给一句实话(.gt-notice 原样念载荷那句 liveNote,一个字不改),其余三种情形一个字都不多(开关关着/库里存不下/屏上没欠着的行);★ 同轮就地改判两条(条数不变):client-47 悬停判据从"整句 note"扩成「原文 + 这一行自己的 label + 注」(一列两种来源并存之后,拿卡头那一句套每一行就串了),client-48 改名(「中文是预译」→「卡头那句中文来源」)并加钉"整句逐字读载荷 ⇒ 界面不数条数、不拼句子、不拿别榜的句子挂本卡"|
| desc-zh.test.mjs | 7 | 内置离线预译表本身:表体形状(主键小写、src 里不许有汉字、译文≠原文、主键不重号、条数与 DESC_ZH_COUNT 一致)、命中判据 =「主键 + 原文逐字相同」(空白归一、主键大小写不敏感,原文被改或被截断 ⇒ 回 '')、★表与解析器同口径(四份真榜面夹具里「表中有此仓库」的每一行必须命中,防解析清洗口径漂移而表还指旧句)、自带中文的仓库不进表、来源与时间戳只有一份(LABEL/NOTE 都由 DESC_ZH_AT+DESC_ZH_ORIGIN 拼,NOTE 必须含「不是现译」)、这份文件是死的(去注释后零 import/fetch(/require(/ctx./readFileSync ⇒ 离线口径由源码钉住)、descZhHits 只收命中行且键为小写主键 |
| board-zh.test.mjs | 19 | ★第二十二轮新套件(10-08):lib/board-zh.js 那份视图与批次。假 transStore / 假 translator 的形状逐格对齐真服务(entries() 回整行、translate() 回那八个键)—— 桩少一格,测的就是桩不是闸门(第十五轮那条教训)。两头:视图(两份行的分工 / B 优先压过库里那行 / 逐字命中才给现译、原文改了当场作废并重新排队 / 空描述与仓库自写中文都不算欠账 / 缺的那几行按名次排队并截到上限 / 跨榜 desc 不同 ⇒ 谁逐字对上算谁、命中过的不再排队 / 失败冷却只挡排队不改读数 / 卡头三档句子且内置那一句逐字沿用旧文案 / 卡头条数只算这一张榜且只算逐字对上的那一行 / via 名单是 domain 那一格 / 落款与 blocked 句子全来自 domain ⇒ 用例里不出现手抄句子)与批次(闸门四种理由各返回一次且一发不派 / no_store 排在 off 之前 / 屏上全命中 ⇒ nothing / 一轮最多 batchMax 且在途不超过 concurrency / 出厂常数 12·2·30min 跟着 domain 走 / 单闸 busy(★ 限时判据:不当场返回就红,见 spec §0 本轮 ⑫ —— 单闸破了用例原本会"挂住而不报红")/ 失败进冷却当轮不重派、其他行照发 / 读库失败 ⇒ 整轮不发也不崩(日志两句:先说因、再说决定)/ runner 不写库只认 translate() 回执)|
| llm.test.mjs | 19 | 模型现译那一发(全离线,喂假句柄 + spy stream()):闸门顺序四档各有各的话且句柄零被碰(未知路数 / 没原文 / 开关关 / 宿主没句柄)、★两档显式全关 ⇒ spy 句柄零调用(不是出厂态:描述那档出厂是开的)、发出去那一发的 reasoningEffort:'off' + temperature:0 + 两档各自 maxTokens + 原文截断,全部从交给 stream() 的那一份 opts 上读回来(不从标签反推)、transSrcKey 折叠空白 ⇒ 喂进去与存下来同口径、in-band 错误(finish 帧里坐着的 failure)判失败而不靠 throw、AbortError 与别的异常各说各的话、★超时那一发把定时器真的拨响(不许把异常圆成超时)、内容三闸(空 / 没汉字 / 超长 ⇒ 原文照给且各说各的)、分片累加与 delta.text 写法、逐字复用与"改一个字就重译"、★宿主默认模型那一档(没给 / 给空 / 读它抛 ⇒ 三句不同的话且句柄零被碰;库里已有译文时压根不取这一档)、desc 与 readme 两档各存一行不互盖、force(重新取一次)绕复用并盖掉旧行、在途去重、落库失败仍给译文并补那句"显示完就丢"、脏行按未命中重译、ready 只说宿主给没给能 stream 的句柄且 dispose 后立刻 false、判据自证(内置表那一条永远不被本套件当成"模型译过的")、★第十五轮 +1:kinds():这一档两路都 serve ⇒ 设置页那两行开关都摆(与 wt-28 那一档相对 —— ★ 第十五轮那一边只报 desc,第十七轮改判后两边都报 desc+readme ⇒ 这一条钉的不再是"谁能做摘要",而是"能力声明由那一路自己说":两路各自的 kinds() 不许被 api 或客户端写死) |
| web-translate.test.mjs | 29(+1 跳) | ★第九轮新套件(19 条)、第十轮扩到 27 条:免费 + 三家云那四路(全离线,喂假 net.fetch;假 net 按整条 URL 精确匹配)—— 闸门与档位(wt-1 开关关着零出网 / wt-2 三家各缺任一格凭据 ⇒ no_credential 且零出网 / wt-3 没传输层归 transport 而不是"翻译失败" / wt-4 路数不认与空原文 / wt-5 档名归一(official→baidu、脏值落出厂档)/ wt-14 免费档几种失败各归各档 / wt-15 连不上与超时都归 transport 且把超时定时器真拨响)、四份端点形状(wt-6 免费档按夹具里那条实测 URL 逐字发 GET / wt-7 免费档夹具是真回包(有抓取时刻与代理路径)/ wt-8 百度 MD5 / wt-9 腾讯 v1(★ 签的是原值、出网才编码)/ wt-10 阿里 RPC V2(★ 签的就是出网那一份百分号编码串,空格编 %20 不是 +)—— 三条都在用例里按官网公式独立复算并断言 URL 里没有密钥本体 / wt-11 一次性数每发都换(腾讯 Nonce 与阿里 SignatureNonce,且 Nonce 换了签名必须跟着换)/ wt-12 三家错误形状不同,认不出来就得点名 bad_json / wt-13 非 2xx 也要先读回包(阿里实测错误就是 404 + Code/Message))、复用与存储(wt-16 逐字复用且落款跟那一行自己的引擎 / wt-17 第九轮那批 engine:'official' 的旧行继续读得出、不冒充新档 / wt-18 改一个字就作废重译、库里记的是折过空白的同一份 / wt-19 force 绕表并写回 / wt-20 存储不可用仍给译文并说"显示完就丢" / wt-21 并发去重 / wt-22 命中缓存那一发不组 URL(一次性数在查库之后才算)/ wt-24 入参截断而库里存没截的那份)、边界自证(wt-23 打码:三家标识符各留头 4 位、签名/密钥/一次性数整段遮 / wt-25 五档引擎名与各张表在 domain 里各只有一份 / wt-26 三家夹具各恰好一条 provenance:'live'(无凭据真回包)且合成样本不许带 capturedAt / wt-27 真机一发,SKIP_LOCAL 跳)、★第十五轮 +1(wt-28):这一档只有翻译能力:kinds() 只报 desc,摘要那一路即使开关开着也不派(把 enabled 的第一行那道能力闸门钉住 —— 摘要提示词那句「整理成一段简体中文摘要」只派给真有摘要能力那一路;★ 第十七轮整条重写:SERVED_KINDS 改回 ['desc','readme'] ⇒ 这一档 serve 两路,llmReadme 开着就真的把那发译出来(断 engine==='keyless' 且假 net 恰一发),开关关着则 errKey:'off' 且连网都不碰 —— 能力回来了,闸门还是那道闸门)、★第十六轮 +1(wt-29):厂商请求号排最前,别被调用点那句 .slice(0, 200) 吃掉(三家位置各不同:腾讯 Response.RequestId/阿里顶层 RequestId/百度 log_id;最坏一发真走假 net —— HTTP 403 + 64 字请求号 + 约 700 字错误体,断言回执行 ≤200 且 ^HTTP 403 请求号 R{64} 那串号活着;没有请求号的真回包不许凭空拼出「请求号 」那种半截话) |
| host-compat.test.mjs | 22(+1 跳) | hc-0 扫描面自己先要「有东西可扫」:清单从 lib/ 目录真读派生(不是手抄文件名),且每个都真读得出 >200 字符、lib/desc-zh.js 必须在里面、零 @deepseek-ai/ / 零第三方依赖、★只读 GET 律的出网名单也改成派生(hc-7:凡真的调用 fetchFn( 的服务文件都算一路,net.js 自己除外;再按端点常量切成 GitHub 路与翻译那四路两拨,并自证两家之和等于总数、translateBound().length===1(四档共用同一份 web-translate.js,这一位就是在钉"不许哪天冒出第二个翻译出网文件而这条律扫不到它");逐文件钉无写方法、GitHub 那一路无凭据字样、不 clone 不下载、不起子进程、不许硬写 https: 字面量、地址只能从 domain 引 —— 手抄那一版对新增的 web-translate.js 零覆盖还照样全绿,见 spec §0 第九轮)、schedule/jobs/通知零调用 + 模型句柄只许一个使用者(hc-8 原为「零 ctx.llm」,10-06 第八轮改判:白名单文件由 index.js 的 createLlmTranslator 那条 import 边派生,并要求它真在扫描面里、真拿到句柄 ≥2 处;其余文件凡出现 deps.llm / snap.llm / .llm? 形状一律红,四类坏形状内置自证 —— 这条判据原先只匹配字面 ctx.llm,被 ctx.inject(['llm'], s => s.llm) 一路绿灯溜过去,见 spec §9.4)、inject=[]、index-inject 载荷 26 键齐(★ 第十二轮多 cacheHours / cacheHourLabels 两格:档位与中文话术都从 domain 走,客户端一格都不自己写;键表是刻意双写的,加键不同步就当场红)、客户端读的每个 cfg().X 都有人推(键表从宿主实际推的那一帧反查,不手抄清单)、保存偏好后必须真推一帧 update(hc-18:挂真 SSE 长连接、真 POST、读回那一帧的 translator.switchRows 里那一行的 on 翻转(★ 第十五轮:从读 descOn 那一格改成遍历这张表,因为那一格整格撤了)—— 走查抓到的"点了『开』高亮还在『关』")、★hc-19 密钥边界(效果侧,第十轮从一把扩到三把):boot 插件 → 逐家真 POST 一份含 KEY 的偏好 → 逐条扫 POST 回执 / GET /api/snapshot / GET /api/prefs / SSE 帧文本 / logger.warn 里既无三把密钥中的任何一把、也不出现它们的键名,并要求该档 credFields[].has===true 且 'value' in f===false 做非空转证明(★ 只摘其中一把密钥的植入就是从这里被抓出来的)、★第十二轮 hc-20(详情 TTL 的接线):装配处只许写 getTtlMs: () => repoCacheTtlMs(getPrefs().repoCacheHours)(现取现算),出现 ttlMs: 那种抄死毫秒即红;出厂那一档与出厂那个毫秒必须同源;prefsView 的初始值里就得有 repoCacheHours 那一格(reloadPrefs 是异步的,装配与首次读库之间点详情不许读成 undefined)、裸宿主缺服务时加载不抛且能力位说真话;★第十七轮 就地改判(条数不变):hc-18 那份开关表在首帧(装配完 + 老库存 llmDesc:true)给 [['llmDesc',true],['llmReadme',false]]、在新宿主帧给两行都 false —— 判的是"两行的键与出厂布尔都从载荷读",不再是"翻译档只有一行";★第二十一轮 +1(hc-21)令牌接线:装配处只许写 getGhToken: () => getPrefs().ghToken(现取现算,与 hc-20 那条 TTL 同一个形状 —— 否则"填了令牌但真跑那一发仍是装配时空的那一份"),出现 const token = 那种存成变量即红;认得 ghToken 这个键名的文件清单从扫描面反查(deepEqual(readers, ['index.js','lib/domain.js','lib/services/repo.js']),多一处就是多一个能把令牌递错的出口,少一处则是这一轮没接完);client.js 里出现「匿名配额 / 已认证配额」任一字面量即红;★同轮就地改判(条数不变)两条:hc-7 那条「GitHub 那一路无凭据字样」按域分家(凡真的调 fetchFn( 的文件里,带 authorization: 的只许 repo.js 一个、且只许一条;fetchFn( 第一实参不许含 token;翻译那四路照旧零凭据头;gh.js 那一层不认得令牌 ⇒ 榜面恒匿名)、hc-19 密钥边界从三把扩到四把(逐家真 POST + 回执 / snapshot / GET prefs / SSE 帧 / logger.warn 五处逐条扫,并要求该把 credFields[].has===true 做非空转证明)|

目录结构

index.js 宿主半边装配:能力探测、六仓储、节拍、路由、详情服务(★ 第十二轮:TTL 交 getTtlMs() 现取现算,不在装配时锁死)、入口载荷 client.js 浏览器半边:侧栏图标 + 整页面板(SSE 主、手动检查兜底;★ 第十二轮:设置页多一行「详情缓存」分段器,详情弹框只摆宿主给的段名与块;★ 第十五轮:现译那几行开关改成吃 translator.switchRows —— 行清单是载荷给的,当前那一路没有摘要能力时那一行不摆,客户端不写死两行) lib/domain.js 一份真相:枚举、标签、边界、阈值、六表 schema(含 GitHub API 基址、★现译引擎五档与各家凭据字段表 TRANSLATE_CRED_FIELDS(三家六格:schema 键名与长度上限全部从这张表派生,手抄必漏)、TRANS_ROW_ENGINES(现行五档 + 历史档名 official,让第九轮那批旧行继续读得出)、翻译端点白名单(TRANSLATE_HOSTS 由 TRANSLATE_ENDPOINTS 派生)、注册地址表 TRANSLATE_REGISTER、★第十二轮的详情缓存四档:REPO_CACHE_HOURS(6/12/24/72,封闭集合)+ 话术表 REPO_CACHE_HOUR_LABELS + 出厂档 REPO_CACHE_DEFAULT_HOURS=24 + 单点换算 repoCacheTtlMs()(越界退回出厂档),REPO_CACHE_TTL_MS 由出厂档算出来而不是写死的毫秒数、★第十一轮的段表与阈值:REPO_SECTION_KEYS(段序唯一真相)与 REPO_BLOCK_KINDS(p/sub/num/excerpt 四种块;★ 第十二轮 REPO_SECTION_SOURCE_NOTES 那张来源落款表整表删除 ⇒ 段对象只剩 key/label/blocks/facts 四格)、README_ZH_SECTION_MIN_CJK(= README_ZH_MIN_CJK,同一条中文判据不另立一个数)、DESC_SELF_ZH_MIN_CJK=8(描述本身就是中文 ⇒ 不派现译)、五档 REPO_README_SOURCE_LABELS、repo 表 schema 多的那两格 readmeSection / descSelfZh(★ sections 与 sectionFields 不在 schema 里 ⇒ 段表不落库,域 version 仍钉 1)、★第十五轮的节选与第二路常量:README_HEAD_CHARS=600(只服务那五档的中文判据)与 README_EXCERPT_MAX=1600(节选预算,本轮才真生效)分家、回退窗口 EXCERPT_SENT_BACK_MAX=200 + 中西文两支 EXCERPT_SENT_END_RE(句子边界收口)、README_ZH_LINK_MAX=200(第二路那条链接的长度闸门)、LLM_SWITCHES 每行自带 kind(设置页那几行跟着当前那一路的 kinds() 走)) lib/kv-schema.js 最小 schema 校验(sysops / stock / modelwatch 同名文件的同源拷贝) lib/kv-records-base.js 记录域底座:WeakMap 域登记表 + refcount + 串行写队列(同源拷贝) lib/stores.js state / events / prefs / seen / repo / trans 六仓储(★ 第二十二轮给 trans 加一个出口 entries():整表一次扫、回 schema 认过的整行、不裁字段 —— 榜面那列的中文视图在读路径上每帧要吃全表,按屏上行逐个 get 等于把开面板的成本挂在榜面行数上) lib/check.js 一轮检查的编排 + 变化判定纯函数 lib/services/gh.js 趋势页抓取与解析(榜面唯一"发什么请求"的地方;怎么出网它不管,交给 net.js) lib/services/repo.js 仓库详情:api.github.com 元数据 + README + 自带中文 README 探测(★第十一轮到五档 zh_default / zh_file / zh_section / en_default / none)+ ★结构化段表 repoSections(四段 what/heat/self/summary、四种块 p/sub/num/excerpt、段序只认 REPO_SECTION_KEYS、数字只进 heat.facts;旧的整句 repoNarrative() 第十一轮整段撤掉)+ 两道源侧闸门用的 descIsZh(DESC_SELF_ZH_MIN_CJK=8)与围栏状态机 splitReadmeSections(同一份 net 传输层,编排仍 3 发封顶)+ ★第十二轮:repoSections 的段对象缩成 key/label/blocks/facts 四格(四句来源落款整格撤,"是谁写的/是谁译的"并进段名),readmeNote() 整函数删除,readmeMeta() 压成一行短字面 节选 N / 整篇 M 字 · 已去标记 · 文件,详情服务的 TTL 吃 getTtlMs() 调用时现取现算,★第十五轮:readmeZhVerdict() 交两样东西 —— head(去标记后前 600 字,只用来数 CJK 判那五档)与 clean(去标记后的整篇),节选吃 clean 并经 excerptOf() 在句子边界收口(README_EXCERPT_MAX=1600 + 回退窗口 EXCERPT_SENT_BACK_MAX=200 + 中西文两支 EXCERPT_SENT_END_RE + 硬切与回切都退掉半个代理对),第二路 pickZhReadmeLink()(markdown 与 href 两种写法)+ zhReadmeRelPath()(五道闸门排在造 URL 之前,返回原始路径,encodeURIComponent 只在出网那一发逐段做)) lib/desc-zh.js 内置离线预译描述表(生成的死数据:[小写主键, 原文, 中文] × 73 + descZhFor / descZhHits,零 import / 零出网,见 dz-6) lib/board-zh.js ★第二十二轮(10-08)新落点:榜面描述列的混合来源视图 + 每轮检查后的补译批次。两条路一份判据 —— 纯函数 descZhView(屏上行, 整张 trans 表) 给视图(读路径零发),
createBoardZhRunner().run() 给批次(闸门顺序:busy 单闸 → no_engine → no_store → off → unavailable → read_failed → 逐字复用 → 失败冷却 → 每轮上限 12 发 · 并发 2);
另有 visibleBoardRows(批次吃:同仓库取名次最好那条)与 allVisibleRows(视图吃:三榜原样并一列、不去重,否则跨榜逐字命中的那一行会被别榜的旧原文抢掉)、 boardDescZhHead(按这一张榜数条数)与 boardDescHeadText(三档句子,内置那一句逐字沿用旧文案)。★ 不碰宿主模型句柄(只吃装配层的 getTranslator()),不写库(落库由 translate() 自己管) lib/services/net.js 传输层:CONNECT 隧道 + 路线仲裁(设置页自定义 > 环境变量 > Windows 注册表 > 直连)+ 注册表 60s 缓存 lib/services/llm.js 模型现译(★五档引擎里 host_llm 那一路):宿主模型句柄的唯一使用者(hc-8 的白名单文件由这一条 import 边派生)—— 闸门顺序、逐字复用、八档失败文案都在这一个文件里;★kinds()(第十五轮立的机制,第十七轮仍在):这一档两路都 serve([...LLM_KINDS] = desc + readme)⇒ 设置页那两行开关都摆 lib/services/web-translate.js ★四路(keyless 免费接口 + baidu / tencent / aliyun 三家云,第十轮把后两家接上):同一个形状的服务、同一条 net.js 传输,全 GET(腾讯 v1 那一路的签是「GET + host + 字典序原值」,POST/TC3 那套没走);查询串里只带各家的标识符(appid / SecretId / AccessKeyId)+ 一次性数(salt / Nonce / SignatureNonce)+ sign/Signature,★密钥本体只进摘要、不进 URL;pickTranslator 按 prefs.translateEngine 在这四路与 llm.js 之间选一个(没选中的那一路连 enabled 都不问);★SERVED_KINDS=['desc','readme'](第十七轮现值):这四路 enabled(kind) 第一行查这张表、第二行才看那两枚开关(readme 吃 llmReadme、desc 吃 llmDesc)⇒ 摘要那一发照派,只是段名与那句说明按档位念「节译」(第十五轮曾把这张表缩成 ['desc'] 并撤掉那一行开关,本轮已被用户改判撤回,见上面第十四件)) lib/api.js 路由表 + SSE hub + 错误码翻译 + 快照装配(netView 在这里把路线翻成界面那句话,translatorView 在这里把当前档翻成那 13 键(含 credFields[] / register,★ 恒无 value;★ 第十五轮:descOn / readmeOn / switchLabels 三格并成一张 switchRows[] ⇒ 15 键变 13 键,行的条数吃当前那一路的 kinds()),派活那一侧的第三道闸门 want(kind) 读的是那一路的 enabled(),descZh.hits 也在这里按屏上那些行算 ★ 第二十二轮:descZh 那一格换成 {hits,heads,liveNote} 三格、装配全在 lib/board-zh.js(这里只调 descZhView(allVisibleRows(boards), await transStore.entries()),纯读、一发不派);★ 补译批次 boardZh.run(visibleBoardRows(snap.boards)) 只挂在 check 服务那一帧 update 之后(GET /api/snapshot 与 SSE 首帧都在读路径上,一处都不许挂),且只有真补成了行(r.ok>0)才追推第二帧 —— 否则一轮检查白刷三次面板) lib/caps.js 能力位(现取现算,不在 apply 顶层锁死) test/ 十二个离线套件 + 四类夹具(趋势页切片 make-fixtures.mjs / api.github.com 原文 make-repo-fixtures.mjs / 现译四路各一份 fixtures/trans-.json,逐条 provenance 见下 / ★第十一轮多一份 fixtures/repo-zh-section.json:zh_section 那一路的形状夹具,文件级 provenance:"synthetic"(不是实抓,命中侧本机零真样本),shapeSources 逐条写明每一格的形状从哪个真文件借(噪声行 ← ant-design、围栏里的中文行 ← Qwen),键集与状态码口径照 repo-api.json;由 make-zh-fixture.mjs 生成,用例不许把它当"GitHub 真的这么答") docs/design-spec.md 设计规格(含 §9.1 S0 探针读数台账、§9.2 测试台账、§9.3 真机走查读数与仍未验证清单) tmp/ 真机走查脚本(shot.mjs 六签走查 / shot-bad.mjs 注入坏帧三态 / shot-proxy.mjs 三档出网方式逐档走查 / shot-links.mjs 外链配色 / shot-detail.mjs 详情弹框逐档 / shot-llm.mjs 现译两档走查 / probe-.mjs 量几何、代理与详情数据源读数、 probe-title.mjs 页头字号与五家兄弟插件 -title 规则的墨迹对表)与截图 tmp/shots/; gen-desc-zh.mjs + desc-src-all.json + desc-zh-authoring.json 是预译表的生成三件套(原文列由解析器取、中文列人工写,幂等); web-.bak- 是走查前那份 web profile 的 package.json / cordis.patch.yml 备份(拆场按它 cmp 还原,第九轮收尾时两份都已 diff 过与 profile 现文件逐字节一致),walk-llm.txt 是第七轮的逐屏读数原文; ★ 第九轮留的:证伪脚本 wt-falsify.mjs / hc-falsify.mjs(还原源 api.bak.js / web-translate.bak.js / wt2.bak.js 三份 cmp 过与现源一致,纯重复)、逐套复跑读数 rerun-ski_local.txt(330/0/2)与 rerun-full.txt(已被 13:5x 那次覆盖成 331/1/0 —— 挂的是真出网那条 wt-19,撞的是外部 429;13:2x 那份 332/0/0 只留在 spec §9.2 台账里)、免费接口真回包 p-g1.json~p-g5.json、以及没落地成引擎的探路痕迹 p-bing- / p-yd.json / p-long(为什么最终只有百度那一路,见 spec §8.4)。
★ 第十轮留的:证伪电池 r10-falsify.mjs + 输出原文 r10-falsify-out.txt(14 条 / 未抓到红 0 条,退出码 0,四条源文件跑完 cmp 过与备份逐字节一致)、逐套复跑读数 rerun-r10.txt(SKIP_LOCAL=1 下 340/0/2,直跑 342/0/0)、真机走查探针与读数 probe-engine10.mjs / probe-engine10.txt(带 body 的 POST 实为 9 发)与 probe-regrow.mjs / probe-regrow.txt(切档后旧译文是否重译那一档)、快照原文 snap-web-1006-r10.json、截图 13 张 shots/60-engine10-01-出厂keyless.png ~ 66-engine10-07-注册行贴标签-{百度,腾讯,阿里}.png(五档逐档 + 空凭据/已存/已清除/收尾出厂 + 那处「注册链接被推到行尾」的前后两张),两份浏览器 profile chrome-profile-engine10/ / chrome-profile-regrow/,以及旧夹具备份 bak/trans-official.json.round9(第九轮那一份「只登记百度」的 trans-official.json,现拆成 test/fixtures/trans-{baidu,tencent,aliyun}.json 三份)。
★ 第十一轮留的(A:自带中文探测 + 结构化段表,新增出网为零,探针那几发的账见 spec §9.1):探测与读数 probe-zh-section.mjs / probe-zh-section.txt(那篇真 README 的分段现场)、 probe-zh-scan.mjs + probe-zh-scan.txt / probe-zh-scan2.txt(榜面 78 行候选池扫描,两轮)、probe-zh-ratio.mjs / probe-zh-ratio.txt(CJK 个数 vs 占比那条律的对照)、 probe-desc-zh.txt(描述侧中文频次,0 发);★ 名字相近但不是本轮的:probe-repo-zh.mjs / probe-repo-zh.txt 与 probe-zh-ratio.mjs / probe-zh-ratio.txt 是 10-05 详情那一层的旧探针(mtime 10-05 12:3x),别当第十一轮的读数引; ★ probe-zh-fixture.mjs(计划把 QwenLM/Qwen 抓成真夹具,按"认围栏"口径重跑后那段中文其实是代码注释 ⇒ 命中侧退回零样本、没落盘,这一发的出网数没留档,是本轮唯一的读数缺口,spec §9.1 如实登记);合成夹具生成器 make-zh-fixture.mjs;文档读数探针 probe-zh-readings.mjs / probe-zh-readings.txt(零出网:假 fetch 吃夹具走真 fetchRepoDetail→repoView→applyZh,实测编排 3 发 / 载荷两侧各 21 键 / 段表形状);证伪电池 r11-falsify.mjs + 输出原文 r11-falsify-out.txt(13 条 / 未抓到红 0 条,四个源文件跑完逐字节等于备份,末行 [还原 ok])、逐套复跑读数 rerun-r11.txt(SKIP_LOCAL=1 下 350/0/2)。
★ 这一轮没有真机截图(详情弹框重排要重启宿主才能看,没点头 ⇒ 图与逐段 rect 都欠着,见 spec §9.3 第十一轮那条)。
★ 第十二轮留的(撤废话 + 详情缓存时长,新增出网为零):证伪电池 r12-falsify.mjs + 输出原文 r12-falsify-out.txt(10:23)与 r12-falsify-out2.txt(10:3x 复跑,逐行一字不差)(19 条 / 未抓到红 0 条,退出码 0,六个源文件跑完逐字节等于备份、末行 [还原 ok];首跑那条"跨行锚点只吃半句"的缺陷已补锚并给电池加了一档「植入改坏源文件」的显式读数,那一遍的原始输出没留档、被修好后那一遍覆盖)、逐套复跑读数 rerun-r12.txt(SKIP_LOCAL=1 下 354/0/2,直跑 355/1/0,挂的仍是 wt-27 那发真出网的 429);10:3x 为核对文档同步又离线复跑一遍 ⇒ 仍是 354/0/2,与 rerun-r12.txt 一字不差。
★ 一次事故如实登记:同步 docs/design-spec.md 时误用整文件写入把它截成 416 字节,已从会话历史快照逐字节还原(1695 行 / 257,462 字节),代价是那一窗口内先做的 8 处第十二轮同步全部丢失、随后重做(现在的规格文档是重做后的那份,含第十二轮 31 处口径)⇒ 教训落进记忆:大文档只用逐处替换,永不整写。
★ 与第十一轮同样:这一轮也没有真机截图(index.js 动了装配半边 ⇒ 要看效果得重启 dsh desktop 宿主;详情弹框那一屏 + 设置页新加的「详情缓存」那一行并成一次走查,图与逐段 rect 仍欠着)。
★ 第十三轮留的(修「存储不可用」事故,零出网):真库存只读探针 probe-storage-open.mjs(吃 C:/Users/<本机用户>/.dsh/storages/gh_trending.json 的真行过 GHT_DOMAIN.tables[t].valueSchema.parse,读数 六表 239 行 / 读不出 0 行 + 自证 prefs 缺 repoCacheHours、repo 缺 readmeSection、trans 缺 engine;★ 只报行数与缺哪一格,绝不打印行值)+ 复跑读数 rerun-r12-fix.txt(SKIP_LOCAL=1 下 355/0/2,与探针末行同档)+ 电池扩条后的输出 r12-falsify-out3.txt(20 条 / 未抓到红 0 条,末行 [还原 ok])。
★ 同一遍里探针首版被抓出的一处空输出冒充读数(拿 valueSchema.shape 数声明键,而 record() 不暴露 shape ⇒ "缺的声明键 无"是假的),已改成从 parse 结果读并拿"改坏成 required"那一发验它真会红。
★ 第十四轮留的(名次徽章分档,零出网):无头几何探针 probe-rank.mjs(CSS 逐字抠 client.js、RankBadge 函数本体抠出来跑、 与表头从 BoardCard 源码逐条读 ⇒ 它自己拒绝为对不上的脚手架出数)写出页面 shot-rank.html + 图 shots/67-rank-medals.png;复跑读数 rerun-r14.txt(SKIP_LOCAL=1 下 356/0/2);证伪电池 r14-falsify.mjs(只圈 client.js)两份输出 r14-falsify-out.txt(7 条 / 未抓到红 0 条)与 r14-falsify-out2.txt(同 7 条,多打是哪一头断言抓到的)。
★ 同一轮删掉了 make-rank-page.mjs:它被 probe-rank.mjs 整件取代(同一份 shot-rank.html 留两个写主 = 两份真相)。
★ 第十五轮留的(四件合并那一版,api.github.com 走查 10 发只读匿名 GET、翻译那四个域名 0 发):走查脚本 shot-r15.mjs + 读数全文 r15-walkthrough.txt + 宿主日志 r15-host.log;图 3 张 shots/68-r15-set-keyless.png / 69-r15-set-host-llm.png / 70-r15-detail-excerpt.png(设置页两档各有几行开关 + 详情弹框那一屏);第二路真回包两份 r15-ocr-live.json / r15-ocr-live2.json(同一仓库相邻两次 refresh=1,配额读数 55 → 51 就是"那一屏真发四发"的现场证据;★ 这条差值只在相邻两次之间作数); ⚠️ r15-ocr.json 是旧读数(12:24 那个旧进程写进库的缓存行:cached:true + 节选恒 600 字),原样留着只为当"库里那行旧 ≠ 代码没生效"的对照,别拿它当本轮证据引;复跑读数 rerun-r15.txt(SKIP_LOCAL=1 下 366/0/2)与 rerun-r15-full.txt(不带 SKIP_LOCAL 的直跑 368/0/0);证伪电池 r15-falsify.mjs + 输出原文 r15-falsify-out.txt(12 条 / 未抓到红 0 条,五个源文件跑完逐字节等于备份,末行 [还原 ok]); profile 备份 bak/web-package.json.r15-before(收尾 cmp 逐字节还原);一次性 DOM 探针 probe-r15-dom.mjs 与浏览器目录 chrome-profile-r15/ 收尾已删(tmp/ 现无残留)。
★ 第十六轮留的(回执带请求号 + 同屏一条失败句只念一次,两处改动本身零出网):复跑读数 rerun-r16.txt(SKIP_LOCAL=1 下 369/0/2)与 rerun-r16-full.txt(不带 SKIP_LOCAL 的直跑 371/0/0; ⚠️ 这一直跑里 wt-27 那条老的真口径用例真的经代理朝免费接口发了一发 —— 本轮的出网数是这一发,不是新增的,别读成"本轮新接口通了");证伪电池 r16-falsify.mjs(只圈 lib/services/web-translate.js 与 lib/services/repo.js,★ 其中 repo.js 那五条里的两条另在 client 套件里各跑一遍)+ 输出原文 r16-falsify-out.txt(11 条 / 未抓到红 0 条,末行 [还原 ok],每条都带是哪一句断言抓到的)。
★ 这一轮没有真机截图,也没重启宿主:那两屏(厂商回执行、摘要段只留段名)都要么吃真凭据、要么吃改过的库档位,动的会是用户自己的东西 ⇒ 屏上的读数暂时由 wt-29 最坏那一发(403 + 64 字顶满的号 + 约 700 字错误体,真走假 net)与 client-55(真渲染树数那句话出现几次)两份离线现场顶着;顺带删掉本轮中途为"把两件旧账的原文捞回来"而从会话记录里导出的一份 r16-asked.txt(不是读数,内容全是聊天记录)。
★ 这个目录不随插件发布(package.json 的 files 只有 index.js / lib / client.js / cordis.yml / prototype / README.md / LICENSE,tmp/ 与 docs/ 都不在里面),里面全是本机走查痕迹。
★ 也不进 Git 仓库(.gitignore 里钉死):这个目录 536MB,装着历次走查的浏览器 profile 与库存备份 gh_trending.json.bak- / bak/ —— 那里面是用户自己填过的三家云真实凭据(腾讯 SecretId/SecretKey 等),绝不上网;prototype 那一格是 files 里的历史声明,本地没有这个目录(如实登记,没为它改 package.json)。
★ 推公开仓库前把台账里的本机绝对路径打了码(4 处 C:/Users/gongj/… ⇒ C:/Users/<本机用户>/…:本行下面那条第十三轮探针的库存路径、spec 里同一条、以及第十五/八轮 crash 日志那两处目录),其余逐字未动;除此之外全仓再无不带用户名的本机路径,代码/测试/fixtures 逐字节扫过一遍无凭据(fixtures 里三家标识符统一是 gh-trending-probe-no-credential)。
(走查中途防"证伪植入没还原干净"而留的 index.js.keep / repo.js.keep / llm.js.keep 三份,收尾时 cmp 过与当前源逐字节一致 ⇒ 纯重复,已删。另有一份 tmp/bak/(10-06 01:43 那一次留的五份快照 api.js / client.js / repo.js / desc-zh.js / host-compat.test.mjs,逐份 cmp 过都与现源不同,外加一个探针仓库名 target.txt):它不是还原源,树里活的是 lib/ 与根目录那几份,别拿 bak 覆盖回去。)

夹具是真页条目的原文切片(条目内字节未改),并强制包含"每榜那一条无描述行"—— 夹具不许比真页干净,否则会把解析器的坑圆掉。
重新生成:node test/make-fixtures.mjs,吃 S0 探针留在 ../tmp/gh-.html 的原始页面(单页 0.6~0.7MB);缺源文件就报错退出,不静默造空夹具。
node test/make-fixtures.mjs --check 只比对现有夹具与源是否一致。

test/fixtures/repo-api.json 是详情那一层的夹具:逐字节取自 api.github.com 的真响应(10 发 = 三个仓库的元数据 / README / 根目录列表 + 一发真 404), README 只留前缀(fullLength / keptLength / truncated 三件都写进档),文件头记 capturedAt 与当时的 route(走的是哪条隧道)。
重新生成:node test/make-repo-fixtures.mjs [--force]。这个夹具没有 --check:比对一致性要把那 9 发真打一遍,匿名额度是硬的。
「有元数据但没有 README」和「限额用尽」两档没有现成真仓库,按文件头 synthesized 里写明的方式拼出来 —— 合成档一律标明,不冒充真字节。

★ test/fixtures/repo-zh-section.json 是第十一轮那份 zh_section 的形状夹具:文件级 "provenance": "synthetic"(整份都是合成,不是实抓 —— 榜上唯一候选 QwenLM/Qwen 按"认围栏"口径重跑后那几段"中文"其实是代码注释 ⇒ 命中侧本机零真样本), shapeSources 逐条写明每一格的形状从哪来(语言切换行与徽章/引用链接定义行 ← repo-api.json 里 ant-design 的真形,围栏里的中文行 ← Qwen 那篇的真形),键集 / 状态码 / 头字段口径照 repo-api.json。
★ 但它不幂等:node tmp/make-zh-fixture.mjs 只产"形状"那一份,现档里 _note / readings / route 是生成之后手登记进去的 ⇒ 直接重跑会把这三格抹掉(本轮实测过这一位:重跑后与备份 cmp 不一致,已按备份还原)。要重生成先备份。
⇒ 这一档的判据目前全是离线的(repo 那条"仍三发封顶"吃的就是它),真回包那一路没吃过;要划掉这条:找一个默认篇是外文、整篇真嵌着达标中文小节的仓库,真发三发把回包字节存进来并改成 live。
★ 第十五轮的第二路(从默认篇那行语言切换里抽相对路径)同样没进 fixture:那一屏的真回包(readmePath:docs/i18n/README.zh-CN.md / 整篇 8,869 / 节选 1,586)留在 tmp/r15-ocr-live.json,用例吃的是按真机形状手写的合成档(★ 只有"根目录没命中"那一头用 vitejs/vite 的真清单;"链接写着但文件不在"那一态真接口压根触发不了)。要划掉这条:按 make-repo-fixtures.mjs 的口径补一发 /contents/docs/i18n/README.zh-CN.md 的真字节进 repo-api.json。

test/fixtures/trans-{keyless,baidu,tencent,aliyun}.json 是现译那四路的夹具,一家一份(第十轮从「百度 + 腾讯 + 阿里挤在一份 trans-official.json 里」拆开的;第九轮那份备份在 tmp/bak/trans-official.json.round9)。
每份里恰好一条 "provenance": "live"(wt-26 逐家钉这一位):三家云那三条是无凭据的真回包(厂商点名的鉴权错误 —— 腾讯走到 AuthFailure.SecretIdNotFound、阿里 HTTP 404 + InvalidAccessKeyId.NotFound,本机真拿到过字节,登记为直连),其余条目是 "provenance": "synthetic"(本机没这三家的账号 ⇒ 成功那一发的真字节从来没拿到过),★ 合成样本不许带 capturedAt,文件级 "synthesized": false 指的是"这份里确实有 live 条目",不是"全都真"。
trans-keyless.json 那份不吃凭据,整份就是实测(wt-7 钉它有抓取时刻与代理路径),所以不带逐条 provenance。
签名正确性靠 wt-8 / wt-9 / wt-10 在三条用例里按官网公式独立复算对账(不拿被测代码自己算的结果自证);要划掉这条:注册拿一对凭据、真发一发、把回包字节原样存进对应那份并改成 live。

挂载前要知道的三个坑(同仓插件踩过,本插件已按口径避开)

1. 宿主半边不许 import @deepseek-ai/*:link: 挂载会解析出第二份模块实例。本仓库零第三方依赖,schema 与 KV 基座都是自造的最小实现(由 hc-1/hc-2 扫源码钉住)。
2. client.js 里 ModuleLoader factory 必须 return module.exports:宿主把 factory 的返回值当模块导出,写成 return module; 会在宿主启动时报 invalid plugin … received object。
3. ctx.inject 回调跑在独立 fiber,能力位与路由注册只能在回调里做;apply 顶层锁死能力快照 ⇒ 满屏降级横幅 + 路由全 404(sysops 病历)。

版式硬约束(由 client.test.mjs 钉住,别改回去):.gt-root 必须自己带 box-sizing:border-box; 禁用 container-type / @container,断点只用 @media;表格用 fixed 模板 + 描述列吃余量,右对齐列的表头必须 th.gt-r 点名覆盖(th 上的 text-align:left 特异性压过 .gt-r); 的类名不许和格子里的元素共用(gt-col- 前缀)—— 撞名后单元格那条 display:block 会命中 col,而 display 不是 table-column 的 col 直接退出列布局,整张表宽度左移(真机病历 §9.3 第五轮)。

许可

MIT。本插件与 GitHub / Microsoft 无隶属关系,只是读取公开的趋势页。
预览分享卡片长什么样 ↓gh-gongjin/dsh-plugin-gh-trending
分享 · DeepSeek Harness Hub
gh-gongjin/dsh-plugin-gh-trending

盯日周月三榜变化,点开仓库看中文详情

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部