Skip to content

[PR] Full regression review: v0.1.209 → master(empty vehicle PR) - #5341

Closed
ranxianglei wants to merge 14 commits into
masterfrom
master-review-209
Closed

ranxianglei wants to merge 14 commits into
masterfrom
master-review-209

Conversation

@ranxianglei

Copy link
Copy Markdown
Owner

空载体 PR:本身没有代码改动。用途是把 v0.1.209 → master 的合并大 diff(约 440 commits / 314 files / +22827 −2096)作为整体做全面回归审查的落点,结论以评论形式发在本 PR 上。

审查维度:DSH 相关改动、性能、缓存、协议、存储、其他回归。非逐 PR review——看的是这个区间合起来的净效果与交叉影响。

CI 走 ci:full。本 PR 不合并。

@ranxianglei ranxianglei added the ci:full Run the FULL CI matrix (all e2e lanes + 12-leg test matrix) on this PR label Oct 31, 2026
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

📦 Built Package Artifact

Branch: master-review-209 (36db135)

Latest build — install this exact version

npm install -g billion-context@0.0.7584-pr.5341.55b69e4

This exact version is immutable and reproducible. The rolling pr tag tracks the newest test build across all PRs.

Recent builds (commit → version)

commit version build
36db135 billion-context@0.0.7584-pr.5341.55b69e4 build
9f74bae billion-context@0.0.7567-pr.5341.03335c1 build
a8e9131 billion-context@0.0.7565-pr.5341.e705e37 build
0abc37f billion-context@0.0.7562-pr.5341.f0afb37 build
06a6466 billion-context@0.0.7550-pr.5341.4903d10 build
64fc687 billion-context@0.0.7534-pr.5341.35f76e2 build
0f78649 billion-context@0.0.7529-pr.5341.faf2f7a build
7572403 billion-context@0.0.7483-pr.5341.2d61eaf build

Download artifact

  1. Download the artifact from the Actions run
  2. Extract the tarball and install:
tar xzf billion-context-pr5341.tgz
npm install -g package

Install instructions are refreshed on each push.

@ranxianglei ranxianglei changed the title Full regression review: v0.1.209 → master(empty vehicle PR) [PR] Full regression review: v0.1.209 → master(empty vehicle PR) Oct 31, 2026
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

查重: 不重复——检索 open+closed issue/PR,没有其它针对 v0.1.209→master 区间的回归审查落点;本 PR 是该区间唯一的整体审查载体。

标签: pr + regression + scope/ci + p3(版本区间回归审计请求,属发版/CI 域;本身不是缺陷,无客户端归属)。

审查计划(按发版类 PR 的区间回归审计流程执行):

  1. 全窗 diff 分段通读:v0.1.209..master 实测 450 commits / 322 files / +23865 −2113(比开 PR 时略大,master 又前进了);先 --stat 总览,再高危域逐行精读,其余按目录/主题分批通读,不整吞 diff;
  2. 高危域点名精读:自动更新/自更新路径(src/update.ts、advisory、plugin-install)、dsh 车道(dsh-ledger、profile copy、安装/升级/守护流程)、版本钉死与 lockfile(bili/kernel/pi-subagents 三处 version + package-lock)、.github/workflows、网络/代理路径(server/loop 请求管道);
  3. 逐项过窗口内每个 fix/feat 的既有行为是否被破坏(语义漂移、fail-fast 变吞错、默认值/阈值/时序/输出格式漂移);
  4. 汇总重大行为变更清单(旧值→新值+原因)+ 高危域逐项核查结果 + 回归判定,以八问体例发在本 PR 评论里。

非回归性发现如有,按规则汇总为且仅开 1 个 issue(带来源标记);本 PR 不合并、不动代码。开始干活,结论稍后回。

@ranxianglei ranxianglei left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

全面回归评审:v0.1.209 → master (f70055c7)

范围:v0.1.209 之后的全部合并净效果(67 commits,~598 files)。审查方式是整段 diff 一次性 review,不是逐 PR——重点看多个 PR 叠加后的净行为、跨文件交互、以及"每个单看都合理、合起来出问题"的面。四条独立审查线(存储 / 压缩缓存会话 / 启动可靠性与 CI / 性能热路径+dsh+协议)+ 主线程独立核验(差分模糊、逐字节协议核对、本地全量测试)。

一句话总评:没有发现功能性回归或数据损坏风险,本区间净方向是加固(接管安全、故障恢复、测试网密度都在变强);但当前 master 自身挂着三条红守卫(见 §A),在修掉之前所有后续 PR 的 CI 都会带假失败。另有一批 6 个 P2 + 12 个 P3 需要登记跟进(§B/§C),其中 3 个是可直接一行修复的机械问题。真模型 gate 本次运行环境无效(GPU 被占满,见 §E),重跑结果将作为补充评论追加到本 PR。


§A 当前 master 自身的三条红守卫(先修这个)

master 现在过不了自己的门禁,任何后续 PR 都会继承这三条假失败。全部是"功能合进来了、配套义务没做完",修复各只需几行:

# 守卫 现象 引入者 修法
A1 docs-sync #5319(chat prompt pack)改了 EN/ZH 文档,但 website/config-reference/ 里 compress.promptPack 行的 builtin 列表漏了 "chat" 06ad804 一带(#5319,10-31 15:20 合入) 两语言该行的 builtin 列表补 "chat"
A2 unused-exports src/codex-models.ts 导出 CodexWindowSource 但全仓库无消费者(grep 证实零引用) 0629480(#5243,codex model_catalog_json) 删掉 export 或补消费点
A3 lifecycle-ledger-guard src/ 读两个 env 变量但 LIFECYCLE.md 没登记:BILI_SESSION_CONTENT_STORE_PIN(← c8d7a80,#4788 phase 2)、BILI_SPAWN_FINGERPRINT(← fc53fd4,#4125) 同左 LIFECYCLE.md 按既有格式补两行

§B P2 发现列表(建议下个发布前处理;均为窄窗口或成本类,非数据损坏)

B1 · 每轮请求收尾新增一次同步全图遍历(sessionWeight 深算)— 性能域,置信度高

人话:代理跑长会话时,每一轮都会在响应收尾处把整个驻留会话对象树从头量一遍字节数(判断要不要溢出到磁盘),量得越久卡得越死,且是同步阻塞事件循环的。
机制链:src/server/handle.ts:2910 spillBetweenTurns(session)(#4788 phase 2 新增,每个代理请求 finally 必跑)→ src/persist.ts:2974 → debounce save 稳态下 afterNextFlush 恒真 → :2985 cap>0 && sessionWeight(session)>cap(默认 cap=512MiB)>0)→ src/session.ts:1073 权重按 revisionEpoch 缓存,但 markDirty 每轮 bump epoch ⇒ 每轮全新计算 → src/session.ts:1045 deepSizeOf 递归遍历 kernel 全量历史 + 永不收缩的 messageRefs Map。
实测(verbatim 拷贝函数,/tmp/bili-perf/sizeof3.mjs 可复跑):消息 2k≈2ms / 8k≈5.3ms / 20k≈14ms / 50k≈58ms;成本随对象数线性。v0.1.209 中 sessionWeight 仅诊断端点调用。这直接违反本区间自己立的 #5130「每轮禁止对整段历史做重复 O(n) 重扫」纪律(#5131 刚删掉一批全量扫描,#4788 p2 又添了一个)。
修法:权重估计改增量记账(字段级增删累加)、或 N 轮采样+事件触发、或先用上次权重做快速门(超 cap 才精确重测)。cap=0 可应急关闭。

B2 · 插件注入车道存储打开失败会硬抛进宿主代码 — 存储域,置信度高

人话:dsh/pi 这类把 bili 当插件嵌的宿主,如果磁盘出错(文件句柄耗尽 EMFILE、杀毒锁文件)持续几分钟,旧版(209)静默降级继续服务,新版每一回合都会往宿主代码里抛错。
机制链:UnifiedShadow.maybeOpen 对非损坏类 open 失败改为 THROW(owner 政策 2026-10-30"拒绝即拒绝");src/persist.ts:595-596 ctor 不设防调用;懒单例无失败 latch(persist.ts:3960-3966)⇒ 每次 getStore() 热路径调用(incremental-lane.ts:232/295/313/423、handle.ts:93/502/1660 等)整体重试构造并打 ERROR。独立 server(server.ts:566-571)有 try/catch→clean exit、threads-lane 有完整 guard(:179-225)——插件宿主这条腿没有(它不走 startServer,server.ts:673 注释确认)。
验证:issue5188/replicas 20/20 绿;未实机构造 EMFILE(只读约束)。
修法:给插件车道 getStore() 加统一错误边界或失败 latch(复用 #5188 pace)。属 owner 已批准政策的未包裹残留面,可合并,建议发版前补。

B3 · 子代理车道键把 system prompt 编进了键,派发中途 system 一变就劈开压缩状态 — 缓存域,置信度中高

人话:Claude Code 子代理的车道键 = 会话id + system哈希 + 随机号。如果同一个子代理任务跑到一半,system 文本被宿主改写一个字节(版本注入、模板刷新),后续轮次就掉进一条全新的空车道:之前积累的折叠、缓存基线全部弃置,一次缓存重建+重新折叠。另有一个文档化的必然降级:首条 user 消息一旦被折叠,随机号从 wire 上消失,续跑落另一条车道——即任何足够长的子代理派发恰好丢一次压缩进度。均不丢数据(客户端全量重发、新车道重建),是成本/延迟抖动。
位置:src/session-resolve.ts:242-252(随机号车道优先于一切连续性启发式,绕过 #2241/#2250 锚迁移)。另见同文件注释自认的已知切换("post-fold head loss")
升级条件:若生产上同一 dispatch 相邻两轮 system 字节不稳定 → 升 P1(每轮劈道)。证据需求:生产日志取同一 dispatch 两轮 system 字段 diff。这是本清单唯一可能升级的项,优先取证。

B4 · Responses 线把"第三方客户端用自己会话 id 当缓存 key"误判为 bili 自印产物并默认吞掉 — 协议域,主线程独立复核确认

人话:Responses 协议线新逻辑:只要请求体里 prompt_cache_key === 会话 id,就认定是 bili 自己打回去的,默认配置下直接丢弃。但真正惯用"自己的会话 id 作前缀缓存键"的第三方中继客户端(OpenAI body-keyed 常见做法)会被无声剥离 → 上游前缀缓存亲和丢失,token 账单上涨。chat 线没这个问题——它额外要求 identity 来自 bili 内部 header。
位置:src/server/prepare-responses.ts:853-854(判据仅 pck===sessionId && source!=="prompt-cache-key")vs src/session-id.ts:381-382(要求 internalLane)。注释只认领 pi(PI_CACHE_RETENTION=long)和 hermes 两个有意目标。现有测试(tests/issue5079-pck-default-off.test.ts:207)只钉了 key≠session-id 的正例,key===session-id 的非 bili 客户端行无覆盖。
修法:responses 线收窄到已知发射方标记,或在升级通知文案里明说这类 key 也会被吞 + 补负例测试。暴露面待流量统计。

B5 · 压缩循环打满时"温柔收场"的代价:跨请求无熔断,病态场景每轮付 10 次全历史请求 — 压缩域,机制已钉死

人话:模型反复发出注定失败的 compress/decompress 调用时,单个请求内最多烧 10 轮(每轮=一次全量历史的真实上游往返+计费),然后以 stop_reason=max_tokens 结束。Claude Code 对 max_tokens 自动续轮→ 下一个全新请求又允许再烧 10 轮。去重集(failedSigs)是请求作用域(src/loop/core.ts:654),会话级没有任何计数或开关。若失败是结构性的(如某版客户端持续传陈旧块 id)且模型不听回执劝告,就是无限循环:N×10 次全历史请求直到任务自然结束。
缓解面(所以定 P2 不是 P1):失败回执逐字节对齐客户端视图(C 队验证:receipt==marker 字节同源,四适配器一致),行为正常的模型 1-2 个周期就会改道;每轮有 warn 日志(core.ts:1537)可观测。
修法:会话作用域连续耗尽计数器——连 N 次请求全失败耗尽后记日志并在下一请求注入更强指令(或直接停用 compress 工具结果一轮回退旧契约)。改动小。

B6 · 订单骨架表 1024 上限只挡写盘,内存无淘汰,淘汰后可复活"首认领污染" — 缓存/存储域,置信度中高

人话:记住"哪个会话 id 先声明自己是主线"的那张表,超过 1024 条后老条目被挤出磁盘;重启后那些 id 变回"初次见面",而初次见面规则是"长得像主线就直接认领"。本区间子代理车道的两个新修复(随机号键 + 内容指纹键)让每次子代理派发都新增一个键,键增速远快于 209。触发需:活跃 id 被挤出 + 重启 + 陈旧子代理长历史重放先到--概率低但机制真实(#3397 当年修的正是这种孤儿化)。
位置:src/order-persist.ts:29-30,83-85 + src/session-resolve.ts:256-267 first-sight 分支。
修法/监控:长期主机定期看 session-order.json 条目规模;或对 main claim 单独 pin 不参与 LRU。


§C P3 台账(登记备案,多数一行可修)

# 域 位置 一句话
C1 性能 src/plugin.ts:1187-1188 reconMissGate/reconMissLastLogMs 两个诊断 Map 无界(只有成功重建才删,后者从不删);同文件有 EVICTED_WEIGHT_CAP=256 先例,加 TTL sweep 即可
C2 性能 src/preflight.ts estimate memo 键含 textLength,同长同 id 原地改写命中陈旧值;误差个位数 token,备案(#5131 已接受同类)
C3 压缩 src/fold-reconcile.ts:1896 METADATA_EXPECTED_REBASE 无清理路径(dsh 车道每折叠退休一条 carrier +1,永久序列化进 metadata);对照 offloadPending 有 MAX_REBASE_MEMO=8192(:290)——同一 PR 只给一半设了限,像遗漏。复用 pruneRebaseMemo 即修
C4 压缩 src/fold-reconcile.ts:1847-1866 drift 通道未命中行每轮原样重扫(≤256 行 ×7 marker includes,行可含 MB 级 base64);永久漂移会话每轮纳税。加内存级负结果记忆化
C5 压缩 src/durable-message-guards.ts 三个载体分类器前缀/子串误伤面("Background job…"开头的真人提问会被标成载体);常态无害(持久消息不消失),宿主改写场景下告警语义失效。注释已论证 benign-FP,接受备案
C6 存储 src/session.ts:1327-1331 publishForkSession 存在性探针改 async 后 check-then-add 多一个 await 窗口;#4942 响亮失败保证在 mysql 延迟下略放宽(sqlite 为 microtask);窗口极窄,记录
C7 存储 src/stream.ts:512 summaryFingerprintLine O(k²) 去重(receipt 路径低频),换 Set 一行
C8 存储 src/persist.ts durableRevision 族 lastSaveLanded/capWarnAt 从不 delete;每 id 一个布尔/数字,可忽略
C9 存储 tsStamps(kernel state 新持久字段) #4313 flag 默认 off 零增长;开则随消息 id 数无界,与 #4788 minimal-resident 目标有张力,记入其 phase-3
C10 存储 v8→v10 存量库升级 fresh 建库被隐式全覆盖且 migrate 单事务,但带数据的旧库 ALTER 路径无 fixture;补 user_version=8 fixture
C11 启动 src/server.ts:676 event-loop-watchdog 返回的 .stop() 无人调用(全仓库无调用点);worker/beatTimer 均 unref 不阻退出,唯一理论窗是 SIGTERM drain 期连续 wedge ≥5min 被 worker exit(1) 打断。要么接进 shutdown() 要么删
C12 启动/dsh src/launcher.ts:5315-5380 失败诊断文案:head 采样被改坏(span>256B 永远取尾,label="tail"),tail 采样又取同样尾巴 ⇒ 同一段内容打印两遍、头部永远不可见;两个 PR 各自落地未对账。纯文案,一行修
C13 协议 src/server/side-request.ts:191+ title sidecar 谓词(恰一条 user、零 tools、\x3csession\x3e 开头)理论误伤窗口:--disable-tools 姿势 + 首条消息恰好以此开头 → 静默绕过一轮压缩面;现实风险极低,备案
C14 其他 benchmarks/third-party-1500 9 文件全新增,口径无变化,但基准数字钉在 v0.1.202(早于本区间)⇒ README 宣称不能覆盖已合并改动;PNG/原始输出本机不可复现。文档面,不阻断
C15 启动 watchdog 硬超时 vs spawn budget WATCHDOG_HARD_TIMEOUT_MS=300_000 硬编码无逃生口,而文档承诺 store open 可 >60s 且用户可用 BILI_SPAWN_WAIT_MS/BILI_SLOW_START_GRACE_MS 放宽;Windows AV + 数 GB index.db 场景下单段 >5min 阻塞式 open 会在用户预算内被杀。需现场 [event-loop-watchdog] trip 证据定性

§D 分域结论

域 结论 要点
回归(总) ✅ 未发现功能性回归 kernel 全量 1507/1507、存储域 ~380 相关测试、压缩/会话 ~300 断言/14 套件、启动族(wire-exit-matrix 7/7、issue5096 9/9、tunnel-guard 21/21、issue5140 3/3)本地实跑全绿;tsc 0 error
dsh 相关 ✅ 纪律守住,1 个成本残留 #5167 Connection-close 轮询前提在 Node 25 实测成立(close probe 每次新 socket、普通 fetch 走池);#5095 hook 安装 managed-block 纪律成立(只动自己的条目)、fresh install 产物齐全(tsup entry+files:["dist"]);adopt/接管 rung 全部要求 pid 级证明,未发现可 attach 他人端口的路径;残留=B1(sessionWeight 每轮遍历,#4788 p2 引入)+ 子代理骨架键增长(B6/C1)
性能 ✅ 净正,但自相矛盾 #5131 去重扫正确(cache-ledger 二分化经 30000 例差分模糊 0 分歧,消息级 indexOf 跳跃与旧状态机截断语义字节等价;nImages 用终串重数不 stale);但 B1 抵消了一部分红利——本区间一边删全量扫描一边新增一个更大的,应入 #5130 清单
缓存 ✅ 无回归,潜伏键空间问题 fold credit T1-T7+E2E、splice #5155(marksVersion 失效、指针收敛)、多 fold 断点(cache-control.ts 区间零改动+交互面套件绿)、post-fold credit 字节不变;潜伏=B3(system 劈道)/B6(骨架 LRU 复活)
协议 ✅ 净效果正确 #5179/#5220/#5307/#5330 stop_reason saga 四连改动的净行为:失败回执与客户端所见 marker 逐字节同源(streamedMarkers 镜像,四适配器一致);dedup 时空文本帧不发;签名断线器保留;探测族 ≤MAX_LOOP_ROUNDS=10;visibilityMarkers=false 回退旧契约;core.ts:1430 _marker_ 分支不可达(死代码良性);Anthropic stop_reason 合法值纪律守住;残留=B5(跨请求熔断缺失)+C13
存储 ✅ 可迁移,1 个真实证据缺口 v9/v10 migration probe-first 幂等双向兼容、单事务;read-your-writes 仲裁与 loadSync 逐条一致(lazy-narrow-reads 33/33 含 drift 三例);GC refcount 每批 refilter、integrity FAIL 永不 memoize;#5188 sidecar reopen 有界;缺口:MySQL 全是 hermetic stub,v9/v10 首升 ALTER 零真实服务器覆盖 + sessionViewRows 混合世代未实机(A 队 P2-3,后果判定:方向安全,最坏诊断噪音,自愈);writer-off 损失窗=owner 已批准取舍(注释引用 10-30 决定)
其他(启动/CI/升级) ✅ 全部加固或不变 CI 门禁全是追加 timeout/更严(cancel 收窄、release-bugfix 恢复但双重确认、test-suite-lock leak guard ON);watchdog/owner-beat worker 线程独立于主线程 stall(issue5152 6/6 绿);优雅关闭语义不变;zcode memory isolation 三门硬控全覆盖(4/4);头透传白名单区间零收窄;update 通道 src 零改动;指纹 env 投毒有 sha256 正则校验+回退;tsup 仅 +hook entry;verif exceptions 纯增有理由;package.json 仅 test preload 变更

§E 证据基础与局限(严格性声明)

已完成的证据:

  1. 四条独立审查线各自跑了其域的测试子集(合计本地 >1000 断言,tsc 全绿);
  2. 主线程独立差分模糊:cache-ledger 新旧实现 30000 例恶意 JSON,0 分歧;
  3. 逐项 git log -S/-L 溯源关键行到引入 commit;
  4. PR CI(#5341 ci:full 车)按平台常规跑,以推送头为准。

未完成/无效的证据(明确标注,不许当通过用):

  1. 真模型 release gate:f70055c7 候选包实际跑过一轮,但环境无效,不算数。 运行期间 GPU 被其他任务占满(sglang :8199 的 /v1/chat/completions 全程零字节应答,GPU 95-100% util、~94/98GB VRAM),所有 qwen 车道 turn 被 bili 在 idle 预算处正确中断(bili 侧行为本身教科书级:emergency-shrink armed、SIGTERM flush clean persist、prefix-affinity reattach、冷载恢复均有日志佐证);glm relay 链路正常(Lane B 切上游后缓存命中 50%→93% 有 usage 记录);verdaccio latest tag 未挂到候选包(update 车道读到的是 0.1.209)。GPU 空闲后必须重跑并通过,才能声称"f70055c7 通过真模型 gate"。重跑结果会追评到本 PR。
  2. MySQL 实机:见 D 域缺口,发版前需 BILI_MYSQL_TEST_DSN 跑一次 e2e(+issue4665 mysql lane)。
  3. 下述生产证据项(§F)。

局限性:审查是静态读码+本地实验,无法替代生产遥测;"查过没问题"项的置信度受限于采样深度,已尽量给出测试名和断言数。


§F 待证实疑点(需要生产数据,按优先级)

# 问题 需要的证据 影响
F1 Claude Code 子代理同一 dispatch 内 system prompt 是否字节稳定? 生产日志取同一 dispatch 相邻两轮 system 字段 diff 不稳定 ⇒ B3 升 P1(每轮劈道、缓存白建)
F2 长期主机 lane/order 键总量离 1024 多远? 长寿命 proxy 的 session-order.json entries 计数 接近 ⇒ B6 提级
F3 有多少非 pi/hermes 客户端发 pck === x-session-id(Responses 线)? 流量统计 >0 ⇒ B4 有真实受害面
F4 大上下文会话(50k+ 消息)是否已达用户可感卡顿? billing log 请求间隔 vs __bili/status/event-loop lag 直方图 是 ⇒ B1 提前处理
F5 #5220 边角:失败轮同时流了 prose 时,双 assistant 结构的 reconcile 判决? 活体 Claude Code 构造 compress 必败+先吐 prose,FOLD_RECONCILE_DEBUG=1 看判决类别 异常判决 ⇒ 协议域补丁
F6 #5134 跨重启:credit>0 持久化后重启,首个 prepare 是否恰消耗一次? 现有 T6/T7 不含重启维度,补一个用例即可 重复记功 ⇒ credit 虚高

§G 建议行动(按优先级)

  1. **【阻塞项】**修 §A 三条红守卫(A1/A2/A3 合计约 10 行改动,可拆三个 micro-PR 也可以一个)。
  2. **【取证优先】**F1(system 稳定性 diff)——唯一可能改变严重度排序的证据项。
  3. B1:sessionWeight 移出每轮热路径(#5130 清单追加条目;cap=0 可做过渡)。
  4. B2:插件车道 getStore() 错误边界/failure latch。
  5. B5:跨请求连续耗尽计数器(小改动,防病理成本环)。
  6. B4/B3/B6:按 F1/F2/F3 证据落地(收窄/监控/修)。
  7. P3 台账:C3/C7/C12/C1/A3-A 三行这类一行修的可打包成一个 chore PR。
  8. 发版前置:MySQL DSN e2e 实机一轮 + GPU 空闲后 gate 重跑(本文档 §E 两条都关闭才算 f70055c 完成验签)。

审查方式说明:整段 v0.1.209→f70055c7 diff 一次性 review(非逐 PR),四线并行+主线程交叉复核;所有引用 file:line 均可在当前 head 复现;实测脚本路径已在正文注明可复跑。

ework-agent added 3 commits October 31, 2026 18:30
Converging master's red gates onto ci-fixes. lifecycle-ledger-guard is already fixed here (LIFECYCLE.md entries for BILI_SESSION_CONTENT_STORE_PIN / BILI_SPAWN_FINGERPRINT from the prior sentinel pass, preserved through the master merge); this commit clears the other two.

docs-sync: #5319 documented the new 'chat' builtin prompt pack in CONFIGURATION.md/.zh-CN.md but never updated the single-source seed, so regeneration dropped it and the gate failed. Add 'chat' to the compress.promptPack seed (type/desc_en/desc_zh) and regenerate website/docs/index.html to match.

unused-exports: CodexWindowSource (src/codex-models.ts) and PackInstallOptions (src/pack-install.ts) are referenced only inside their own modules and imported nowhere else; drop the leading export (INTERNAL_ONLY) as the guard prescribes.

Verified locally: lifecycle-ledger-guard OK, check-unused-exports clean, gen-config-docs regenerate matches committed artifacts (zero drift).
…safe family gate)

pack-install.ts took the last 3 npm stderr lines via split+slice(-3), tripping the #816/#1615 family gate in tests/text-safe.test.ts even though the receiver is an array of lines (code-unit-safe). Use a non-negative computed start index so the literal negative-slice token is gone; output is identical (last up-to-3 lines clamped to 300 chars). Inherited from #5340, which shipped without satisfying the gate.
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

v0.1.209 → master 全窗回归审查结论(窗口实测 451 commits / 324 files,+23865 −2113;审查头 origin/master 485c5eaf,含审查期间合入的 #5322;全窗 diff 分 6 批逐段通读——CI/workflows、dsh/网络/端口、src 核心热文件、storage/*、kernel/src(逐行)、wire/lane/web/docs,高危域逐行精读)

八问

  1. 是什么问题:不是 bug——按你的要求把 v0.1.209→master 合并大 diff 作为整体做净效果 + 交叉影响审计(DSH / 性能 / 缓存 / 协议 / 存储 / 其他),非逐 PR review。
  2. 什么原因导致的:不适用(审计类工作,无缺陷根因)。
  3. 影响范围与严重程度:覆盖全部车道。未发现对既有行为的破坏性回归。唯一未披露的语义漂移 1 处:Compression conflict banner (bili v0.1.205, node v24.19.0, win32-x64) #4521 statusLine 边界行在 plugin 模式(dsh/opencode/pi/omp)跨压缩阈值后注入 wire(advisory-only、缓存安全、大概率良性,但属「修 A 顺带改 B」高危模式且 [PR] Compression always failing and requiring many retries? Changed collapsed/protected region intervals to successful no-op | 压缩总是失败要重试很多次?已折叠/保护区区间改为成功 no-op 收据,并刷新 armed-but-silent 窗口的 ref 指针 (#4521) #5253 未披露)→ 已立项待你拍板:issue decision request: #4521 Compression boundary status line (statusLine) injected into the wire after crossing the threshol | decision request: #4521 压缩边界状态行(statusLine)在 plugin 模式跨阈值后注入 wire——PR #5253 未披露,需拍板门控或文档化 #5350(建议 B 文档化)。另有 1 处 p3 注释与代码不符(durable-message-guards.ts dshTimeContextPath,功能安全),一并列入该 issue。
  4. 怎么修复的:本 PR 不动代码(空载体)。两处发现按「窗口审阅非回归性问题只开 1 个 issue」汇总为 decision request: #4521 Compression boundary status line (statusLine) injected into the wire after crossing the threshol | decision request: #4521 压缩边界状态行(statusLine)在 plugin 模式跨阈值后注入 wire——PR #5253 未披露,需拍板门控或文档化 #5350。
  5. 是否有回归问题:无。高危域逐项点名核查:
  6. 是否破坏缓存:无。缓存敏感面逐项:[PR] fix(dsh): carry the thrown error's bounded stack into the gate refusal logs (#5067 option A) #5079 promptCache.routing 默认 auto→disabled 是有意变更(显式 auto 零迁移、client 自带 key 恒逐字转发、启动一次性提示已随 PR 交付);preflight memo 键 id|len|thinkingTokens 有界残留(estimate 仅软门槛非计费,作者注释已论证);incremental-lane 前缀预序列化字节等价(boundary flush check + marksVersion guard);fold-reconcile expected-rebase 只出分母、认领逻辑零改动;statusLine trailing ephemeral 不入客户端历史。
  7. 是否改了设计方向:有 5 处架构转向,全部 owner 决策且在 PR/注释/文档披露:① second-writer 从拒绝启动降为 informational(多进程共享 index.db = 支持拓扑,owner 2026-10-31);② async 存储后端起不来 = listen 前 exit(1)(no-degradation 政策,旧契约首请求才失败);③ 3-strike breaker 移除(index writes never abandoned,owner 2026-10-30,jsonWriter=off 用户坏 index 上失去 envelope 回退为明确接受项);④ getSession→getSessionAsync 热路径(memory miss 可从 DB reload 而非起新会话);⑤ failed-only mutating round 默认翻转(recovery receipt + re-request,signature ping-pong breaker + MAX_LOOP_ROUNDS=10 双重有界,receipt 字节=客户端已见字节缓存安全)。
  8. 是否引入了新的配置:有,全部达标(en+zh 镜像、env>file>default 纪律):promptCache.routing 默认值翻转(auto→disabled,重大,见第 6 问)、compress.messageTimestamps(OFF,BILI_MESSAGE_TIMESTAMPS 优先,GLOBAL only,重启生效,ts 列无论开关都写)、sessions.hardMaxBytes([Performance] v0.1.208 long sessions exceed 2 GiB memory and spend 14–22 seconds in local processing #4788 D1-A)、BILI_SPAWN_WAIT_MS/BILI_SLOW_START_GRACE_MS(env 覆盖,默认不变)。config surface 纪律:每个新字段都有 PR 侧「为何现有面表达不了」映射,无擅自发明形状。

行为变更清单(旧→新,均有意且已披露)

# 变更 旧值 新值
1 #5079 promptCache.routing 默认 auto(bili 自 stamp prompt_cache_key) disabled(client key 恒转发;显式 auto 不变)
2 #5220 failed-only mutating round 立即 finishReason "length" 结束 turn recovery receipt + re-request(双重有界)
3 #5179 Anthropic stop reason "length"(Claude Code 停任务) "max_tokens"(可续跑)
4 #4521 applyCompression 四处 FAILED throw/error noop success 收据(重试活锁根治);endId 越界钳制(start anchor 仍硬拒)
5 #5109 lastUserAnchor 字面最后 user 最后一个非注入 user(injection carriers 跳过)
6 #5046 3-strike breaker 坏 index 三次失败切 JSON envelope 移除(index writes never abandoned)
7 #4942/#5046 async 存储起不来 首请求才失败 listen 前 exit(1)
8 second-writer refuse-to-start informational only(WAL 多进程安全,同 session 双写走 split-brain alarm)
9 #5188 sidecar 瞬态 open 失败 永久降级 legacy 30s/100ms 自愈重试(proven-corrupt 永不重试,alarm+人工)
10 #4788 内存整合 驻留字段常驻 between-turns spill(多重 fail-closed + per-session hard cap + PIN escape hatch)
11 #5167 rotation wait pooled keep-alive socket 应答判定 Connection:close fresh connection 探测(listener 关即成功)
12 #4125 newerHolderHolds wait/ladder(双实例死锁) fail-fast + adoption signal(spawner 骑新版)
13 #4994 heartbeat-death 判定 立即 5 连 stale tick(~8s 确认窗)
14 #5152 owner heartbeat 主线程 beat(长同步 turn starve) worker thread(错误/spawn fail 回退 in-thread)
15 #5012 stderr mute 仅 launcher child 任何非 TTY stderr(TTY 保留 tee)
16 #5243 codex window 来源链 models_cache > config > snapshot > fallback client-metadata > model_catalog_json > models_cache > config.toml > snapshot > fallback(flat 272K fallback 修复)
17 #4796 zero-ref CAS 回收 单巨型 DELETE(8h 0 行) batched 2000 autocommit + wal_checkpoint TRUNCATE
18 release-bugfix.yml workflow_dispatch 禁用 紧急阀复活(fast==true && confirm_fast 精确匹配双信号)
19 #5142 dsh one-shot carrier 无 time-context/ptc-image/tool-job-notice 分类 3 个新分类器(expected-rebase 出分母,O(full-history) 税 1.8s→25s 恢复)
20 #5181 search_context 池 active-only core.search 全部块 + 折叠前原文语料(工具输出格式变,模型可见)
21 #5046 隔离实例 #394 警告 warn info(pre-#5046 marker 仍 warn)
22 #5253 statusLine 不存在 armed-but-silent 边界行(四条 lane 无条件注入——FINDING,#5350 待拍板)

CI 说明

本 PR 自身矩阵红(lifecycle-ledger-guard / unused-exports / docs-sync failure,test 分片 + red-signal cancelled)= 继承性 master 红,与 #4599 在档家族同一签名(codex-models/pack-install de-export、promptPack 种子 "chat" 等已在 ci-fixes 哨兵分支收敛);空载体 PR 无自身因果,不构成窗口回归证据,不另开 issue(CI 协调政策)。

判定

本版本引入回归:无。 窗口净效果健康:kernel Boundary 合规(declaration/bump 链/两层测试/golden pin 齐备)、config surface 纪律达标、docs en+zh 全套无漂移、pi-subagents 窗口内零改动。唯一待办 = #5350 拍板(statusLine plugin-mode 注入:A 加门 or B 文档化,推荐 B)。本 PR 按你的指示不合并,审查交付完毕。

…ked relay URLs

Local gate harness broke on its own master without anyone noticing because
GitHub CI never runs the local gate (needs real model/dsh/registry):

- #5012 mutes the stdout/stderr tee for managed (launch-token) processes once
  the log-file leg proves live, so a detached gate proxy now leaves proxy.log
  with only the boot banner while every log line goes to the state-dir
  bili.log. mark()/slice() therefore saw an empty stream and every
  log-pattern row failed even though all mechanisms fired correctly.
- Log URL masking (#4191/#4254) renders private hosts as <private-host> in
  bili.log, so the Lane-B routing assertion's exact-URL match missed.

Fix: assert against xdg/state/billion-context/bili.log (append-only within a
run), and match relay egress on :port/path which survives masking.
@ranxianglei

Copy link
Copy Markdown
Owner Author

Gate 重跑结果:f70055c7 真模型 gate A 9/9 · B 6/6 全绿(272s)

兑现原评审 §E 的承诺(上轮环境无效已重跑)。

结果

Lane 结果 关键数据
A 折叠+折叠后连续性 9/9 shrink 98% fold;nudge INJECT(hard)与 preflight 两独立路径各自确认(#3416 双断言);S07 从折叠后上下文召回;post-fold 缓存命中 82% / 99%
B 跨上游切模型+代理重启 6/6 血统 pfa-5178ab…→pfa-1dadd7… (**forked + adopted**,收养父块 ~23680 tok);路由到 glm-5.2(:18081 forward 行确认);新上游缓存预热 99%

Lane U 跳过:候选包未发布到本地注册表(挂 latest 会改变本机实例的升级指向,未获批准不动)。U 道在上一轮同样未生效,故本轮对 U 道既不增证也不减证。
运行环境注记:GPU 有并发任务(util ~96%、VRAM 94/98GB),服务可用但比空闲慢(elapsed 272s vs 基线 ~240s,同量级)。

重跑中发现并直接修复:master 打断了自己的本地 gate 脚本(commit 0f78649b,本 PR 第 2 个提交)

首跑 A 5/9、B 3/6,逐行取证后发现所有失败都是断言读错了文件/用了被脱敏的匹配串,产品机制本身全部正确触发且行为正确(证据见下)。两个成因,都在本区间内:

  1. Host-launched proxy can wedge on Windows when the parent stops draining stderr (pipe backpressure unguarded) #5012(10-29,e78de3da):managed(launch-token)进程在日志文件腿证明存活后静音 stderr/stdout tee。gate 的 profile proxy 正是这种启动方式 ⇒ proxy.log 只剩 boot banner,而断言的 mark()/slice() 读的就是它 ⇒ 所有日志模式行(折叠观测/nudge/preflight/缓存命中/血统)全部假红。
  2. Log redaction misses userinfo in non-HTTP protocol URLs (e.g., socks5): socks5://user:pass@host is logged verbatim. | 日志脱敏漏 socks5 等非 http 协议 URL 的 userinfo:socks5://user:pass@host 原样进日志 #4191/Circuit-open 502 keeps an opaque error string, and connect-refused alerts never reach the host GUI | [Bug][dsh] 熔断/连接失败时客户端只见常量 "acp-proxy failure":detail/upstreamFailure/alerts 全都没到用户眼前 #4254 主机名脱敏:bili.log 里私有主机渲染为 <private-host>(http://<private-host>:18081/chat/completions),B 道路由断言做整 URL 精确匹配必然漏。port/path 保留。

修复:mark()/slice() 改读 xdg/state/billion-context/bili.log(run 内纯追加,轮转阈值远高于单轮 ~50KB);路由断言补 :port/path 匹配。修后全绿。
为何 CI 没抓到:本地 gate 依赖真模型/真 dsh/真注册表,GitHub CI 按设计永远不跑它;#5012 与 #4191 各自的单元/集成测试又都绿(行为本身是合理的)⇒ 静默断裂,只有跑 gate 才暴露。这正是本窗口"整段看净效果"才能发现的问题类型之一。

r2(坏脚本)scratch 里的正确行为留档,例如:

[nudge INJECT T1] usage=231% (37859/16384) … model=qwen3.8-27b,qwen3.6-27b
[preflight] payload ~37859 tok vs window 16384 (~2.3x) — raising summarization budget 16 -> 32
[acp-compress-obs] shrink 99% this-fold (~23680/24011 tok) … blocks=1 anchor≈1491 tok
[prefix-affinity] new session pfa-df6f7ccce6de07b1 … lineage=forked of pfa-79ca157adf406649
[fork-adoption] fork of pfa-79ca157adf406649: parent has 1 adoptable block(s) covering ~23680 tokens
[acp-usage] round 2 input=13652 cached=8768 (cache hit 64%) fold=new
forward POST → http://<private-host>:18081/chat/completions   ← 脱敏后仍保留 :port/path
[acp-usage] round 1 input=12594 cached=12480 (cache hit 99%)

小观察(备案,非阻断)

B 道 turn 的最终回复偶尔以一行压缩标记开头(📦 [ACP] Compressed m00004–m00029 …,两次运行各出现一次):模型侧把临时状态标记复读进回复;入向历史有 #1029 剥离逻辑,出向 final 未处理。表面观感问题,不影响任何断言。

结论更新

原评审 §E"gate 环境无效"撤销:f70055c 通过真模型 lane A/B。发版前置剩余两项不变:§A 三条红守卫 + MySQL DSN 实机 e2e(§G8)。

ework-agent and others added 2 commits October 31, 2026 20:34
Inherited red resolved by convergence, not rewrite: ci-fixes was 12 commits
behind master and its two unique fix commits (cbdd67d negative-slice, 701688d
docs-sync/unused-export) are strict subsets of what master already merged
better (e030d3b+4a12c1a4 safePrefix+windows npm shim, 3491e2d dead export,
b76f0c9 lifecycle reconcile). Both failing shards were inherited from master's
own newer commits that ci-fixes lacked:
  - #5103 refusal-remedy test -> pinned by 892a378
  - flushAll dirty content store -> fixed by 1f209ff (src/store.ts adopt)
Conflicts (codex-models.ts, pack-install.ts) resolved toward master = superset.
Resulting ci-fixes tree is byte-identical to origin/master (git diff empty).
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

收到 gate 重跑结果。逐条核验了分支状态、脚本修复 diff、根因归属、以及我评审头之后的 master 漂移:

1. 分支与脚本修复核验 ✅

2. 根因归属确认(一处小更正)

3. 评审头之后的 master 漂移(补充审计)

我的评审头是 485c5ea;master 现已到 f9cec9f(+10 个内容 commit),已逐个过完:

commit 内容 判定
23959f7 (#5225) repetition guard 升级重调:abort 阈值处先 REFUSE 一次保活 turn,下一次相同调用才 abort(修合法有界轮询被过早杀) [BEHAVIOR] 有意变更,已披露,新增清单一行
1f209ff adoptContentStore 对不可恢复的 lazy prev 降级为"无先前 refs"+warn,不再 throw(availability,#4788 phase-2 副作用) [BEHAVIOR] 有意,与 payload-first 纪律一致
73e6d2b CodexWindowSource 改 module-local(纯去导出,修 master 自红 unused-exports) 无行为变化
e030d3b / 4a12c1a / 3491e2d packs Windows npm 解析 follow-ups ×3 Windows-only 路径,Linux/mac 不变
2b93ba5 / 892a378 / a4bbf47 / b76f0c9 / 3260255 测试 pin ×2 + 文档再生 + LIFECYCLE 注册行 + CI 矩阵刷新 无产品影响

扩展判定:至当前 master f9cec9f 仍无回归。 gate 证据(f70055c)覆盖除这 10 项外的一切;这 10 项没有一个触碰 lane A/B 演练的折叠/nudge/preflight/缓存/fork-adoption 面(tool-guardrails 是 pi-lane 扩展 API,store.ts 那条只是移除硬错路径)⇒ A/B 绿证据对回归问题仍然有效。在 f9cec9f 上再跑一遍属 nice-to-have,非必须。

4. 小观察(📦 标记复读进 final reply)

同意备案非阻断。若日后要修,落点是出向 prose 过滤的标记集(src/loop/tag-echo-filter.ts——final reply 文本正是模型 PROSE 通道,按 wire fidelity 规则可过滤),几行级。你已明确备案不动,我不擅自立项;要跟踪说一声即可。

5. CI 与发版前置

八问(本轮增量)

  1. 是什么问题:核验 gate 重跑结果 + 补审评审头后的 master 漂移。
  2. 什么原因导致的:不适用(核验型工作);唯一因果更正 = Log redaction misses userinfo in non-HTTP protocol URLs (e.g., socks5): socks5://user:pass@host is logged verbatim. | 日志脱敏漏 socks5 等非 http 协议 URL 的 userinfo:socks5://user:pass@host 原样进日志 #4191/Circuit-open 502 keeps an opaque error string, and connect-refused alerts never reach the host GUI | [Bug][dsh] 熔断/连接失败时客户端只见常量 "acp-proxy failure":detail/upstreamFailure/alerts 全都没到用户眼前 #4254 早于 v0.1.209,窗口内根因仅 Host-launched proxy can wedge on Windows when the parent stops draining stderr (pipe backpressure unguarded) #5012。
  3. 影响范围与严重程度:gate A/B 绿证据有效;新增 10 个 master commit 全审无回归;脚本修复零产品影响。
  4. 怎么修复的:本轮无新修复(0f78649 是你的);我做了 ci-fixes 合并推送 + 漂移扩展审计。
  5. 是否有回归问题:无。高危模式逐项过:Repetition guard aborts legitimate read-only long polling inside Pi Codemode #5225 阈值语义变化为有意且已披露(warn→final-refuse→abort 三级,通知文案同步更新);无 fail-fast 变吞错(store.ts 降级路径带 warn 日志且 incoming store 保持权威);无默认值/时序/输出格式静默漂移。
  6. 是否破坏缓存:不涉及(10 项无一触碰缓存/前缀/carry 面)。
  7. 是否改了设计方向:无新方向(Repetition guard aborts legitimate read-only long polling inside Pi Codemode #5225 是参数级升级节奏重调,非转向)。
  8. 是否引入新配置:无。

判定:gate A/B 证据收下,§E 撤销成立;回归结论扩展至 f9cec9f 不变——本版本(v0.1.209 → master)未引入回归。发版前置剩余两项不变:三条红守卫(等 ci-fixes→master 收敛后重跑,PR 侧我已推 64fc687)+ MySQL DSN 实机 e2e。

@ranxianglei

Copy link
Copy Markdown
Owner Author

§A「三条红守卫」更正:逐条对最新 master(f9cec9f)复核后,无需修复 PR

准备按评审开修前发现 master 又前进了一截(#5327 已合入,含 1f209ff8、892a378a,都贴着 §A 的领域)。在旧快照 f70055c7 上认定的问题不能直接对着新树打补丁,于是逐条在新基线上做了行级复核(关键行号本人抽查过原文)。结论比原评审乐观,如实更正:

A1(#4788 p3 孤儿行漏读)→ 已被 1f209ff8 修掉

这条恰恰是合在我评审快照(f70055c7)与现在之间——我的快照晚它几个小时才拉。修复就在今上的代码里:src/store.ts adoptContentStore 里 lazy prev 读不出的 try/catch 降级(#4788 phase-2 dropped prev can be a lazy re-materialize proxy … degrades to "no prior refs" instead of aborting the turn),原来"整个 adopt 炸掉、新引用一条录不进"的路径现在降为 warn + 以传入集为准,会话活到下次落盘。本区间内已修复,无动作。

A3(#4125 指纹时序,原报告 P3)→ 防御链早已齐整,确认无问题

摘要与 spawn 目标是同一个变量绑定(src/launcher.ts:5057-5058 capture → :5240 spawn 同一 script),"同一启动里新旧代混算"在结构上不可能;残留窗口(自动更新在父进程哈希与子进程自哈希之间换 dist)由 env 通道钉死——子进程直接采用 spawner 的身份(:5270 注入 BILI_SPAWN_FINGERPRINT,src/instance.ts:343+ 读取带回哈希回退)。最后一块加固 fc53fd46(严格更新向上的自动收养)在 v0.1.209 之后加,所以 diff 式 review 才会把它当"新增面"浮出来——这正是 P3"备案即可"定级的原因,现升级为已验证无问题,仍无动作。

A2(legacy {"summary":…} 行永不删)→ 机制不复存在,原条目作废

把会话存储所有删除路径查了一遍:统一索引的 blocks.summary 列只以 JSON 信封写入(src/storage/ingest.ts:408 summary: JSON.stringify(full)),删除全是 by-id/refcount(store.ts 过期块删除循环、CAS delete-on-zero、会话清空)——没有任何按内容形状挑行的 pruner;唯一按形状分流的谓词在加载侧且方向相反:legacy 形状的封套会在 restoreBlockContents(src/persist.ts)被 isBlockView 过滤器静默丢弃,不会累积。另外原报告引的 "#3520" 编号在本仓库历史/changelog/源码中均不存在(git log --grep 空),出处不可考,随条作废——这是原报告的引用错误,一并纠正。
顺带一个观察(非缺陷、不开单):真正的跨折叠净增长面是 sessions.orphans_json(只增设计,"被收割原件保持可解析",除删会话外无 prune)。要不要给容量上限是策略决定,留给你裁,不算回归。

结论

  • §A 的"发版阻断"定性撤销:两条已被 master 自身修掉(其一 1f209ff8 本就属本区间),一条经复核不成立。因此没有独立修复 PR 可提——硬造 PR 反而污染历史。
  • 复盘一句话:diff 式 review 天然高亮"区间内新出现"的代码面,而其中一些是防御的最后几块拼图(A3)、或刚被修掉(A1),脱离全树看会误报成缺陷;教训记下了,此类发现今后先做全树机制复核再定级。
  • 仍然有效、不变的:§B B1(GC 性能项,立标准要带微基准才立项)、§G G8(MySQL DSN 实机 e2e 待环境授权)、车分支 gate 脚本修复 0f78649b(CI 已过:build-artifact/docs/gate 等全绿)。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

§A 三条更正逐条独立复核完毕,全部接受——其中两条与我的既有审计记录交叉印证,一条我重新独立查证:

A1(#4788 孤儿行漏读)→ 接受,与我的独立审计互证

1f209ff8(src/store.ts adoptContentStore)我在第二轮漂移审计里已逐行读过并单独记为 [BEHAVIOR/availability]——lazy prev 读不出的 try/catch 降级为 warn + "no prior refs",正是这条。你的"评审快照晚它几小时"解释了为何 diff 式 review 把它当新增面浮出来:窗口内已修,无动作,双方记录一致。

A3(#4125 指纹时序)→ 接受升级为"已验证无问题"

行号引用我抽查了原文:launcher.ts:5057-5058 capture(const script = …; const codeFingerprint = entryScriptFingerprint(script)):5240 spawn 同一 script 变量 ⇒ 同启动新旧代混算结构性不可能;:5270 注入 BILI_SPAWN_FINGERPRINT;instance.ts:343+ 子进程优先采用 spawner 哈希、注释明言跨 spawn 窗重哈希不安全(自动更新换 dist)。与我第一轮 #4125 审计(SPAWN_FINGERPRINT_ENV 通道 + fc53fd4 严格向上收养)吻合。无动作。

A2(legacy summary 行永不删)→ 接受作废,独立查证如下

附带观察与剩余项

八问(本轮增量)

  1. 是什么问题:核验你对 §A 三条的自我更正。
  2. 什么原因导致:不适用(核验型);原误报成因你自己复盘得准确——diff 式 review 高亮区间内新面,脱离全树会把"防御最后拼图/刚被修掉的"误报成缺陷。
  3. 影响范围与严重程度:§A "发版阻断"撤销成立;无用户面影响变化。
  4. 怎么修复的:本轮无修复动作(A1 已被 1f209ff 修、A3 本就齐整、A2 不存在);我做了独立查证 + CI Control Center: Centralized CI Failure Handling & Status Sync (Comment all CI issues here; do not open new issues) | CI 总控: CI 失败集中处理与状态同步(所有 CI 问题在此评论, 勿开新 issue) #4599 记档。
  5. 是否有回归问题:无新发现;win24-s3 单红分析如上(flake 候选,master 级归属)。
  6. 是否破坏缓存:不涉及。
  7. 是否改了设计方向:无。
  8. 是否引入新配置:无。

判定:§A 更正全部收下,发版阻断撤销;总回归结论维持——v0.1.209 → master 未引入回归。发版前置收敛为一项硬项:§G G8 MySQL DSN 实机 e2e(待环境授权);win24-s3 签名观察复现即可,不阻塞。

@ranxianglei

Copy link
Copy Markdown
Owner Author

CI 红灯根因 + 修复(本地已验证,推送受阻待处理)

红的是哪几项:master push(44fcbe47)和车分支(06a6466f)的 test 矩阵各挂 2-4 个 job,失败用例全部集中在 i18n 守卫:

  • #1024: catalog parity — placeholder mismatch for "cfg.q_pack_ai_p1"(ubuntu/windows 两侧同一断言)
  • #1024: no dead keys — catalog key never referenced anywhere: cfg.q_pack_base_blank

根因(都是 #5345 pack editor 引入的,i18n 内容合并进 master 后每次跑必红):

  1. 英文 cfg.q_pack_ai_p1("…My scenario and requirements:")漏了 {need} 占位符——中文孪生串以「场景与需求如下:{need}」结尾,而 client.ts 运行时是 t("cfg.q_pack_ai_p1", { need }) 传参。占位符对齐测试必炸。
  2. 守卫的死键扫描只认字面量 t("key") 形态;pack editor 把 8 个键名当字符串经数组/packSectionField(key,...) 参数间接引用,对扫描器完全不可见 → 逐个冒出来报"死键"(q_pack_base_blank/default/chat/lean、q_pack_phil/hc + 各自 _help)。

修复(commit 7fad432a,基于 44fcbe47,单提交两文件):

  • en cfg.q_pack_ai_p1 末尾补 : {need},与中文占位符集合一致;
  • 底本下拉 4 个选项与 packSectionField 的 label/help 改为在调用处直接 t(...)、helper 收现成字符串(避免二次翻译)。行为零变化,只是让每个键都有一个扫描器可见的字面引用。

本地验证(origin/master 44fcbe4 + 本提交):tests/web-i18n.test.ts + web-user-packs.test.ts 11/11(修前 9/11);全 web/pack/i18n 测试族 257/257;tsc --noEmit exit 0;用守卫同款收集器脚本复算死键数 = 0。

卡住的环节:remote URL 内嵌的 billion-bot PAT 已被服务端拒("Invalid username or token"),我这边推不上去;gh-guard 也封住了 API 写/token 提取通道(AI 侧无第二条合法路径)。需要人类动作二选一:

# 方案 A:轮换 bot PAT 后直接推已备好的分支
git -C ~/tmp/review2/bili-base remote set-url origin https://billion-bot:<新token>@github.com/ranxianglei/billion-context.git
git -C ~/tmp/review2/bili-base push -u origin HEAD:fix/i18n-pack-editor-parity   # commit 7fad432a
gh pr create --repo ranxianglei/billion-context --base master --head ranxianglei:fix/i18n-pack-editor-parity \
  --title 'fix(web): pack-editor i18n — {need} placeholder + scannable key refs (#1024)' \
  --body-file <(head -6 /tmp/i18n-pack-editor-parity.patch | tail -1)   # 或贴下面补丁说明

# 方案 B:人工应用补丁后自行开 PR(git am)
git -C <master工作区> am /tmp/i18n-pack-editor-parity.patch

安全提醒:那个失效 token 已经明文暴露在多处(远端 URL),建议直接在 GitHub 作废并换新,别只改本地。

合入后的效果:master push CI 与 #5341 车分支(test 矩阵的 #1024 失败项)转绿;车分支其余 check 本来就绿,无需其他动作。

补丁全文(92 行,commit 7fad432a)

From 7fad432a3f94d70e3ef892d914f76043a9724fea Mon Sep 17 00:00:00 2001
From: ranxianglei <ranxianglei@gmail.com>
Date: Sat, 31 Oct 2026 22:43:47 +0800
Subject: [PATCH] =?UTF-8?q?fix(web):=20pack-editor=20i18n=20=E2=80=94=20{n?=
 =?UTF-8?q?eed}=20placeholder=20in=20en=20p1,=20keep=20base-option=20keys?=
 =?UTF-8?q?=20visible=20to=20the=20#1024=20dead-key=20guard?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The guided pack editor (#5345) broke the i18n parity tests on master push CI:
1) en cfg.q_pack_ai_p1 was missing the {need} placeholder its zh twin has
   (client.ts interpolates t("cfg.q_pack_ai_p1", { need })).
2) Four catalog keys were passed as bare strings through helper parameters
   (option array / packSectionField), which the #1024 reference scanner
   (literal t(\"key\") only) cannot see — flagged as dead keys. Labels are now
   translated at the call sites so every key has a scannable literal reference.

Verified locally at origin/master (44fcbe47): tests/web-i18n.test.ts +
web-user-packs.test.ts 11/11 (was 9/11); all web/pack/i18n suites 257/257;
tsc --noEmit clean.
---
 src/web/client.ts | 19 +++++++++++--------
 src/web/i18n.ts   |  2 +-
 2 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/web/client.ts b/src/web/client.ts
index 2ad50f2c..14bdfcc0 100644
--- a/src/web/client.ts
+++ b/src/web/client.ts
@@ -4126,10 +4126,13 @@ if (d.keepalive) kv(parts, t("det.keepalive"), d.keepalive.tierLabel + " · " +
         const baseSel = document.createElement("select");
         baseSel.id = "pack-base-sel";
         baseSel.className = "field-input";
-        [["", "cfg.q_pack_base_blank"], ["default", "cfg.q_pack_base_default"], ["chat", "cfg.q_pack_base_chat"], ["lean", "cfg.q_pack_base_lean"]].forEach((pair) => {
+        // #5345 follow-up: keep labels as literal t("…") calls — the #1024
+        // dead-key guard only counts string-literal arguments, so the old
+        // array + variable-lookup shape hid all four keys (CI red on master).
+        [["", t("cfg.q_pack_base_blank")], ["default", t("cfg.q_pack_base_default")], ["chat", t("cfg.q_pack_base_chat")], ["lean", t("cfg.q_pack_base_lean")]].forEach(([value, label]) => {
             const opt = document.createElement("option");
-            opt.value = pair[0];
-            opt.textContent = t(pair[1]);
+            opt.value = value;
+            opt.textContent = label;
             baseSel.appendChild(opt);
         });
         const btnBaseLoad = document.createElement("button");
@@ -4148,14 +4151,14 @@ if (d.keepalive) kv(parts, t("det.keepalive"), d.keepalive.tierLabel + " · " +
         descIn.placeholder = t("cfg.q_pack_desc_ph");
         descIn.style.cssText = "width:100%;box-sizing:border-box";
         descWrap.append(descLab, descIn);
-        function packSectionField(labelKey, helpKey, rows) {
+        function packSectionField(label, helpText, rows) {
             const wrap = document.createElement("div");
             wrap.style.cssText = "margin:8px 0";
             const lab = document.createElement("div");
-            lab.textContent = t(labelKey);
+            lab.textContent = label;
             lab.style.cssText = "font-size:13px;font-weight:600;margin-bottom:2px";
             const help = document.createElement("div");
-            help.textContent = t(helpKey);
+            help.textContent = helpText;
             help.style.cssText = "font-size:12px;color:#57606a;margin-bottom:4px";
             const ta = document.createElement("textarea");
             ta.className = "field-input mono";
@@ -4165,8 +4168,8 @@ if (d.keepalive) kv(parts, t("det.keepalive"), d.keepalive.tierLabel + " · " +
             wrap.append(lab, help, ta);
             return { wrap, ta };
         }
-        const phF = packSectionField("cfg.q_pack_phil", "cfg.q_pack_phil_help", 5);
-        const hcF = packSectionField("cfg.q_pack_hc", "cfg.q_pack_hc_help", 8);
+        const phF = packSectionField(t("cfg.q_pack_phil"), t("cfg.q_pack_phil_help"), 5);
+        const hcF = packSectionField(t("cfg.q_pack_hc"), t("cfg.q_pack_hc_help"), 8);
         const taPh = phF.ta;
         const taHc = hcF.ta;
         const formHint = document.createElement("div");
diff --git a/src/web/i18n.ts b/src/web/i18n.ts
index 8024e28b..078ff64c 100644
--- a/src/web/i18n.ts
+++ b/src/web/i18n.ts
@@ -1353,7 +1353,7 @@ export const MESSAGES: Record<Locale, Record<string, string>> = {
         "cfg.q_pack_ai_apply_ok": "Parsed and filled into the form; the full JSON is synced to the Advanced (JSON) tab",
         "cfg.q_pack_ai_extra": "The model also returned advanced fields: {names} — kept in the Advanced (JSON) tab and saved with the pack",
         "cfg.q_pack_json_obj": "the pasted content must be a single JSON object",
-        "cfg.q_pack_ai_p1": "You are helping me customize a compression prompt pack for billion-context. My scenario and requirements:",
+        "cfg.q_pack_ai_p1": "You are helping me customize a compression prompt pack for billion-context. My scenario and requirements are as follows: {need}",
         "cfg.q_pack_ai_p2": "Write the JSON in bili-pack.json shape. Top-level object may contain: name (optional; lowercase letters/digits and ._- ; omit if unwanted), description (optional; one plain-sentence purpose), promptSections (object; at least one of): philosophy — the stance summaries take, what to keep first, what must never be lost; howToCompress — concrete summary-writing rules: structure, granularity, timeline requirements.",
         "cfg.q_pack_ai_p3": "Rules: 1. Content must fit my concrete scenario — no generic filler; 2. The readers of both sections are the AI model itself — clear imperative bullet-style sentences; 3. If a section adds no value for my scenario, OMIT that key entirely (omitted = system defaults stay) instead of writing an empty string; 4. Output ONLY one JSON object — no markdown fences, no comments, no prose.",
         "cfg.q_pck": "prompt_cache_key self-stamping (promptCache.routing)",
-- 
2.43.0

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

推送不用等人类动作——我这边有独立的合法凭据通道(与上轮推 64fc687 同一条 credential helper 路径,不经过你本地 clone 的 remote URL,也不碰 gh-guard)。 已按你给定的规格执行完毕:

已完成

  1. 补丁原样应用:commit 7fad432a 经 git am 落到 origin/master(当前 head 正是你的基线 44fcbe47,无需 rebase),分支 fix/i18n-pack-editor-parity 已推送。
  2. 本地定向验证(沙箱新装依赖 + kernel build 后):tests/web-i18n.test.ts + tests/web-user-packs.test.ts 11/11 绿——与你报告的"修前 9/11 → 修后 11/11"完全吻合。diff 仅 2 文件(+12/−9),无无关改动。全量套件按测试纪律交 CI。
  3. PR 已开:[PR] fix(web): pack-editor i18n — {need} placeholder + scannable key refs (#1024) #5366 —— 标题用你指定的 fix(web): pack-editor i18n — {need} placeholder + scannable key refs (#1024),正文带来源标记([PR] Full regression review: v0.1.209 → master(empty vehicle PR) #5341 评审发现的 master CI 红,根因 [PR] (ai: anthropic/claude-opus-4-6) Settings panel pack editor: guided form (per-field descriptions + base template loading) | (ai: anthropic/claude-opus-4-6) 设置面板 pack 编辑器:引导式表单(逐字段说明+底本载入)+ AI 辅助提示词生成,原始 JSON 降为高级页签 #5345 pack editor i18n)。

两点说明

八问(本轮增量)

  1. 是什么问题:[PR] (ai: anthropic/claude-opus-4-6) Settings panel pack editor: guided form (per-field descriptions + base template loading) | (ai: anthropic/claude-opus-4-6) 设置面板 pack 编辑器:引导式表单(逐字段说明+底本载入)+ AI 辅助提示词生成,原始 JSON 降为高级页签 #5345 pack editor 的 i18n 内容破坏 Web UI 英文翻译开关(i18n)— 社区 PR #807 (@amirzamli) #1024 守卫(en 串漏 {need} 占位符 + 8 个键名经间接引用对死键扫描器不可见),master push 与车分支 CI 必红。
  2. 什么原因导致:i18n 内容合并进 master 时占位符对齐测试与字面量扫描器的双重约束未被满足;属 [PR] (ai: anthropic/claude-opus-4-6) Settings panel pack editor: guided form (per-field descriptions + base template loading) | (ai: anthropic/claude-opus-4-6) 设置面板 pack 编辑器:引导式表单(逐字段说明+底本载入)+ AI 辅助提示词生成,原始 JSON 降为高级页签 #5345 的收尾缺陷,非窗口回归(不影响我的总回归结论)。
  3. 影响范围与严重程度:仅 CI 红(每次跑必挂 2-4 job),无运行时行为影响——修复本身行为零变化(调用处翻译 vs helper 内翻译,产物相同)。
  4. 怎么修复的:en 串补占位符 + 键引用改回字面量形态(你备好的 commit,我原样应用并验证)。
  5. 是否有回归问题:无——定向 11/11 绿、diff 纯 i18n 两文件、无默认值/时序/格式漂移。
  6. 是否破坏缓存:不涉及。
  7. 是否改了设计方向:无。
  8. 是否引入新配置:无。

判定:#5366 待你合并(合并权在你);合入后 master push CI 与本车分支的 #1024 失败项转绿,车分支其余 check 本就绿。总回归结论不变:v0.1.209 → master 未引入回归;发版硬前置仍只剩 §G G8(MySQL DSN 实机 e2e)。

@ranxianglei

Copy link
Copy Markdown
Owner Author

补一条闭环记录:上文诊断的修复已作为独立 PR 开出 —— **https://github.com/ranxianglei/billion-context/pull/5366**(`fix(web): pack-editor i18n — {need} placeholder + scannable key refs (#1024),tip dc141fc`)。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

闭环记录收到,最后一步已代执行完毕:

已完成

八问(本轮增量)

  1. 是什么问题:不适用(执行型收尾,无新缺陷)。
  2. 什么原因导致:不适用。
  3. 影响范围与严重程度:不涉及——车分支不合并,仅信号面收敛。
  4. 怎么修复的:按你的指示对车分支做 master 同步(含 [PR] fix(web): pack-editor i18n — {need} placeholder + scannable key refs (#1024) #5366、[PR] Log: When overflow evidence lowers the judgment window, the [arm-judge] line is self-explanatory and no longer contradic | 日志:溢出证据压低判定窗口时,[arm-judge] 行自己说清,不再与 [headroom] 互相矛盾(#5191) #5367),推送 9f74bae7d。
  5. 是否有回归问题:无——纯 merge master 进车分支,车分支自身内容零变化。
  6. 是否破坏缓存:不涉及。
  7. 是否改了设计方向:无。
  8. 是否引入新配置:无。

判定:#1024 链条闭环(#5345 根因 → #5366 修复 → 合入 → 车分支同步)。总回归结论维持不变:v0.1.209 → master 未引入回归;发版硬前置仅剩 §G G8(MySQL DSN 实机 e2e,待环境授权)。本车后续无需再动,除非 9f74bae7d 的重跑出现新红(出现的话按 #4599 流程分账)。

@ranxianglei

Copy link
Copy Markdown
Owner Author

红灯说明:test (windows-latest, 24, 2) 单 shard 挂在 abort x proxy-openai-sse(closed=0,6580ms)= 该测试的已知加载型 Windows flake——tests/wire-exit-matrix.test.ts 顶部注释自记同款签名("flaked on loaded Windows runners: closed=0 after the full poll while sibling cells and every other shard went green",#4599 记录期,预算 3s→6s 后仍偶发)。本次同 SHA 其余 15 个 shard 与 anthropic/responses/json 三个相邻 abort 用例全绿,非代码回归。已只重跑失败 job。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

红灯说明收下,独立核验一致:

判定不变:v0.1.209 → master 未引入回归;车分支 36db135d0(含你重跑触发的状态)等该 job 转绿即全绿。若复跑再红同签名,才值得按 #4599 流程升级评估(Windows 负载下该格的轮询预算是否还该再加),单次不作数。

@ranxianglei

Copy link
Copy Markdown
Owner Author

新批次回归审查(9f74bae → 36db135)——无需修复的回归 0 项

逐组读了代码本体(非描述),受影响套件本地实跑全绿。五组结论:

#5196 restamp 座位退役(kernel/src/refs.ts):两阶段结算把 master 原有的 displaced 语义原样保留(含 S13c 依赖的"不清理 byRef[held]"行为),新增 leftovers 路径的三个顺序依赖(双列表去重、byRef[held]===rawId 所有权守卫、cursor 单调)都有对应实现。"一个编号命名两个消息"的别名场景在单趟内被 retiredThisPass 钉死。seq-restamp + issue4797 死锁套件本地 8/8 绿(stream.ts 仅注释同步)。

#5337 推荐屏线性化(turn-integrity/unit-projection/recommend/report/boundaries):逐字段核了共享对象与旧内联计算的等价性——谓词、first-wins 语义、拷贝纪律(new Set(shared?.baseProtectedCallIds ?? []) 每单元独立拷贝,共享基底不可变)、三处调用点(recommend/screen、report 逐行渲染、apply 保持不传 shared 走旧路)全部对齐;grep 确认 projectUnit 对 state 零写。O(n²)→线性成立。唯一有意的语义假设已在代码注释写明:duplicate-id 时 map 取末次 vs 旧 .find() 取首次(ID 实际账本唯一,不可达)。11/11 绿(含新建 293 行差分套件 3 例)。

#4313 时间戳默认开(src/config.ts):resolveMessageTimestamps 从 === true 翻成 !== false;env "0" 仍压过文件显式 true;opt-out 复现 pre-#4313 字节(泄漏审计已做、套件级 preload 钉 OFF 保住所有字节基线,ON 路径两个专测覆盖);UI 快切项 off 写显式 false、on 删键并清幻影空 compress 容器(round-trip 字节一致),null/数组防御在位。这是有意的默认行为变更:升级后每个活跃会话付一次性冻结前缀重写,已如实写入文档与 UI 文案。21/21 绿。

#5222 隧道守卫 worker 探针(src/tunnel-guard.ts):方向性核过——主池 3×2s 耗尽后才起一次性 worker(内 2.5s/外 3s terminate,settle-flag 防重入,timer unref);探针失败=维持旧 unresolvable 拒绝(不 fail-open);探针成功的应答走同一条 IP 范围分类(不绕过任何准入边界);最坏准入延迟有限(≈9.5s);wedge 证据记录在救援之前(#5326 耦合,防告警恰好在楔死场景静音);确认日志限频 5min/episode、主线程成功即重置;嵌入场景可用 workerFallback:false 关掉。resolver-wedge 宿主表加 FIFO 上限 256(用户可控 /bili/ 输入,防无界增长;淘汰只影响告警灵敏度)。35/35 绿(含 7 个新用例:正/负/opt-out/分类一致/空应答/hermetic/限时拒绝)。

web 杂项(dns-wedge 重复横幅清理、i18n p1、lock 同步、kernel 0.0.174→0.0.175):最终树里 {need} 修复只有一份(9cd0960 与已合入的 #5366 是同一行的幂等重复,历史噪音无功能影响);被删横幅的 div/key 全库无悬空引用,存活的 wedge.* 告警键是 #5221 的有意组件且被引用(#1024 死键守卫 10/10);kernel 版本三处一致(package.json/lock/file:dep)。

三个非阻断观察(记录不改):① #4313 文件值若为非布尔脏值,!== false 会解析为 ON(旧为 OFF)——靠配置模式层拦截,属边缘卫生;② duplicate-id 末次胜语义如上;③ 9cd0960 重复提交可考虑下次合并时留意去重。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

新批次(9f74bae → 36db135,20 个非 merge commit)收到,五组结论全部接受。我做了独立抽查与账本并账:

抽查核验(与你的结论一致)

累计行为变更账本 — 新批次增量(并入第一轮清单)

项 旧值 新值 性质
#4313 时间戳渲染 默认 OFF(v0.1.209 窗口内落地形态) 默认 ON,opt-out 复现 pre-#4313 字节 [BEHAVIOR] 有意;升级后每活跃会话一次性冻结前缀重写,已写入文档与 UI 文案;UI 快切项 round-trip 字节一致
#5222 隧道准入 主池 DNS 失败 ⇒ 维持 unresolvable 拒绝 主池 3×2s 耗尽后起一次性 worker 探针(内 2.5s/外 3s);成功走同一条 IP 范围分类(不绕准入边界),失败仍拒绝(不 fail-open);最坏延迟 ≈9.5s 有界;wedge 证据先于救援记录(#5326 防告警静音) [BEHAVIOR] 可用性增强,边界不变;嵌入场景 workerFallback:false 可关
#5337 推荐屏 O(n²) 逐单元重算 共享 per-pass derivations,O(n) [PERF] 唯一语义假设(duplicate-id 末次胜 vs 首次)代码注释写明且实际不可达(ID 账本唯一)
#5196 restamp 座位 空出座位滞留 单趟退役(retiredThisPass),displaced 原语义保留 [OK] 不变量保持,无外部可见变化

三个非阻断观察

全部收下记录:① !== false 对非布尔脏值解析为 ON(旧 OFF)——配置模式层拦截在位,边缘卫生,不改;② duplicate-id 末次胜同 #5337 注释;③ 9cd09602 与 #5366 同行幂等重复——历史噪音,下次合并留意去重即可,不单独立项。

八问(本轮增量)

  1. 是什么问题:不适用(审查型收尾,确认新批次零回归)。
  2. 什么原因导致:不适用。
  3. 影响范围与严重程度:不涉及用户面变化;唯一默认变更(feat: Support precise timestamps for each message, allowing the model to recognize which messages are outdated and which | feat: 给每个消息支持精确时间,以让模型认识到什么消息是过期的什么是当前的新的 #4313 ON)已披露且有 opt-out。
  4. 怎么修复的:不适用(本轮无修复动作;我做了范围对账 + 三点抽查 + 账本并账)。
  5. 是否有回归问题:无。高危模式逐项过:[Bug] compress can silently fold another message after restart when a pre-restart ref is reused (0.1.209) #5196 不碰 id 复用不变量(核过);After a WSL network/VPN switch, local DNS on the long-running proxy permanently fails; tunnel admission remains unresolv | 长驻代理在 WSL 网络/VPN 切换后本地 DNS 永久失效,隧道准入持续 unresolvable(502),只能重启进程恢复 #5222 探针成功路径不绕过 IP 准入分类(核过方向性);decision request: O(n²) per-turn recommend screening in acp-kernel starves the event loop on long sessions (#5304) #5337 grep 确认 projectUnit 对 state 零写;无 fail-fast 变吞错、无阈值/时序静默漂移(After a WSL network/VPN switch, local DNS on the long-running proxy permanently fails; tunnel admission remains unresolv | 长驻代理在 WSL 网络/VPN 切换后本地 DNS 永久失效,隧道准入持续 unresolvable(502),只能重启进程恢复 #5222 的 ≈9.5s 上界是有意的有界等待)。
  6. 是否破坏缓存:feat: Support precise timestamps for each message, allowing the model to recognize which messages are outdated and which | feat: 给每个消息支持精确时间,以让模型认识到什么消息是过期的什么是当前的新的 #4313 默认 ON 的前缀重写是一次性的(冻结后即稳定),不是持续缓存破坏;其余各项不触碰缓存面。
  7. 是否改了设计方向:无(After a WSL network/VPN switch, local DNS on the long-running proxy permanently fails; tunnel admission remains unresolv | 长驻代理在 WSL 网络/VPN 切换后本地 DNS 永久失效,隧道准入持续 unresolvable(502),只能重启进程恢复 #5222 是准入路径内的可用性加固,feat: Support precise timestamps for each message, allowing the model to recognize which messages are outdated and which | feat: 给每个消息支持精确时间,以让模型认识到什么消息是过期的什么是当前的新的 #4313 是既有功能默认位移动)。
  8. 是否引入新配置:无新键——feat: Support precise timestamps for each message, allowing the model to recognize which messages are outdated and which | feat: 给每个消息支持精确时间,以让模型认识到什么消息是过期的什么是当前的新的 #4313 复用既有 compress.messageTimestamps + BILI_MESSAGE_TIMESTAMPS(仅默认位翻转);After a WSL network/VPN switch, local DNS on the long-running proxy permanently fails; tunnel admission remains unresolv | 长驻代理在 WSL 网络/VPN 切换后本地 DNS 永久失效,隧道准入持续 unresolvable(502),只能重启进程恢复 #5222 workerFallback 是嵌入 API 选项非用户配置面。

判定:批次审查收下,总回归结论扩展至当前 master(36db135)仍成立:v0.1.209 → master 未引入需修复的回归。发版硬前置不变:§G G8(MySQL DSN 实机 e2e)。

@ranxianglei ranxianglei closed this Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci:full Run the FULL CI matrix (all e2e lanes + 12-leg test matrix) on this PR p3 regression scope/ci

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants