From c36a794aa8f709b07c3e6ce090516ce5a0e43f7d Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Wed, 14 Oct 2026 20:15:08 +0800 Subject: [PATCH] =?UTF-8?q?chore(main):=20=E5=9B=9E=E6=B5=81=20=E2=80=94?= =?UTF-8?q?=E2=80=94=20=E7=AC=AC=E4=B8=89=E6=89=B9=E9=80=90=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E5=AF=B9=E7=85=A7=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按纪律先在 release 提交再内容对齐。校验:diff vs release = 0 行。 --- docs/channels-parity.md | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/docs/channels-parity.md b/docs/channels-parity.md index 16cbe6f..1c96352 100644 --- a/docs/channels-parity.md +++ b/docs/channels-parity.md @@ -489,3 +489,52 @@ error)被当成功、`pcall` 只取 ok 不看返回值(把诊断信息扔了 **未实现的部分集中在两类**:(1) 需要**真实浏览器/验证码**的领取全自动 (captcha 系 ~3300 行);(2) **二进制缺失**(qoder wasm)。 其余是宿主 UI 特性或前提不存在的模块。 + +--- + +# 第三批(2026-10-14 晚)—— 逐模块对照的**新发现** + +## ★ 本轮新补的三个真缺陷 + +### ① 自动领取每天静默漏领(`credits.ts` / `auto-checkin.ts`) +活动刷新时刻**各平台不同**(Qoder 每日 10:00 UTC+8),而我们只在 08:00 跑一次 +⇒ 上午看到昨天那条 `CLAIMED`、报 `already-claimed` 并记账 ⇒ 当天再不去领。 +**修法照参考**:不配"时刻表"(必然漂移),让**产出方声明 `covers_today`**, +记账方只数"有几条能证明今天已处理"。两层都要:频率提高 + `first_due_now`。 + +### ② 凭据续期此前是假的(`refresh.ts` / `expiry-sync.ts`) +`account_refresh` **一个换 token 的请求都不发**却恒返回 `ok:true` +⇒ `refresh_creds` 打「已续期 N 个」而什么都没续 —— **日志在说谎**。 +这是本轮第三次遇到同形态(前两次:`account_test` 恒 ok、业务级错误被当成功)。 + +### ③ `isFree` 与声明自相矛盾(`cline-models.ts`) +cline 的免费模型声明在 `models` 里 ⇒ 被标成收费。 +★ 关键认识:**两个参考用的是不同机制** —— cline 用远端 `free[]`, +opencode 用 models.dev 的 `cost`。混成一条 OR 链会与既有判据正面冲突。 +⇒ 加 `free_source` 由**平台声明**权威来源。 + +## 插件自装适配器(第 3、4 个) +| 适配器 | 解决的问题 | +|---|---| +| `channels-qoder` | 错误信封**双层编码**;`10605`(排队) 与 `110`(额度耗尽) 语义**相反**,必须分开说(参考实测:110 原被归成通用服务端错误 → 白重试 5 次 ≈15.5 秒) | +| `channels-cline` | 429 **无 retry-after 头**、等待时长写在英文句子里(`Try again in 19h 39m`)。解析不出 ⇒ 内核按 30 秒短冷却 ⇒ **每 30 秒猛敲上游**(比参考的「永远 60 分钟」更糟) | + +现共 4 个:`channels-trae` / `channels-gemini` / `channels-qoder` / `channels-cline`。 + +## 对照后判定「不适用」的(附理由,不是"没做") + +| 模块 | 为什么不需要 | +|---|---| +| `account-pool` 并发写竞态 | 我们的落盘是**同步** tmp+rename(Lua 无异步),每次写序列化**当前** state。参考的缺陷是"异步后端 + 共享可变快照"的产物。**已加判据钉住**(已删账号不复活、新增不丢失、内存/磁盘不分叉) | +| `gemini-messages` SSE 末帧丢失 | 我们的 `bufio.Scanner` 对无尾换行的最后一行**照样产出**(已实测自证)。参考那是在 `while(!done)` 里按行处理所致 | +| `cline-rate-limit` 的 30 分钟策略冷却 | 我们**每账号一个源**(`channels--`)⇒ 某账号被拦只冷却它自己,下个请求自然换源。参考是"一个池里换号",才需要长冷却挡住同一轮里的连续重撞 | +| `message-shape` | DSH 宿主的消息形状迁移;我们直接透传 OpenAI 形状 | +| `loop-recovery` | 前提不存在(我们的内核没有循环守卫) | +| `reasoning-ladder` | 需要内核支持 `efforts` 字段(属内核改动,按纪律不做) | +| `retry-after.ts` | 参考那份实现**自己就是死代码**(grep 无消费者);我们的固定 30s 冷却有明确理由(429 是"太快"不是"坏了",走指数退避会让额度充沛的源被锁 30 分钟) | +| `image-budget` | 实际缩放委托给宿主的附件服务,我们无对应物 | + +## 运行环境的一条教训(不是代码缺陷) +全量 `go test` 曾出现 `TestConcurrentPluginAdapterUpdates` **挂 59 分钟**、 +看着像死锁。单独跑 **0.058s 通过** ⇒ 真因是 **`/tmp`(8.8G tmpfs)被 Go 构建 +缓存占满 100%**。教训:构建/测试挂住时先 `df -h /tmp`(`/` 空闲不代表 `/tmp` 够)。