You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[automation] getSuspendedScreen 只读内存热缓存 —— 重启后一个仍然活着的挂起 run 取不到它的 screen(404) #4515
同步版正是 AI 最容易踩的那类陷阱:调用它在热进程里完全正常,只在重启后 404,常规测试根本照不出来——"looks right, works in dev, fails in production"。方案 A 把陷阱从契约里删除;方案 B 只是把陷阱文档化,而依赖「AI 记得读文档」正是我们不信任的东西。
Activity
os-zhuang commentedon Aug 2, 2026
决策请求(PM 循环第 1 轮分诊):本 issue 的修复方向涉及公开契约变更,按规程不派发、请你拍板。已打
needs-user-decision标签。两个候选方案
方案 A:把契约方法改为异步 ——
getSuspendedScreen(runId): Promise<ScreenSpec | null>,同步改packages/spec/src/contracts/automation-service.ts、packages/runtime/src/domains/automation.ts路由调用点及其他消费方。破坏性变更。方案 B:新增异步孪生方法 —— 保留同步版作热路径快查,加
loadSuspendedScreen(runId): Promise<…>,路由改用异步版。签名不破坏,代价是两个名字做一件事。两轴分析
① 项目长远合理性
② 防 AI 写代码犯错
建议
方案 A,按契约变更走:spec 契约改异步 → 路由与消费方同步迁移 → 一个 changeset 记录破坏性变更。若你担心一步到位的波及面,可以 A 的分步变体:先加异步版并把所有内部调用迁过去,同一个版本窗口内删除同步版(要有明确的删除排期,不能让 B 的状态常驻)。
拍板后请回复评论(选 A / A 分步 / B / 其他),摘掉
needs-user-decision或直接告诉我,即可进入下一轮派发。Generated by Claude Code
os-zhuang commentedon Aug 2, 2026
同意方案A
os-zhuang commentedon Aug 2, 2026
维护者已拍板:方案 A(契约方法改异步,破坏性变更)。已摘除
needs-user-decision,转为可派发实现任务。排期说明:列为下一轮首位而非本轮立即派发——本轮已追加派发 #4525(spec 建模
DecisionOutputDef.required),两者都会改动packages/spec的公共表面并重新生成同一份 api-surface 基线,同批并行必然在生成产物上撞车;按批次独立性规则串行,#4525 的 PR 进入合并流程后即派发本条。Generated by Claude Code
os-zhuang commentedon Aug 2, 2026
认领:PM 循环第 2 轮(维护者已拍板方案 A:契约方法改异步)
分支:
claude/issue-4515-suspended-screen-asyncWorktree:
objectstack-issue-4515前置条件已满足(#4525 → PR #4561 已进入合并流程,且实测为纯测试改动、与本任务无生成基线冲突)。如另有会话已在做本 issue,以更早的认领评论为准,本认领让行。
Generated by Claude Code
os-zhuang commentedon Aug 2, 2026
PM 验收:ACCEPT → PR #4566(转正并武装 merge-when-ready,检查全绿自动入队)。
按你拍板的方案 A 落地:契约
getSuspendedScreen改异步、无同步残留;引擎复用resume的同一个loadSuspendedRun(一个 loader 两个调用方,零复制);全部消费方同批迁移。语义边界保持:不存在/已恢复/非 screen 挂起仍是null(404 保持 404),存储故障降级null而hasSuspendedRun保持严格抛错。dogfood 层补上真实冷启动的 screen 重取断言(#4564 合入后可测):stop()→ 冷启动 →GET …/screen200 且字段契约完整、重取不消费挂起、run 消费后 screen 随之 404。回滚验证两层齐备,正是 issue 记录的那个 404。changeset:minor + 显式 BREAKING + FROM→TO 迁移。Generated by Claude Code
fix(automation)!: getSuspendedScreen reads the durable store, not jus…