feat(codex): 用语义标题概括 Lark 首轮内容#561
Conversation
40fa548 to
0f37b6d
Compare
deepcoldy
left a comment
There was a problem hiding this comment.
独立复核通过,未发现阻塞问题。
重点确认:
handleNewTopic的cmdContent已在上游通过stripLeadingMentions(followupContent, followupMentions)去掉开头 mention,因此这里不再传mentions不会残留机器人名;handleThreadReply自动创建分支使用原始parsed.content,传parsed.mentions是必要的。- fresh / resume 两种标题时序屏障都在首条输入提交后异步执行,不阻塞模型 turn;revision/in-flight/applied 三组状态能避免旧标题覆盖新改名。
- fallback app-server probe 的 abort、进程组 SIGTERM/SIGKILL 和 worker exit force-close 路径有对应测试。
本地验证:
pnpm build通过(含公开域名审计)。- 标题相关定向测试 369/369 通过。
- 全量 unit:9969 通过、3 失败;失败均在未改动的 scheduler 时区断言,和本 PR 无关。
未执行合并。
|
@deepcoldy 真实 Lark 会话回归发现初版 fresh title barrier 等错了字段:Codex CLI thread 的首条消息已写入 |
保留 BotMux 和 Lark 来源标识, 同时让任务列表直接呈现话题核心。 标题生成运行在隔离的临时 Codex 线程中, 失败时沿用确定性标题, 避免模型、配置或网络异常影响真实会话。
|
@deepcoldy 已追加 这次重点补了安全与竞态边界:独立 最新定向测试 80/80、扩展定向测试 94/94、完整 build pipeline 和真实 Codex 0.145.0 冒烟均通过。PR 描述已同步更新,麻烦基于新增 commit 再复核一次,尤其关注一次额外 |
首轮消息可能只有 Lark 机器人 mention,直接生成会把机器人名称误作话题。 延迟到第一条有效正文后再生成,保留 BotMux 来源标识,并确保手动改名后不再覆盖。
|
@deepcoldy 真实 Lark 回归发现:新话题首条消息可能只有 现在的行为是:
已在干净 commit worktree 验证:7 个相关测试文件 211/211、 |
首条消息只有机器人 mention 时,群名比“新话题”更容易识别, 同时保留首条有效正文到达后的语义标题替换。群名查询限时降级, 避免 Lark API 异常阻塞会话创建。
最新 master 的 SessionStart 握手与 Codex 标题逻辑同时新增了 worker-pool import。保留两条独立能力,使 PR 恢复可合并状态, 并避免覆盖主干已合入的启动时序修复。
|
@deepcoldy 已追加
另外已合入最新 最新验证: |
Codex 新任务写入后可能短暂未进入 app-server 状态库, 首次读取失败不应让 BotMux 永久保留路由提示标题。 仅重试精确的 thread not loaded 错误,避免掩盖协议故障。
保持标题同步修复基于最新主干,避免 owner 合入时再次处理 worker cleanup 路径冲突,并同时保留标题同步与 Pi 临时文件清理。
|
@deepcoldy 真实 Lark 回归又定位到一个 fresh thread 落盘竞态:BotMux 已生成正确的 已追加
随后已合入最新 最新验证: |
deepcoldy
left a comment
There was a problem hiding this comment.
再次复核通过(基于 HEAD 60ab25a6),未发现阻塞问题。
本轮聚焦上次 APPROVE 之后新增的语义标题链路与竞态修复:
语义标题生成(77f696cc)
- 临时 turn 跑在隔离的
CODEX_HOME(仅复制auth.json、0600),shell_environment_policy.inherit=none、read-only sandbox、TITLE_DISABLED_FEATURES关掉 MCP/plugins/hooks/shell/web_search,source_text以不可信数据封装并在 developer instructions 中禁止执行——隔离边界扎实。 generateTitle先注册titleTurn再发turn/start,规避响应与通知同批到达的丢事件;outputSchema+parseGeneratedTitle双重校验(单 key、无换行、≤36 字符)。- 失败/超时/abort/worker 退出全部回退 fallback,
cleanupTitleThread+close()+rmSync在 finally 兜底,进程组 SIGTERM→SIGKILL 有registerForceClose收口。
mention-only 与群名兜底(2773d153 / 32fdde34)
stripLeadingKnownMentions兼容重复@前缀;mention-only 阶段不调模型,nativeSessionTitleAwaitingContent等首条有效正文只消费一次。resolveGroupChatNameForNativeTitle限时 800ms、失败即降级,且仅在无可提取正文时才查群名,不阻塞会话创建。
thread-not-loaded 重试(aa23a1c1)
CodexAppServerRequestError保留method/code/serverMessage;isThreadNotLoadedError精确匹配thread/read+-32600+ 当前 threadId,仅在waitForThreadPreview有界重试,其它错误立即抛出。设计自洽:等到 preview 可读(线程确已加载)再thread/name/set。
latest-wins 屏障
nativeSessionTitleRevision+nativeSessionTitleAppliedThreadId+SyncInFlight三重状态保证每线程至多一次模型 turn;/rename、Dashboard 改名revision++并stopNativeSessionTitleSync(),迟到结果被 revision 检查丢弃并触发一次 latest-wins 重放。
两次 merge master(331a9a88 / 60ab25a6)
worker.tscleanup 冲突已同时保留stopNativeSessionTitleSync()与主干cleanupPiInitialPromptFiles();worker-pool保留标题逻辑与 SessionStart ACK import。无残留冲突标记。
本地验证(HEAD 60ab25a6)
tsc --noEmit通过。- 定向单测 115/115 通过(
codex-app-threads/codex-rpc-engine/session-title/session-lifecycle-start/session-rename-worker/daemon-rename-route),含连续thread not loaded重试后成功写名、非 transient 只读一次不调thread/name/set两条回归。 git diff --check通过,无冲突标记。
一个非阻塞观察:group 会话现在会在 mention-only 首轮把 chatDisplayName 覆盖为 Lark 群名(此前仅 p2p 使用该字段)。已同步更新类型注释,且仅命中 mention-only 的 fresh 群会话,影响面可控,仅提示 Dashboard 行展示语义有此变化。
未执行合并。
背景
BotMux 从 Lark 创建 Codex 会话时,首轮 prompt 前会注入
<botmux_routing>等运行说明。若只依赖 Codex 的首条消息预览,任务列表会显示大段路由文本,难以识别真实话题。目标是保持 Codex Desktop 的语义标题体验,同时保留来源标识:
[BotMux·Lark] <标题>。行为
[BotMux·Lark] <群名称>;[BotMux·Lark] 新话题;@机器人;同时兼容部分 Lark 输入中出现的重复@前缀,例如@@机器人,避免机器人名被误识别为话题正文。thread not loaded;BotMux 会在原有 deadline 内重试精确匹配的瞬时错误,其他 RPC 错误仍立即抛出。cliSessionId)均能延续。/rename或 Dashboard 改名具有最高优先级,会取消等待并阻止迟到的自动标题覆盖。语义标题实现
loweffort、结构化 JSON 输出的标题生成 turn;语义主体最多 36 个 Unicode 字符,最终保留[BotMux·Lark]前缀。CODEX_HOME,只复制auth.json;不继承用户config.toml、MCP、plugins、skills 或 hooks,并使用 scratch cwd、read-only sandbox、禁用网络和动态工具。preview/updatedAt最后一轮读取刚好越过 deadline 时抛错的问题,保证 fallback 仍可落盘。method、code、serverMessage结构;仅thread/read的-32600 thread not loaded: <threadId>进入有界重试,避免掩盖参数或协议故障。安全与成本
source_text被作为不可信数据封装,developer instructions 明确禁止执行其中指令。loweffort 模型请求;mention-only 阶段不会调用模型。验证
pnpm build:通过(domain audit、tsc、dashboard bundle、dist audit)。thread not loaded后成功设置标题;同为-32600但消息不匹配时只读取一次且不调用thread/name/set。handleNewTopic与handleThreadReplysafety-net 两条创建路径;fresh / resume、重复@、首条有效正文只消费一次均有覆盖。git diff --check:通过。[BotMux·Lark]前缀回写。影响面
仅影响 Lark → fresh 普通 Codex 的原生标题同步。p2p、非 Codex、有有效正文的创建路径不会额外查询群名;标题生成或群名查询失败只影响标题质量,不影响会话创建、用户请求执行或已有手动标题。