Repository navigation
fix(steward): retain periodic state across executor changes - #7869
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.
Reviewer: model_agent · GPT-6 · OpenAI · self_reported
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
已准备原生周期任务后切换执行器的个人管家用户。旧界面隐藏整块周期设置,用户无法判断计划是否丢失;新界面保留原计划与窗口,并明确当前无法执行。打包界面在桌面和窄屏均可读回原状态,恢复支持的执行器后同一配置重新可用。本 PR 不接入新周期执行器,不重放旧窗口,不生成或发送业务报告。当前未支持执行器的原生周期执行与真实自然送达仍未完成,保留在既有周期任务工作中。
改动思路 / Approach
读取沿用现有健康投影,执行仍由原 TypeScript owner 判断;无需新增调度或持久状态。当前切片只交付原配置可见性、禁用修改和同身份恢复。只改 UI 不足以修复:旧 API 不返回已保留健康状态,旧 Zod 与执行器渲染门也会继续隐藏它。此次复用原健康 owner、日历编辑器和 settings 入口,并将配置可用性统一为 canConfigure。没有新增持久字段、调度队列或后台消费者。用户不必重新输入已知计划,也没有增加确认轮次。
| 原状态 | 本次结果 | 执行边界 |
|---|---|---|
| 已准备但当前 executor 不支持 | 保留原配置并显示无法运行 | 原 native owner 仍拒绝修改 |
| 恢复支持的 executor | 同一 actor/config/window 重新可配置 | 不创建替代身份或重放窗口 |
此表解释 exact head 8a1f25c 的源码路径;不是执行证据,执行证据来自下述 HTTP 和打包界面验收。
具体改动 / Changes
依据改动前的 docs/product/periodic-reports.md,spec_revision=8a9e116283df2796926ea153241f48c9c8fc3dbb。SR1 对应准备身份不启用任务:读取及恢复验收没有新增模型或发送。SR2 对应原生生命周期 owner:prepare、monitor、report enable/pause/cancel 在两种存储后端均保持拒绝。SR3 对应不得重跑或退役旧窗口:journal、registry、binding 和原历史独立读回保持不变。新增文档说明没有被当作反向定义测试预期的依据。
关键代码讲解
_private_conversations保留原 prepared actor 的健康投影;不支持的 executor 补充 false 可用性与明确错误标记。普通项目、群、未准备对象继续沿原过滤路径。privateConversationSchema在两个 available 分支保留可选字段,使真实打包界面不会丢掉标记;Codex 原响应字典无需新增字段。StewardManagedMode使用一个 canConfigure 约束既有编辑入口,保留只读帮助;状态文案区分计划保留和执行启用。StewardReport保留原日历、窗口与投递状态,无法执行时禁用修改,并移除误导性的“监控照常运行”声明。
测试新增 File/SQLite 同输入失败与恢复路径,既有合成 fixture 的 retained-executor 开关实际用于本次打包 QA;未另起生产模块。11 个文件 +136/-17 包括三张合成截图,没有提交生成 bundle。
对主干的风险 / Risks
主要风险是把可见状态当作执行许可,或只测后端而遗漏 schema/渲染门。File/SQLite 的五类 POST 拒绝、持久状态不变,以及相同打包界面的旧/新对照共同排除此风险。基线两例在缺失 managed_steward 处失败,head 两例通过;支持 executor 恢复后健康字典精确还原。桌面和窄屏的十个修改控件均禁用,帮助仍能阅读;恢复测试没有新增模型 Turn 或 provider 写入。
PASS:Python compilation/Ruff、Chat build、TypeScript 类型、6 项 direct 与 16 项 premerge 检查。premerge 总退出码 1 的原因是三张二进制图需要人工 review;已逐张检查实际像素、合成来源、提交字节及 PNG metadata,三项 visual hold 在此 exact-head review 内得到解决,未把原退出码改称全绿。文本隐私扫描为零命中;图片无用户数据或文本/EXIF metadata。
FAIL(非本 PR 回归):扩大 owning suite 为 59 passed / 1 failed。失败为 test_chat_server_closes_lark_goal_topic_runtime 的未初始化 background_services,已用相同单测在干净 8a9e116 重现相同 AttributeError;PR 未改这条关闭服务路径,保留原失败,相关关闭服务维护由其既有 owner 处理。CI 未查询;该 Goal 的 wait_for_ci=false。CQR 当前关闭,未制造资格回执。支持 host 的旧响应继续兼容,不涉及持久格式迁移;反向恢复已通过同一原配置验收。
语义与 CI 对齐
两个新字段是已有私聊响应的瞬时派生投影,扩展显示词汇而不新增 actor 或 admission authority;原 TypeScript host gate 未变。语义 drift smoke 通过,报告激活、错误窗口、送达资格没有变成 UI 文案判断。
我的整体评价 / Verdict
long_horizon=preserved:失败窗口、旧回执与原 actor 的恢复仍由原生命周期负责。user_experience=improved:无需重填配置即可区分原计划存在和当前无法运行。已检查桌面与窄屏的原生周期展开区域及下部报告控件:保留计划、窗口和不可用状态可读,技术明细仍在原设置内。未核验范围:真实报告生成、自然送达和未支持执行器上的周期执行。
本切片具备独立可用的状态读回价值,机制与故障范围相称。已有 owner 已复用,局部收敛了配置可用性,无需继续拆分或新增抽象。可合并此显示修复;安装采用和真实报告交付仍需各自证据,不从截图或 metadata 推断。exact head 8a1f25c,无阻塞发现。
English verdict: APPROVE — retained periodic state is readable without expanding execution authority; live report delivery remains outside this change.
Changing a prepared steward to an unsupported scheduled-work executor previously hid its original periodic configuration. Keep that state readable, show an execution-unavailable notice, and disable changes until a supported executor returns. Native admission, the original actor, windows and delivery receipts retain their existing authority.
The existing connection view and report controls share one availability value; older Codex responses retain their shape. The disposable browser fixture adds an active retained-executor readback journey rather than another execution owner.
Validation: File/SQLite regression fails on baseline at the missing state and passes on this head (2 cases). The owning test run has 59 passes and one pre-existing service-close fixture failure, independently reproduced on clean baseline. Python compilation/Ruff, packaged Chat build, and desktop/narrow readback pass. Configuration recovery retains the same report state with zero new model calls or provider writes. Exact-head premerge and TypeScript checks are recorded in the review; CI is not queried under the managed policy.
These screenshots use synthetic data only. They qualify packaged readback, not live report generation or delivery.