Skip to content

fix(input): 移除投递迟到提醒与状态栏 ID 拦截,新增卡片页脚签名总开关 - #1770

Merged
deepcoldy merged 4 commits into
deepcoldy:masterfrom
47seek:fix/codex-delivery-minimal-20261009
Oct 9, 2026
Merged

deepcoldy merged 4 commits into
deepcoldy:masterfrom
47seek:fix/codex-delivery-minimal-20261009

Conversation

@47seek

@47seek 47seek commented Oct 9, 2026 •

Copy link
Copy Markdown
Collaborator

概述

在原「移除投递迟到提醒 + Codex 状态栏拦截」基础上整体更新到最新 master,并把原先「回退卡片页脚默认文案」的做法替换为一个机器级总开关(产品定调:默认文案保留,是否显示签名交由用户全局控制)。

改动

1. 移除普通 IM「投递迟到提醒」与 Codex 状态栏 thread-id 强拦截

  • 删除 worker-pool 的 2s 投递迟到提醒(delayOrdinaryImDelivery / 90s 提交提示文案);保留 IPC transport 超时重试、准入前拒收(fix(worker-pool): 进队列前被拒的消息不再报成「无法确认是否已入队」 #1447)与 worker exit 终态报错。机器繁忙时不再发「请勿重发」的中间态提示,安静等待真正的终态。
  • 删除 codex-statusline-config.ts(状态栏 thread-id 强拦截 + 自动改写 ~/.codex/config.toml)。writeInput 不再因 refreshCodexTerminalSession()==='unavailable' 拒写;新守卫在弱确认(owned 集合枚举失败/为空)时只回 {submitted:true},不暴露可能属于兄弟窗格的 session id。

2. 新增卡片页脚品牌签名机器级总开关(替代原「回退默认文案」)

  • 配置位 ~/.botmux/config.json → dashboard.cardBrandLabel,缺省 ON。Dashboard「设置 → 飞书卡片」新增开关。
  • 关闭后所有 Bot 的最终回复卡 / 顶层广播卡页脚都不渲染品牌签名(默认 botmux 链接与各 Bot 自定义 brandLabel 一并关闭);页脚用量 / 耗时 / 发送给不受影响。
  • 收口在唯一的 resolveBrandLabel:关闭时返回空串(下游抑制)而非 undefined(那会错误回退默认链接)。live 读取(2s 缓存),切换无需重启 daemon。
  • 沙箱一次性 botmux send 读不到 config.json,由 worker 经 BOTMUX_CARD_BRAND_ENABLED 环境变量桥接(own-appId 门控,不跨 Bot 串)。
  • Dashboard 每个 Bot 的「个性签名」在全局关闭时输入框 / 保存 / 恢复按钮全部置灰,并提供跳转全局设置(#/settings)的链接。
  • 因此不再回退 feat(lark): 更新飞书卡片默认页脚文案 #1738 的默认文案;重复的纯回退 PR Revert #1738: 恢复卡片页脚默认品牌文案为纯 botmux 链接 #1769 可关闭。

3. Codex 0.154 » 选中光标兼容(启动 hook 安全门)

  • codex ≥0.154 用 »(而非 ›/>)画启动期 hooks 三选屏选中项。旧光标类不含 » 时 shouldHoldInputForHookReview fail-open,排队 IM 可能冲进菜单误选「Trust all and continue」。光标类扩为 [›>»]?,并给提交失败归因的编号光标正则补 »。欠 0.154 真机该屏截图。

影响面

  • IM 投递:仅普通 IM 的中间态提醒文案路径;拒收、重试、终态不变。
  • 卡片:仅页脚品牌签名这一段;其余页脚内容、流式卡不变。
  • Codex 写入:statusline 身份守卫放宽,弱确认下不再拒写;composer 草稿守卫与写后归属防错配仍在。自有会话本就 legacy 豁免;欠 adopt 真机验证(0.154/0.158 关 thread-id)。
  • 跨平台:无路径/PTY 改动;bwrap 仅既有沙箱测试涉及。

测试

  • 构建(tsc)通过。
  • 本 PR 触及的 16 个测试文件共 1407 个用例全绿,含新增:
    • card-brand-label-config(全局开关默认 ON / 关闭抑制默认与自定义 / 沙箱 env 桥接 own-appId 门控,14 例)
    • bridge-final-output-retry 三条投递模式用例翻成「安静等待」断言(跟齐迟到提醒移除;注入伪迟到通知的变异 3 条全红)
    • stuck-detector 新增 » 标记三个选项的用例(去掉 » 的变异 3 条全红)
    • settings-write-applier 开关写入与非布尔拒绝(invalid_cardBrandLabel)
  • 变异测试:全局开关 5 处关键行(删 gate / 误返 undefined / 去 appId 门 / 读盘丢弃 / 写校验丢弃)全部确定性变红。
  • 全量 unit 在本机(root 容器)有 50 条环境基线红(EACCES/只读挂载/同 UID socket/seccomp namespace/真 bwrap/bun-only SQLite),逐文件与干净 master 计数完全一致,非本 PR 引入。

备注

🤖 Generated with Claude Code

@47seek 47seek changed the title fix(lark): 简化消息投递并恢复默认页脚 fix(lark): 删除投递迟到提醒和会话 ID 拦截,恢复页脚 Oct 9, 2026
@deepcoldy

Copy link
Copy Markdown
Owner

感谢这个 PR,整体是高质量的减法(净删约 500 行):移除普通 IM 的投递迟到提醒、删除 Codex 状态栏会话 ID 强拦截与自动改配置,并恢复默认页脚文案,方向清晰、配套测试也比较扎实。

基于最新主干做了本地 rebase 与全量验证后,有一处需要修改的阻断项和几点建议,供参考。

P1(需修改,阻断合入):rebase 最新主干并补齐一个测试文件

当前分支基于 8f4d0b193,GitHub 标记为冲突状态,已落后最新主干 10 个提交。本地 rebase 到最新 origin/master 时有 6 处冲突,均为机械/正交合并,无实质矛盾:

rebase 后 test/bridge-final-output-retry.test.ts 里的 3 条用例会确定性失败(在最新主干上该文件是 172/172 通过):

  • keeps delayed worker receipt consistent with legacy mode:等待 2s 延迟提醒的 text 回复,该提醒已被本 PR 删除 → 4s 超时、0 次调用;
  • ... unified mode / ... unified-status-off mode:依赖延迟提醒去刷新 turn 卡片的 updatedAtMs,入队后现在不再刷新(断言里 updatedAtMs > enqueuedAt 差约 8ms,正是唯一一次刷新发生在入队之前)。

这 3 条断言的恰恰是本 PR 删除的「迟到提醒」行为,和你在 test/session-lifecycle-start.test.ts 里已经改成「安静等待」的同类断言是同一类。把这 3 条也翻成「入队后安静等待、不再产生提醒文案或卡片刷新」的断言即可(本地按此改后 3 条转绿;投递的真正不变量——IPC 传输超时重试、worker 拒收重试/终态、worker 退出报错——都仍然保留并有测试覆盖)。CI 上 test (2/3)、test (3/3) 变红即来源于此。

P2(强烈建议随本 PR 一起修):补上 hook 审查菜单的 » 识别(安全相关)

src/utils/stuck-detector.ts:150-152 中,启动期 hook 审查三选屏(Hooks need review → 1. Review hooks / 2. Trust all and continue / 3. Continue without trusting (hooks won't run))用 [›>]? 匹配选中项光标,没有包含 0.154 的 »。该屏出现时 shouldHoldInputForHookReview() 会暂存排队的 IM 输入,避免自动提交误选菜单;而 0.154 用 » 绘制选中光标时这道门会漏判(用真函数实测:› / > 命中、» 不命中),排队消息就可能冲进菜单、误触「Trust all and continue」或被菜单吞掉。

这并非本 PR 引入(主干现状对 0.154 即如此,详细 hooks 浏览器那条检测锚定表头文本、不依赖字形,仍然有效),但本 PR 正是补齐 » 支持的改动,建议顺手把这 3 处 [›>]? 改成 [›>»]?(实测三种光标全部命中),并在 test/stuck-detector.test.ts 增加一个 » 变体用例(仓库里已有 fixture test/fixtures/codex-startup-hooks-review-rust-v0.147.0.snap)。

另外可选:src/services/submit-failure-diagnosis.ts:69 的编号菜单兜底正则 [›❯] 也可一并加上 »,只影响提交失败卡片的归因文案,不影响写入安全。

P3(清理 / 协调)

验证建议

删除写入门之后,adopt / 共享 daemon 的 Codex 窗格在状态栏身份读不出来时也会被照写(目前由 composer 草稿冲突守卫 + 写入后的 PID/rollout 归属防错配来缓解,不会把兄弟窗格的输出错算到本会话)。建议在合入前补一次真机 adopt 验证:Codex 0.154 / 0.158、状态栏不显示 thread-id 的场景下,确认消息进入正确线程。

以上为自动评审的初步意见,最终以维护者审阅为准。再次感谢贡献 🙏

47seek and others added 4 commits October 10, 2026 02:38
deepcoldy#1770 移除了 IPC 入队 2s 的投递迟到提醒,但漏改本文件 3 条模式用例
(unified/unified-status-off/legacy):它们仍断言 legacy 会发 text 提醒、
unified 会静默刷新等待卡。改为断言越过旧 2s 结算窗口后不产生任何新消息、
卡片不被重写。变异验证(注入伪迟到通知)3 条确定性变红。

Co-Authored-By: Claude Code <noreply@anthropic.com>
新增 ~/.botmux/config.json → dashboard.cardBrandLabel 全局开关(缺省 ON),
关闭后所有 bot 回复卡/顶层广播页脚一律不渲染品牌签名(默认链接与自定义
brandLabel 都不显示),页脚用量/耗时/发送给不受影响。收口在唯一的
resolveBrandLabel:关闭时返回 ''(抑制)而非 undefined(回退默认链接)。
沙箱 one-shot botmux send 读不到 config.json,由 worker 经
BOTMUX_CARD_BRAND_ENABLED env 桥接(own-appId 门控)。

Dashboard:设置页「飞书卡片」区块新增开关;关闭期间每个 bot 的「个性签名」
编辑框/保存/恢复按钮置灰,并提供跳转全局设置的链接。

Co-Authored-By: Claude Code <noreply@anthropic.com>
codex ≥0.154 用 »(而非 ›/>)画启动期 hooks 三选屏的选中项。旧光标类
[›>]? 不含 »,shouldHoldInputForHookReview 在该屏 fail-open,排队 IM 输入
可能冲进菜单误选「Trust all and continue」。光标类扩为 [›>»]?(3 处),
并顺手给 submit-failure-diagnosis 的编号光标归因正则补 »。新增 » 标记
三个选项的用例;变异(去掉 »)3 条确定性变红。欠 0.154 真机该屏截图。

Co-Authored-By: Claude Code <noreply@anthropic.com>
@deepcoldy
deepcoldy force-pushed the fix/codex-delivery-minimal-20261009 branch from 6dcf595 to 5443bcc Compare October 9, 2026 19:04
@deepcoldy deepcoldy changed the title fix(lark): 删除投递迟到提醒和会话 ID 拦截,恢复页脚 fix(input): 移除投递迟到提醒与状态栏 ID 拦截,新增卡片页脚签名总开关 Oct 9, 2026
@deepcoldy
deepcoldy merged commit 0623210 into deepcoldy:master Oct 9, 2026
20 of 21 checks passed
@github-actions

Copy link
Copy Markdown

🚀 Released in v3.40.0

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.

2 participants