Skip to content

fix: promote audit CRITICAL/HIGH defect fixes to main - #155

Merged
LeXwDeX merged 2 commits into
mainfrom
dev
Jul 31, 2026
Merged

fix: promote audit CRITICAL/HIGH defect fixes to main#155
LeXwDeX merged 2 commits into
mainfrom
dev

Conversation

@LeXwDeX

@LeXwDeX LeXwDeX commented Jul 31, 2026

Copy link
Copy Markdown
Owner

内容

dev 上的审查缺陷修复批次晋升到 main。本批次为单个 PR(#154),修复一次全代码库审查报告的 3 个 CRITICAL + 12 个 HIGH 级缺陷。

修复清单

CRITICAL

  • C1 · TUI Worker 空异常处理器 — 全局 uncaughtException/unhandledRejection 为空函数,静默丢弃所有未捕获异常,进程在损坏状态下继续运行(表现为 TUI 黑屏/挂死且零日志)。改为:uncaughtException 落盘日志 + worker.fatal RPC 通知主进程 + 安全退出;unhandledRejection 仅落盘(游离 rejection 不等于进程损坏)。同时加固 RPC 层(handler 抛错回传给调用方,不再变成 unhandledRejection + 永久 pending promise),主进程三路兜底监听 worker fatal/error/close。
  • C2 · LLM 工具结算竞争raceFirst(join, awaitEmpty) 在最后一个工具 fiber 失败时可能被 awaitEmpty 的成功赢得竞争而吞掉失败(Effect 源码证实:observer 先 backing.delete 再完成 deferred,同 tick 竞争)。修复为 awaitEmpty 胜出后复查 deferred,有失败则改走 join。
  • C3 · 请求构建串行阻塞prompt.tsEffect.all 漏传 concurrency 选项,6 个独立 I/O 被串行化(每 turn 约 100–600ms);copilot responses 转换的 reasoning 解析从循环内串行 await 提升为批量 Promise.all

HIGH(12 项)

崩溃恢复:recovery.ts 精确捕获 NotFoundError 不再编造 nodeFailed、loop.ts wake 重投递失败记录日志、dag.ts 配置解析结构守卫。
资源边界:stream.transport buffered 上限 1000、recoverQuestion 120s 截止、ACP contextLimit 失败不再永久缓存、plugin 事件 hook rejection 可观测。
并发正确性:loop.ts dag.fail 移入 evalLock 消除误杀窗口、processor.ts cleanup 状态守卫防覆盖已结算工具结果、stream.transport prompt 回合空闲逃生阈值。
性能:zen 网关加权选择去掉 O(Σweight) 数组展开、event-reducer 每 delta 双通知合并为 batch。

其中 5 项修正了审查报告的论断(H1 的 DB 错误实为 defect、H3 的直接置 live 会引入抢跑竞态、H7 无限容量是有意设计、H9 严格 Schema 会拒绝旧行、H11 rope string 下 O(n²) 不成立)。完整论证见 #154

门禁验证

dev 上全量 CI 已通过(run 30638047212):

  • ✓ Unit Tests (linux) — 19m22s
  • ✓ E2E Tests (linux) — 2m53s
  • ✓ E2E Tests (windows) — 12m53s
  • ✓ Typecheck(含 lint 棘轮:4710 警告 < 阈值 4716)
  • ✓ CodeQL(actions / go / javascript-typescript)

首轮 Unit Tests 曾因 v2 pty HttpApi > serves location-wrapped PTY routes 失败(轮询 20s 后 PTY 状态仍为 running)。已论证为环境 flaky 而非本批改动引起:PTY 退出状态由 proc.onExit 同步回调直写 session.infopackages/core/src/pty.ts,未改动),不经任何被修改的路径;pty handler 仅依赖 InstanceState.context(本批只加注释)与 registerDisposer(未改动);本地该文件 4/4 通过;重跑该 job 全绿。

补充审查

  • CodeReview 子代理逐一审查 16 个文件:无 blocker/major/minor/nit
  • L3 深度安全审查:0 findings

LeXwDeX and others added 2 commits July 31, 2026 22:04
…recovery, settlement races, and hot paths

- worker.ts: replace empty exception handlers with file logging, worker.fatal RPC notification, and safe exit; main process listens for worker fatal/error/close
- rpc.ts: propagate RPC handler failures to caller instead of unhandledRejection + hung promise
- llm.ts (V2 runner): close awaitToolFibers race where awaitEmpty could swallow the last tool fiber failure
- processor.ts (V1): guard cleanup against overwriting settled tool results; claim toolcalls synchronously
- prompt.ts: parallelize independent request-build I/O with concurrency unbounded
- recovery.ts: narrow session status checker to NotFoundError; propagate unexpected errors instead of inventing node failures
- loop.ts: move orchestrator_unresponsive dag.fail under evalLock; log wake redelivery store failures instead of swallowing
- stream.transport.ts: cap buffered events at 1000, add prompt-turn idle escape threshold, bound recoverQuestion polling to 120s
- convert-to-openai-responses-input.ts: batch reasoning provider-option parsing out of the per-part loop
- handler.ts (zen): cumulative-weight provider pick replaces O(sum-of-weights) array expansion
- plugin/index.ts: observe plugin event hook rejections via forkDetach + logError
- dag.ts: structural guard in parseWorkflowConfig for nodes/id/depends_on invariants
- acp/service.ts: drop failed contextLimit lookups from cache so they retry
- event-reducer.ts: batch per-delta store updates into one reactive notification
- instance-state.ts: document why the ScopedCache is deliberately unbounded
fix(core,opencode): resolve audit CRITICAL/HIGH defects across crash recovery, settlement races, and hot paths
@LeXwDeX
LeXwDeX merged commit 414d9f9 into main Jul 31, 2026
17 of 18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant