From 711be35f9fa913c162ce12591cb1a0ed6841ea59 Mon Sep 17 00:00:00 2001 From: lex Date: Sat, 8 Aug 2026 19:37:37 +0800 Subject: [PATCH] docs: close ledger tickets 10/11 (#189 evidence) and add batch-B handoff --- .opencode/handoff-batch-b.md | 48 +++++++++++++++++++ .../10-backlog-phantom-cancelled-state.md | 16 +++++-- .../issues/11-backlog-spurious-t8-budget.md | 15 ++++-- 3 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 .opencode/handoff-batch-b.md diff --git a/.opencode/handoff-batch-b.md b/.opencode/handoff-batch-b.md new file mode 100644 index 0000000000..02a8726146 --- /dev/null +++ b/.opencode/handoff-batch-b.md @@ -0,0 +1,48 @@ +# 批次 B 交接文档(新会话入口) + +> 本会话(批 A 全链路)已极长,批次 B 在新对话执行。引用本文件 + 下述证据路径即可开工。 + +## 起点状态(交接时) +- 基线:**dev**(`bee78d7ed` 起算,开工前 `git fetch && git switch dev && git pull`) +- 批次 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 四组票(Ask Matt 路由:agent-ready,证据已在案) + +### 组 1:U-1 / U-2 + Transport mid-stream-stall(一个 spec 三张票) +三个 abort-path 集成测试,同源同批。先 /to-spec 收敛三票边界,再逐票 /implement。 + +### 组 2:F3 / F4 测试卫生债 +小票直接做(无需 grill),每票新上下文 /implement。 + +### 组 3:O1 remote config last-known-good 缓存 +小 feature;离线降级的 last-known-good 语义在批 A 前置调研中有上下文(config-offline-degrade 已合入 dev,先读现状再定增量)。 + +### 组 4:S7 recovery INVENTED 推断 ⚠️ +唯一带 bug 气味的——**必须走 /diagnosing-bugs**:先 tight feedback loop(一条命令红灯复现)再修,禁止先理论后复现。修复以回归测试收口。 + +## 证据路径(不用重新调查,票据直接引用) +- .opencode/promotion-review-round1/*.md(U-1/U-2/F3/F4/O1/S7/P8 全部 finding + 根因记录) +- .opencode/promotion-review-round2.yaml 相关证据(若引用深审轮次) + +## 工程纪律(仓库铁律 + 本项目惯例) +- 分支:从 **dev** 切 `feat/**` 或 `fix/**`(AGENTS.md 原文写 main,本项目当前惯例:批 B 基于 dev——dev 领先 main 且为集成层) +- 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 巡检候选,疼了再做 diff --git a/.scratch/batch-a/issues/10-backlog-phantom-cancelled-state.md b/.scratch/batch-a/issues/10-backlog-phantom-cancelled-state.md index 57d3c09cf1..7f54f181c3 100644 --- a/.scratch/batch-a/issues/10-backlog-phantom-cancelled-state.md +++ b/.scratch/batch-a/issues/10-backlog-phantom-cancelled-state.md @@ -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 套件绿 diff --git a/.scratch/batch-a/issues/11-backlog-spurious-t8-budget.md b/.scratch/batch-a/issues/11-backlog-spurious-t8-budget.md index 675e877cbd..8b01cd76c3 100644 --- a/.scratch/batch-a/issues/11-backlog-spurious-t8-budget.md +++ b/.scratch/batch-a/issues/11-backlog-spurious-t8-budget.md @@ -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 套件绿