Repository navigation
fix(lark): return answers to uncaptured steward questions - #8213
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Reviewer: model_agent · OpenAI · gpt-6.1-sol · runtime_reported · max
Reviewed exact head: 326253d; immutable base: 22b0f6c.
动机 / Motivation
飞书私聊管家的本人用户在历史收信缺口后再次等待原问题的直接答案。
旧服务发现没有 Core 请求的历史问题后只会重连;本提交让原服务核验原消息后,在同一队列生成一次受限补答并沿原消息返回。
合成原入口已观察到一个补答回合、原回复 worker 发送及独立读回;真实模型与安装后补答仍须由原服务验收。
本改动不重执行业务,不把答案当作素材入库或委派完成,也不覆盖项目、群聊、媒体或早于当前会话的问题。
真实安装和原消息回传尚待后续验收;原本执行效果不明及未完成的业务继续保留,不在本次审查中报为完成。
原问题与授权已经存在,用户不需要导航到新设置、复制旧问题或再确认一次。零改动及重复重连都不能得到答案,直接重放历史业务会扩大未知效果,因此本次选择原服务内的一次受限补答。
改动思路 / Approach
来源枚举和飞书 IO 留在现有 provider,准入由既有 TypeScript conversation planner 裁决,持久预留与幂等采用归 Core,原 worker 发送读回;没有新增消费者、业务重试家族或账户配置。
当前交付边界是已绑定 Codex 私聊管家的一次受限历史补答;失败复核及未知业务效果保留原 owner,真实安装验收由原服务继续。
下表是从 326253d 源码及合成原入口观察归纳的行为比较,不是真实模型或生产安装证据。
| 原始状态 | 旧路径 | 本提交 |
|---|---|---|
| 合格历史问题未进入 Core | 只重连,仍无答案 | 原队列一次受限补答,原消息回传读回 |
| Stop、撤权、正文改变或源清单不完整 | 无新历史执行 | 保留等待,不把未知当无效果 |
| 原生后台/活跃任务 | 原 owner 保留 | 不替换原 actor,不为历史读库存阻塞活跃回合 |
| 入队前后确认丢失 | 缺少此类预留 | 采用同一 review-1,重复观察不增加回复 |
具体改动 / Changes
规范依据为 docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md,固定在变更前提交 22b0f6c25a0450a66bd93f05954808dc0a5800ed;不是用本 PR 新增段落自行定义通过条件。SRC-1(当前来源/授权/停止)、ANS-1(受限只读答案)、ONCE-1(原队列幂等预留)、RETURN-1(原 worker 送达并独立读回)均已在合成真实队列旅程实现。RETURN-1 的真实模型及安装旅程仍保留独立验收,不宣称广义 SLA 或业务结算。
关键代码讲解
PrivateIngressObserver.answer_candidates:read-only complete source enumeration。输入为complete fresh gap/current owner raw sources;关键边界是commands/Stop/New, incomplete inventory or foreign source hold。通过后provider mget only; yields source,结果交给observe_ingress asks Core;拒绝时由provider next scan; never creates another consumer。ChatExternalConversations.admit_history_answer:canonical answer reservation。输入为fresh source_preflight under request/source fences;关键边界是binding/current Codex/idle/background/stop validated before queue。通过后effect_runtime planner then enqueue_turn,结果交给same Core journal and original worker;拒绝时由same reservation adopted after either enqueue crash。planBoundConversationRequest:typed authority decision。输入为owner binding + exact current context + observation;关键边界是all required observations true; source time after Session and older5s。通过后pure decision; no provider/model IO,结果交给Core persists reservation;拒绝时由hold reason retained。CodexAppServerAdapter.answer_review_replaceable:protect original live actor。输入为existing original process only;关键边界是unknown/active/duplicate IDs/background → false。通过后two paginated reads + background read within5s,结果交给Core admission and runtime replacement check;拒绝时由false keeps original adapter and source pending。
LarkPrivateConversations.admit 冻结原始消息身份、正文、毫秒时间及引用关系,并在 Core 源屏障内并行重新读取原始/渲染消息;标记 provider_history,不冒充 WS 收信。start_reserved_recovery 复用现有 read-only adapter 和原账户策略,不改执行器,禁止写入、网络、委派及业务继续。普通后续问题恢复原非复核配置。
完整差异 745 增/147 删,含 115 行原投影函数的原样迁移;没有新模块、新消费者、账户设置或预算阈值增加。Chat 原引用上下文通过兼容导出继续读取同一函数。
验证:精确 head 577 项相关 Python 回归、16 个补答场景、59 项 TS、typecheck 及标准 premerge 6 direct + 11 selected 通过。额外同一夹具在固定 base/head 分别 8 项通过:合法历史从 0 到 1 个答案,Stop/清单不完整/早于会话仍从 0 到 0;响应顺序变化、70 个别的来源及已完成引用不改变本来源结论。基线原服务缺陷 oracle 明确失败于 Core count 1≠2,head 通过;初次错误导入 head 的基线“通过”未当作证据。
对主干的风险 / Risks
最大风险是把“没有可见回复”错当作“没有执行业务”,或替换仍拥有后台工作的原生 actor。该补答只读,当前活跃回合不进行历史库存 RPC,原 live adapter 需两次稳定终态清单及无后台证明,runtime 替换前再核对;这不是旧业务效果已经结清的证明。来源编辑、撤权、Stop/New、未知库存和不完整原消息继续等待。
原队列、原 worker 和四槽调度保持;每 binding 每轮一个候选,最多 64 条完整原始控制清单。真实模型可因额度或内容不足仍不能答好,这不由 stdio peer 证明。已有失败复核、素材入库和委派完成义务不在此处冒领。持久预留只认一个当前契约;向不识别 answer-only 的旧 reader 降级未获资格,恢复采用同版本或前向修复。初期模块上限、依赖及导入失败已按原条件修复并用冻结检查覆盖,没有提高阈值。CI 按 wait_for_ci=false 未查询、未等待。
我的整体评价 / Verdict
结论是 justified_increment:这是能通过原入口产生一次可验证补答的完整修复片段,仍保留原 owner 的真实安装、原消息送达与业务效果验收。long_horizon 为 accepted_tradeoff:bounded 源清单及未知任务等待换取不重复执行;user_experience 为 improved:已有授权的原问题无需新增交互即可在原消息收到合成补答。
沿用现有飞书原消息回复与终态读回;本 diff 没有改变渲染器、布局、折叠或字体,因此没有新增页面可视验收。
真实飞书客户端中补答内容的可读性、真实模型答案质量及安装后的到达仍未验证。
来源枚举和飞书 IO 留在现有 provider,准入由既有 TypeScript conversation planner 裁决,持久预留与幂等采用归 Core,原 worker 发送读回;没有新增消费者、业务重试家族或账户配置。
当前交付边界是已绑定 Codex 私聊管家的一次受限历史补答;失败复核及未知业务效果保留原 owner,真实安装验收由原服务继续。
没有发现当前精确 head 的阻塞缺陷。语义判断为扩展既有来源/answer-review 词汇;扫描器的动态/未知 producer 覆盖没有被当作安全证明。生产采用与广义历史业务闭环仍须后续按原来源验收,不以合并替代。
English verdict: APPROVE the bounded original-service historical answer-only repair at 326253d. Local source qualification passed; real model, installed delivery and unknown prior business effects remain explicitly unclaimed.
飞书管家能发现历史中未回复的本人问题,但没有 Core 请求记录时,原服务只会重连,问题一直没有直接答案。
本改动让原服务在同一条持久队列中预留一次仅补答案的复核。Core 核验原本人、原消息、绑定、停止指令、原会话及队列状态;provider 明确保存历史来源,使用原始消息时间与正文,兼容 CLI 的格式化时间和成功信封。原生 adapter 只允许受限读取,回复由原 worker 沿原消息返回并独立读回。历史请求不会进入普通业务重试,也不会生成虚构的失败 Turn。
为保护正在工作的管家,活跃回合不进行历史原生库存读取;替换现有 adapter 前须由其原进程证明没有活跃回合或后台终端。原消息被编辑、停止、撤权、旧来源冲突及读回不完整时保留等待。入队前后丢失确认均采用原预留,不增加一次复核;后续普通提问继续使用原授权。
验证
边界
限定为已有 Codex 私聊管家、原会话创建后的文字问题;每次须完整核对至多 64 条未核验原消息。项目/attached/group、命令、媒体、更大或不完整清单以及失败复核保留原边界。读取复核不证明素材入库、PR 合并或委派业务完成;未知效果继续等待。使用既有账户策略,没有新账户配置或模型候选集。
界面沿用原对话、回复和读回,没有新增页面。真实消息接口已只读核对;实际模型补答及安装采用在合并后由原服务验收。含此预留的存储向不识别仅补答案协议的旧 reader 降级未获资格。没有查询或等待 CI。