What's Changed
- [PR] release v0.1.209 by @github-actions[bot] in #4982
- [PR] ci: 恢复紧急快速发布入口(fast 模式加双信号防误触门) by @ranxianglei in #5054
- [PR] Update QQ Group information in README by @ranxianglei in #5087
- [PR] Modify QQ group status in README.zh-CN.md by @ranxianglei in #5088
- [PR] Second process opening index.db falsely reports "will corrupt data" — change to a shared-mode warning (#5082) | 第二个进程打开 index.db 误报「会损坏数据」——改为共享形态的提示(#5082) by @ranxianglei in #5091
- [PR] Running tests locally writes test sessions into the real ~/.local/billion-context — preload sandboxes the default direct | 本地跑测试会把测试会话写进真实的 ~/.local/billion-context——预载把默认目录沙箱化(Fixes #5114) by @ranxianglei in #5115
- [PR] fix: keep test suite off the production sessions dir (#5107) by @ranxianglei in #5120
- [PR] fix(#5012): trust the log file over dead pipes — mute the stderr tee once the file leg proves live by @ranxianglei in #5089
- [PR] fix: watchdog heartbeat branch requires consecutive confirmation before killing the proxy (#4994) by @ranxianglei in #5085
- [PR] fix(#5135): post-fold nudge sizing must ride the credited baseline, not the stale pre-fold usage by @ranxianglei in #5136
- [PR] kernel: stop emergency-truncate latch cross-writing tool args/receipts via shared BLOCKED sentinel (#5102) by @ranxianglei in #5110
- [PR] fix: clear stale membership and reject null billing prices by @kuviki in #5042
- [PR] fix(storage): digest object keys in sorted order — single-instance shadow drift (#4392) by @Maziar123 in #4685
- [PR] fix: prompt_cache_key self-injection disabled by default, promptCache.routing one switch controls both wires (#5079) | fix: prompt_cache_key 自注入默认关闭,promptCache.routing 一个开关管住两条 wire (#5079) by @ranxianglei in #5112
- [PR] fix: keep ordering-repair separators out of compression range analysis by @ranxianglei in #5143
- [PR] fix: wedged proxy self-exits instead of holding its port forever (#4762) by @ranxianglei in #4784
- [PR] fix(#5152): widen the watchdog's liveness window by its own event-loop lag, and beat from a worker by @Louie0806 in #5153
- [PR] fix: recover non-retained parent fork snapshot from intact unified raw tail after cold restart (#5140) by @ranxianglei in #5144
- [PR] fix(launcher): adopt proven-healthy child at spawn timeout instead of killing it (#4994) by @ranxianglei in #5010
- [PR] fix: crash-on-startup no longer leaves only a dead port: launcher adds tail sampling + human-readable permission error m | fix: 启动即崩溃不再只剩死端口:启动器补尾部采样+权限问题人话提示,端口挂启动失败占位页 (#5096) by @ranxianglei in #5097
- [PR] fix: name the win32 READONLY index.db open failure; drop the delete advice under OS-level refusals (#4614) by @ranxianglei in #4625
- [PR] fix: make startup-failure paths self-contained and actionable (#5104) by @ranxianglei in #5157
- [PR] fix: Root cause detection for Windows startup EPERM-type issues — self-check on startup and provide remediation command | fix: Windows 启动 EPERM 一类问题的根因检测——node.exe 被 Low 完整性标签污染时启动即自检并给出修复命令 (#5154) by @ranxianglei in #5159
- [PR] fix(#5167): poll the stale-rotation wait on fresh connections so a draining resident reads as released by @ranxianglei in #5169
- [PR] fix: web overview rides the persist store singleton instead of opening a second SessionStore by @ranxianglei in #5002
- [PR] fix(launcher): make the spawn health budget configurable (#4947) by @zxmqq1234 in #4948
- [PR] storage gc: batch orphan-content collection + refuse full VACUUM while another process holds the db (#4612, #4796) by @ranxianglei in #5193
- [PR] Storage Layer Memory Governance: Five Fixes Consolidated into One (Streaming Fingerprint Saves / Batched Spot-Checks / B | 存储层内存治理:五个修复合成一个(保存指纹流式化 / 抽查分批 / 会话装载有界 / 增量车道只渲增量) by @ranxianglei in #5198
- [PR] fix: bound ordinary session loading and avoid full reloads for lazy fields by @ranxianglei in #4765
- [PR] fix: bound ordinary session loads and narrow lazy field reads by @z0d0dOr in #4750
- [PR] perf: verify stored sessions in bounded batches by @z0d0dOr in #4540
- [PR] fix: stream storage verification digests to reduce peak memory by @z0d0dOr in #4532
- [PR] CI: add hourly zombie cleanup + main matrix job timeout — auto-cancel if no progress after 2h queued / 4h running (#5186 | CI 加每小时僵尸清理 + 主矩阵 job 超时:排队 2h/运行 4h 不动就自动取消 (#5186) by @ranxianglei in #5187
- [PR] fix(#5179): change stop_reason from "length" to "max_tokens" sent to Claude Code when all compression attempts fail and | fix(#5179): 压缩全败提前收尾时发给 Claude Code 的 stop_reason "length" 改为 "max_tokens",避免任务中途自动停住 by @ranxianglei in #5202
- [PR] revert #5202: stop_reason mapping fix — pulling back for now; users reported issues on the OpenAI protocol, need full ro | revert #5202: stop_reason 映射修复先撤回——报告用户在 OpenAI 协议上,还需完整定位后再合 by @ranxianglei in #5211
- [PR] fix(#5140): name the failed raw-tail reconstruction gate instead of failing closed silently by @ranxianglei in #5188
- [PR] fix: read the checkpoint tip-seq as one MAX(seq) aggregate, not a full-log scan by @ranxianglei in #5239
- [PR] [storage] Degradation Semantics Bundle: Seven accepted fixes consolidated into one branch — a single merge suffices (inc | [storage] 降级语义全家桶:七个已验收修复合成一个分支,合并一次即可(含撤回损坏库自动改名) by @ranxianglei in #5213
- [PR] Claude subagent parallel homogeneous dispatch merge: SubagentStart hook injects a unique lane token per dispatch (#5095) | claude 子代理并行同型派发合流:SubagentStart hook 注入每次派发唯一 lane token(#5095) by @ranxianglei in #5184
- [PR] compression: protect the newest HUMAN request, not the host reminders injected after it by @ranxianglei in #5182
- [PR] fix(plugin): "tool_calls": null deltas poisoned sawToolUse — degenerate empty stops never retried by @ranxianglei in #5286
- [PR] Compression always failing and requiring many retries? Changed collapsed/protected region intervals to successful no-op | 压缩总是失败要重试很多次?已折叠/保护区区间改为成功 no-op 收据,并刷新 armed-but-silent 窗口的 ref 指针 (#4521) by @ranxianglei in #5253
- [PR] fold idle session content stores between requests (#4788 phase 2) by @ranxianglei in #5292
- [PR] fix(storage): a live second writer no longer blocks startup — sharing a local-disk index.db is a supported topology (rev | fix(storage): 活着的第二写者不再阻止启动——共享一个本地盘 index.db 是受支持拓扑(撤回 #5213 的拒绝策略) by @ranxianglei in #5294
- [PR] fix(#5095): add per-run discriminator to the claude-anthropic derived-persona lane key by @ranxianglei in #5163
- [PR] feat(#4313): 每条消息和每个压缩块带上不可变本地时间戳——模型从此分清什么早发生、什么刚发生(默认关闭) by @ranxianglei in #5236
- [PR] Two installations differing by one version no longer deadlock on the same port; traffic is no longer sent in the clear ( | 两份安装差一个版本不再死锁在同一端口上,流量不再裸奔(#4125) by @ranxianglei in #5303
- [PR] fix(loop): a failed compress must not kill the task — feed the model a recovery receipt instead of ending the turn by @ranxianglei in #5231
- [PR] docs: add 1,500-item third-party evaluation across LongMemEval-S, ContextBench, and MemoryAgentBench by @2211427551 in #5307
- [PR] fix(#4977): exit twin-collision before persistence init when the port holder is a silent same-build twin by @ranxianglei in #5004
- [PR] Eliminate redundant per-round scanning of full history/full request body; reduce per-round agent overhead by 12–16% for | 砍掉每轮对全历史/全请求体的重复扫描,大上下文每轮代理开销降 12-16% (#5130) by @ranxianglei in #5131
- [PR] fix(#5243): honor codex's model_catalog_json when aligning windows by @ranxianglei in #5305
- [PR] fix+docs: make the long-lived-proxy stale-DNS wedge diagnosable and document its remedies (#5224) by @ranxianglei in #5263
- [PR] search: search_context finds folded-away blocks and the folded original text, not just live summaries by @ranxianglei in #5181
- [PR] feat: Built-in chat prompt compression package — default compression rules for long-term companionship / multi-session m | feat: 内置 chat 提示压缩包——长期陪伴 / 多会话记忆场景的默认压缩规则(#5319) by @ranxianglei in #5320
- [PR] test(loop): pin the pi-subagents fallback channel's failed-compress recovery path (#5231 follow-up) by @ranxianglei in #5310
- [PR] fix: recognize the claude code title sidecar so it never claims the raw session id (#5136) by @ranxianglei in #5137
- [PR] fix(#5142): account expected host rebases out of fold-drift by @ranxianglei in #5150
- [PR] fix(zcode): isolate project memory extraction sessions (#4952) by @jianzhangg in #4954
- [PR] fix: in external-summary mode, #2749 guard scan no longer falsely reports rejected logs for historical compress calls (# | fix: external-summary 模式下 #2749 守卫扫描不再对历史 compress 调用误报 rejected 日志 (#5161) by @ranxianglei in #5227
- [PR] feat(web): Web dropdown lists all available compression prompt packs (including built-in chat) (#5319) | feat(web): 网页下拉列出全部可用压缩提示包(含内置 chat)(#5319) by @ranxianglei in #5325
- [PR] (ai: anthropic/claude-opus-4-6) Manage custom compressed prompt packs on the web: Create / Edit / Delete | (ai: anthropic/claude-opus-4-6) 网页端管理自定义压缩提示词包:新建 / 编辑 / 删除 by @ranxianglei in #5331
- [PR] fix(observability): surface suspected DNS-resolver wedge as logged + panel alarm (#5221 phase 2) by @ranxianglei in #5322
- [PR] Repeated invocation guard: on the 5th occurrence, warn only without killing the turn; terminate on the next violation (# | 重复调用守卫:第 5 次只警告不杀回合,再犯一次才终止 (#5225) by @ranxianglei in #5327
- [PR] fix(#5303): restore the costUsd spend ledger on session reload by @ranxianglei in #5338
- [PR] Recover legacy cross-session fold blocks stuck in parent sessions (#5312) by @ranxianglei in #5343
- [PR] ci: stop runner-queue pileups (serialize release trio, protect theorem lane, starvation alert) by @ranxianglei in #5333
- [PR] fix(security): bump zod 4.1.8 -> 4.6.7 to clear GHSA-mrhx-c7xc-m3w5 (#4820) by @ranxianglei in #4880
- [PR] Isolate concurrent launcher-spawn test suites from the shared starting marker by @ranxianglei in #4960
- [PR] fix: clamp the output budget against a safety-inflated input estimate (#5278) by @ranxianglei in #5291
- [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 降为高级页签 by @ranxianglei in #5345
- [PR] fix: serve the missing /__bili/upstreams endpoint so the DSH upstream banner works by @ranxianglei in #5147
- [PR] fix: esc-interrupted output no longer triggers the growth-cadence nudge on resume (#5298) by @ranxianglei in #5356
- [PR] fix(web): pack-editor i18n — {need} placeholder + scannable key refs (#1024) by @ranxianglei in #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) by @ranxianglei in #5367
- [PR] fix(kernel): post-restart compression no longer silently folds wrong messages — slots freed during ID reconciliation are | fix(kernel): 重启后压缩不再静默折叠错消息——编号对账时腾出的座位保留给原主(#5196) by @ranxianglei in #5360
- [PR] fix(#5337): long-session per-turn freeze — quadratic compress screening goes linear by @ranxianglei in #5361
- [PR] fix: tunnel admission survives a wedged process-local DNS resolver + wedge detection & visibility (#5222) by @ranxianglei in #5272
- [PR] feat(config): message timestamps are ON by default — opt-out keeps every pre-#4313 byte | 消息时间戳默认开启:关开关即逐字节回到特性前 (#4313) by @ranxianglei in #5368
- [PR] fix: repetition guard stops aborting legitimate long polling (#5225) by @ranxianglei in #5264
- [PR] release v0.1.210 by @github-actions[bot] in #5373
- [PR] docs: regenerate CONFIGURATION tables (guardrails.repetition drift breaks docs-sync) by @ranxianglei in #5374
- [PR] fix(release): let one-click publish a merged-but-unpublished fallback bump (stuck v0.1.210) by @ranxianglei in #5375
- [PR] fix(release): replace the retired train box with an explicit emergency skip-CI-gate checkbox by @ranxianglei in #5376
New Contributors
- @2211427551 made their first contribution in #5307
- @Louie0806 made their first contribution in #5153
- @Maziar123 made their first contribution in #4685
- @zxmqq1234 made their first contribution in #4948
Full Changelog: v0.1.209...v0.1.210