
v8.0.42 发出两小时后被连开六单:登录快照能把刚禁用的号改回轮转、invalid_grant 后重登也拉不回来,另有一条只在双工 steer 打开时才碰得到的跨 key 越权;六处行为在主干上原样存在,正文给出逐条判据与今晚的处置顺序。
bc064340 上验证过,也就是 v8.0.42 自己的提交,每张都带可复现的测试和一版建议改法。2截至发稿,六张单一条回复都没有。bc0643405a1d。3dev 上没有更新的提交,这六处行为在 dev 上一字不差地存在。| 单号 | 什么时候会碰到 | 结果 | 今晚动不动 |
|---|---|---|---|
| #6951 | 登录动作与禁用操作撞在一起 | 刚禁用的凭证重新进入轮转 | 要 |
| #6948 | 刷新令牌返回 invalid_grant 之后重登 | 账号带着好令牌仍停在不可用 | 要 |
| #6949 | 开了 upstream.codex.response-steering | 轮次身份写进别的请求;换 key 的轮次被放行、账记在旧 key | 要 |
| #6952 | 同上,且有请求拦截器删掉 model | 按上游模型授权,可能错拒或错放 | 同上一行 |
| #6950 | 工具 schema 用 allOf 提供 items | 数组被声明成字符串数组 | 改写法 |
| #6953 | 自己跑 go vet 或 CI | 静态检查红 | 只影响自建镜像 |
ClearFileSnapshot() 把绑定清掉,接着这份无绑定的克隆同时写进缓存和第 131 行的队列副本。2
internal/watcher/dispatcher.go 第 106–134 行:第 112 行清掉文件绑定,第 126 行把克隆写进缓存,第 131 行用同一个克隆做队列副本。6updateInternalLocked 第 292 行那句 isFileSnapshot 判为 false,紧接着的磁盘比对整段跳过。Generation 与 RegistrationEpoch 又都是 0,陈旧检查也拦不住。队列消费与内联应用谁先拿到那把锁,谁生效。2active,令牌换成 t1。go test ./internal/watcher/ ./sdk/cliproxy/ 也过。active 的,重新禁用并记下时刻。refreshAuth 会留下 Status=error、Unavailable=true、一条 400 的 invalid_grant 错误和 RefreshFailures=1。中转站的标准恢复动作,就是用同一账号重新登录、重写同一份凭证文件。7
sdk/cliproxy/auth/conductor_lifecycle.go 第 406–421 行:第 413 行的条件只覆盖 401 类失败,invalid_grant 是 400,进不来。8invalid_grant 是 400,过不去。账号于是带着完好可用的新令牌,继续留在 Unavailable。invalid_grant 失败、令牌端点 503 失败、还有一组是重登时仍有一个活着的 429 冷却。前两组重登后仍在轮转之外,第三组按原样保留了冷却。d5816d5e(#6844,v8.0.39)引入这套继承时,本意是凭证重写时保住运行期状态。清理条件定得太窄,把「令牌死了、换个新的就好」这类恢复也一起挡住了。active。还挂着不可用的,最省事是重启一次进程——那份凭证文件里存的是令牌,运行期状态一重启就重建。POST /v8/management/routing/cooldown/reset 也能试。它走 ResetQuota,只在账号未被禁用、没有未到期的模型错误、且没有 401 失败记录时才把状态拉回 active。9authenticateResponsesWebsocketTurn 第 312–318 行,只要认证成功且 c 非空,三个键无条件写进 c。受 updateRequestContext 控制的只有后面第 320 行那段 request context。
sdk/api/handlers/openai/openai_responses_websocket.go 第 308–322 行:第 312–318 行的写入没有条件,第 320 行的 request context 才看 updateRequestContext。10false。所以每来一个续轮或 steer 帧,调用这个函数的是执行器的写协程。11CloseExecutionSession 关掉上游连接就结束。还在飞的那次校验于是可能写进一个 gin 已经回收、并已交给下一个请求的 Context。Set 自己带锁。Authorization、X-Goog-Api-Key、X-Api-Key、?key=、?auth_token= 的顺序取第一个配置过的 key。helps/usage_helpers.go 第 89 行)。双工的这次校验从不更新那个 context。c,并把认证出来的 principal 返回给双工闭包,身份不同就回 401 让客户端重连。upstream.codex.response-steering 是关的。没开双工 steer 的实例碰不到这一整类。initial.originalPayload 里的 model,读不到才回落到 req.Model。req.Model 是上游模型。12originalPayload 是请求拦截器跑完之后的那份 body。某个拦截器把 model 删掉之后,绑定值就成了上游模型 U,而流在握手时授权的是客户端别名 A。ReplayRequired,退回复放。
internal/util/gemini_schema.go 第 556–568 行:第 563 行只跳过带 $ref 的节点,第 566 行随即写入 string 占位。14$ref 的节点,带 allOf 的节点照样被补上占位 items。这一步发生在内联引用之前、mergeAllOf 之前。合并时父级优先,分支里真正的 items 就没了。$ref 为什么要跳过:占位会成为内联后的兄弟键,盖掉被引用定义里的真值。allOf 的处境一模一样。allOf,让 Phase 3 的 sanitizeArrayItems 在合并之后补占位。type: array 就地把 items 写全。用 allOf 包一层再引用,正是最容易被改写掉的写法。go vet ./internal/home/ 报 lostcancel,位置在 cluster_balance_regression_test.go 第 293 行——context.WithCancel 之后没有 defer cancel(),第 320 行那条 return 可能不经过 cancel。internal/pluginhost/stream_bridge.go 第 197 行的 streamBridgeStream.close 在 closeWithError 重构之后没有调用方,unused 会报。整包里这个函数只有定义处。16antigravity_issue6825_test.go 第 399 与 402 行用字符串 "gin" 做 context.WithValue 的键,staticcheck 报 SA1029。go vet ./... 的人会红。跑发行版二进制的人不受影响。upstream.codex.response-steering。开着又用不上双工 steer 的,关掉并重启,第三、第四两节的问题一起退出。active 的重新禁用;仍不可用的重启一次进程。allOf 提供 items 的数组,就地补全 items。go vet ./internal/home/,等补丁。bc064340 之后的第一笔提交。adapters_executors.go 第 491 行已经有 helps.NewPayloadFinalizer,说明这笔修复由维护者另笔提交带进了发行版。17判「某条修复在不在」,看发行版,别看 PR 状态。configuration_update,要等 v3.1.2。x-grok-client-version。session-affinity-consistent-hash 选项,属于功能新增,尚未合并。21github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.