 xcsandClaude Opus 5
|
c3fed573ee
|
fix(loop-engine): 收尾复审二审 —— 兜底卡自己会抛 / 清单兜底不看面孔 / 空转写解闸
复审逐条核实上一波(C2/C3/M1/M2)修法本身引入的三处破坏,全部属实并修死:
- I1 二审:配方办不下去时发的那张兜底卡(deps.cards.issue)从前裸调,调人预算
触顶抛 HumanCallBudgetExceededError 会精确复现 C3 那种无限热循环(推进器每
2 秒重来、不烧预算、不换状态、界面纹丝不动)。包进 try/catch,失败留痕、
状态退回 awaiting,不让它抛出去。配了变异验证:拿掉 try/catch 后新用例
真的变红(runTurn 抛出预算触顶错误),还原后转绿。
- C2 二审:decisionCardFace 的 checklist 兜底从前不看 reviewFace —— 一步只声明
acceptanceChecklist 而 cardVariant 不是 review(T_release 那种形状)时,配方发
的普通 decide 卡也会被兜上清单,前端不渲染勾选区、回传门却要求 checked ⊇
checklist,卡按不下去。改成只在 reviewFace 为真时才退回剧本声明的清单。
- M1/M2 二审:project 动作里 localExisting/localUnkeyed 触发的观察痕与真写
(localWrote/localDropped)共用 detail.auto + detail.ledger 这两个键,而
raiseAcceptance 的 revised 判据只认这两个键在不在 —— 一颗料 skipExisting、
或一行主键算不出来,这条"什么都没动"的痕照样能解开重做闸,人打回重做、
配方原样重跑一遍,闸却开了。auto-runner 补 detail.changed(真写了/真撤了
才为真),revised 判据对配方那一路改认这个标记。
另两笔记账:
- save-wake.test.ts 的用例标题写着"验收态就是这一种(没有卡在等人)"是错的,
pendingCards 把未办结工单也算在内,验收态恰恰有一张开着的验收工单——只改
标题措辞,不动断言与实现。
- docs/debt.md 补两笔:保存后唤醒的收窄几乎不生效(pendingCards 口径过宽);
模型路径的写同样会 un-land、只补了配方那一半(独立起一条,排在 W05 重写前)。
pnpm gates 退出码 0(2410 passed / 23 skipped);
git diff --stat b995148...HEAD -- activities/ 为空,九个活动包一字未动。
报告:.superpowers/sdd/2026-08-29-deterministic-steps-auto-recipe/closing-fix-report.md
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
|
2026-08-29 09:21:02 +08:00 |
|
 xcsandClaude Opus 5
|
588d5c2dd4
|
fix: 配方只认 liveStep;保存不再无端叫醒任务;prune 不在人填的时候撤行
**I6 · 配方只认 `liveStep`**:`current` 有一条兜底(`liveStep ?? 在场的第一个有剧本的项`),
它不过滤 `settledIds`。当初这只影响提示词内容;配方接进来之后它驱动**副作用** ——
再写一遍台账、再 prune 一遍,carded 为假时甚至再发一张卡。兜底继续只服务提示词。
同处 `settledIds` 改取 sweep 之后的 `stateRuntime`(`liveStepOf` 吃的是 sweep 之后的
`stateEnabled`,两边得同一份局面)。
**注**:这一形状(既已收掉又在场)我没能在当前 lifecycle 里构造出可达来路 ——
`publishEnabled` 把 Completed/Terminated 挡在 entries 与 inProgress 之外,
`reenter` 又是就地改状态、不留旧实例。用例用的是 `live-step.ts` 注释描述的那种局面
(同 id 两份实例),守的是不变式;详见最终报告。
**F1 · `afterSave` 只在有未答的卡时才 `wake`**:`wake` 对 awaiting-event / awaiting-human
一律拨成 running,推进器随即推一拍并**记一步预算**。而现有九个活动包一个 auto 都没有:
人每按一次保存就白烧一步、界面闪一次「AI 正在推进这单」;任务本来 awaiting-human
(等人裁决)时被叫醒,那一拍结束还会把它写成 awaiting-event —— 从「等人办事」降级成
「等外部回音」,而等的明明还是人。**这是界面撒谎。**「保存即铺格」的场景恰恰都有卡在场。
用既有的 `humanTool.pendingCards`,不新造。`wake` 失败不再 `.catch(() => false)` 静默 ——
它是「保存即铺格」的唯一触发器,吞掉等于人按了保存、格子没出现、系统一个字不说。
**F3 · `prune` 不在人填的时候撤行**:人在件上「加一行」加出来的行,配方的数据源里当然没有 ——
编辑中途把它悄悄撤掉是最不能接受的一种静默数据丢失。有卡在等人(quiet)那几拍只铺不撤;
同一张表既被 prune 又列在该步 `humanWrites` 里,装包报 warn;规范 §4.6 纪律补两条
(prune 的表不该是人能加行的表 · card 之后那几笔要等人交回之后那一拍才跑)。
I6 2 测(做过变异验证)· F1 5 测 · F3 2+1 测。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
|
2026-08-29 08:42:06 +08:00 |
|