dsh-plugin-gh-trending
Manifest validdsh plugin: GitHub Daily/Weekly/Monthly Trending Monitor + Chinese Descriptions of Repository Details and README Section Translations (Fully Read-Only GET Requests)
dsh-plugin-gh-trending
DSH(deepseek HARNESS)的 GitHub 热榜监控插件:在侧边栏「插件」下方增加一个入口,盯三件事 —— 日榜 / 周榜 / 月榜各自怎么变、哪些仓库同时在多张榜上、本机第一次见到的仓库。变化只记录在本插件面板里,不推任何外部通知。
对 github.com 全程只读 GET(每轮三发 = 三张榜各一发;只有传输类失败——连不上/超时——才对那一榜补发,单榜含补发最多 3 发,成功即停):不带 key、不带 cookie、不 POST、不下载 zip、不 clone。
★ 第二十三轮(10-09)加的那一路有尾巴:开了「全站高星」那一档 ⇒ 一轮最坏四发(三榜 + /search/repositories 一发),那一发每轮上限一枚、不补发、不重试,且出厂关着 ⇒ 关着时上面那句"每轮三发"照旧一字成立;填了 GitHub 令牌时它也走同一条 Authorization 请求头那一路(只进请求头,不进 URL)。
★ 同日就地改判(用户裁定「开启的时候默认拉取一次」):把开关从关拨到开的那一趟 ⇒ 另加一发、当场花(它不属于任何检查轮,所以那一轮的"四发"账不因为它变成五发)。口径钉三条:认的是库里的转换(已经开着再存一次 true、改别的键时顺带带上、连点 ⇒ 一律不派),回执之前发完(保存偏好的响应回来时那一批已经在库里也在载荷里,不留"点完了但结果在别处"),发过就追帧(坏轮的故障三格同样当场让界面看见)。匿名 search 一小时才 10 发 ⇒ 这一发是用户点下去授权的,不是插件自己起的。
★ 同日第二条裁定(「上次间隔时间范围内已经拉取过就不要拉取了」):那一趟从"必发"改成当场决定发不发 —— 库里最后一次成功取回(ok===true 的 at)距此刻不到一份检查间隔(prefs.intervalMin,设置页那一格,出厂 60 分)⇒ 0 发,直接把库里那一批端上来(挡下的一趟不写库、不追帧,开关位跟着同一次回执上屏)。窗口不另造常数、界面上看得见的那个数字就是它;⚠️ 上一发是坏的(403 / 超时)时照旧重试 —— 判据吃 at 而不是 lastFetchAt,不许让用户为了重试去等下一轮检查;这一道闸只挂在开启那一趟,检查轮"每轮一发"的节律一字不动。
需要代理时走插件自己的 CONNECT 隧道(lib/services/net.js):它不改本机任何代理设置,也不起监听端口,只在需要时向代理发起一条 CONNECT github.com:443,之后仍是标准 TLS + HTTPS GET。
它是什么
- 三张榜独立闸门:日 / 周 / 月各一份状态,坏在哪一榜就只冻结哪一榜,绝不连冒横幅。
- 变化流水:
board_enter / board_exit / board_move / first_on_board / renamed / rising_cross / cooling_cross / source_error / source_recover / baseline(枚举与中文标签只在宿主侧lib/domain.js,界面只查表)。位次挪动日/周 ≥3、月 ≥2 才记board_move。 - 跨榜同现:同时出现在 ≥2 张榜 = 持续升温,只剩 1 张 = 热度回落。三张榜在同一次检查里拿到,这块分析零额外请求。
- 明星仓库那一屏(★ 第二十三轮(10-09)新增,第七个页签):答「哪些仓库反复上榜、谁在往上走」,原料全在本地(三榜这一轮的行 + 观测史
seen)⇒ 打开这一签零请求;七列里「今日新增」只吃日榜、证据不足 3 轮时「在榜」那一列整列置灰并说清为什么(不藏列)。另有一档「全站高星」(GET /search/repositories)出厂关着 —— ★ 10-09 改判:点「开」的那一刻宿主立刻发一发(不等下一轮检查),之后每轮最多一发、结果进缓存,关掉不删已攒的那批,详见「界面」那节;★ 10-10 第三条裁定:开着时它那一批行也参与描述列的现译(与榜面共享那 12 发,关掉只是不上屏、不删译文)。 - 改名识别:靠条目里的
record_id认出同一个仓库换了owner/name⇒ 记renamed而不是「掉榜 + 新进」两笔假账。 - 项目收藏(★ 第三十二轮(10-13)新增,第八个页签):三榜每一行的末尾、明星仓库那一屏的每一行、以及详情弹框的标题行,共三处入口摆同一枚 ☆(同一个组件、点它只改收藏 ⇒ 不跳转、不开弹框、不滚动);收进来的仓库进「收藏」那一屏,七列
# / 仓库 / 描述 / 语言 / 累计 ★(那一刻)/ 收藏于 / ★(★ 第三十五轮(10-13)撤掉「这一轮」那一列:用户指着屏上那一列说「去掉这个」,裁定「只删那一列,右侧那枚 ★(取消收藏的入口)照旧留着」⇒ 八列变七列,屏上不再有「在日榜 / 在月榜 / 未上榜」那个读数;宿主侧那一格派生、载荷格、相关判据与台账一并撤干净,不留死码)。★ 第三十三轮(10-13)描述那一格换成"本机已有的那一份中文":内置预译或已付过额度的现译,命中判据与榜面同一个函数(lib/board-zh.js的descZhHits,这一屏不重写第二遍)⇒ 周榜上有中文的那一行,收藏那一屏逐字同;中文长在载荷那一行的descZh那一格(★ 旧台账叫它「第 11 格」,那个序号吃的是「那一行共有十一格」—— 第三十五轮撤掉末尾的「这一轮」之后只剩十格,序号名一并作废,改叫格名),desc那一格恒是收藏那一刻的原文(覆盖掉就没有第二处能证明"快照不刷新"了)。这一路零出网、零新增额度:那一格是被动的 —— 本机哪天译过那句原文它就上屏,没译过就念原文,屏上永远不欠一次请求。 两条口径决定这一屏的形状:① 存的是收藏那一刻的快照,不是引用 —— 星数与描述不随榜面刷新(所以那一列表头写着「那一刻」,卡脚那句 note 把这件事说明白,要新值点仓库名走详情那条链)⇒ 打开这一签与收藏那一发都恒零出网(★ 第三十二轮的出网账裁定:收藏这一路 0 发,不为了补快照去问 GitHub);②「这一轮」那一格是宿主本地比出来的成品句(拿收藏键与同一帧屏上那几批行比,命中念「在日榜 / 在周榜 / 在月榜 / 在明星」的优先级单值,没命中念「未上榜」),★ 比键时把榜行的★ 第三十五轮(10-13)这一条整条作废(用户指着屏上那一列说「去掉这个」,裁定「只删那一列,右侧那枚 ★ 照旧留着」):那一格连同它的派生一起撤 —— 优先级单值、renamedFrom一起铺进去 —— 仓库改名后不铺就会把"明明在榜"念成"未上榜"(用户收的默认:误念比缺念更糟)renamedFrom归一、FAV_ON_BOARD_PRIORITY、FAV_COL_ON_BOARD、FAV_OFF_BOARD_CELL全部零出处(留入参就是死接口,favs那套里有一条专门喂旧的那三档原料验它长不出那一格)⇒ 这一屏的形状现在只剩上面那一条律,屏上不再有「在日榜 / 未上榜」那个读数,收藏与榜面的关系只从「来自 <榜名>」那一枚出处牌读。 收藏不裁行、不设上限、不参与 LRU(10-13 裁定:与repo/trans那两张表故意不同 —— 按时刻裁等于"收藏久了被系统悄悄删掉"),那一行的五格读数由宿主派生(favSeedOf四路:三榜切片行 → 全站高星那一批 → 榜史seen→ 详情缓存repo表),浏览器只递{repo, action}两个字段;形状细节与判据见docs/design-spec.md§8.15。 - 仓库详情按需取:点榜面条目的仓库名才弹出一张详情对话框,并在这一下点击去
api.github.com要元数据 + README,把 GitHub 自己给的字段拼成一张结构化段表(sections[]四段:项目是什么 / 热度与元数据 / 仓库自己怎么介绍它 / 中文摘要,★ 第十一轮起替代旧的那一整句narrative;段序、段名、哪句摆在哪一段、哪句算小字全在宿主拼死,客户端只按kind摆),并探测仓库自己写的中文 README(★readmeSource五档:zh_default默认 README 本身就是中文 /zh_file仓库另写了一份中文 README(★ 第十五轮起这一档有两条路:根目录列表里命中README-zh_CN.md那类,或默认篇首屏那行语言切换里写着的相对路径命中(真机docs/i18n/README.zh-CN.md那一类,根目录压根没有)—— 两条路共用同一发正文请求,编排仍是 4 发封顶) /zh_section默认篇是外文但整篇里嵌着一段中文小节(第十一轮新增,吃已经在手的那份正文,零额外请求)/en_default只有英文篇 /none没 README)。 描述那一句若命中内置离线词表,会在「项目是什么」那一段里多一个块「中文描述(内置离线预译 · <日期>,不是现译)」,原文紧跟着另起一块照给;没命中而现译开关开着时,换成「中文描述(<这一行当初是谁译的> · <日期 时刻>)」(免费接口/百度/腾讯/阿里/模型现译五选一,库里旧行还可能有历史档名官方接口,§8.4),原文照样另起一块(译文不替换仓库自己写的那句)。 - 描述列中文(内置离线预译表,
lib/desc-zh.js):榜面与详情里的仓库描述,命中表里的就给一句人工预译的中文,没命中就只显示原文。三条口径: 离线(这份文件是死数据,零import、零fetch、零模型调用,dz-6从源码钉住);带来源与时间戳(卡头与悬停都念「内置离线预译 · 2026-10-06」,界面不自己编日期); 原文改过就不译(命中判据是「仓库主键 + 原文与表里记的那一句逐字相同」,仓库把描述改了 ⇒ 静默退回原文显示,绝不拿旧译文指鹿为马)。 表由脚本生成、不是手抄(tmp/gen-desc-zh.mjs:src那一列由解析器从真榜面逐字取出,中文那一列是人工写好再合并进去的),当前 73 条;★ 覆盖面会随时间衰减 —— 表只认整理那天在榜上的那些仓库,掉榜/新上榜的描述就是原文。 ★ 第二十二轮(10-08)起,榜面那一列不再只靠这张表:内置表没命中的那几行由每轮检查后的补译批次接上(现译那一路、同一张trans表、同一把逐字复用判据)⇒ 一列里从此可能两种来源并存, 所以落款跟着每一行走(悬停给「原文 + 这一行自己的来源 + 注」),卡头那句「描述中译为…」换成宿主按这一张榜算好的条数(内置预译 N 条 · 现译 M 条)。B 那三条口径一个字没动,表命中的行照旧不重发。 ★ 10-10 第三条裁定起,这一路吃的参与行变成两组:三榜那一批 +「全站高星」那一档开着时它那一批(同一张trans表、同一把逐字复用判据、同一份 12 发共享预算,榜面先吃饱)⇒ 那一屏的描述列从此也可能两种来源并存;关掉那一档就一行都不进(已攒的译文留着但不上屏)。"参不参与"这件事的出处只有一处(descZhRows),视图与批次两处都调它。 ★ 第三十三轮(10-13)起,"命中判据"也只剩一处:那一圈「内置优先 → 与库里那行原文逐字比对」从descZhView抽成导出的纯函数descZhHits(rows, transRows) ⇒ {hits, counts},榜面读descZhView里的那一份、收藏读这一份 ⇒ 两侧一旦漂移,屏上就会出现"榜面有中文、收藏没中文"(你报的正是这一形)。★ 抽函数而不是复制粘贴:lib/favs.js与client.js从此连比对的口径都不认(hc-23拿四类判据字面 + 合成正样本 + import 名单三头钉住);「哪些行去排队补译」仍由descZhRows单独管,收藏那批行不进那个集合 ⇒ 抽函数没有把出网账抽多一根线。 - 现译引擎五档(D,2026-10-06 第九轮加三档、同日第十轮扩成五档,
lib/services/web-translate.js+lib/services/llm.js):内置表没命中的那一句描述(以及 README 英文节选的摘要),交给你在设置页选的那一档现译:免费接口= Google 网页版翻译(免注册免密钥,★ 不是官方授权接口,且这台机器直连不通、必须经代理)/百度= 百度翻译开放平台通用文本翻译(AppID + 密钥,签名 MD5,境内直连可达)/腾讯= 腾讯云机器翻译 TextTranslate(Version 2018-03-21、地域广州;SecretId + SecretKey,签名 HmacSHA1 v1,直连可达)/阿里= 阿里云机器翻译通用版 TranslateGeneral(Version 2018-10-12;AccessKeyId + AccessKeySecret,签名 RPC V2 的 HMAC-SHA1,直连可达)/宿主模型= 第八轮那一路(lib/services/llm.js,花宿主的模型额度)。默认落免费接口(用户裁定「两条都做,设置页选」+「与宿主模型并存,二选一」+「分段器并排五档」)。★ 三家云要不要花钱、有多少免费额度以官网计费页为准(这一轮没能复核到可引用的数字,所以界面上不念数字,只把注册入口摆出来)。五条口径五档共用:只在点开详情那一刻、只译当前这一条(榜面永远零现译,一轮三发榜面照旧)★ 第二十二轮(10-08,用户回「按C来」)改判这一条:现译发生在两处 —— 点开详情那一刻译当前这一条(原样)+ 每轮检查之后给榜面上内置表没命中的那几行补一批(用户三条裁定:「检查轮次后补」/「每轮 12 发 · 并发 2」/「复用「描述现译」这一档」⇒ 设置页不新增开关)。 ★ 改判的是什么时候发,不是发多少:读路径恒零发(打开面板 / 重开面板 / SSE 首帧一发都不派 ⇒ 界面永不"因为翻译而转圈"),配额严格按检查节拍花(出厂 60 分钟一轮,手动「重新取一次」也算一轮,一轮最多 12 发、同时在途 2 发、同一行失败 30 分钟内不再试);榜面那三发 GitHub 请求照旧(补译不打 github.com)。形状见docs/design-spec.md§8.7; B 优先(表命中的行压根不派活,两个来源不会在同一屏打架); 三道源侧闸门(★ 第十一轮加两道、第十九轮补第三道,都排在派活之前:仓库自己写的描述就是中文 ⇒ 不派描述那一发;README 已经有中文 ⇒ 不派摘要那一发 —— ★ 第十八轮把这一句点名到三档:zh_default默认篇整篇是中文 /zh_file仓库另写的那份中文篇(根目录名或默认篇里的语言切换行指到的)/zh_section整篇里嵌一段达标中文小节,只有默认篇是英文(en_default)才译;none由"没有节选"挡。★ 第十九轮(用户改判「这两种也算有中文」)补第三道readmeZhOnScreen(节选):即便档名是en_default,只要要派出去的那段节选里 CJK ≥ 8(中英混排篇,真机thedotmack/claude-mem9 字)或出现「中文」两字(中文篇在子目录没抓到、只剩那行语言切换字样)⇒ 摘要那一发也不派,self段名跟着补那半句实话(「(节选里已有中文)」/「(这行写着有中文版)」)。★ 第三十轮(10-12,你那句「我开了摘要现译,这个点开没有翻译」)把这一道收窄成只认cjk那一支(api.js派活那侧读.via !== 'cjk'):「这行写着有中文版」是个推测,推测兑现的仓库档名本来就会落在zh_file/zh_section(上面那道档名闸已经挡住),推测没兑现的(真机debpalash/VoiceStudio:中文那份在根目录、库里那行又被 304 冻在en_default)被它挡下来的结果就是"屏上既没中文、也没摘要"⇒ 派。⚠️ 段名后缀那两支照旧都给(那半句说的是关于这篇 README 的事实,与派不派活是两件事,这一轮第一次把两种用途分列)。★ 判节选不判档名:README_ZH_MIN_CJK = 20那条一字未动(它管的是「默认 README 本身就是中文」这句档名敢不敢说,降到 8 会把只有一行切换标签的英文篇改名成中文);「日本語」不算中文、国名「中国」不算声明、英文Chinese不认(挡了就是删了用户在用的那一屏)。三道都在源上挡,不是译完了再挑译文。★ 第十五轮的第三道闸门不在这里,在那一路服务自己声明的★ 第十七轮(10-07)这一条被用户改判:那一发放回来了,五档都派两发(原话「我前面是有摘要现译的,你在哪一次改坏了,给我放出来」);kinds()里:免费 / 百度 / 腾讯 / 阿里只有翻译能力,「整理成一段简体中文摘要」那一路只派给宿主模型⇒ 那四档连enabled('readme')都问不到,设置页那一行开关也跟着不摆kinds()那道口与三道源侧闸门都还在,只是翻译四档现在也报readme。保留的只有措辞:那四档给的是节选的节译,段名与设置页那句说明跟着档位走,只有宿主模型那档叫「摘要」); 落库复用(按「仓库主键 + 原文逐字相同」判,仓库改了描述就重译,绝不拿旧译文指鹿为马。★ 第十一轮把「换了引擎,旧译文照样复用」这一条钉成裁定:现行行为就是要的行为 ⇒ 零代码改动,只补判据与文档,落款署的是那一行当初的来源,不冒充新引擎);两档开关各开各的(描述出厂开、摘要出厂关,都关掉时那一屏与 C/D 之前逐字相同。★ 第十五轮:那两行不再是写死的两行 —— 摆几行由当前那一路自己声明的kinds()决定,载荷从descOn/readmeOn/switchLabels三格换成一张switchRows[]。★ 第十七轮(10-07)改判后那份机制一字未动,动的是服务那份声明:翻译四档现在也报readme⇒ 五档都摆两行)。 ★ 选路只有一处(pickTranslator):没选中的那四路连"你开着吗"都不问,五路服务互相不知道对方在 ⇒ 不会变成一次点击发五发。 ★ 落款跟着那一行自己的引擎:换了引擎不作废旧译文,也不拿新引擎的名字盖它 —— 库里那行署它当初的来源(trans表行内engine字段)。 ★ 额度分两本账:宿主模型那一发不打任何 HTTP(走宿主连接);另外四发在插件的出网账里(同一份net.js、同一档 15s 超时),但不吃 GitHub 那 60 次/小时(另四个域名)。 ★ 密钥的边界(第十轮把这一格从"只有百度一家"扩成三家 × 六格):密钥本体只参与摘要那一步,出网 URL 里只有各家的标识符 + 一次性数 + 签名 (appid/salt/sign、SecretId/Nonce/Signature、AccessKeyId/SignatureNonce/Signature);密钥不进 URL、不出网、不回显、不进日志, 界面上只看得到「库里已存(留空不改动)」那一句。★ 标识符能进查询串是翻译域的例外,GitHub 那一域默认零凭据(★ 第二十一轮改判那句"仍然零凭据":出厂ghToken空 ⇒ 与旧版一样一发凭据头都不带;填了才带一条Authorization: Bearer,只进请求头、绝不进 URL,且这一把密钥与那三把走同一套回显闸门PREF_SECRET_KEYS;cookie那三类头全域仍禁,全程仍只读 GET)。 失败的话各说各的:模型那八档(开关没开 / 宿主没给模型 / 没设默认模型 / 超时 / 答错 + 回执原话 / 读不出中文 / 太长 / 没存下来)+ HTTP 那四路九档(多出的三档是no_credential、http、bad_json—— 网页接口改了形状必须点得名,不许混进"没中文"),一律原文照给。 - 语言过滤:可配一档语言(
prefs.language,页面 slug 的小写形式),保存时就地 GET 一张周榜验<title>,站点不认这个 slug 就拒收并说明原因。空 = 全站榜。 - 出网方式:
跟随系统(先环境变量HTTPS_PROXY/ALL_PROXY/HTTP_PROXY,再 Windows 注册表的系统代理)/自定义地址(只认设置页那一行,形如127.0.0.1:7897,只支持 http 代理的 CONNECT 隧道)/直连。默认跟随系统—— 这台机器上直连 github.com 会超时,而注册表里就写着127.0.0.1:7897。 - 设置:检查频率(1 / 3 / 12 / 24 小时)、榜单条数(5
25,默认 15)、事件保留条数(502000,默认 300)、详情缓存(★ 第十二轮立起、★ 第二十七轮(10-10 用户亲手)整行撤掉、★ 第三十一轮(10-12 用户再次亲手改判)摆回来:6 / 12 / 24 / 72 小时四档分段器,出厂 24 小时,裁定原文「还是改成以前那种模式,默认缓存24小时,可以配置,不要用60秒这种」 ⇒ TTL 之内一发都不问(连验证器都不问),改档下一发详情就按新档判新鲜(getTtlMs()现取现算,装配时锁死是第十二轮那笔账的形状),失败档那 5 分钟照旧不进设置页):那一档的存与废走的是同一条链的五个点(domain 那三个名字 +DEFAULT_PREFS那格 +prefsRecord声明 +clampPrefs名单 +index.js的getTtlMs接线与prefsView初始格 +api.js的 400 校验 +hc-11键表 + 设置页那一行与hc-20那条正则),缺一处就是第二真相;★ 那一段键从没真正消失过(第二十七轮只是让open()静默丢弃它 ⇒ 删格方向由tmp/probe-schema-drop.txt实测安全、域version恒 1、零迁移),本轮改回optionalInt声明把它收住(追加/恢复键一律 optional,requiredInt那条 10-07 血案律照守),POST 脏档照旧 400 拒收(不像第二十七轮那一版走白名单丢弃 —— 它现在决定"这一问出不出网");替代物DETAIL_RECHECK_MS(固定 60 秒防连点)整键删掉,hc-20反过来钉「domain 那一侧一个字都不许认得它」⇒ 界面上多回一个控件、少一条出网承诺,语言过滤、出网方式、现译引擎(并排五档分段器,出厂「免费接口」;选中「百度 / 腾讯 / 阿里」任何一家时才多出一行那一家的两格(标识符 + 密钥,密钥框是password)带「保存」/「清除」,并另起一行给出那家的注册地址(要注册才用得着,链接新开标签页、不带走面板))、现译开关行(★ 第十五轮改口径:摆几行由当前那一路服务的kinds()决定,不是客户端写死两行;★ 第十七轮(10-07)用户改判放回:翻译四档的kinds()现在也报readme⇒ 五档都摆两行(描述现译出厂开、摘要现译出厂关),那一行行名不变、"这一段是什么"跟着档位走 —— 翻译四档那句说明念「这一段是节译不是摘要」,只有宿主模型那档念「另给一段中文摘要」(domain.switchRowLabel);每行{key,kind,row,label,on}五格、客户端只念key/row/label/on,点一下即存。真机那两屏tmp/shots/68-r15-set-keyless.png/69-r15-set-host-llm.png是第十五轮那一版的读数(免费档只有一行开关),第十七轮放回后还没重拍 ⇒ 挂在 §9.3 那条走查清单上,要重启宿主才看得见新那两行)、GitHub 令牌那一行 + 「创建令牌」那一行(★ 第二十一轮新增,用户裁定「设置页加一个 GitHub token,配额抬到 5000/h」:它不在现译那一叠分段器里,是 GitHub 那一域的凭据、与翻译无关 ⇒ 单独两行,全部读snap.github:框是password+autoComplete:'new-password'、maxLength与字段名来自那张派生表、密钥格value恒空(存过只把 placeholder 换成「库里已存(留空不改动)」)、库里存过才摆「清除」(点了只发{ghToken:''}这一格)、「保存」只在草稿 ≠ 库里那份时可用;下面那一行给github.com/settings/tokens那条网址(target=_blank rel=noreferrer,★ 与三家云同一条律:那句额度话不替 GitHub 承诺数字)。⚠️ 这两行还没在真机上看过,与第十七、十九、二十轮那几屏挂在同一条走查清单上),外加一张只读的「运行环境」表(最近那一发的传输路径 + 宿主能力位)。
它不是什么
- 不是 GitHub 官方工具,与 github.com 无隶属关系;榜单是趋势页页面自己排的名次。
不做 AI 解读(零—— 2026-10-06 第八轮由用户拍板改判为「默认零调用 + 句柄只许一个使用者」:现译只在点开详情那一下、只在开关开着的那一档发生。 ★ 同日第九轮再改一次:现译默认不再走模型 —— 出厂档换成免密钥的翻译接口,宿主模型降为设置页分段器里的一档(上面「现译引擎五档」那条;★ 第十轮那一档旁边又多了两家云,从三档变五档)。两次改判都没动这条铁律的另一半: ★ 第二十二轮(10-08)改判的是那一次的"什么时候发"(「只在点开详情那一下」→「详情那一刻 + 每轮检查后给榜面补一批」),这条铁律的另一半照旧一个字没松:句柄仍只许ctx.llm)lib/services/llm.js一个使用者(新落点lib/board-zh.js只吃装配层给的getTranslator(),认不到句柄),开关关着 / 引擎没就绪 ⇒ 两处都零发。 不发通知、不写会话日志、不动宿主定时器之外的任何东西照旧成立;要通知请用宿主自己的机制,本插件不代作决定。 真机口径(2026-10-05 第六轮为「描述译中文」跑过一次临时宿主 LLM 探针,跑完即撤、现已撤净):这台宿主的10-06 01:16 那一轮把它翻案了:思考能关,走ctx.llm关不掉思考 —— 官方那两个关思考的字段被静默吞掉、reasoningEffort看不出起作用,20 来字的译文照烧 209~318outputTokens⇒ 真要做现译只能默认关闭 + 从调用次数省。reasoningEffort:'off'—— 同模型同题两发对照:outputTokens260 → 12、耗时 1.9s → 0.9s、思考字符 1342 → 0(归零才算关掉,耗时和观感都不算判据); 顶层那两个官方关思考字段照旧传了不生效,因为适配器只认reasoningEffort这一个入口。★ 这句"还没有排期"也一并作废:10-06 同日第八轮就做了, 发的每一发固定reasoningEffort:'off'(LLM_REASONING_EFFORT单点在 domain)。 五发读数与两发对照、判据全在docs/design-spec.md§9.4 / §9.4.1。
一个必须先说清的口径
数据源是 https://github.com/trending?since=daily|weekly|monthly 的页面 HTML,属于非官方接口:对方改版即失效。
(为什么不选 Search API:要 key,而且"趋势榜"是站点自己算的一张榜,API 复现不了你在 github.com 上看到的那个名次。为什么不选第三方镜像:多一层可用性风险,数据也不可追溯。)
第二个数据源只在点详情时才出现:https://api.github.com/repos/{owner}/{name}(+ /readme、必要时 /contents/)。它是官方 REST,字段稳定,但额度默认是匿名那一档:60 次/小时/IP(实测历轮每一发都回 x-ratelimit-limit: 60。★ 第二十一轮(10-07)改判那半句"硬的":设置页可以填一个 GitHub 令牌 ⇒ 详情那四发各带一条 Authorization: Bearer <token>,只进请求头(不进 URL、不回显、不进日志、不进快照,空白格等于没填、照旧匿名发),
官方文档口径带令牌是 5000 次/小时(★ 本机没有 GitHub 账号也没有令牌 ★ 10-10 只读对账改口:库里 ghToken 那一格非空(只报"非空 + 40 字",值不打印)⇒ 详情那两发带着 Bearer 在发;但那一档仍是零真回包 —— 历次真回包只见过 60,5,000 那一格从来没从 GitHub 头上落到本机,所以那一形状到现在还是合成的)⇒ 屏上那句「匿名配额 / 已认证配额 剩 N / 上限」的上限与那两个字的标签都由 GitHub 自己回的那一格决定:填了却被拒(撤销、拼错)就照旧念「匿名配额」,代理把那一格吞了就退回保守的 60 —— 宁可梦见 60,不可梦见 5000。★ 发数一发没多(一次点击仍 ≤4 发),而 github.com/trending 榜面那三发永远匿名(gh.js 连这一格的键名都不许认得)。
所以一次点击最多 4 发(元数据 1 + README 1 + 只在默认篇不是中文时补 根目录列表 1 + 中文文件 1;★ 第十五轮第二路没加这个数 —— 那一发中文文件正文照发,只是路径改从已经在手的默认 README 那行语言切换里抽,零额外请求,命中才发),
★ "隔多久才肯再问"这一格现在是三层叠起来(★ 第二十七轮 10-10 收成两层、★ 第三十一轮 10-12 用户改判回三层):① TTL(设置页那一档,出厂 24 小时) ⇒ 这一期内一发都不问,连验证器都不问;② 过档那一问走条件请求(元数据与 README 各带自家 If-None-Match,原样转发弱标 W/"…";验证器只存两格、不设长度上限,截断的钥匙永远换不回 304);③ 手动「重新取一次」裸发全量(?refresh=1,一个字都不喂 prev)。失败档 5 分钟(不进设置页),同人连点两下在途去重,界面还如实显示「这一小时还剩几次」。
★ 出网账(第三十一轮改口的就是这一条):TTL 内点开同一个仓库 = 0 发;过档那一问若正文没变 = 2 发各回 0 字节、单发 ≈100ms、但配额照扣 1 —— 官方文档那句「304 不计入速率限制」被本机 9 发匿名探针推翻(§9.1 那张表),★ 这条实测正是"为什么不能每次点开都问"的依据(匿名档 60/小时下,每次点开都问会把一小时压成约 15~30 次点击;已认证那一档本机零样本,用户裁定「不测,边界如实登记」);⚠️ 代价也照实登记:不回源就不知道 README 改了,正文最长滞后 = 用户自己选的那一档。唯一一条 TTL 例外:库里那一行自称中文 README 那一档还没探完(zhProbed 缺或 false,第三十轮那半截结论)⇒ 过档那一问必须真出网重判,否则中文那一档要等满 24 小时才自愈、第三十轮那条修复当场白做。
两个时刻各有各的说话权:at 只在真拿到正文时推进、checkedAt 每问必推 ⇒ 那句落款念「正文取回于 3 天前 · 刚核对过」(那两截词来自 domain,客户端不造缺位符、相对时间仍由浏览器算,§8.10);★ 第三十一轮把「刚核对过」收窄成只在真核对过那一问才念(cached === true 时恒 false ⇒ TTL 命中那一屏只有第一截,屏上不许出现"第三截"那种东西)。⚠️ TTL 判的是 checkedAt(缺这格的老行回退 at)—— 判 at 会让"最省额度"那一类行(304 后 at 是刻意冻住的)每次都出网,那正好把用户要的东西反着做。★ 第十一轮的 zh_section 那一档不在这个数里加东西:默认篇是外文时,先在已经在手的那份整篇 README 里找中文小节(零额外请求,那条路实测 3 发封顶),找到了就不再往现译那一路派活;「仓库自己写的描述本身就是中文」(descSelfZh)同理;★ 第十九轮的第三道闸门同样不在这个数里加东西 —— 它吃的是要派出去的那段节选(/readme 那一发已经回来的字),既不许多打一发去猜路径,也不新增载荷键或存储字段 ⇒ 三闸门省的都是翻译那本账,GitHub 这本账一克没动。详情读的是仓库自己写的话(description 两路中文都没有时那句原样标「原文,未翻译」—— 开关关着、那一档发不出去、或接口答错了都落在这档),命中内置离线词表时多一句人工预译的中文(带来源与时间戳,原文照给,见上面「描述列中文」那条与 docs/design-spec.md §8.2),现译命中时同理(落款是「<这一行当初是谁译的> · <时刻>」,原文同样照给,§8.3 / §8.4)。
★ 第二十二轮(10-08)起这本账有两处:详情那一路仍是「一次点击最多两发 = 描述 + 摘要」,榜面那一路新增「一轮检查后最多 12 发、同时在途 2 发、只补描述那一档」(用户裁定的额度闸门)。
★ 10-10 起榜面那一路分成两组,但 12 发仍是共享的那一份:全站高星 那一档开着(prefs.allStarsEnabled === true)时它那一批行也进补译的参与集合,排序上榜面先吃饱、全站那批排在后面(两个 rank 不同轴:榜内名次 vs 全站名次)。真机口径(脚本回算,不是估的):库里那一批发 30 行,其中 2 行本来就在三榜可见切片上(所以旧版那两行有中文)⇒ 本轮新并入的参与行是 28 行,ceil(28 / 12) = 3 轮才补齐,按生效的 intervalMin = 60 ≈ 180 分钟。★ 这笔支出花的是翻译那本账(host_llm 那一路连 HTTP 都不打),GitHub 的 REST 与 search 两本账一克没动;关掉那一档 ⇒ 已攒下的译文仍躺在 trans 表里,只是不在参与集合里所以不上屏,重开立刻上屏且不重烧额度(那是这一档"开关"的真实代价形状)。
★ 读路径恒零发 —— 打开面板、重开面板、SSE 首帧都只读库不算活 ⇒ "面板开合"这个动作一发都不花钱,配额严格按检查节拍花(出厂 60 分钟一轮,手动「重新取一次」也算一轮)。
★ 第二十八轮(10-10)起,那两本账之外多出第三本,而且它是用户按下去才开的:详情弹框 self 段段名那一行右侧那三枚常驻按钮 —— 展开全文 = 1 发 GitHub(整篇裸取,一个字都不带验证器、不落库、也不受详情那一档 TTL 挡:那一发要的是正文,不是"问一次有没有变");译整篇 = 1 发 GitHub + 最多 40 发翻译/模型(段落边界分块、同时在途 2 发、到 MANUAL_LEG_MAX 闸就停手并把已跑的拼回去);整篇摘要 = 同一本账,但预算先扣 1 发留给末尾那一发汇总 ⇒ 块最多 39、汇总恒轮得到、总发数 40 封顶。★ 这三枚不受设置页那两个开关管(用户原话「不受参数设置控制」),但照吃就绪态与能力位:没选引擎 / 那家云凭据没填 / 宿主没给句柄 / 这一档不会摘要 ⇒ 置灰并说一句各自的话(四形四句,不许互相冒充)。⚠️ 上面那句「读路径恒零发」一字未动 —— 手动这一路是写(POST /api/repo/readme),只有按下去才出发,渲染期一个字节都不派。
闸门的闭嘴形状各有名字、各有判据:那一路没接(no_engine)/本地库不在(no_store)/开关关着(off)/引擎没就绪(unavailable)/账本读不出来(read_failed ⇒ 整轮作废,不是当新行重烧 12 发)/屏上全命中(nothing)。
★ 第三十二轮(10-13)多出第四个写入口(POST /api/fav,那枚 ☆),而它是这本账上唯一一本"零出网"的:收藏那一刻的五格读数(显示名 / 描述 / 语言 / 语言色 / 星数)全部由宿主从本地四张表派生(favSeedOf 的查找序 = 屏上那几屏的顺序:三榜切片行 →「全站高星」那一批 → 榜史 seen → 详情缓存 repo 表),★ 第四路刻意读表而不是读 repoService.load() —— 后者会在 TTL 之外真问 GitHub 一发,而这一趟的出网账钉的是 0。四路都没有 ⇒ 那一行照落库,出处念「详情」、四格在屏上是 —("本机一个读数都没见过它"的实话,不是缺格)。这一路同时不派现译(★ 第三十三轮改口:那一屏的描述格摆的是本机已有的那一份中文 —— 内置预译或库里已付过额度的现译,命中判据吃榜面那同一个函数;「不派」这一半一个字没动,读它不花一分钱,也永远不欠一次请求)、不写 events(流水的判据是"榜变了什么")。
★ 10-06 之后这里多出第二个出网账:现译开关开着且内置表没命中时,那一句会交给设置页选中的那一档(一次点击最多两发 = 描述 + 摘要;★ 第十五轮曾把翻译四档砍成只剩描述那一发,第十七轮(10-07)用户改判放回 ⇒ 五档又都吃满这个上限,那道能力声明 kinds() 与源侧闸门都还在(★ 第十九轮又补一道,见上面那条))。五档里只有 宿主模型 那一发不打 HTTP(走宿主自己的模型连接与额度);
免费接口 / 百度 / 腾讯 / 阿里 那四发是插件自己经同一份 net.js 出的网(代理仲裁与 15s 超时都不另建一套),打的却是另四个域名(translate.googleapis.com / fanyi-api.baidu.com / tmt.tencentcloudapi.com / mt.aliyuncs.com,白名单由 TRANSLATE_ENDPOINTS 派生成 TRANSLATE_HOSTS,判据不手抄清单)
⇒ GitHub 那一域的配额五档都不占(★ 第二十一轮之前那句写的是「那 60 次/小时」;现在那一域是"匿名 60 那一档,填了令牌则是按账号那一档",但翻译那四发一格都不占这件事没变),运行环境 与页脚那句配额说的还是 GitHub 那一头,跟翻译成没成是两条独立的线(别在文案里混成"配额用完了所以没译出")。判据与口径见 §8.3 / §8.4。
★ 全程只读 GET 这条铁律一个字没松:腾讯云与阿里云那两路接进来用的是它们官方签名里能走 GET 的那一档(腾讯 v1 签名把参数放查询串、阿里 RPC V2 是查询串签名),
所以改判的是"翻译域的查询参数里允许出现厂商标识符"那一格,不是 method。★ 后半那句「也不是 GitHub 那一域的零凭据」第二十一轮就地改判(原句留着当历史):现在写的是「默认零凭据 —— 库里 ghToken 空着(出厂态)时那一域一发凭据头都没有,与旧版逐字节一致;填了才带一条 Authorization,只进请求头、绝不进 URL,且只给 api.github.com 的详情那一路」;cookie / client_secret / access_token 三类头全域仍然一律禁(判据 hc-7 按域收窄成三道硬界,逐条证伪见 §9.2 第二十一轮)。
探针实测的三件事决定了解析器的形状(完整读数见 docs/design-spec.md §9.1):
- 每个数值 span 前内嵌约 700 字符的
<svg>⇒ 锚点必须跨</svg>取文本,定长窗口会静默取空。 - 未登录页每行都带
/login?return_to=…的 star 按钮 ⇒ 仓库名必须从<h2起找,不然每个仓库都解析成login。 ?since=bogus不报错,逐字节返回日榜;语言 slug 不存在也只给 200 + 0 条 ⇒ 白名单与「空榜 / 无效语言」的判据(<title>念没念语言名)只能守在宿主侧。
因此:
| 情况 | 面板表现 |
|---|---|
| 某一榜本轮抓不到 / 解析失败 | 该榜卡就地写「故障 · <原因>(显示 <多久> 前的上次成功数据)· 已连续 N 轮」,行数据冻结在最后一次成功轮,其他两榜照常 |
| 连不上 / 超时(传输类) | 先补发(同榜最多 3 发),仍不通则卡上多一条来源提示,按最近那一发的实际路线说:经代理 http://127.0.0.1:7897 未通 / 直连未通 / 配置坏到根本没出网(三种情况绝不并成一句「网络不通」);同时写明「下次自动检查 X 后」 |
| 代理地址填错 / 解析不出来 | 记为配置错误(不补发、不静默回落直连),榜面冻结在最后一次成功轮,运行环境 · 传输路径 一行红点写明原因 |
| 语言 slug 站点不认 | 记为配置错误(不是源故障),但仍然冻结该榜并写清原因;保存时直接 400 拒收 |
| 语言合法但这一档今天没榜 | 合法空榜:ok=true + 「这一档今天没有上榜仓库」,不冒红点 |
| 条件请求拿到 304 | 只推「最近取回」时间,榜面数据时间不动(304 只证明整页字节没变,"今日新增"是累计值) |
| 点详情时 api.github.com 给 404 / 限额用尽 / 传输失败 / 配置坏 | 四种各给一句话(REPO_ERROR_LABELS + 接口原话),榜面照常;失败行 5 分钟内复读同一仓库不再出网,免得把坏名字刷爆额度 |
详情在设置页那一档 TTL 内再点同一个仓库(★ 第三十一轮:那一档摆回来,第二十七轮的固定 60 秒窗口 DETAIL_RECHECK_MS 整键删掉;⚠️ 第三十轮那句落款第三截「· 60 秒内没再问 GitHub」跟着撤,词表回两格) | 载荷标 cached: true + ageMs,连验证器都不问、这一问 0 发出网 ⇒ 底部那句配额读数不往下走;落款只念第一截「正文取回于 <多久> 前」,revalidated 恒 false(这一问压根没核对过,念「刚核对过」就是谎);★ 唯一不受这一挡的成功行是 zhProbed 不是 true 那一类(见下一行的例外);重取走 ?refresh=1 —— 它绕过缓存且一个字都不带验证器(带着旧 ETag 去问就大概率换回 304 的老正文,那颗按钮写着「不走缓存」就会说谎) |
| 点开详情、已过档且仓库一个字没改(★ 形状 B 自第二十七轮起在,★ 第三十一轮起这一支只在"过档那一问"才走到) | 照样出网 2 发、各回 0 字节(≈100ms,配额照扣 1),载荷 revalidated:true ⇒ 底部那句念「正文取回于 <上一刻> · 刚核对过」,正文沿用本地那一份、一个字没换;README 变了才走满 2~4 发;★ 没带钥匙却回了 304(中间代理 / 接口改版)⇒ 当场裸发重问一发,绝不把空正文端给界面;⚠️ ★ 第三十轮那道例外在第三十一轮升格成 TTL 的例外:库里那一行若自称中文 README 那一档还没探完(zhProbed 缺或 false —— 上一版把探测那一发超时/5xx 留下的半截结论连同整行一起冻住,用户每问一次都命中同一个「没有中文版」),freshEnough() 直接判假 ⇒ 这一问一个字都不喂验证器、裸发四发重判一次,探完才写回 true ⇒ 代价是一次性的,三问内回到 0 发(TTL 命中);⚠️ 那一格的口径不许写成"来过 probeReadme 一趟就算探完"(那是把同一个冻结换个地方继续冻),八形逐形钉(六 true 两 false) |
| 三榜连坏 | 节拍按 2^N 翻倍退避,指数封顶 4 轮、绝对封顶 4 小时;任何一榜成功即归零。(2026-10-05 真机改造前:启动抖动连坏三轮,未封顶的指数退避把下一轮推到 24 小时,面板一整天空着。改造后同一场景实测 backoffExp:1 → effectiveMs 顶到 4 小时,第三轮自愈) |
宿主没有 ctx.storageDomain / 存储域 open 失败 | 榜面照看,能力位与状态卡如实写「变化史留不下来」。绝不谎报存储在位 |
安装
⚠️ 当前状态:页签化 + 传输补发 + 插件内代理隧道 + 仓库详情(数据源与详情对话框)+ 描述列内置离线预译 + 模型现译(C)+ 现译引擎五档(D,第九轮三档、第十轮扩到五档并接上腾讯 / 阿里云)+ 自带中文探测与结构化段表(A,第十一轮)+ 详情屏撤废话与详情缓存时长可配置(第十二轮)+ 名次徽章分档(第十四轮)+ 节选与判据窗口分家 / 句子边界收口 / 摘要能力跟着那一路 / 语言切换行找中文 README(第十五轮,★ 其中「摘要能力跟着那一路」已被第十七轮用户改判放回)+ 回执带上厂商请求号 / 同屏一条失败句只念一次(第十六轮)+ 摘要现译放回来(第十七轮)+ README 有中文就不派摘要(第十八轮,闸门本就在)+ 屏上那段节选里已有中文也不派摘要(第十九轮,★ 同一轮"库里那条旧译文行删"那一件没做成** —— 删掉后被在跑的宿主写回,要等宿主关掉重删)+ 多份中文篇并存时挑简体那一份(第二十轮)+ 设置页 GitHub 令牌那一行 / 详情配额那句跟着 GitHub 自己回的那一格(第二十一轮,★ 这轮动的是文首那条铁律的"不带 key":改判为默认零凭据 + 填了只进请求头)+ 榜面描述列接上现译(第二十二轮,★ 这一列从此是「内置预译 + 每轮检查后补的现译」两种来源并存)+ 明星这一屏(第二十三轮:第七个页签 + 形状 B 薄快照 + 那一发的闸门与落库)+ 点「开」的那一刻默认拉一次(第二十四轮)+ 检查间隔之内已经成功取回过就不重发(第二十五轮)+ 全站高星那一档接上描述列现译(第二十六轮,★ 与榜面共享每轮那 12 发、榜面先吃饱)+ 详情改条件请求 / 固定 60 秒防连点 / 撤掉「详情缓存」那一档(第二十七轮,★ 本轮把「隔多久才肯再问」从"按设置页那一档"改成"每次点开都问、只问验证器";⚠️ 第二十七轮那两件事已被第三十一轮用户亲手改判:条件请求留下、"每次都问"换成"过档才问"、60 秒窗口整键删除)+ 详情弹框那三枚手动按钮:展开整篇 / 译整篇 / 整篇摘要(第二十八轮,★ 第一条由浏览器发起、当场花模型额度的写,也是「不受参数设置控制」那半句的落地)+ 面板选中态落盘:切走再回来还在原页签、原档位(第二十九轮,★ 只动浏览器半边 client.js —— 宿主 main 那个 keyed 席位切走就是整棵树重建,而选择态里躺着的东西不该进库、更不该进快照)+ 中文 README 那一档不再被 304 冻住 / 摘要那一发不再被"推测有中文"挡掉 / 60 秒防连点窗口命中那一屏有可见结果(★ 第三十轮,你那两问「1.我开了摘要现译,这个点开没有翻译;2.截图里写着有中文,为什么没有拉取到中文版」—— 修法是让库里那一行说自己"探完了没有":repo 表追加 zhProbed 那一格(口径 = 判定输入齐了才算探完),缺或 false ⇒ 下一问一个字都不喂验证器、裸发重判一次,探完写回 true ⇒ 代价是一次性的;另两处是闸门只认屏上真中文,与那句落款补第三截「60 秒内没再问 GitHub」;⚠️ 那第三截已被第三十一轮撤掉)+ 详情缓存那一档摆回来(默认 24 小时 / 四档可调)· 固定 60 秒防连点整键删除 · TTL 之内连点 0 发 · zhProbed 那半截结论不受 TTL 挡(★ 第三十一轮,你那句「我说还是改成以前那种模式,默认缓存24小时,可以配置,听不懂吗,不要用60秒这种」—— 这是你亲手撤销自己 10-10 那次撤档裁定的改判,不是新功能;落款第三截跟着撤、词表回两格,「刚核对过」收窄成只在真核对过那一问才念)+ 项目收藏:那枚 ☆ 三处入口 + 第八个页签「收藏」+ 第八张表 fav(★ 第三十二轮,你那句「增加一个项目收藏功能」—— 三条形状是这一屏的骨架:存的是收藏那一刻的快照而不是引用(星数与描述不随榜面刷新,所以表头念「那一刻」、卡脚那句 note 把这件事说白)⇒ 打开那一签与点那枚 ☆ 都恒零出网;「这一轮」那一格是宿主本地比出来的成品句(三榜 → 明星的优先级、单值、比键时把 ★ 第三十五轮整条作废(用户裁定「去掉这个」⇒ 那一列连同 domain 那四个名字、renamedFrom 一起铺进去 ⇒ 改名后不把"在榜"念成"未上榜")favView 的三档原料入参一起撤,屏上七列;这三条形状只剩两条,另立新立的那四读与判据出处见上面第三十五轮当前读数与本节第 419 行那条);那一行的五格读数由宿主派生(favSeedOf 四路读本地表,浏览器只递 {repo, action});收藏不裁行、不设上限、不参与 LRU),这几件已过 626 项用例(★ 口径:含那两条要真出网的;SKIP_LOCAL=1 下是 624 过 / 2 跳;套件 15 → 16)(★ 第十三轮把基线从 356 推到 357(差的那一条是事故补的回归判据)、第十四轮推到 358、第十五轮推到 368、第十六轮推到 371、第十七轮推到 372、第十九轮推到 376、第二十轮推到 378、第二十一轮推到 391、第二十二轮推到 415、★ 第二十三轮推到 494、第二十四轮推到 504、第二十五轮推到 514、第二十六轮推到 521、第二十七轮推到 530、★ 第二十八轮推到 565(套件 14 → 15)、★ 第二十九轮推到 568(套件仍 15,差额 +3 全在 client 66→69)、★ 第三十轮推到 573(套件仍 15,差额 +5 分两套:repo 101→105 / client 69→70)、★ 第三十一轮推到 574(套件仍 15,差额 +1 只落 repo 105→106)、★ 第三十二轮推到 626(套件 15 → 16,差额 +52 分五套:store 47→57 / api 89→99 / client 70→77 / host-compat 21→22 / 新开 favs 24))(★ 口径更正:跑测器 test/_helpers.mjs 数的是用例(check)条数**,不是 assert 条数,旧文档写"项断言"是把这两件事混成一件了;10-07 10:0x 本机复跑:SKIP_LOCAL=1 下 354 过 / 0 挂 / 2 跳,那两条跳的是要真出网的口径(hc-17 与 wt-27);不带 SKIP_LOCAL 那一份是 355 过 / 1 挂 / 0 跳,挂的是 wt-27 免费接口真出网那一发回 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)条数不变、内容改判;这一件过真机(图 6870 + 第二路真回包 + 配额 55→51 那一屏四发),逐条读数见下面第十二件那条与 §9.3 第十五轮;★ 第十四轮欠的那张活宿主名次徽章屏仍未截 ⇒ 还挂在那条清单上)
(★ 第十六轮(10-07,两件旧账收尾:30 次点击到顶;已认证那一档(5,000/小时)本机零样本,按第三条裁定原文「不测,边界如实登记」,不写成"验过";
② ★ 那两个时刻不合并成一格: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-0810-10):四件功能 + 一次撤档 = 明星这一屏(形状 B)/点「开」的那一刻默认拉一次/检查间隔之内已经成功取回过就不重发/「全站高星」那一档接上描述列现译/★ 第二十七轮详情改条件请求(用户那句「只有有变更时才重新获取,没有变更还是用本地缓存的」+「按你推荐的 B」)并把「详情缓存」那一档整个撤掉(裁定原文「撤掉这一行,改成固定 60 秒防连点」)。逐轮读数、差值、证伪电池与病历都在下面「测试」那节(基线 415 → 494 → 504 → 514 → 521 → 530 项;电池 8 + 14 / 9 / 9 / 9 / 13 条各拿到全部失败信号),这里只记三条口径级的账:
① ★ GitHub 文档那句「304 不计入速率限制」被本机 9 发匿名探针推翻(tmp/probe-detail-304.txt,零凭据、零落库)⇒ "每次点开都问"的真实代价按次数计而不是按字节计,匿名那一档一小时约 15at = 上一次真拿到正文(两发都 304 就沿用库里那刻)、checkedAt = 上一次问过(每问必推,含 304)⇒ 界面那句「正文取回于 3 天前 · 刚核对过」两截各有出处(先例是 state 表的 at / lastFetchAt,§8.10 那张表逐格写了"能说什么 / 反例");
③ ★ 撤一格偏好要沿一条链撤五个点(domain 那三个名字 + DEFAULT_PREFS + prefsRecord 声明 + clampPrefs 名单 + index.js 的接线与 prefsView 初始格 + api.js 的 400 校验 + hc-11 键表 + 设置页那一行与 hc-20 那条正则)⇒ hc-20 当时扫的是"代码位一处都不许认得那个撤掉的键",留一条"读得到但摆不出来"的库存就是第二份真相;删格方向由 tmp/probe-schema-drop.txt 实测安全(未声明的多余键被 schema 静默丢弃)⇒ 零迁移、域 version 仍钉 1。⚠️ 第三十一轮把这一条验成了双向:摆回来走的是同一条链、五个点反向,一处不落(hc-20 那条正则因此从"认不得那个键"翻成"认得那条 TTL 链 + 认不得 DETAIL_RECHECK_MS")—— 链是同一把,方向不挑人。
★ 10-10 用户重启 dsh desktop 后走完第二十六轮那四步并回报「全部符合预期」(⚠️ 口头读数、无截图;ceil(28/12)=3 轮 ≈180 分钟那个完整读数没等满)⇒ 那一屏逐轮变中文的形状、关掉退回原文而 trans 表不删、只有全站那一档欠账时榜面不念那句故障话,三条各对上一条活宿主读数;⚠️ 第二十三二十五轮那三屏 + 本轮那一屏四读(设置页那一行没了 / 那句「正文取回于 …· 刚核对过」/ 60 秒内连点 0 发 / 那颗按钮真的重新出网)仍挂 §9.3 —— 本轮动的是宿主半边 第七轮(第四轮定时器崩溃、第五轮列宽、第六轮内置离线预译、第七轮模型现译,下面几段各记一件),逐轮记账都在 §9.3。第一轮含一次真故障往返:三榜连坏三轮时界面读到 index.js + lib/** 与浏览器半边 client.js ⇒ 要你再重启一次才看得见;我不替你重启、没动你的 prefs、没动库存行、也没替你点过详情弹框。⚠️ 那四读里的第一读(「设置页那一行没了」)与第三读(「60 秒内连点 0 发」)已被第三十一轮改判 ⇒ 那两读从此作废,改读「那一行摆回来且能改」+「TTL 内连点 0 发、配额读数不动」,见本轮那条。
(★ 第二十八轮(10-10,你那条「1.加一个按需展开,下次点开支持重新加载README,最好是加个按钮;2.加几个按钮,英文文档支持点击翻译和对整篇文档生成摘要,……不受参数设置控制」,附 cathrynlavery/diagram-design 那张详情截图):详情弹框 self 段段名那一行右侧多了三枚常驻按钮(展开全文 / 译整篇 / 整篇摘要),三条裁定落地成 「分块跑完整篇 + 熔断」+「存结果 + 原文指纹」+「常驻,不该点时置灰并说明」。
★ 立论前提是整篇早就下载完了(1,492 字是在落库之前砍的)⇒ "全量加载"在出网侧零增量,代价全在存储与载荷,所以整篇正文一个字都不入库、每次动作自己裸发那一发(★ 一个字都不带验证器:带了就大概率换回 304,而 304 的正文是 0 字节,那一屏展不开 —— 与第二十七轮那颗「不走缓存」的按钮同一个坑)。
★ 手动绕的是设置页那两个开关,不绕就绪态与能力位:lib/services/llm.js 的 enabled() 因此从两行改成三行(第一行 MANUAL_KINDS.includes(kind) ⇒ true),少了那一行 readmeFullZh 就会被 llmDesc 那个设置页上根本不存在的开关管住;免费四档 SERVED_KINDS 补 readmeFullZh 但不声明摘要 ⇒ 那枚在免费档置灰,那句是「这一档只会翻译,不会摘要」而不是「开关没开」。
★ 一趟只落 trans 一行:分块那几发恒 persist:false(27 行分块会把榜面那两路的复用行挤出 TRANS_MAX=200),src 存的是整篇指纹(sha256 前 16 位 + ':' + 字数)而命中判据「主键 + src 逐字相同」一个字没改 ⇒ README 换版本、旧译文自动作废;整篇译文超 MANUAL_FULL_ZH_MAX = 30,000 字整份不存(截一半的"已存"是假话)、schema 与域 version 照旧 1、零迁移。
★ 新增 POST /api/repo/readme 是第八条路由、第四条被回环闸门拦下的,也是第一条由浏览器发起、当场花模型额度的写(最多 40 发出网 ⇒ 它自己在路由上标 loopback:true,不许只靠"是 POST 就闸"那条顺带规则);结果走载荷那一整格 manual({section, runNote, actions, sections},命名统一吃 kind)不走客户端 state ⇒ 关掉弹框不丢。
基线 530 → 565 项(口径沿用从前:含那两条要真出网的,=563 过 + 2 跳)、套件 14 → 15、SKIP_LOCAL=1 下 563 过 / 0 挂 / 2 跳(过的那一边净 +35:新开 full-readme 19 + repo 96→101 + api 83→89 + client 63→66 + llm 19→20 + web-translate 28→29,store 47 条数不变、就地补断言;两个来源回算同值,逐套与全文 ^ok 各数一遍);
电池 tmp/r28-manual-falsify.mjs 15 条 / 未抓到红 0 条 + [还原 ok] 4 个文件跑完逐字节等于进来时。★ 首跑两条"全绿 = 判据空跑"都登记(同 r22 那条律:漏网有两种):指纹那条的第二趟换了新库 ⇒ old 恒为 null、变异体与原判据走同一条路(改成同一副替身改正文 + 复用同一副库);展开覆盖两块那一条的夹具恰好与段表同序 ⇒ "按下标"与"按 kind"等价(夹具改反序 + 补一条段内位置断言)。
★ 本轮抓出的不是回归、是一处隐式耦合:full-readme.js 里 runOnce 落库前自己小写、readRows 却把保留大小写的键交给表,靠 lib/stores.js 内部再归一一次 ⇒ 生产没坏,但同一张表的键形状有两处出处;是冒烟那颗不做归一的替身表把它照出来的(tmp/r28-smoke.txt)。⚠️ 它没进电池:真表会归一 ⇒ 两种写法在真设施上逐字等价,拿它做变异只会得到假绿,如实登记为等价改动。
⚠️ 收尾那一遍另修三处台账自身与文案的不实(都在盘上回算过,不是顺手改字):① 那三条新写的详情判据短号撞了既有的三条(client-56/57/58 各出现两次;全名不重 ⇒ 跑测器与 pass 66 都看不出,但本仓指判据认的是短号)⇒ 改号 client-64/65/66、电池四发期望串跟着换、整把十五发重跑(红数逐发与撞号前相同、实名变了:⑮ 那九条是 client-41/43/45/50/51/53/55/57/64,其中 client-57 是第二十一轮那条配额句 ⇒ 三枚按钮的形状与段表直通是同一块地基);撞号前那份留在 tmp/r28-falsify-out-before-rename.txt。② 详情载荷出边界那格 README 一直写着第十一轮的 21 键 ⇒ node -e 现算钉回 23(挂上 manual 那一整格是 24,且只在 ok:true 那一支)。③ GH_TOKEN_REGISTER.quota 那句里「本机没有 GitHub 账号可验」是把本机状态摆进通用 UI,且已被 10-10 盘上读数证伪一次 ⇒ 撤掉那半句(判据吃的是常量不是手抄句子 ⇒ 零用例改;改完全量重跑同数:15 套 pass 563 / fail 0 / skip 2,第二来源 ^ok 563 同值,读数 tmp/rerun-r28-postfix.txt)。
⚠️ 本轮零真出网、零截图:19 条编排用例吃的都是合成正文与替身翻译,真机欠账两条挂在 §9.3(① 展开那一发真的不带验证器 —— 活宿主上看一次 GitHub 回 200 而不是 304;② 免费档那枚「整篇摘要」置灰的话在屏上念得出来)。你的 prefs、库存行、dsh desktop 一个字都没动、没替你重启)
(★ 第二十九轮(10-12,你那条「切换了tab后,右侧面板选择的东西就没了」):面板选中态落 localStorage(三枚 id:tab / starsView / starsSort)。
★ 定性靠宿主安装包的盘上行号,不靠猜(tmp/host-asar.mjs 从 app.asar 只读抽出三个包到 tmp/host-asar/)⇒ 这是两条独立的根因:路 1 = 插件内切签,client.js 那一片条件渲染换签即卸载旧卡片,而全插件只有 StarsCard 带内层选择态 ⇒ 切一次签,明星那一屏的视图档与排序档回第一档;路 2 = 切宿主面板再切回,dsh-client-ui-layout/lib/client.js:118 把 main 做成 keyed 席位(entryKey = activePanelId)、dsh-client-ui-renderer/lib/client.js:1153-1156 只渲染 options.key === entryKey 的那一条 ⇒ 整棵 GhTrendingPage 重建,而 keepMounted 那条保活(dsh-client-ui-sidebar-right/lib/client.js:5522)只给右侧栏 tab 席位,本插件走的 sidebar.panellist + main 不在其上 —— 不是宿主疏漏,是分席位。
★ 形状:只落 id、生效档在渲染期现推。读回走单点 pickOption(名单, 存的 id, 出厂档):认「在册且未禁用」(关掉那一档时库里那份旧 id 自动回落名单第一档,与「关掉把人送回第一档」共用同一处判据,不另立一条);不在挂载时一次定(首帧没有载荷 ⇒ 那一刻会把存的那一份判成"不在册",载荷到位也回不去,电池第 ⑧ 发钉的就是这一形);读写各包一层 try/catch(隐私模式 / 配额写满 ⇒ 界面照旧在内存里用,与宿主 README 自己那句「存储失败时,当前布局仍可在内存中使用」同口径);键名 ${PANEL_ID}.ui.v1 跟着载荷的 panelId 走(不手抄,client-68 ⓪ 两条断言)。
★ 明确不落盘的三样:设置页那份草稿(proxyUrl 是草稿态、点「保存」才发,落盘等于把"未确认的输入"变成"下次自动用它")、详情弹框那一份(重开白发一发出网)、四把密钥(client-68 ⑤ 用 domain 派生的 PREF_SECRET_KEYS 钉「存串里一个密钥键名都不许出现」,其余偏好键也一律不进)。
基线 565 → 568 项(套件仍 15、SKIP_LOCAL=1 下 566 过 / 0 挂 / 2 跳,过的那一边净 +3 且全部落在 client 66→69,其余十四套逐套同数;两个来源各数一遍又对上:全文 ^ok 566 / ^FAIL 0 / ^SKIP 2,另 git diff -U0 -- test/ | grep -c '^+check(' = 3 = 净差值);
电池 tmp/r29-ui-state-falsify.mjs 10 条 / 未抓到红 0 条(红总数 12:④ 与 ⑧ 各红 2、其余各 1)+ [还原 ok] client.js 跑完逐字节等于进来时。★ ⑨ 首跑「全绿 = 判据空跑」并登记:那一发改的是 UI_KEY 字面量,而用例读的 UI_KEY 来自同一份导出 ⇒ 两侧一起动、判据看不见(漏网第一种:判据吃被测常量本身),补 client-68 ⓪「键名跟着载荷 panelId」两条后才有失败信号。★ 等价变异 1 条如实登记:pickOption 里 arr[0]?.id ?? fallbackId 改成直接 fallbackId —— 三个调用点的出厂值与名单第一档逐字相同,抓不到红。
★ 一处既有判据改判(不是回退源码):client-62 ③″ 旧写法是硬塞 view='allStars' 去验「开关关着却停在那一档 ⇒ 退回原文」,而落盘之后这一形成了每次重挂都会遇到的输入、被名单校验挡掉 ⇒ 改判为「关掉 ⇒ 回落名单第一档、列数跟着回落、那一枚照旧灰着摆着」;「客户端不许自己拿 transRows 补中文」那半仍由同条的 ②③③′ 三头钉着。
⚠️ 本轮零真出网、零截图,且只动浏览器半边 client.js(index.js 与 lib/** 一字未动)⇒ junction 挂载下不用重启 dsh desktop,刷新面板即生效(本机对账:宿主五个 DeepSeek Harness 进程同为 10-12 08:50:10 起、client.js 09:21:29 落盘 ⇒ 现在跑着的那一份还是旧的,刷一次就是新的);真机欠账一条挂在 §9.3(切走宿主面板 / 切签再回来还在原页签与原档位 + 禁用存储时界面照旧)。你的 prefs、库存行、dsh desktop 一个字都没动、没替你重启)
(★ 第三十轮(10-12,你那两问「1.我开了摘要现译,这个点开没有翻译;2.截图里写着有中文,为什么没有拉取到中文版」+ 追问「多点几次详情会重新去 GitHub 拉取,并没有缓存 24 小时」):这是第一轮"修 bug"而不是"加功能",三处落点与三条定性(全文取证在 spec §8.13):
★ 定性一(缺陷):中文 README 那一档被 304 冻住 —— 第二十七轮抽 probeReadme 时那句注释写的是"判定输入就是 README 正文,正文没变 ⇒ 结论不会变",这句漏了前提:结论还依赖插件自己的探测走到哪一步。真机 debpalash/VoiceStudio 的现场是「中文篇那一发超时 ⇒ 库里落下 en_default 这半截结论 + 两把验证器齐着 ⇒ 此后每一问都 304、整条探测跳过 ⇒ 永远翻不出中文」(tmp/r30-probe-zh-file.mjs 走产品函数两趟复现:第一趟 4 发裸取能翻对,第二趟 2 发全 304 就冻住了)。修法只有一条形状:让库里那一行说自己"探完了没有" ⇒ repo 表追加 zhProbed: optionalBool(追加键一律 optional、域 version 恒钉 1、缺格的老行与 false 同义 ⇒ 零迁移),load() 的 prev 闸门多一条 ⇒ 代价是一次性的(多两发),三问内收敛,不是"从此每问四发"。⚠️ 口径不许写成"来过 probeReadme 一趟就算探完"(那是把同一个冻结换个地方继续冻)⇒ 八形逐形钉(六 true 两 false),电池 ② 打掉这一条时两条判据一起红,是本轮最重的一发牙。
★ 定性二(缺陷):摘要那一发被一个推测挡掉 —— 第十九轮那道闸门认的是 cjk(节选里真躺着中文)∪ lang(那行写着有中文版)。lang 那一支在派活这一侧从不起作用(推测兑现的仓库档名会落在 zh_file / zh_section,上面那道档名闸已经把它挡在那儿了),它唯一生效的现场恰恰是推测没兑现那一种 ⇒ 挡下来就是"屏上既没中文、也没摘要",而用户开了开关、点了详情、什么也没拿到(真读数:那 1,600 字节选里 CJK 只有 7 个)。⇒ 收窄成 .via !== 'cjk';⚠️ 段名后缀那两支照旧都给(那半句说的是关于这篇 README 的事实,与派不派活是两件事 —— 这一轮第一次把同一个 via 的两种用途分列,电池 ⑦ 钉的就是"顺手把段名也收窄"那一发)。
★ 定性三(不是缺陷,是没有可见结果):「为什么不缓存 24 小时」那一档是用户 10-10 亲手裁定撤掉的(4a80fd3,裁定原文「撤掉这一行,改成固定 60 秒防连点(推荐)」),且 60 秒内实测 0 发 —— 那一屏旧落款只念「正文取回于 刚刚 · 刚核对过」,被读成"又拉了一遍"。⇒ 补第三截「60 秒内没再问 GitHub」,只认载荷 cached;那个秒数在 domain 按 DETAIL_RECHECK_MS / 1000 现拼(hc-20 两头钉:domain 必须现算、client.js 代码位不许出现那个数)。⚠️ 这一条的定性已被第三十一轮推翻:10-12 那一问不是"缺一句可见话",而是用户不要那个 60 秒形状 ⇒ 第三截整截撤掉、DETAIL_RECHECK_MS 整键删;定性一与定性二(zhProbed 那一格与摘要那道闸门)照旧成立,且 zhProbed 在第三十一轮从"304 复用的例外"升格成"TTL 的例外"。
基线 568 → 573 项(套件仍 15、SKIP_LOCAL=1 下 571 过 / 0 挂 / 2 跳,过的那一边净 +5 分两套:repo 101→105 / client 69→70,另四处(api 那条整条替换、hc-11 词表、hc-20 的 prev 字面、repo 那条落库判据补一句)条数不变、就地改判;三个来源各数一遍又对上:逐套加总 571 = 全文 ^ok 571,另 git diff -U0 -- test/ 数 check( = 新增 6 删 1 ⇒ 净 +5;⚠️ "净差值 5"与"新增 6"是两个口径、不许混用);
电池 tmp/r30-zh-probed-falsify.mjs(圈 四个源:lib/services/repo.js / lib/api.js / client.js / lib/domain.js)11 发 / 未抓到红 0 / 等价变异 1 + 末行 [还原 ok] 4 个源文件跑完逐字节等于进来时(③「白名单漏那一格」一下红五条 = 那一格的四条律共用同一个存储出口)。★ 两条病历登记:① ⑪ 首跑红 3 条而不含目标那条(那条落库判据只钉 etag 与 checkedAt,schema 漏格在它眼里不可见)⇒ 补一句断言后整把 11 发重跑、红数逐发核对(③ 4→5、⑪ 3→4);② ⑤ 全绿 = 等价变异(readmeFieldsFromPrev 写死 true 与照原样带在盘上不可分辨,因为 load() 只把探完的行递进来)⇒ 不新增判据也不放宽电池。⚠️ 踩到跑测器自己的口径:SKIP_LOCAL=1 是按用例名含「真机」二字跳的 ⇒ 新那条最初叫「★★ 真机形状回归」被静默跳过(pass 104 / skip 1,全绿而不报错),改名「★★ 冻结那一形自愈(10-12 那两个读数)」后才真跑(它吃真夹具 + 合成档,零出网)。
⚠️ 本轮产品侧零真出网、零截图(取证 10 发全匿名、走系统代理,没吃用户令牌:curl 抓那三件 + 重放 4 发,r30-probe-zh-file.mjs 走产品函数两趟 6 发),且动的是宿主半边 lib/domain.js / lib/services/repo.js / lib/api.js 三份 ⇒ junction 挂载下要重启 dsh desktop 才装得上(client.js 刷新面板即可,但它只是第三截的显示层);四条判定性走查挂在 spec §9.3(⚠️ 走查前别清库、也别改偏好 —— 那两个 bug 的现场就在库里那一行)。另登记一处本轮没修、也没有判据的真隐患:lib/stores.js:213-214 按 at 裁 REPO_CACHE_MAX=120 行,而 304 命中时刻意冻住 at ⇒ 越省额度的行越先被删、删了退化成裸发全文(本机库里 13 行,量不到、拿不到失败信号)⇒ ★ 第三十四轮已修(裁行键换成「最后一次问过 GitHub」并复用 TTL 那把尺 domain.repoAskedAt,两条行为牙落进 test/store.test.mjs,形状与判据分层见 spec §8.17;⚠️ 第三十一轮那句"改回 TTL 后更难咬到"随之作废 —— 现在有牙,不再依赖真机现场)。你的 prefs、库存行、dsh desktop 一个字都没动、没替你重启)
(★ 第三十一轮(10-12,你那句「我说还是改成以前那种模式,默认缓存24小时,可以配置,听不懂吗,不要用60秒这种」):这一轮不是加功能、也不是修 bug,是用户亲手撤销自己 10-10 那次撤档裁定的改判回退(4a80fd3 删前那份是尺子:档位 / 接线 / 校验 / 界面四处逐字落回,不凭印象重写)。⚠️ 归因先记在自己账上:10-12 那两问(「为什么不缓存 24 小时」)我按"缺一句可见落款"处理成第三十轮定性三 ⇒ 判错了性质,他要的是行为回退,不是话术。三处新旧语义冲突各有裁定(D1 / D2 / D3,全文取证在 spec §8.14):
★ D1(TTL 判 checkedAt,缺这格的老行回退 at):304 命中时刻意冻住 at(正文没变就不该改取回时刻)⇒ 拿 at 判 TTL 会让"最省额度"那一类行每次都出网、而本机 9 发实测 304 照扣 1 次配额,那正好把用户要的东西反着做;freshEnough() 里那一句 const base = num(row.checkedAt) ?? row.at; 是这一条的落点。
★ D2(zhProbed !== true 的成功行不受 TTL 挡):第三十轮那一格从"304 复用的例外"升格成 TTL 的例外 —— 否则库里那半截结论要等满 24 小时才自愈、上一轮那条修复当场白做 ⇒ 代价仍是一次性的(过档那一问多两发,探完写回 true)。⚠️ 这一条例外不进设置页,屏上也不许多出一句专门解释它的话。
★ D3(落款回两截):第三十轮那第三截「60 秒内没再问 GitHub」整截撤,DETAIL_STAMP_LABELS 回到 {body, revalidated} 两格;「刚核对过」收窄成 ok===true && cached!==true && checkedAt>at ⇒ TTL 命中那一屏恒 false(没问过 GitHub 就不能说核对过)。
★ 形状两条:① TTL 之内一发都不问(连验证器都不问,配额读数当场不动)—— 这正是那句「不要用60秒这种」的正面落地;② 过档那一问仍走条件请求(第二十七轮那半件没撤:If-None-Match / 304 复用 / revalidated 全在),手动「重新取一次」照旧裸发全量、一个字不喂 prev。代价如实登记:不回源就不知道 README 改了,正文最长滞后 = 用户自己选的那一档。
★ 接线两条律照守:getTtlMs() 调用时现取现算(第十二轮那笔账:装配时锁死 ⇒ 界面已显示新档、真跑的窗口还停在旧值);DETAIL_RECHECK_MS 整键删掉,hc-20 从"代码位一处都不许认得那个撤掉的键"翻成"认得那条 TTL 链 + 认不得 DETAIL_RECHECK_MS"(同一条链反向走一遍,五个点一处不落 ⇒ 那条律验成了双向)。库里那格 repoCacheHours 从头到尾没真正消失过(第二十七轮只是让 open() 静默丢弃)⇒ 本轮改回 optionalInt 声明把它收住、POST 脏档照旧 400 拒收(它现在决定"这一问出不出网",不像那版走白名单丢弃),域 version 恒 1、零迁移(10-07 那条 requiredInt 血案律照守,电池 ⑦ 打掉它时红 2 条)。⚠️ 有意没恢复旧的 REPO_CACHE_TTL_MS 那个导出 —— 盘上没有消费者 ⇒ 恢复它就是第二真相。
基线 573 → 574 项(套件仍 15、SKIP_LOCAL=1 下 572 过 / 0 挂 / 2 跳,过的那一边净 +1 且只落在 repo 105→106(新那条钉"装配后改档、下一发就按新档判,不用重启宿主"),client 70 / host-compat 22 / store 47 / api 89 条数不变、就地改判;三个来源各数一遍又对上:逐套 pass 加总 572 = 逐套全文 ^ok 572(另 ^FAIL 0 / ^SKIP 2)= 源码 ^check( 574,读数 tmp/rerun-r31.txt + tmp/suites-r31/;⚠️ 含跳口径 = 过 + 跳,与"净差值"是两个数、不许混用);
电池 tmp/r31-ttl-falsify.mjs(圈 六个源:lib/domain.js / lib/services/repo.js / index.js / lib/stores.js / lib/api.js / client.js)10 发 / 未抓到红 0 / 等价变异 0 + 末行 [还原 ok] 6 个源文件跑完逐字节等于进来时(红共 11 条:⑦ 那一发红 2 条 = store 那圈把"schema 的 open 校验"一起照住了)。★ 首跑三发指向错套件、补完重跑:③ 那发(装配时锁死出厂档)最初圈 test/repo.test.mjs ⇒ 那套件不 import index.js,结构上不可能有失败信号(漏网第二种:判据在但拿不到红)⇒ 改指 host-compat(hc-20 那条静态接线)才算验成;另两发同族(client / store 各一处)跟着挪正后整把十发重跑。⚠️ 三处台账文案本轮一并改口:文首「一个必须先说清的口径」那三行、口径表里「60 秒」那两行、第二十八轮那句「不进 60 秒防连点那个窗口」⇒ 现在念「不受详情那一档 TTL 挡」。
⚠️ 本轮产品侧零真出网、零截图,动的是宿主半边 lib/domain.js / lib/services/repo.js / lib/api.js / lib/stores.js / index.js 五份 + 浏览器半边 client.js ⇒ junction 挂载下要重启 dsh desktop 才装得上;四条判定性走查挂在 spec §9.3(那一档能改 / 改档立刻生效 / TTL 内连点 0 发且底部配额读数不往下走 / 过档那一问走条件请求并回 304)。另:第三十轮那四条走查里「60 秒内连点 0 发」那一读判据文字已被本轮改写作废,改读上面第三条。你的 prefs、库存行、dsh desktop 一个字都没动、没替你重启)
(★ 第三十二轮(10-13,你那句「增加一个项目收藏功能」+ 原型那三条推荐全选、「可以」):第八个页签、那枚 ☆ 三处入口、第八张表 fav(形态取证全文在 spec §8.15,本轮落地与那八步的差口全记在 §8.15 末尾那张改口表里)。四条骨架,逐条都有判据:
★ 存的是收藏那一刻的快照,不是引用 ⇒ 星数与描述不随榜面刷新(表头因此念「累计 ★(那一刻)」、卡脚那句 note 把这件事说白,要新值点仓库名走详情那条链);由此推出本轮最硬的一条出网账裁定:打开那一签与点那枚 ☆ 都恒零出网(不为了补快照去问 GitHub),且不派现译、不写 events —— ★ 三件"不做的事"由 api 那一条用例上的四本计数器一起钉(出网 / 现译作业 / repoService.load 调用次数 / 流水条数),移出那一路同理。
★ 那一行的五格读数由宿主派生(favSeedOf 四路读本地表:三榜切片行 →「全站高星」那一批 → 榜史 seen → 详情缓存 repo 表;★ 第四路刻意读表不读 repoService.load() —— 后者会在 TTL 之外真问一发出去),浏览器只递 {repo, action} ⇒ stars / desc / lang 递不进来;四路全空照落库,出处念「详情」、缺的格在屏上是 —("本机一个读数都没见过它"的实话,不是缺格)。
★ 「这一轮」那一格是宿主本地比出来的成品句(拿收藏键与同一帧那几批行比,按 日榜 → 周榜 → 月榜 → 明星 的优先级出单值,没命中念「未上榜」),★ 比键时把榜行的 renamedFrom 一起铺进去 —— 不铺就会在仓库改名后把"明明在榜"念成"未上榜"(你那条默认裁定:误念比缺念更糟)。⚠️ 本条已被第三十五轮整条作废(用户指着屏上那一列说「去掉这个」⇒ 那一格连同派生、那几个 domain 常数与判据一并撤干净;当时那八列于是变七列)。历史原文留在这里不改写,当前口径看文首「项目收藏」那一条与 spec §8.15 本轮改口表。
★ 界面上的代价:那枚按钮落在宿主表尾原本 width:0 的占位列上,改成 36px ⇒ 描述列少的就是那 36px(你收下这条代价,所以没有新增 <col>/<th>);收藏不裁行、不设上限、不参与 LRU。
⚠️ 取证抓出两处真缺陷、都在"三档说话"那一格上(§8.15 落地改口 ⑦):① 屏上那一侧:存储位不真时空态那句话照摆 ⇒ 「读不到那张表」与「还没有收藏」两句同屏拆台 ⇒ 加 f.available === true 那道闸(client-74 ②);② 宿主那一侧:lib/api.js 只看 favStore.available 那一位门面(它说的只是"有设施且没关",不代表 open() 成功、更不代表这一帧读得出来)⇒ readFavRows 回报 {rows, unreadable}、storageAvailable 两道都问。★ ②是一条分形律:以后任何一张表的"读得到没有"都不许只看门面(判据 hc-22 ③、电池 ①⑭ —— ⑭ 那一发撤掉 unreadable 之后 hc-22 当场红,说明补上的判据有牙)。
基线 574 → 626 项、套件 15 → 16(★ 逐套读数、+52 那五套的分摊、四来源对账、22 发证伪电池与那一发等价变异病历全在本文「测试」那节的 当前读数(10-13 第三十二轮),此处不重抄一遍数、免得起第二真相);
⚠️ 本轮产品侧零真出网、零截图,动的是宿主半边五份(lib/domain.js / lib/stores.js / lib/api.js / lib/favs.js 新 / index.js)+ 浏览器半边 client.js ⇒ junction 挂载下要重启 dsh desktop 才装得上,同时还要刷新面板;七条判定性走查挂在 spec §9.3(★ 走查前别清库 —— 收藏那几行的出处全靠库里已有的榜史与详情缓存行)。你的 prefs、库存行、四把密钥、dsh desktop 一个字都没动、没替你重启)
(★ 第三十三轮(10-13,你那句「为什么收藏过来的项目描述没有翻译的」+ 回「按 A 开工」):收藏那一屏接上本机已有的那一份中文,形态取证全文在 spec §8.16,落地与那八步的差口记在 §8.16 末尾那张改口表里。三条骨架,逐条都有判据:
★ 命中判据只有一个出处:把 descZhView 里那一圈"内置优先 → 与库里那行原文逐字比对"抽成导出的纯函数 descZhHits(rows, transRows) ⇒ {hits, counts}(★ 返回只有这两键 —— 把 todo 也带出来,收藏那一屏就变成会花钱的屏),descZhView 内部首行改调它 ⇒ 榜面那三项逐字不变;在 lib/favs.js / client.js 再写一遍 stored.src === transSrcKey(desc) 就是第二份判据,两侧漂移的结果正是你截图里那种"半屏假话"。
★ 一帧一处读:transStore.entries() 每一帧只读一次,榜面那份 hits 与收藏那份 hits 吃同一个值(读两遍 = 中间落库一次就是两个答案);中文放载荷第 11 格 descZh(⚠️ 第三十五轮撤掉末尾的「这一轮」那一列之后那一行只剩十格,这个序号名作废 ⇒ 现在只叫「descZh 那一格」)、desc 仍是收藏那一刻的原文(覆盖之后屏上与库里同名不同值,"快照不刷新"就只剩注释能证明);渲染侧三屏(榜面 / 明星 / 收藏)收进一个 descCell(那条"客户端只搬字不判档"的规则此前已有两份逐字拷贝,收藏是第三个用户)。
★ 出网账 0 发 + 0 新增额度(本轮最重要的一本):两根钉子 —— 收藏那批行不进 descZhRows 的参与集合(那个函数一个字没改),descZhHits 是纯函数(派活只发生在轮次之后的批次)⇒ 收藏里躺着一个从没译过的仓库也一发不派;那一格中文是被动上屏的,屏上永远不欠一次请求。⚠️ 被否掉的两案已登记:B(为收藏新派现译)多花额度且把"这一屏不刷新"变成"这一屏会花钱",C(只补一句解释)是没改行为 —— 你回的是「按 A 开工」,两案不许在实现期偷偷改回来。
基线 626 → 637 项(★ 逐套读数、+11 那五套的分摊、四来源对账、19 发证伪电池与那两发等价变异病历全在本文「测试」那节的 上一份读数(10-13 第三十三轮),此处不重抄一遍数;⚠️ 那一轮末尾登记的"同一族命名账(两个同名 descZhHits)"已由第三十四轮改名消歧,见 §8.17 与下面第三十四轮当前读数);
⚠️ 本轮产品侧零真出网、零截图,动的是宿主半边四份(lib/board-zh.js / lib/api.js / lib/favs.js / lib/domain.js)+ 浏览器半边 client.js ⇒ junction 挂载下既要重启 dsh desktop 也要刷新面板;三条判定性走查挂在 spec §9.3(★ 走查前别清库、别改偏好 —— 清了 trans 表就只剩英文原文,这一形再也读不到)。你的 prefs、库存行、四把密钥、dsh desktop 一个字都没动、没替你重启)
(末尾另修了六条你递过来的真机问题:定时器崩溃、榜单表列宽、页头字号、页签条那条没意义的滚动条、注册链接被推到行尾、★ 以及 10-07 那张「存储不可用」截图);
前面那四件在真机(挂 web profile + 无头浏览器逐签截图)走过三轮,其后又有第四(共尝试 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、08:51,你重启 desktop 宿主后先读了它的 snapshot,再把同一份目录挂进 web profile 起实例、无头浏览器截图):卡头「描述中译为内置离线预译 · 2026-10-06」在日 / 周 / 月三张卡上各出现一次,
日榜 13 行里 11 行中译 / 1 行无描述 / 1 行未命中照给原文,周榜与月榜各 15 行里 14 行中译;弹框命中档与未命中档两屏都在(§9.3 第六轮,图 今日新增 整列不见、余量全灌进最后一列 ——
根因不是宽度数值,是 <col class="gt-repo"> 与格子里的 <a class="gt-repo"> 撞名,单元格那条 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:49tmp/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:1910:4x,脚本 13:2x,脚本 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:05tmp/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 分钟不进设置页(那是故障保护,不是给用户调的配置)。
★ 第二十七轮(10-10)撤掉了这一档 —— 上面那四档与那条接线是当时的口径,历史叙述原样留着不改写;撤档的理由不是"那套接线写坏了",而是详情改成条件请求之后那一档没有可判的对象("多久算新鲜"被"问一次验证器、没变就 0 字节"取代,窗口只剩 60 秒防连点与失败 5 分钟两格,都在 domain、都不进设置页)。撤干净的一条链五个点与零迁移实测见上面第 44 行那条与 spec §8.9。⚠️ ★ 第三十一轮(10-12)用户再次亲手改判,那一档摆回来了(裁定原文「还是改成以前那种模式,默认缓存24小时,可以配置,听不懂吗,不要用60秒这种」)⇒ 上面那四档与那条接线又是当前口径,只多两条新语义(TTL 判 checkedAt + zhProbed 那条例外);那条链验成了双向,逐点读数见上面第三十一轮那段与 spec §8.14。
离线 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文字与 HTMLhref="https://github.com/gh-gongjin/dsh-plugin-gh-trending/blob/HEAD/路径"` 两种写法都认**(真机那一行用的是后一种,只写前一种等于没做),多条命中按名排序(★ 这一条已被第二十轮改判:现在先按"明写简体 / 不带变体 / 明写繁体"三档、同档内才按名 —— 见下面第十七件);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 现在拼 请求号 <号> <code> <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 次/小时匿名配额那条红线 ⇒ 只做「屏上那段有中文/那行写着有中文版」,不猜路径。另登记一条没动的发现(你裁定范围外):
★ 第十七件(第二十轮)把这条发现接住了:你裁定「使用 README.zh.md 这种」⇒ 已落地,见下面那件;「不猜路径」那一条你也裁定了 保持不做。
⚠️ 诚实一句:这一轮没有真机截图 —— 本轮动的又是宿主半边 pickZhReadmeLink 按名字排序取第一个 ⇒ claude-mem 那种形状会挑中 docs/i18n/README.zh-tw.md(繁体)而不是 README.zh.md('-'(0x2d) 排在 '.'(0x2e) 前面)。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)
-
编辑 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"
-
在 profile 的
node_modules下建目录联接:New-Item -ItemType Junction ` -Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-plugin-gh-trending" ` -Target "<本仓库的绝对路径>" -
重启 dsh(宿主半边在启动时加载)。只改
client.js的话刷新页面即可。
停用 / 卸载
临时停用:在 ~/.dsh/profiles/desktop/cordis.patch.yml 里加
- id: gh-trending
disabled: true
界面
S2 起是页签制(交互照 modelwatch 的同源实现):页头(三榜状态胶囊 + 「立即检查」+ 该操作的回执)与页签条包成一块 sticky 常驻,滚到榜底也切得动签;六个签 ⇒ 第二十三轮(10-09)起七个签 ⇒ 第三十二轮(10-13)起八个签 总览 / 日榜 / 周榜 / 月榜 / 明星仓库 / 收藏 / 变化记录 / 设置(「明星仓库」插在月榜之后、「收藏」插在明星仓库之后),签上带该榜条数徽标(0 条、总览与设置不带徽标 —— 拿 0 冒充有数最坏;★ 「明星仓库」的徽标 = 载荷 stars.rows.length、★ 「收藏」的徽标 = fav.rows.length,同一律)。⚠️ 第七枚插进来之后页签条的宽度与折行在活宿主上还没量过(旧那份"六个签在 1088px 栏里 scrollWidth === clientWidth"是第九轮的读数,判据在 client-38,七签要重看 —— 挂在 §9.3);★ 第三十二轮又多一枚 ⇒ 那一遍要量的是八签,本轮零截图、读数挂在 §9.3 那条。
- 总览:三榜状态 → 每榜前 3 名速览(名次徽章 + 仓库 +
+新增)→ 跨榜同现,一屏看完「要不要点进某一榜」;卡头的「完整榜单 →」就是切页签。总览原先收尾在一张「最近变化」小结(前 4 条 + 「全部 →」),2026-10-05 用户口径去掉——流水就归「变化记录」那一签管,总览不重复养一份影子。 - 日 / 周 / 月榜:各自一张 8 列大表(
table-layout:fixed+<colgroup>:# 46 / 仓库 268 / 描述吃余量 / 语言 112 / 累计★ 64 / 本轮新增 72 / 位次变化 56 / 兜底 0,≤1000px 时仓库吃余量、描述定 160),卡头一行给「榜面数据· 最近取回 」(坏榜改口「最近尝试」)与 显示 / 榜面计数,这一张榜真有命中的描述时再追一句「· 描述中译为内置离线预译 · <日期>」(没命中就整段不出现,载荷的 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)。 - 明星仓库(★ 第二十三轮(10-09)新增,形状 = 用户裁定的那份 B):这一屏答「哪些仓库反复上榜、谁在往上走」,原料全在本地(最近一轮三榜的行 + 观测史
seen)⇒ 打开这一签零请求,与榜面同一条"出网只在点仓库名那一下"。七列# / 仓库 / 描述 / 语言 / 累计 ★(今日新增)/ 在榜(轮数 · 峰值)/ 兜底(★ 「今日新增」只吃日榜那一条,不在日榜给—而不是0;周/月榜的"新增"是另一个周期,混进同一列就是把两件事演成一件);卡头只摆三件(标题 + 视图分段器 + 那一档的开关),排序分段器与统计那句下沉到卡体首行.gt-bar,滚动权在卡内的.gt-scroll(整页一张卡,卡是.gt-root的直接子)。 ★ 「一份真相」在这一屏钉得最死,因为这里每个数字看着都像"界面自己数一下就有":档位归属、排序、行数、置灰判据、缺位符、那三句话全在宿主(载荷stars那一格),界面只做"筛与不筛、搬与不搬"(判据client-59~client-63,承重由tmp/r23-stars-falsify.mjs那八发验过)。 全站高星那一档出厂关着(§1 那份清单里唯一新增的一路,prefs.allStarsEnabled出厂false):关着 ⇒ 分段器那一枚照摆但disabled、签上写「全站高星 · 未开启」、卡体念那句 note(点「开」的那一刻当场发那一发、之后每轮最多一发、结果进缓存、关掉不删已攒的那些行);★ 10-09 改判(用户裁定「开启的时候默认拉取一次」):把那一档从关拨到开 ⇒ 宿主在POST /api/prefs的回执里当场发那一发(认的是库里的转换,已经开着再存一次true不派;发完才回回执,所以按钮"保存中…"散去的那一刻那一批已经在库里),之后每轮 1 发、不补发、不重试,失败时上一批照常显示并挂一句故障(★ 连"点开的当口就坏了"也是当场追帧,不藏到下一轮),三榜一个字不动;★ 同日第二条裁定给那一趟又加一道新鲜度闸:库里最后一次成功取回还在一份检查间隔(prefs.intervalMin,出厂 60 分)之内 ⇒ 这一趟 0 发、也不追第二帧(那一批本来就在库里,开关位随同一次回执上屏)——"当场"指的是当场决定发不发,不是必发;⚠️ 上一发是坏的那一档不算"拉过",点开照旧重试;这一道只挂在开启那一趟,检查轮那一路不受影响;★ 开启 ≠ 跳档(点的是数据源的开关不是切屏),只有关掉时把人送回名单第一档(那一枚这时已disabled,不送就困在这一屏)。 ★ 10-10 第三条裁定(用户看了真机截图问「这些为什么没有翻译过来」,裁定「按 A 执行,条件判定加上allStarsEnabled」):这一档开着时,它那一批行也进描述列的现译集合 ⇒ 那一屏的「原文,未翻译」不再是固定形状。判据的出处只有一处(lib/board-zh.js的descZhRows({ boards, allStarsRows, allStarsEnabled })),快照视图与每轮检查后的补译批次都调它 —— 分成两处各判一次就会造出"hits里有它而排队里没有"那种半截屏(第二十三轮把这一档排除在现译之外的那句裁定已作废,见 §8.8 落地改口 10 与新增的第 17 条)。每轮那 12 发是两组共享的同一份预算、榜面先吃饱(两个rank不同轴:榜内名次 vs 全站名次);界面上那句「榜面这一列只显内置预译」的欠账只数榜面那一组(boardMissing),只有全站那一档欠着时榜面不许念它。关着 ⇒ 一行都不进参与集合(库里已攒的译文不删也不上屏,重开立刻上屏、不重烧额度);真机补齐那一屏需要ceil(28/12) = 3轮 ≈ 180 分钟(§1 出网账),且满屏之后仍不发(逐字复用那把判据照旧)。 ⚠️ 两处与榜面的可见差异,都是律逼出来的不是漏做:语言那一枚点是灰的(这一屏的行不带langColor,补齐它要么在宿主再造一份色表出口、要么让客户端定义枚举 ⇒ 走 CSS 那一份灰);卡脚没有.gt-note那句(原型上有,那是界面自己拼的话)。 - 收藏(★ 第三十二轮(10-13)新增,第八个签,用户诉求原文「增加一个项目收藏功能」):三处入口那枚 ☆ 都画在宿主给的那一行上(三榜行尾 / 明星行尾 / 详情弹框标题行,同一个组件
FavStar,亮灭只看一个on位),点它只改收藏 ⇒ 不跳转、不开弹框、不滚动,榜面那一枚还必须stopPropagation(client-71)。 这一屏七列# / 仓库 / 描述 / 语言 / 累计 ★(那一刻)/ 收藏于 / ★(★ 第三十五轮:用户指着屏上「这一轮」那一列说「去掉这个」⇒ 八列变七列,右侧那一枚 ★(取消收藏的入口)照旧留着、还是最后一格),★ 星数列表头那个「(那一刻)」和卡脚那句 note 是同一件事的两句说法(星数与描述是收藏那一刻的快照,不随榜面刷新),要新值点仓库名走详情那条链 ⇒ 打开这一签零请求。三档排序分段器收藏时间 / 累计 ★ / 名称(默认档「收藏时间」)与页签一样落localStorage(favSort,第二十九轮那套pickOption复用);名单只有一份出处(snap.fav.sorts),客户端一个字不排表(client-75)。「这一轮」那一格念的是成品句(★ 第三十五轮(10-13)这一整段作废:那一列连同宿主侧的派生、载荷里那一格、domain 那四个名字(在日榜 / 在周榜 / 在月榜 / 在明星 / 未上榜,优先级与那两句汉字只在 domain,FAV_ON_BOARD_PRIORITY),★ 单值 —— 一个仓库同时在两榜只念优先级最高的那一个;没命中那一档跟着置灰(gt-flat),与明星屏同一条读法。FAV_ON_BOARD_LABELS/FAV_OFF_BOARD_CELL/FAV_ON_BOARD_PRIORITY/FAV_COL_ON_BOARD)一起撤干净,不留死码 —— 判据是favs那条「撤一列连入参一起撤:旧的三档原料照喂,行与载荷也长不出「这一轮」那一格」+hc-24(那四个名字零出处、favView的调用点只喂三格、客户端连「未上榜」那三个字都不认)+ 电池tmp/r35-onboard-cell-falsify.mjs十一发。仓库名旁边那枚「来自 日榜」照旧吃宿主拼好的整句fromCell(客户端把from和「来自」接起来就是第二份榜名,client-72)—— 撤掉那一列之后,这一屏与榜面的关系只从那一枚出处牌读。 ⚠️ 三档说话分开:available !== true⇒ 卡体念noStoreNote(存储不可用,☆ 按下去不落库);available === true且零行 ⇒ 念emptyNote(还没有收藏);★ 两者不许同时出现在屏上(那两句互相拆台)—— 这道闸门正是本轮取证出来的两处真缺陷之一,判据client-74。 - 变化记录:全量流水。设置:偏好 + 只读「运行环境」表(环境跟在设置里,不占一个签)。偏好里
出网方式那行下面是现译引擎五档分段器(免费接口 / 百度 / 腾讯 / 阿里 / 宿主模型,★ 档名、顺序、当前档、这一档那句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的旧宿主整段不摆,点了没用的控件比没有更糟 —— 那说的是载荷里没这一格,与档位无关)。出网方式是三档分段器 + 一个地址框(草稿,点「保存」才发),切到自定义地址时模式与地址一起发——只发模式会拿旧地址出网,只发地址则可能压根没在用自定义。详情缓存那一行(★ 第十二轮立起)与检查频率同形状:四档分段器★ 第二十七轮(10-10)那一行整行撤掉(用户裁定原文「撤掉这一行,改成固定 60 秒防连点(推荐)」),★ 第三十一轮(10-12 用户再次亲手改判)按原来那形状摆回来(裁定原文「还是改成以前那种模式,默认缓存24小时,可以配置,听不懂吗,不要用60秒这种」)⇒ 上面那段划掉的描述逐字又是当前口径,只补三条本轮新增的语义:① TTL 之内一发都不问(连验证器都不问,不是"只问验证器");② 那一档多一条例外:库里6 小时 / 12 小时 / 24 小时 / 3 天、出厂 24 小时,档位与话术都从入口载荷读(cacheHours/cacheHourLabels,客户端一个字不写)、点一下即存;★ TTL 在服务侧调用时现取现算 ⇒ 改档后下一发详情就按新档判新鲜,不必重启宿主;档位外的值POST /api/prefs直接 400(不许悄悄回落 24 —— 那等于库里一个值、分段器上另一个值);失败档那 5 分钟不进设置页(故障保护不是给用户调的配置)。zhProbed不是true的成功行不受 TTL 挡(第三十轮那半截结论必须过档就真出网重判,否则要等满 24 小时才自愈);③ 撤档期间换进去的那格 60 秒防连点(DETAIL_RECHECK_MS)整键删掉,snap里那两格(cacheHours/cacheHourLabels)回来,detailStampLabels那格留着但只剩两个词(第三十轮补的第三截跟着撤,见下面「详情弹框底部那句落款」那条);库里那一格从头到尾没真正消失过(第二十七轮只是让open()静默丢弃它)⇒ 本轮改回optionalInt声明收住、POST 脏档照旧 400(它现在又决定"这一问出不出网"了)。失败档那 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 未验证清单第十一轮那条。 ★ 第二十八轮(10-10):self段段名那一行右侧多了三枚常驻按钮(展开全文 / 译整篇 / 整篇摘要,用户原话「加几个按钮……不受参数设置控制」)。形状上四件事各有一条判据(client-64 / 65 / 66): ① 常驻 ≠ 恒能点 —— 三枚恒在,不该点的那一枚disabled并把原因写进title;置灰有四种各说各的话(no_readme这一屏没有可展的原文 /already_zh仓库自己写的就是中文 /no_sum_capability这一档只会翻译不会摘要 /not_ready现译这一路此刻发不出去),★ 而且**"根本没装配现译"那一支排在能力位之前**(少了它那种屏会念成"这一档不会摘要",是把没接上的东西说成不支持); ② 点下去当场await跑完再回执 ⇒ 没有进度条(浏览器拿不到中间态;硬做要再引一张 job 表 + SSE 推进度,本轮撤掉)、也没有"停手"按钮:关掉弹框不打断那一趟,结果照样落库、下次点开秒出 —— 这是"取消"最省的形状,真取消要让AbortController贯穿分块循环(第二套生命周期); ③ 那两段中文只从载荷manual.sections摆(段名连落款原样念,库里没有那一行就整段不摆;回执那份读不到库也照样顶上一屏,因为那一趟不能白跑;失败回执不顶替那一段),展开那一下只按kind覆盖已有的两块(节选 + 那句元数据),客户端不判"这一段该显示什么"; ④ 按钮名单回执那一份优先于点开那一刻的详情载荷(档位换了置灰口径跟着换),且disabled同时认can与"正在跑" —— 同一趟额度只有一份,跑着的时候连另一枚也不许点。 ⚠️ 这三枚是第一条由界面发起、当场花模型额度的动作 ⇒ 真机那一屏(点了真等 20 秒那一趟)到现在一次都没走过:活的宿主半边要重启 dsh desktop 才装得上新的lib/**,挂在 §9.3 本轮那两条欠账里。 - ★ 第二十九轮(10-12):页签与明星那一屏的档位落
localStorage(你那句「切换了tab后,右侧面板选择的东西就没了」)。屏上只多了一件事 —— "它记得你上次在哪",四条形状各有判据(client-67~client-69+ 改判的client-62③″): ① 存的只有三枚 id(tab/starsView/starsSort,键${panelId}.ui.v1跟着载荷的 panelId 走)⇒ 设置页那份草稿、详情弹框那一份、四把密钥一律不落(半截密钥进浏览器存储是新增的泄露面;草稿落盘等于把"未确认的输入"变成"下次自动用它",而proxyUrl那格点「保存」才生效); ② 读回只认名单(在册且未禁用才生效)⇒ 档位撤掉、库里那点脏值、载荷换了一批都不认,界面上就是一次正常的出厂;「关掉那一档把人送回名单第一档」与这条回落共用pickOption一处判据,不另立第二份真相; ③ 生效档在渲染期现推,不在挂载时定死 ⇒ 首帧还没有载荷时,不许把存着的那一份判成"不在册"(否则载荷到位也回不去,用户看到的仍是"记不住"); ④ 存储坏了不带走界面:读写各包一层try/catch,读不到当没存过、写不进就在内存里用完这一份(宿主自己的 README 就写着「存储失败时,当前布局仍可在内存中使用」,插件同口径)。 ⚠️ 为什么这件事必须由插件做:宿主的main是 keyed 席位(entryKey = activePanelId,renderer 只渲染命中那一条),切走面板就是整棵树重建;那条keepMounted保活只给右侧栏 tab 席位,本插件走的sidebar.panellist+main不在其上 ⇒ 「切回来还在」这个席位上从来没有保活可依赖(宿主侧行号取证见 spec §8.12)。 - ★ 第三十轮(10-12):详情那一屏的两笔真机 bug + 60 秒窗口命中那一屏的可见结果(你那两条「我开了摘要现译,这个点开没有翻译」与「截图里写着有中文,为什么没有拉取到中文版」,判据与病历见 spec §8.13)。三件事的形状:
① 中文 README 那一档不再被 304 冻住:
repo表追加一格zhProbed(optionalBool、域version恒钉 1),口径是判定输入齐了才算探完 —— 八形里六形算探完(zh_default/zh_file/zh_section/ README 404 那个none/ 中文篇坏链接的 404 / 清单 200 且两条路都无线索的en_default),只有"探测那一发自己没答上来"两形留 false(清单 5xx、中文篇超时 ⇒ 同一个en_default档名,探没探完差在这一格);库里那一格缺或 false ⇒ 下一问一个字都不喂验证器(裸发重判一次),探完才写回 true ⇒ 代价是一次、三问内收敛,不是每问四发。★ 这一格填的正是第二十七轮那道「304 就沿用库里那一行」的洞:上一版把半截探测结论(默认篇是英文、中文篇那一发没探成)连同整行一起冻结,用户每问一次都命中同一个en_default,永远翻不出中文。 ② 摘要那一发不再被"推测有中文"挡掉:源侧第三道闸门从「屏上有中文 或 那行写着有中文版」收窄成只认屏上真中文(readmeZhOnScreen(节选).via !== 'cjk'才派活)—— 第二路那份「语言切换那一行」是线索不是正文,拿它挡摘要等于替用户断定"中文的已经在屏上了"。段名后缀那两支照旧都给(README_ZH_GATE_SUFFIXES认cjk与lang两种来源,说的是"段名为什么这么念",与"要不要派活"是两件事)。 ③ 窗口命中那一屏有可见结果:详情底部那句落款补第三截「60 秒内没再问 GitHub」,只在cached:true那一支出现(DETAIL_STAMP_LABELS.windowHit,秒数由 domain 现拼,client.js一个字不写那个数)⇒ 第二十七轮那条「60 秒内再点同一仓库,这一发请求都不发」从此在屏上看得见,不再是只有账本知道。⚠️ 这一条不是缺陷修复:「为什么不缓存 24 小时」的 24 小时档是用户 10-10 自己裁定撤掉的(裁定原文「撤掉这一行,改成固定 60 秒防连点」),本机 60 秒内实测 0 发 —— 补的是可见结果,不是把档位加回来。⚠️ ★ 第三十一轮(10-12)这一条整条作废:用户当场改判「听不懂吗,不要用60秒这种」⇒ 那一档加回来了、第三截与windowHit那个词整撤,DETAIL_STAMP_LABELS回两格;这一句当时把性质判错了(当成"缺一句可见话",实际要的是行为回退),登记在此不改写历史。 ⚠️ 本轮动的是宿主半边lib/**⇒ 要重启 dsh desktop 才看得见(client.js那半刷新面板即生效);四条判定性走查挂在 spec §9.3,本轮零真出网、零截图,你的 prefs 与库存行一个字没动(走查前别清库、也别改偏好,那两条 bug 的现场就在库里那一行)。 - ★ 第三十一轮(10-12):设置页「详情缓存」那一行按原形状摆回来 + 落款回两截(用户裁定原文「我说还是改成以前那种模式,默认缓存24小时,可以配置,听不懂吗,不要用60秒这种」)。界面上只有两处:
① 设置页那一行:四档分段器
6 小时 / 12 小时 / 24 小时 / 3 天、出厂 24 小时,档名与顺序仍从载荷cacheHours/cacheHourLabels读(客户端一个字都不排表,client-53钉这一条时打的是"客户端写死那四个数"⇒ 电池第 ⑧ 发);点一下即存,改档下一发详情就按新档判(getTtlMs()现取现算,不必重启宿主);旧宿主没推cacheHours⇒ 整行不摆(摆出来点了没用的控件比没有更糟,与现译那两行同一条律)。 ② 详情底部那句落款:从三截回两截 ——正文取回于 <多久> 前 · 刚核对过,且第二截收窄成只在真核对过那一问才念(cached === true那一支恒 false ⇒ TTL 命中那一屏只剩第一截,因为那一问压根没问过 GitHub)。那两个词仍只在 domain(DETAIL_STAMP_LABELS),第三个词windowHit整格删(hc-20与client-70两头钉:词表键集 ={body, revalidated}、client.js代码位不许出现「秒内没再问」那半句)。 ⚠️ 形状上没有新增:撤档那两轮没删过库里那一格(只是让open()静默丢弃),所以摆回来零迁移;⚠️ 本轮动的是宿主半边五份 +client.js⇒ 要重启 dsh desktop 才装得上,四条走查挂 spec §9.3。 - ★ 第三十二轮(10-13):那枚 ☆ 三处入口 + 第 8 页签「收藏」(用户诉求原文「增加一个项目收藏功能」,原型三条推荐全选 + 那条默认裁定「这一轮跟着
renamedFrom归一 —— 误念比缺念更糟」⚠️ 那条裁定连同「这一轮」那一格已被第三十五轮整条作废(用户指着那一列说「去掉这个」)见 spec §8.15)。界面上多出来的东西全在这几条: ① 三处入口共用一个组件(FavStar,.gt-fav一枚 28×22 的方框,亮灭只看on)⇒ 样式只有一份、行为只有一份;榜面那张 8 列表与明星那张表末尾那列原本是width:0的纯占位(.gt-tail),本轮把它改成 36px 摆那枚按钮 ⇒ 代价是描述列少那 36px(用户收下这条代价,所以没有新增<col>/<th>;§8.15 落地改口 ① 把规格原文那句「约 34px」收窄成实读的 36px),列宽那三条账(td有overflow:hidden、按钮走 border-box 28px、左右内距 8 ⇒ 36−8=28 刚好)写在client.js那条 CSS 的注释里; ② 点它只改收藏:不跳转、不开弹框、不滚动,榜面那一枚还stopPropagation(client-71的判据是"整行那条链接一次都不许被触发");收藏那一发零出网、不派现译、不写events(三件"不做的事"由api那条用例上的四本计数器一起钉,流水的判据是"榜变了什么"); ③ 收藏屏是三档说话(available/rows.length/ 那两句成品),★「读不到那张表」与「一行都还没收藏」不许同时念 —— 本轮取证出的两处真缺陷就在这一格与词表那一格上(详见 spec §8.15 落地改口); ④ 排序分段器与页签选中态一同落localStorage(第二十九轮那套readUi/writeUi直接复用,多一枚favSortid)。 ⚠️ 本轮动的是宿主半边五份(lib/domain.js/lib/stores.js/lib/api.js/lib/favs.js新 /index.js)+ 浏览器半边client.js⇒ junction 挂载下要重启 dsh desktop 才装得上,同时还要刷新面板;七条判定性走查挂 spec §9.3,本轮产品侧零真出网、零截图,你的 prefs、库存行、四把密钥一个字没动(★ 走查前别清库 —— 收藏那几行的出处就靠库里已有的榜史与详情缓存行)。 - 名次徽章、
新面孔标签(本机首次上榜)、原 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 规则逐字)。 - 「榜面数据
」与「最近取回 」分两条写:拿到 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(观测史,★ 本轮加两格 roundsTotal「累计在榜轮数,一轮同现三榜只 +1」与 bestRank「历史最好名次,同轮跨榜取最小、只降不升」,两格都走 optionalInt)/ repo(仓库详情缓存,LRU 裁到 REPO_CACHE_MAX 行;★ 第三十一轮起那一行还多背一件事:TTL 判的是 checkedAt(缺这格的老行回退 at),而 zhProbed 不是 true 的成功行不受 TTL 挡 —— 那一格是第三十轮追加的 optionalBool,缺格与 false 同义 ⇒ 老库零迁移)/ trans(现译译文,键 kind:小写 owner/name,LRU 裁到 TRANS_MAX 行)/ search(★ 本轮新加:全站高星那一批,键恒为单值 'batch',行 = {at, lastFetchAt, ok, error, transport, rows[六格], rateLeft, rateLimit, rateResetAt, rateAuthed},只有一个写者 = lib/services/all-stars.js 那个 runner,坏轮冻结与三榜同一条读法、关掉不删行)。
域名排他(同名重复 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]、★ 第二十八轮新增 POST /api/repo/readme(详情弹框那三枚手动按钮的唯一出口,体是 {name, action, path},action 只认 expand | translate | summarize)、★ 第三十二轮新增 POST /api/fav(那枚 ☆ 的唯一写入口,体只认 {repo, action} 两格,action 只认 add | remove,越界 400 并把合法值念回来;repo 走详情那一路的同一把闸门 normalizeRepoKey,多余字段一律不看 ⇒ stars / desc / lang 浏览器递不进来)⇒ 路由表九条(5 GET + 4 POST)。
★ 第二十三轮(明星那一屏)没有新增任何一条路由(那是红线改判不是顺手加发):它的一切骑在 GET /api/snapshot 与 SSE update 帧上,出口是快照里 stars 那一格(headline / minRounds / roundsAvailable / thin / thinNote / views / sorts / 三个列名 / missingCell / rows / allStars{note, statLine, hasData, ok, error, transport, rows}),★ 没数据给空数组与空串而不是缺键;那一档开关的读数只有 prefs.allStarsEnabled 一处出口(stars 那一格里恒不重复给一位同样的布尔 —— 一个值不许有两处出口)。多开一条 GET /api/all-stars 就等于把出网时机交给浏览器(点一下发一发),每轮预算那条口径当场作废。
写操作只接受本机回环(连 x-forwarded-for 链每一跳都要是回环),纯读面板的 GET 不闸以便排障;
唯一一条闸的 GET 是 /api/repo —— 它读的是本地缓存,但缓存过期那一发要打 api.github.com,花的是匿名按 IP 计的额度,让局域网邻居点你的面板刷额度不合理。
★ 第二十八轮起被闸的是四条、第三十二轮起五条(POST /api/prefs / POST /api/check / GET /api/repo / POST /api/repo/readme / POST /api/fav):第二十八轮新增那一条是第一条由浏览器发起、当场花模型额度的写(一趟最多 40 发),所以它自己在路由表上标 loopback:true —— 不许靠"是 POST 就顺带闸"那条隐式规则,那样哪天加一条不花钱的 POST 就会被顺带闸掉,而这条该闸的理由(额度按这台机器/这个账号计)也就没人负责了。★ 第三十二轮那一条的理由是另一件事(写在路由表那条注释上):这一路不花上游配额,它改的是本机库存 ⇒ 放给邻居点等于让别人替我收藏,闸的理由不同但同样要自己标;那句 403 文案也不穷举方法名(第二十八轮就为这个改过一次口)。判据在 api 那两条「从别机来是 403」(repo/readme 与 fav 各一条)与 hc 的路由表扫描那一族。
★ 第三十二轮 POST /api/fav 的回执形状:{ok, action, repo, fav} —— fav 那一格就是整份新视图(与快照里那一格同一个 favView 产物),⇒ 点的那一块不必等 SSE 那一帧就到齐;★ 且写完恒追一帧(hub.broadcast('update', snap),与 POST /api/prefs 那一路同一条读法,但这里没有"库里一个字没变所以不追帧"那一支 —— add 幂等时 already 为真,可那枚 ★ 的样式与页签计数本来就该跟着这一按走)。仓储没装配回 501 GHT_RECORDS_UNAVAILABLE(不是 500,也不是"假装收藏成功了"),action 越界与 repo 不是 owner/name 一律 400 且一行都不落库。
★ 第三十二轮(收藏那一屏)同样没有为它单开一条读路由:它的出口是快照里 fav 那一格 = favView() 的整个输出(★ 脚本回算 11 键:available / rows / count / sorts / sortIds / defaultSort / cols{stars,column,saved} / missingCell / note / emptyNote / noStoreNote;⚠️ 旧台账写的是 12 键、cols 里多一格 onBoard、外面多一格 offBoardCell —— 那两格随第三十五轮撤掉「这一轮」那一列一起删,键表由 favs 那套的 deepEqual(v.cols, …) 与「行与载荷也长不出那一格」两条钉住),★ 键恒在,一条都没收藏也给空 rows 与那两句人话;rows 里每行 10 格(同一把脚本回算:repo / name / desc / descZh / lang / langColor / stars / addedAt / from / fromCell,★ descZh 是第三十三轮加的那一格 = {zh, via, label, note, src} 或 null,而 desc 恒是那一刻的原文、不被中文覆盖;余下缺位的读数给 null ⇒ 界面摆 missingCell 那个 —),★ 「来自 …」那一格 fromCell 是宿主现算的成品句、不是零件(客户端把 from 和「来自」接起来就是第二份榜名);⚠️ 旧台账里那句「onBoard 与 fromCell 都是成品句」的前半随那一列一起作废;装配不再吃榜面那三行与明星那两批行(撤列之前它排在这些之后、因为要比键 ⇒ 第三十五轮之后与 stars 的装配先后没有依赖,hc-24 钉的就是那个调用点只喂三格)。
/api/repo 的载荷是 applyZh 出边界的那 23 键(★ 这一格旧文档一直写着第十一轮的 21,第二十七轮多 checkedAt + revalidated 两格之后没跟着改口,收尾这一遍补上:21 → 23 → ★ 第二十八轮 24;整句中文与段落形状由宿主拼:sections(四段段表,唯一句子出口)/ error,旧的 narrative / facts / flags / readmeLabel / readmeMeta 五格已整段撤掉,客户端不补判定);
★ 第二十八轮那一整格 manual({section, runNote, actions[], sections[]})由 api 边界的 attachManual 挂上,且只在 ok:true 那一支 —— ok:false 不挂(按钮不许摆在一段错误上面),所以这份载荷的键数是条件数:坏名字那一屏回的还是 23 键。
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 # 634 项用例(十六套;含两条要真出网的口径)—— ★ 直跑那两份通与不通都出现过,见下面读数
SKIP_LOCAL=1 node test/host-compat.test.mjs # 跳 hc-17(声明真机口径)
SKIP_LOCAL=1 node test/web-translate.test.mjs # 跳 wt-27(真发一发免费档)
当前读数(2026-10-09 本机复跑,第二十三轮「增加一个 tab,主要收集 github 明星项目和高星项目」⇒ 明星仓库那一屏(形状 B)那一遍,全文 tmp/rerun-r23.txt):SKIP_LOCAL=1 下 492 过 / 0 挂 / 2 跳,逐套 gh 19 / net 22 / store 47 / repo 87 / check 39 / api 73 / client 63 / host-compat 21(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳)/ board-zh 19 / stars 28(★ 新开一套)/ all-stars 20(★ 新开一套)⇒ 基线 415 → 494 条。
当前读数(同日就地改判「开启的时候默认拉取一次」那一遍,全文 tmp/rerun-r24.txt):SKIP_LOCAL=1 下 502 过 / 0 挂 / 2 跳,逐套 gh 19 / net 22 / store 47 / repo 87 / check 39 / api 78 / client 63 / host-compat 21(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳)/ board-zh 19 / stars 29 / all-stars 24 ⇒ 基线 494 → 504 条。★ 差额 +10 分三套:api 73→78(转换判据认库里旧值 · 取值须在写入之前 · 那一发不等回执就不回响应(延迟桩 + "库里已经有那一批"才分得开)· 发过追帧且坏轮也追 · 关掉与没碰那一档一律不派)/all-stars 20→24(2b 那一圈:闸序一条没少 · 当场落库且 round.at 记发起时刻 · 同刻连触被挡 · 两个入口互不侵占)/stars 28→29(那两句成品必须自己念出「点「开」的那一刻」与「每轮检查后」)。★ 电池 tmp/r24-enable-falsify.mjs 9 条 / 未抓到红 0 条 + [还原 ok] 三个文件逐字节等于进来时(九发各打掉一条新律:删转换判据 / 判据挪到写入之后 / 丢掉 await / 丢掉追帧 / 丢掉 onPrefsChanged(视图不刷 ⇒ off 闸吃掉那一发)/ runOnEnable 传 run(0) / 每次抹平预算 / 说明句丢「点「开」的那一刻」/ 等待句丢「每轮检查后」);★ 上一轮那两把一并复跑仍是全绿(r23-stars-falsify.mjs 8 条 / mutate-client-6.mjs 14 条,两边 [还原 ok] ⇒ 改文案与加入口没有把形状 B 那一圈的判据磨钝)。⚠️ 真机那两屏(点「开」之后立刻出现的那一批 + 那一发失败时屏上那句故障)等你重启宿主后截给我,继续挂 §9.3。
当前读数(同日第二条裁定「开启的时候,如果上次间隔时间范围内已经拉取过就不要拉取了」那一遍,全文 tmp/rerun-r25.txt):SKIP_LOCAL=1 下 512 过 / 0 挂 / 2 跳,逐套 gh 19 / net 22 / store 47 / repo 87 / check 39 / api 80 / client 63 / host-compat 21(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳)/ board-zh 19 / stars 29 / all-stars 32 ⇒ 基线 504 → 514 条。★ 差额 +10 分两套:all-stars 24→32(2c 那一圈七条:窗口内 ⇒ skipped:'fresh'、sent:0、返回体键表恒那五格、库里一字未变 · ★ 窗口就是 prefs.intervalMin 那一格(61 分钟前的库在 60 档发、在 1440 档不发,两档各用独立库)· ★ 上一发是坏的 ⇒ 照发(判据吃 ok)· 脏时刻(at 在未来)不算新鲜 · 缺 intervalMin ⇒ 照发 · ★ fresh 只挂在 runOnEnable,run(轮次) 那一路不受影响 · 关着/无设施那一趟一次库都不读;再加一条 2d:窗口量的是 at 而不是 lastFetchAt(ok:true 而两格分开的库里行,两个方向各钉一次)/api 78→80(间隔内已取回 ⇒ 点「开」0 发、不追帧、库里 at 没被推进、而屏上那一批照旧在载荷里 · 窗口吃的是生效偏好那一格,装配层不自己数分钟)。stars 条数不变、prose pin 扩一条(那两句必须自己念得出「检查间隔之内已经成功取回过时不重发」)。★ 电池 tmp/r25-fresh-falsify.mjs 9 发 / 未抓到红 0、末行 [还原 ok] 三个文件跑完逐字节等于进来时(逐发红数:as 3 / 3 / 1 / 1 / 3 / 1 / 1,api 1,stars 1)—— ★ 首跑第 ② 发(吃 lastFetchAt)没抓到指定那条:坏轮同时把 ok 写成 false,ok === true 那一格先把闸关掉 ⇒ 字段选谁在那条用例里根本不可见,那是等价变异(真判据是 ok,第 ③ 发有牙);补了 2d 那条两格分开的库里行才拿到失败信号,过程写在 tmp/r25-falsify-out.txt 与 spec §9.2。★ 上一轮那三把一并复跑:r23-stars-falsify 8/0、mutate-client-6 14/0、r24-enable-falsify 首跑三发报「锚点在源码里找不到」(本轮把 runOnEnable 从一行箭头函数长成带 fresh 闸的 async 块、说明句里也插了半句 ⇒ 旧锚点跟丢源码,不是判据变钝)——重扫锚点后 9/0、末行 [还原 ok](三把还原均干净)。⚠️ 真机那一屏(间隔内已取回过时点开不再出网,只能从"上次取回"时刻那一格读出来)同样等你重启宿主后走查,挂 §9.3。
当前读数(10-10 第三条裁定「按 A 执行:那一档接上现译,条件判定加上 allStarsEnabled」那一遍,全文 tmp/rerun-r26.txt):SKIP_LOCAL=1 下 519 过 / 0 挂 / 2 跳,逐套 gh 19 / net 22 / store 47 / repo 87 / check 39 / api 83 / client 63 / host-compat 21(+1 跳)/ desc-zh 7 / llm 19 / web-translate 28(+1 跳)/ board-zh 23 / stars 29 / all-stars 32 ⇒ 基线 514 → 521 条(口径 = 逐套 pass + skip 之和,与上面几段同一个算法)。★ 差额 +7 分两套:board-zh 19→23(descZhRows 四面:条件两个方向(开着才并入;false / 缺位 / 0 / 'true' 一律不并)· ★ 不许污染载荷(打组标记必须拷一份 —— snap.stars.allStars.rows 就是载荷本身)· dedupe 只作用在榜面那一段 · 组序(每轮那点预算先给榜面吃饱,全站的 rank 不许插到榜面行前面)· boardMissing 与 missing 分家/api 80→83(快照那一列吃同一份集合:开着 ⇒ 库里已译的那句上屏,关掉 ⇒ 译文躺在库里也不给、而载荷 desc 一字未动 / 轮次后补译吃同一份集合:开着进 jobs、关掉只补榜面 / liveNote 的欠账只数榜面那一组:正向 + 对照各钉一次)。★ client.js 本轮零改动(那一屏读的一直是 hit?.zh || r.desc 那份取值),改的是测试夹具:snapFixture 的取行集合换成同一个 descZhRows,并把 stars 提到 zhView 之前算(对齐宿主"先有那一档的行,才有那一档开着时的屏上那些行"那份顺序)⇒ 夹具不再自己 allVisibleRows(boards) 一遍(那是第二份真相)。★ 电池 tmp/r26-starszh-falsify.mjs 9 发 / 未抓到红 0、末行 [还原 ok] 两个文件跑完逐字节等于进来时(逐发红数按脚本顺序:bz ① 1 / ② 4 / ⑤ 1 / ⑦ 1 / ⑧ 1 / ⑨ 1(六发),api ③ 1 / ④ 1 / ⑥ 1(三发)—— ② 那发一下红四条,是因为条件反过来同时打掉 dedupe、组序、boardMissing 三条吃集合归属的判据)—— ★ 首跑第 ③ 发报"没抓到",而套件里红的正是目标那条:期望串抄成了『它那一批进 hits』而用例标题写的是『它那一批里库里已译的行上屏』⇒ 判据有牙,是电池的期望串对不上名字,改期望串不动判据(过程留 tmp/r26-falsify-out.txt)。⚠️ 有一处结构约束没有可见判据、所以没进电池:api.js 里 search 那一批「读一次、两处用」—— 改成读两次,两次读之间没有写入时值完全一样 ⇒ 离线抓不到红(等价变异),只由注释与那条律守着,在这里如实登记而不是假装验过。★ 上一轮那四把一并复跑:r23-stars-falsify 8/0、r24-enable-falsify 9/0、r25-fresh-falsify 9/0、mutate-client-6 14/0,四把末行均 [还原 ok] ⇒ 本轮动的那两处 api 接线没让它们的锚点跟丢源码。⚠️ 一次回算脚本自相矛盾(记下来免得下次信错):第一次回算打印 pass 515,而同一条命令打印的合计是 521(= 519 + 2 跳)—— 用逐条数值与全文 ^ok 行数(519)交叉核对后确认 519 是真读数,515 不可复现(同一脚本复跑两次都给 519)⇒ 结论:单脚本的加总也要有独立来源交叉核对,台账数字只认核对过的那一个。★ 真机走查(10-10,用户重启 dsh desktop 后按 §9.3 那四步走完):回报「全部符合预期」 ⇒ 那一屏的描述列确实逐轮变中文、第一轮只有部分行属预期、关掉那一档退回原文而 trans 表不删、重开立刻上屏不再出网,且只有全站那一档欠账时榜面不念那句故障话。⚠️ 三条边界如实登记(详 §9.3 本轮读数那条):(a) 这一屏是口头读数、没有截图;(b) 第二十三二十五轮那三屏(七签页签条折行 / 形状 B 薄快照置灰 / 间隔内已取回不再出网的「上次取回」时刻)未逐条回报,照旧挂在 §9.3;(c) 5 的判据分属两侧):① ceil(28/12)=3 轮 ≈ 180 分钟那个完整读数没等满 —— 只证到"第一轮部分变中文"这一形状,没证到"三轮后全齐"。
★ 差额 +79 分六套,按 docs/design-spec.md §8.8 那七步一步一测记:步骤 1 store 40→47(seen 两格 roundsTotal / bestRank 走 optional + 第七张表 search + 「新增键不许 required」那一圈)、步骤 2 stars 0→28(候选窗口按时间不按轮 / "取名次最好那条"复用同一个函数 / added 只吃日榜(不在日榜给 null 且排序垫底,与「今天没涨」的 0 分家)/ 三档判据各一条 / 截断在宿主 / 三句话全来自 domain,用例里不出现手抄句子)、步骤 3 repo 76→87(q 里 >= 必须编成 %3E%3D 那条 URL 形状判据 + 回包→SEARCH_ROW_SHAPE 六格 + x-ratelimit-* 三格 + 令牌只进请求头那一圈)、步骤 4 all-stars 0→20(四道闸各返回一次且一发不派 + off 排在 no_store 之前单独钉一次(与补译那一档故意相反)+ 同一轮第二发被 round_already_sent 挡 + 坏轮 rows 不动)、步骤 5 api 65→73(stars 装配进快照且读路径零发 + 不带 at 的 update 一发不派、一帧不追 + 没落库时 allStars.rows 给空数组而不是 undefined)、步骤 6 client 58→63(client-59 七列 / 六列 col·th·td 逐列同数 + 整页一张卡那四条几何 CSS 原文 / client-60 名单、列名、句子三处全吃载荷(换哨兵值屏上必须跟着换)/ client-61 缺位与置灰(0 与「没有这一格」分得开、整列置灰不藏列)/ client-62 故障·没取回·空表·没存储四种"没内容"各说各的 / client-63 那条不对称:开启不跳档、关掉才把人送回名单第一档)。
★ 另三圈条数不变、内容改判:client-17 与 client-30(六签变七签:labels 表、clicked 七键、首帧前那一屏)、client-32(全文件禁串扫描加三条书面豁免:累计 ★、回落 / 全部 / 全站高星、—,每条配"前提断言 + 指向承重判据的去处",免得下一个人在子串扫描上二次误伤)。
★ 证伪电池两张(步骤 6 与步骤 1tmp/mutate-client-6.mjs(只圈 client.js,14 发)14 / 未拿到失败信号 0、末行 还原逐字相同:是;② tmp/r23-stars-falsify.mjs(圈 lib/domain.js / lib/stores.js / lib/services/all-stars.js / lib/stars.js / client.js,8 发,读数 tmp/r23-falsify-out.txt)8 / 未抓到红 0、末行 [还原 ok] —— schema 追加键写成 requiredInt / 一轮同现三榜从 +1 变 +3 / off 挪到 no_store 之后 / added 拿三榜相加 / 界面按 boards 自己数轮数(屏上念成 '3 轮#2')/ 统计句换成界面自拼的额度句('search 额度剩 1' ≠ 宿主那句 '… 剩 8 / 10(匿名)')/ 缺位符界面自造 '—' / 界面自己判薄快照。
★ 两发首跑没红,都登记:mutate-client-6 的 M6「开启时也跳档」—— 那趟的 view 停在第一档,条件本来就不成立 ⇒ 断言空跑,把 view 挪到 'allStars' 才打中;r23-stars-falsify 的 ⑧「界面自己判 roundsAvailable < 3」—— 默认夹具里 thin 与 roundsAvailable 同源,界面复算与宿主判处处相等 ⇒ 那是等价变异,补两份故意矛盾的载荷(thin=true 而 roundsAvailable=99,与反向那份)才拿到失败信号。⇒ 第二十二轮那条"漏网有两种"补上第三态:判据在、变异在,但两份真相当时恰好相等(要失败信号就得亲手让它们不相等)。
★ 本轮出网 1 发:步骤 3 落夹具时经同一份 lib/services/net.js 直连抓的 /search/repositories(匿名 x-ratelimit-limit: 10,落盘 test/fixtures/repo-search.json,读数 §9.1 末尾);产品代码那一路在套件里零真出网,SKIP_LOCAL=1 下 search 吃那份夹具。⚠️ 没截真机屏:宿主半边 lib/** 要重启 dsh desktop 才进内存,浏览器半边 client.js 硬刷新面板即可。★ 10-09 走查当天取证改口:%USERPROFILE%\.dsh\profiles\desktop\node_modules\dsh-plugin-gh-trending 现在是指向 F:\dsh-plugins\dsh-plugin-gh-trending 的 junction(package.json 里那格已从 github: 复制副本改成 link:),所以磁盘上宿主看到的就是仓库本身(六个文件 cmp 过逐字节一致)⇒ 旧那句"本轮连副本都没刷"不准,准确说法是宿主进程没重启:那一屏落进 client.js:623 的空态(载荷里没有 stars 那一格),而库存里 45 条 seen 行零条带本轮那两格、prefs 里也没有 allStarsEnabled(文件 mtime 就在走查那一刻,说明跑着的仍是旧那一份代码)。七签页签条与形状 B 首屏那两屏仍挂在 §9.3。我不替你重启、没动你的 prefs、没替你打开那一档的开关、也没动库存行(读库存只打印键名与条数)。
当前读数(10-13 第三十五轮「去掉这个」(用户截图红框圈住收藏那一屏「这一轮」那一列)+ 澄清后裁定「只删「这一轮」那一列,右侧那枚 ★ 照旧留着;宿主侧那一格派生、载荷格、相关判据与台账一并撤干净,不留死码」⇒ 收藏那一屏八列变七列 那一遍,逐套摘要 tmp/rerun-r35.txt、逐条原文 tmp/rerun-r35-full.txt,逐发原文 tmp/r35-falsify-out.txt):SKIP_LOCAL=1 下 632 过 / 0 挂 / 2 跳(跳的仍是 hc-17 与 wt-27 那两条要真出网的),逐套 gh 19 / net 22 / store 59 / repo 106 / check 39 / api 103 / client 78 / host-compat 24(+1 跳)/ desc-zh 7 / llm 20 / web-translate 29(+1 跳)/ board-zh 24 / stars 29 / all-stars 32 / full-readme 19 / favs 22 ⇒ 基线 639 → 634 项(口径沿用从前:含那两条要真出网的;过的那一边 637 → 632;套件仍 16 个)。★ 这是本台账第一次净撤(−5):判据面缩了,因为撤的不是判据而是一整个屏上的读数。
★ 差额 −5 分两套:favs 28→22(★ 撤掉「这一轮」那一族七条:命中优先级单值 / 按档退 / 明星那两批都算命中 / renamedFrom 归一 / 未命中那句成品 + 置灰档 / 只看切片后的行 / onBoard 绝不写回输入行;就地改判一条(旧「第 11 格 descZh」→「descZh 那一格」,键数断言从 11 格换 10 格);★ 新立一条「撤一列连入参一起撤:旧的三档原料(boards / starsRows / allStarsRows)照喂,行与载荷也长不出「这一轮」那一格 —— 留入参就是死接口」,那一发的反面同时扫 onBoard / ON_BOARD / OFF_BOARD / keysOf 四个标识符)/host-compat 23→24(★ hc-24:那四个名字(FAV_ON_BOARD_LABELS / FAV_OFF_BOARD_CELL / FAV_ON_BOARD_PRIORITY / FAV_COL_ON_BOARD)在 lib/domain.js 零出处 + lib/favs.js 与 client.js 连 onBoard / offBoardCell / 「未上榜」三形都不认,每一形先在合成样本上自证扫得到再断真源码为 false;★ 另钉 lib/api.js 那个 favView({ 调用点只喂三格(descHits / favRows / storageAvailable 键表 deepEqual)且 boards / starsRows / allStarsRows 三个死料词一个都不出现,调用点恒恰一处)。其余条数不变、就地改判:client-73 改名「收藏那一屏七列逐列同数:后两列列名…」并新增两枚尾列断言(缺位那一行的尾列照样摆那一枚 ⇒ 撤一列不许把取消收藏的入口带走)+ 禁串扫描换成「client.js 里 onBoard 与「未上榜」一个都不许出现」/api 撤掉 favSeedOf 切片吃 prefs.topN 那两条里读快照比 onBoard 的末两行断言(判据对象已不在盘上)+ 三条用例名与消息里「第 11 格」改口成「descZh 那一格」。
★ 四个来源各数一遍又对上:① 逐套 pass 加总 632(另 fail 0 / skip 2,tmp/rerun-r35.txt 逐行打印);② 逐套全文 ^ok 632 / ^FAIL 0 / ^SKIP 2(tmp/rerun-r35-full.txt,682 行 —— 第二个来源数的是它,不是那份逐套摘要);③ 工作树源码静态 ^check( 634(逐套 19+22+59+106+39+103+78+25+7+20+30+24+29+32+19+22,其中 host-compat 25 = 24 过 + 1 跳、web-translate 30 = 29 过 + 1 跳);④ 上一份含跳 639 − 撤掉那一族 7 + 新立 2(favs 1 + hc 1)= 634 ⇒ 四数互洽。⚠️ 口径分清楚:634 是含跳用例数,632 是 SKIP_LOCAL=1 下真跑过的条数。★ 载荷形状独立回算(不是抄测试里的数,留档 tmp/r35-shape-read.txt):favView 顶层 11 键、cols 3 格(stars / column / saved)、rows 每行 10 格 —— 三条都由 node -e 现调现数,与 favs 那两条 deepEqual 对上。⚠️ 序号名「第 11 格」随本轮作废(撤掉末尾那一格之后行只剩 10 格、descZh 一直在第 4 位)⇒ 台账、用例名与那两句源码注释(client.js / lib/favs.js)统一改口,盘上产品码与测试再没有一处叫它"第 11 格"。★ 短号自查(client-NN 到 78、hc-NN 到 24,favs 那套按描述名编号)第七次复跑:tmp/r28-label-dups.mjs ⇒ 16 套无撞号(本轮零新短号,client-73 就地改名不占新号)。
★ 证伪电池 tmp/r35-onboard-cell-falsify.mjs(圈 client.js / lib/favs.js / lib/api.js / lib/domain.js 四个源,支持 node tmp/r35-onboard-cell-falsify.mjs N… 只重跑指定那发)11 发 / 未抓到红 0 / 全绿(等价)1、末行 [还原 ok] 4 个源文件跑完逐字节等于进来时(⚠️ 那两行摘要与分账打在 stdout、不进逐发 LOG ⇒ LOG 是 tmp/r35-falsify-out.txt(579 行 / 11 节)、摘要与分账另存 tmp/r35-falsify-stdout.txt;★ 本轮跑完还另把四份源码与跑前 cp 的备份 cmp 过一遍逐字节相同才删备份 ⇒ "还原干净"有两个来源)。逐发红数(FAIL 条数,按脚本序):①client 表头复辟 1/①行里那一格复辟(表头不动、行多摆一个 td ⇒ 整表错位、★ 被挤走)1/①撤列撤过头(把右侧那枚 ★ 一起删)2/②favView 行复辟那一格 2/②载荷复辟 offBoardCell 1/③装配点复辟喂料(boards: v 形)1/③同一发简写形(boards, ⇒ 键表只认 k: 那一形,抓它的是那条死料词兜底)1/③同一发顺序面(那三格交换书写先后)0(预期等价)/④domain 复辟 FAV_OFF_BOARD_CELL 1/④domain 复辟 FAV_COL_ON_BOARD 1/④客户端自己造「未上榜」1。★ 第 3 发是本轮用户那条划界的牙:撤列撤过头就是把 ★ 一起删 ⇒ 电池里"少撤"(复辟)与"多撤"(带走 ★)两个方向都有失败信号。
★ 电池/判据首跑的病历(§0 那条律第十一次兑现,本轮红在三处判据自身写法而不是产品代码):hc-24 首跑连红三遍,产品源码一字未改 —— ① 切 favView({ 调用体那段正则 favView\(\{([\s\S]*?)\n\s*\}\) 在嵌套的 descZhHits(…) 那个 }) 处提前截断 ⇒ 入参名单少报一格,改用 indexOf('favView({') + indexOf('})', at) 切片并补一条"读全了没"的前置断言(判据不许红在读半截);② 合成样本 SYNTHETIC_ON_BOARD_CELL 里没有任何 ^\s*word: 行 ⇒ 反面自证空转,补一段 favView({ … }) 对象字面量;③ 样本用的是简写 boards, ⇒ 键表正则扫不到 ⇒ 新增死料词循环 for (const dead of ['boards','starsRows','allStarsRows']) 那一支才抓到。三次修完 host-compat 25/0/1,整把 11 发重跑。⚠️ 第 8 发(顺序面)如实登记为等价变异:那三格谁先写都不影响值与键表 ⇒ 全绿是对的,不许为它立判据。
★ 历史两把一并复跑(本轮动的那四份正是它们圈的源 ⇒ 不复跑就不知道有没有把旧判据磨钝;读数 tmp/r35-rerun-r33-battery.txt / tmp/r35-rerun-r32-battery.txt,两把末行各自 [还原 ok]):tmp/r33-desc-zh-falsify.mjs 19 发 / ✅ 15 / ❌ 3 / ℹ 等价 1、tmp/r32-fav-falsify.mjs 22 发 / ✅ 19 / ❌ 2 / ℹ 等价 1。★ 那五处"未抓到"没有一处是判据变钝:r33 两发是假失败(期望串吃旧用例名「★ 第 11 格」,红的正是就地改名后的那条「descZh 那一格」);r33 一发 + r32 两发是判据对象随本轮消失 ⇒ 锚点在该源里找不到(r32 ⑧ renamedFrom 铺集合 / ⑪ 命中优先级,r33 ①′ 那个 favZh 局部名的等价变异锚盖着本轮删掉的那三格死料)。⚠️ 两把旧电池一个字不改、只在这里登记(与第三十四轮那条 D1 字面锚同规矩),也没有为消掉任何一发去放宽判据或改期望串。逐发归因表在 spec §9.2 本轮那条。
★ 出网账:本轮产品侧 0 发、取证侧 0 发(撤的是一格本地比出来的读数,与出网本来无关;本轮三把电池与全量复跑全离线)、零截图;没碰你的 prefs、没碰库存行、没读那四把密钥。⚠️ 真机欠账一条挂 spec §9.3(★ 本轮既要重启 dsh desktop 也要刷新面板:宿主半边 lib/domain.js / lib/favs.js / lib/api.js 三份 + 浏览器半边 client.js;走查判据四读:那一屏变成七列且「这一轮」那一整列没了 / 右侧那枚 ★ 还在最后一格、点它仍能移出 / 描述那一格中文照旧(第三十三轮那一条不受本轮影响)/ 底部配额读数与打开那一屏之前一致 ⇒ 出网账仍是 0)。★ 顺带清掉一条旧欠账:第三十二轮那七条走查里「『这一轮』单值与改名归一」那条判据对象已不在盘上 ⇒ 作废(其余六条照旧挂着)。你的 prefs、库存行、四把密钥、dsh desktop 一个字都没动、没替你重启。
上一份读数(10-13 第三十四轮「按你推荐的来」⇒ 详情缓存那把尺抽成 lib/domain.js 的 repoAskedAt 三处共用 + lib/desc-zh.js 那个同名导出改名 那一遍,全文 tmp/rerun-r34.txt,逐发原文 tmp/r34-falsify-out.txt(1,125 行 / 18 节),套件的完整逐条输出 tmp/rerun-r34-full.txt(671 行)):SKIP_LOCAL=1 下 637 过 / 0 挂 / 2 跳(跳的仍是 hc-17 与 wt-27 那两条要真出网的),逐套 gh 19 / net 22 / store 59 / repo 106 / check 39 / api 103 / client 78 / host-compat 23(+1 跳)/ desc-zh 7 / llm 20 / web-translate 29(+1 跳)/ board-zh 24 / stars 29 / all-stars 32 / full-readme 19 / favs 28 ⇒ 基线 637 → 639 项(口径沿用从前:含那两条要真出网的;过的那一边 635 → 637;套件仍 16 个)。
★ 本轮三件事(都是上一轮末尾列的待裁定,用户回「按你推荐的来」):① 收藏那一屏「来自」那一格保持现状并落为裁定 —— 改成"你点星那一屏"要破「浏览器只递 {repo, action}」那条承重律,为一句文案不值;② repo 表的裁行键从 at 换成「最后一次问过 GitHub」并复用 TTL 那把尺(repoAskedAt(row):checkedAt 优先 → 缺格回退 at → 脏值当缺位给 0),消掉 §8.13 末尾登记的"304 反复命中的那一行 at 冻在从前 ⇒ 越省额度越先被 LRU 删掉"那处真隐患;③ lib/desc-zh.js(内置表)那个与判据单点同名不同义的 descZhHits 改名 builtinDescZhMap,lib/board-zh.js 那个判据保持原名 ⇒ 盘上只剩一个 descZhHits。
★ 差额 +2 全落 store(57→59):①「★ repo 裁行吃 checkedAt 而不是 at:304 反复命中的那一行不能被删」(§8.13 那处隐患的行为牙),②「★ 那把尺不吃脏时刻:库里躺着 checkedAt: Infinity / "9000"(手改 json、换机搬库)⇒ 按「没有这一格」回退 at」—— ★ 这一条是证伪电池第一跑抓到"判据空跑"之后补的(脏行必须绕开 schema 用 facility.seed 塞,checkedAt 走 optionalNumber 在 put 那关就抛)。其余全是就地改判、条数不增减:store 那条 499(裁行口径 + list() 交出去的 askedAt 与裁行同格)、desc-zh 的 dz-7(改名 + 两种导出写法都扫 + 反面自证那条"只剩一个"不是假话)、host-compat 的 hc-20(D1 那一支拆成"两个调用点 + 尺子在 domain");另 lib/stores.js 函数头注释改口(本轮换尺子这件事写在表头上,不留在注释里的旧口径)。
★ 四个来源各数一遍又对上:① 逐套 pass 加总 637(另 fail 0 / skip 2);② 逐套全文 ^ok 637 / ^FAIL 0 / ^SKIP 2(tmp/rerun-r34-full.txt);③ 工作树源码静态 ^check( 639(逐套 32+103+24+39+78+7+28+19+19+24+20+22+106+29+59+30,其中 host-compat 24 = 23 过 + 1 跳、web-translate 30 = 29 过 + 1 跳);④ 上一份含跳 637 + 本轮新增 2 = 639 ⇒ 四数互洽。⚠️ 口径分清楚:639 是含跳用例数,637 是 SKIP_LOCAL=1 下真跑过的条数。★ 短号自查(client-NN 到 78、hc-NN 到 23,favs 那套按描述名编号)第六次复跑:16 套无撞号(本轮零新短号)。
★ 证伪电池 tmp/r34-cache-ruler-falsify.mjs(圈 lib/domain.js / lib/stores.js / lib/services/repo.js / lib/desc-zh.js / lib/board-zh.js 五个源,支持 node tmp/r34-cache-ruler-falsify.mjs N… 只重跑指定那发;⚠️ 盘上是 CRLF,多行锚点必须按文件自己的 EOL 拼,否则电池自己空跑)18 发 / 未抓到红 0 / 全绿(等价)3、末行 [还原 ok] 5 个源文件跑完逐字节等于进来时。逐发红数(FAIL 条数,按脚本序):①裁行回退旧尺子 1/①接线面(两处调用点少一处)1/②list() 自己数 at 2/②接线面 1/②尺子撤 at 回退 2(store)/②同发打 TTL 1/②接线面(domain 不再有 numOf(row?.at))1/②两格顺序反过来 1/②同发打裁行 2/
Comments
Loading…