Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
67d1ca2
fix(dag): eliminate phantom cancelled node state — align transition t…
LeXwDeX Aug 8, 2026
b356304
fix(dag): stale watchdog read no longer consumes timeout extension bu…
LeXwDeX Aug 8, 2026
222c172
test(dag): type-safe fixtures remove 36 lint warnings, ratchet restor…
LeXwDeX Aug 8, 2026
bee78d7
Merge pull request #189 from LeXwDeX/fix/batch-a-residuals
LeXwDeX Aug 8, 2026
711be35
docs: close ledger tickets 10/11 (#189 evidence) and add batch-B handoff
LeXwDeX Aug 8, 2026
3e8368f
Merge pull request #190 from LeXwDeX/docs/ledger-close
LeXwDeX Aug 8, 2026
2ad7fb9
docs: prepare batch B implementation tickets
LeXwDeX Aug 8, 2026
8f84657
Merge pull request #191 from LeXwDeX/docs/batch-b-tickets
LeXwDeX Aug 8, 2026
668b1e2
test(opencode): verify fork rollback
LeXwDeX Aug 8, 2026
55dd345
Merge pull request #192 from LeXwDeX/test/fork-rollback
LeXwDeX Aug 8, 2026
8ec1ef1
test(llm): verify timeout cancels response stream
LeXwDeX Aug 8, 2026
38b497f
docs(batch-b): close transport abort ticket
LeXwDeX Aug 8, 2026
1a86354
Merge pull request #193 from LeXwDeX/test/transport-abort
LeXwDeX Aug 8, 2026
1d5d08f
test(llm): cover midstream timeout gaps
LeXwDeX Aug 8, 2026
eadf7d0
docs: close midstream timeout ticket
LeXwDeX Aug 8, 2026
a149102
Merge pull request #194 from LeXwDeX/test/midstream-timeout
LeXwDeX Aug 8, 2026
f77106b
test(goal): replace subscription settle sleeps
LeXwDeX Aug 8, 2026
cadd382
docs(batch-b): close goal readiness ticket
LeXwDeX Aug 8, 2026
403461e
Merge pull request #195 from LeXwDeX/test/goal-readiness
LeXwDeX Aug 8, 2026
017693b
test(dag): use typed store fixtures
LeXwDeX Aug 8, 2026
4675435
Merge pull request #196 from LeXwDeX/test/dag-store-fixtures
LeXwDeX Aug 8, 2026
72630c3
docs(config): specify remote config LKG
LeXwDeX Aug 8, 2026
af0be65
Merge pull request #197 from LeXwDeX/docs/config-lkg-spec
LeXwDeX Aug 8, 2026
caf6ed4
feat(config): add remote config LKG
LeXwDeX Aug 8, 2026
1827355
Merge pull request #198 from LeXwDeX/feat/config-lkg
LeXwDeX Aug 8, 2026
9b0897d
docs(dag): close recovery diagnosis no-fix
LeXwDeX Aug 8, 2026
3aae32c
Merge pull request #199 from LeXwDeX/test/recovery-diagnosis
LeXwDeX Aug 8, 2026
63103cf
docs(dag): close p8 observation
LeXwDeX Aug 8, 2026
ccdb33e
Merge pull request #200 from LeXwDeX/docs/p8-observation
LeXwDeX Aug 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .opencode/grill-batch-a/node-lifecycle-transitions.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@

## 状态空间

**主状态**(workflow_node.status):`pending` / `queued` / `running` / 终态 `completed` / `failed` / `cancelled` / `skipped`
**主状态**(workflow_node.status):`pending` / `queued` / `running` / 终态 `completed` / `failed` / `skipped`

> **节点级无独立 `cancelled` 终态**(method-A 对齐实现):`NodeCancelled` 事件投影为 `status=failed` + `error_reason='cancelled via replan'`,取消语义经 error_reason 承载,行永不持有 `status='cancelled'`(`NodeStatus` 枚举无 CANCELLED,`getValidNextNodeStatuses` 对任何 from 均不返回 cancelled)。工作流级 `cancelled`(`WorkflowStatusProjection.cancelled`)是合法独立终态,与节点级无关。见 T5。

**running 扩展维度**(子状态):
| 维度 | 语义 | 契约来源 |
Expand All @@ -26,7 +28,7 @@
| T2 | queued | nodeStarted | runtime spawn | running | **清 escalation_pending + 重置 timeout_extensions=0**(新 attempt) | 子会话启动 | [现状] |
| T3 | running | nodeCompleted | 子会话结果 | completed | **清 escalation_pending**(终态无裁决对象) | 结果交付(终态交付臂) | [目标] ADR-0001 |
| T4 | running/queued | nodeFailed(reason + trigger) | 子会话失败 / watchdog cap / recovery | failed | **清 escalation_pending**;trigger 入 error 语义 | `[DAG Node Result]`/wake 承载 reason+trigger(错误即状态→处置依据) | [目标] ADR-0001 |
| T5 | pending/queued/running | nodeCancelled | replan cancel / workflow cancel | cancelled | **清 escalation_pending**(cancel 即裁决) | 取消交付 | [目标] ADR-0001 |
| T5 | pending/queued/running | nodeCancelled | replan cancel / workflow cancel | failed(cancelled) | **status=failed + error_reason='cancelled via replan' + 清 escalation_pending**(cancel 即裁决;节点级无独立 cancelled 终态,取消语义经 error_reason 承载) | 取消交付 | [目标] ADR-0001 |
| T6 | pending/queued | nodeSkipped | 依赖失败级联 | skipped | — | 跳过级联 | [现状] |
| T7 | failed | nodeRestarted | replan restart | running | 清旗 + 重置计数(新 attempt) | 重试 | [现状] |
| T8 | running | nodeTimeoutEscalated | **watchdog(提议者)** | running | timeout_extensions+1、escalation_pending=true、wake re-arm(wake_reported=false) | `[DAG Node Timeout]` wake(extend 或 cancel 的裁决请求) | [现状] |
Expand Down
49 changes: 49 additions & 0 deletions .opencode/handoff-batch-b.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# 批次 B 交接文档(新会话入口)

> 本会话(批 A 全链路)已极长,批次 B 在新对话执行。引用本文件 + 下述证据路径即可开工。

## 起点状态(交接时)
- 基线:**dev**(批 B 规划基线 `3e8368f37`;每票开工前重新同步最新 `dev`)
- 批次 A 全闭环:Q1-Q6 引擎语义 + 接受期绑定校验 + flaky 根治(豁免清单已清零)+ 技术债清零(PR #185-#189 全合入)
- lint 棘轮:4852(CI 口径;本地 = CI − 10 生成物差,本地基线 ≤4842)——**只紧不松**
- 台账:.scratch/batch-a/issues/01-11(01-09 完成,10/11 closed)

## 批次 B 四组票(审计后路由,证据已在案)

### 组 1:U-1 / U-2 + Transport mid-stream-stall(一个 spec 三张票)
三个 abort-path 集成测试,同源同批。规格已收敛到 `.scratch/batch-b/abort-path-contracts.md`,按 01→02→03 逐票 /implement。

### 组 2:F3 / F4 测试卫生债
小票直接做(无需 grill),每票新上下文 /implement。

### 组 3:O1 remote config last-known-good 缓存
批 A 已完成“网络/响应体失败时 warn + skip”;剩余增量只有持久化 last-known-good。先完成 `.scratch/batch-b/issues/06-o1-lkg-spec.md` 的小规格,再按 07 实现;不得重新实现离线降级。

### 组 4:S7 recovery INVENTED 推断 ⚠️
当前已有 ownership-lost 后暂停工作流的缓解,尚无用户态缺陷实证。**必须走 /diagnosing-bugs**:先建立一条确定性、快速、可红灯的复现命令;不能建立反馈回路则记录尝试并停止,不得先改生产代码。若红灯成立,另开修复票与新上下文。

## 证据路径(不用重新调查,票据直接引用)
- `.scratch/batch-b/evidence.md`:已追踪的稳定证据快照,含当前代码路径纠偏与验收边界;新 worktree 只依赖此文件
- `.opencode/promotion-review-round1/*.md`、`.opencode/.dag-specs/evidence/*.md`:原始本地评审产物,当前未追踪,仅用于复核来源,不作为跨 worktree 前置
- `.scratch/batch-b/abort-path-contracts.md`:U-1/U-2/mid-stream-stall 的已追踪规格;本地 OpenSpec 原件受 `.gitignore` 约束,不作为跨 worktree 前置

## 工程纪律(仓库铁律 + 本项目惯例)
- 分支:从最新 **dev** 切票据指定分支;生产 feature 用 `feat/**`,测试/规格债用 `test/**` 或 `docs/**`,均符合 branch-naming ruleset
- PR → dev:Typecheck 门禁;push dev 自动触发全量测试(Typecheck + Unit + E2E×2)
- 测试从包目录跑(packages/opencode 等),禁根目录;typecheck 用 `bun typecheck` 不用裸 tsc
- 每票一个新上下文会话执行(/implement 内含 /tdd),票间清上下文
- HTTP API 路由若被触及:再生 SDK(./packages/sdk/js/script/build.ts)+ 更新 httpapi-exercise 场景

## 收束清单(批 B + 批 C 全部完成后)
1. dev 全量 CI 绿 → 一次性 dev→main 晋级 PR(四项门禁)→ 手动 release-fork
2. 分支一并清理(用户确认后手跑,dcg 拦 agent 删除):
```bash
git worktree prune # 先清 opencode/* 残留 worktree(git worktree list 查路径)
git branch -d feat/dag-timeout-escalation feat/event-batch-publish feat/goal-pause-resume \
feat/llm-request-timeout feat/session-runner-hotpath fix/config-offline-degrade \
fix/deep-review-fixes review/dev-promotion <批B/C分支>
```
3. 台账惯例:新票记 .scratch/batch-b/issues/,完成翻 closed 附 PR/commit 实证

## 批 C(观测后再动,勿提前)
- P8 spawnReady O(ready×nodes):当前规模无实感,挂 /improve-codebase-architecture 巡检候选,疼了再做
14 changes: 8 additions & 6 deletions .scratch/batch-a/issues/01-q1-escalation-pending-lifecycle.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@

**Blocked by:** None — can start immediately

**Status:** ready-for-agent
**Status:** closed(PR #186,merge commit `4ddeaf2fc`)

- [ ] 节点终态转移(completed/failed/aborted)与取消路径清 escalation_pending
- [ ] wake_reported 在清旗路径上不被触碰(两旗正交测试)
- [ ] 已有 NodeStarted/NodeRestarted 清旗点保持不回退
- [ ] replay/恢复场景下清旗经事件折叠重放一致
- [ ] dag 测试套件 + typecheck 绿
**Completion evidence:** 批次 A 实现与测试随 PR #186 合入 `dev`,并随 PR #188 通过 main 全量门禁。

- [x] 节点终态转移(completed/failed/aborted)与取消路径清 escalation_pending
- [x] wake_reported 在清旗路径上不被触碰(两旗正交测试)
- [x] 已有 NodeStarted/NodeRestarted 清旗点保持不回退
- [x] replay/恢复场景下清旗经事件折叠重放一致
- [x] dag 测试套件 + typecheck 绿
14 changes: 8 additions & 6 deletions .scratch/batch-a/issues/02-q2-delivery-gated-retime.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@

**Blocked by:** None — can start immediately

**Status:** ready-for-agent
**Status:** closed(PR #186,merge commit `4ddeaf2fc`)

- [ ] skip 合取项落在 re-time 唯一发起点,全 re-time 触发路径逐条覆盖(测试枚举,不只抄规格)
- [ ] 初始升级(deadline ⟹ 首次 wake)不受门控影响
- [ ] 裁决写入后 re-time 能力恢复的测试
- [ ] watchdog 无状态写(仅提案)的断言保持
- [ ] dag 测试套件 + typecheck 绿
**Completion evidence:** 批次 A 实现与测试随 PR #186 合入 `dev`,并随 PR #188 通过 main 全量门禁。

- [x] skip 合取项落在 re-time 唯一发起点,全 re-time 触发路径逐条覆盖(测试枚举,不只抄规格)
- [x] 初始升级(deadline ⟹ 首次 wake)不受门控影响
- [x] 裁决写入后 re-time 能力恢复的测试
- [x] watchdog 无状态写(仅提案)的断言保持
- [x] dag 测试套件 + typecheck 绿
16 changes: 9 additions & 7 deletions .scratch/batch-a/issues/03-q3-node-deadline-extended-event.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@

**Blocked by:** 01 — Q1:escalation_pending 裁决旗生命周期闭环(projector 折叠侧写集串行)

**Status:** ready-for-agent
**Status:** closed(PR #186,merge commit `4ddeaf2fc`)

- [ ] Schema 定义 NodeDeadlineExtended + 入 EventManifest.Definitions
- [ ] 命令层执行 guard:拒绝时命令失败并携带 typed 错误,编排器可区分拒绝与成功
- [ ] 直写 deadline 旧路径废除(无遗留调用方)
- [ ] projector 纯折叠:无事件发布、无返回值契约依赖
- [ ] 恢复/replay 一致性测试(事件日志重放 ⟺ 活跃态)
- [ ] dag 测试套件 + typecheck 绿
**Completion evidence:** 批次 A 实现与测试随 PR #186 合入 `dev`,并随 PR #188 通过 main 全量门禁。

- [x] Schema 定义 NodeDeadlineExtended + 入 EventManifest.Definitions
- [x] 命令层执行 guard:拒绝时命令失败并携带 typed 错误,编排器可区分拒绝与成功
- [x] 直写 deadline 旧路径废除(无遗留调用方)
- [x] projector 纯折叠:无事件发布、无返回值契约依赖
- [x] 恢复/replay 一致性测试(事件日志重放 ⟺ 活跃态)
- [x] dag 测试套件 + typecheck 绿
14 changes: 8 additions & 6 deletions .scratch/batch-a/issues/04-q3-sdk-regen-consumers.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@

**Blocked by:** 03 — Q3:NodeDeadlineExtended durable 事件 + guard 前移命令层

**Status:** ready-for-agent
**Status:** closed(PR #186,merge commit `4ddeaf2fc`)

- [ ] SDK 再生脚本执行,生成物提交
- [ ] 事件联合类型包含 NodeDeadlineExtended,消费方编译绿
- [ ] `check:generated`(SDK + client)零 diff
- [ ] 涉及响应/事件形状的 httpapi-exercise 场景已更新(如有)
- [ ] 全量单元测试(含 httpapi 契约)绿
**Completion evidence:** 批次 A 生成物与消费者更新随 PR #186 合入 `dev`,并随 PR #188 通过 main 全量门禁。

- [x] SDK 再生脚本执行,生成物提交
- [x] 事件联合类型包含 NodeDeadlineExtended,消费方编译绿
- [x] `check:generated`(SDK + client)零 diff
- [x] 涉及响应/事件形状的 httpapi-exercise 场景已更新(如有)
- [x] 全量单元测试(含 httpapi 契约)绿
14 changes: 8 additions & 6 deletions .scratch/batch-a/issues/05-s5-workflow-lock-timeout.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@

**Blocked by:** None — can start immediately

**Status:** ready-for-agent
**Status:** closed(PR #186,merge commit `4ddeaf2fc`)

- [ ] 唯一改动点在 withWorkflowLock 包装层(一行 + 常量)
- [ ] 30s 超限产生 TimeoutException,编排器按既有 error_class 分诊规则处置
- [ ] 无新错误类、无 per-caller 分支的断言
- [ ] watchdog 自续行为在锁超时后仍正确的测试
- [ ] dag 测试套件 + typecheck 绿
**Completion evidence:** 批次 A 实现与测试随 PR #186 合入 `dev`,并随 PR #188 通过 main 全量门禁。

- [x] 唯一改动点在 withWorkflowLock 包装层(一行 + 常量)
- [x] 30s 超限产生 TimeoutException,编排器按既有 error_class 分诊规则处置
- [x] 无新错误类、无 per-caller 分支的断言
- [x] watchdog 自续行为在锁超时后仍正确的测试
- [x] dag 测试套件 + typecheck 绿
12 changes: 7 additions & 5 deletions .scratch/batch-a/issues/06-flaky-stdout-pollution.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@

**Blocked by:** None — can start immediately

**Status:** ready-for-agent
**Status:** closed(PR #186,merge commit `4ddeaf2fc`)

- [ ] 污染源定位经可复现测试验证(修复前红、修复后绿)
- [ ] run-process 9 项断言不削弱、不删除,本地重复跑(≥5 次)稳定绿
- [ ] ShareNext 的 stdout 污染分量同步修复(计时问题归 07 票)
- [ ] opencode 包测试套全绿(除豁免清单剩余项)
**Completion evidence:** flaky 根因修复与验证随 PR #186 合入 `dev`,并随 PR #188 通过 main 全量门禁。

- [x] 污染源定位经可复现测试验证(修复前红、修复后绿)
- [x] run-process 9 项断言不削弱、不删除,本地重复跑(≥5 次)稳定绿
- [x] ShareNext 的 stdout 污染分量同步修复(计时问题归 07 票)
- [x] opencode 包测试套全绿(除豁免清单剩余项)
10 changes: 6 additions & 4 deletions .scratch/batch-a/issues/07-flaky-sharenext-timing.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@

**Blocked by:** 06 — Flaky:stdout 污染族根治(同一测试文件,写集串行)

**Status:** ready-for-agent
**Status:** closed(PR #186,merge commit `4ddeaf2fc`)

- [ ] 修复走信号等待惯用法;若改预算须附 CI 计时证据
- [ ] 本地重复跑(≥5 次)+ 模拟负载下稳定绿
- [ ] 无新增 Effect.sleep 等待 forked fiber 的反模式
**Completion evidence:** flaky 稳定化与验证随 PR #186 合入 `dev`,并随 PR #188 通过 main 全量门禁。

- [x] 修复走信号等待惯用法;若改预算须附 CI 计时证据
- [x] 本地重复跑(≥5 次)+ 模拟负载下稳定绿
- [x] 无新增 Effect.sleep 等待 forked fiber 的反模式
10 changes: 6 additions & 4 deletions .scratch/batch-a/issues/08-flaky-workspace-timing.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@

**Blocked by:** None — can start immediately

**Status:** ready-for-agent
**Status:** closed(PR #186,merge commit `4ddeaf2fc`)

- [ ] 先复现并确认根因(计时 vs 其他),根因记录入票
- [ ] 修复后本地重复跑(≥5 次)+ 模拟负载下稳定绿
- [ ] 无新增固定 sleep 反模式
**Completion evidence:** flaky 稳定化与验证随 PR #186 合入 `dev`,并随 PR #188 通过 main 全量门禁。

- [x] 先复现并确认根因(计时 vs 其他),根因记录入票
- [x] 修复后本地重复跑(≥5 次)+ 模拟负载下稳定绿
- [x] 无新增固定 sleep 反模式
12 changes: 7 additions & 5 deletions .scratch/batch-a/issues/09-promote-dev-to-main.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@

**Blocked by:** 01、02、03、04、05、06、07、08 全部合入 dev

**Status:** ready-for-agent
**Status:** closed(PR #188,merge commit `e837dcbfa`)

- [ ] dev 最新 push 的 CI 四项检查全绿(Typecheck、Unit、E2E linux、E2E windows)
- [ ] 豁免清单清零或逐项重新裁决留档
- [ ] PR 描述附批次 A 交付清单(Q1/Q2/Q3/S5 + flaky 根因修复)与两轮深审 PASS 证据链接
- [ ] 合并后 main 可手动 release-fork
**Completion evidence:** dev→main 晋级 PR #188 的 Typecheck、Unit Tests (linux)、E2E Tests (linux/windows) 全部通过并合入。

- [x] dev 最新 push 的 CI 四项检查全绿(Typecheck、Unit、E2E linux、E2E windows)
- [x] 豁免清单清零或逐项重新裁决留档
- [x] PR 描述附批次 A 交付清单(Q1/Q2/Q3/S5 + flaky 根因修复)与两轮深审 PASS 证据链接
- [x] 合并后 main 可手动 release-fork
16 changes: 11 additions & 5 deletions .scratch/batch-a/issues/10-backlog-phantom-cancelled-state.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,15 @@

**Blocked by:** None(独立设计决策)

**Status:** backlog(需先设计裁决,非 ready-for-agent
**Status:** closed(方案 A 已实施 — PR #189,commit 67d1ca2b1

- [ ] 设计裁决 A/B(含消费方影响面清单)
- [ ] 按裁决实施 + 测试
- [ ] 转移表 v2 与 CONTEXT.md 状态机词汇同步
- [ ] typecheck + dag 套件绿
## 裁决与实施记录(batch-a-residuals DAG,终审 PASS)
- 裁决:方案 A(对齐实现)——消费方核验确认仅 TUI 存在 phantom dead branch 读节点级 cancelled,投影写 status=failed 故永不触发,无真实依赖
- T5 改写 to=failed(cancelled);状态空间删除节点级 cancelled 目标态(保留工作流级);CONTEXT.md 同步;projector 投影注释固化契约
- 新增 core 测试断言 NodeCancelled 重放 → status=failed + error_reason 承载取消语义
- 对抗审查:检察官/辩护人/证据矩阵三路 + 第四方 claim 核验,终审 PASS

- [x] 设计裁决 A/B(含消费方影响面清单)
- [x] 按裁决实施 + 测试
- [x] 转移表 v2 与 CONTEXT.md 状态机词汇同步
- [x] typecheck + dag 套件绿
15 changes: 10 additions & 5 deletions .scratch/batch-a/issues/11-backlog-spurious-t8-budget.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,14 @@

**Blocked by:** None(独立设计决策)

**Status:** backlog(需先裁决 A/B/C,非 ready-for-agent
**Status:** closed(方案 A 已实施 — PR #189,commit b35630486

- [ ] 裁决修复方向(A/B/C,含锁交互与预算语义影响面)
- [ ] 按裁决实施 + 测试(含陈旧读复现场景)
- [ ] 若 C:ADR + 转移表语义注记落地
- [ ] typecheck + dag 套件绿
## 裁决与实施记录(batch-a-residuals DAG,终审 PASS)
- 裁决:方案 A(锁内新鲜读)——watchdog 以 staleDeadlineMs 守卫判定:陈旧读触发的延长被新鲜读否决时不发布 NodeDeadlineExtended、不递增 timeoutExtensions
- 真红→绿:test/dag/dag-retime-stale-read.test.ts,case1(陈旧读抑制)vs case2(真实超时延长)对照
- 不变式保持:-2/0/1 三值契约、N1 监督不变式(running 节点总有 watcher)
- 对抗审查两项开放担忧裁决:U1(Effect.timeout 败者中断产生孤立节点)经 Effect v4 源码分析 REFUTED(TimeoutError=Cause.Fail,raceAllFirst 败者中断不经 hasInterrupts 匹配);N1(抑制守卫 >staleDeadlineMs 缺 >now)经三方一致论证为有界自愈(下一 tick 必发布,延迟 ≤1 escalateIntervalMs,预算不丢)

- [x] 裁决修复方向(A/B/C,含锁交互与预算语义影响面)
- [x] 按裁决实施 + 测试(含陈旧读复现场景)
- [x] typecheck + dag 套件绿
23 changes: 23 additions & 0 deletions .scratch/batch-b/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# 批次 B 执行台账

**规划基线:** `dev@3e8368f37`(PR #190)

**当前状态:** 规格与票据已就绪;实现代码尚未开始。

## 审计结论

- 批次 A 已经 PR #188 晋级 `main`;残余修复 PR #189 与交接 PR #190 已进入 `dev`。
- U-1/U-2/mid-stream-stall 的 OpenSpec 已完成并通过校验;仓库规定 `/openspec/` local-only,跨 worktree 使用已追踪镜像 `.scratch/batch-b/abort-path-contracts.md`。
- 原始 `.opencode/promotion-review-round1/` 与 `.opencode/.dag-specs/evidence/` 是未追踪本地文件;跨 worktree 统一引用 `.scratch/batch-b/evidence.md`。
- O1 不是直接实现票:离线降级已完成,剩余 LKG 的持久化、键、失效和安全边界需先写小规格。
- S7 只有静态 bug 气味;先诊断,不能复现就无代码收口。P8 维持批 C 的观测候选,不阻塞批 B。

## 串行顺序

1. 01 U-1 → 02 U-2 → 03 mid-stream-stall;02/03 写同一测试文件,禁止并行。
2. 04 F3 → 05 F4;两票只清测试债,不顺带改运行时。
3. 06 O1 规格 → 07 O1 实现。
4. 08 S7 诊断;只有红灯成立才新建独立修复票。
5. 批 B 全部处置 + 批 C P8 观测记录关闭后,执行 09 的 dev→main 晋级与 release-fork。

每票从最新 `dev` 创建符合仓库规则的分支,单独 PR → `dev`,单独新任务执行。票据完成时将状态改为 `closed`,附 PR、merge commit 与验证命令。
Loading
Loading