From d904141c9d4b8d60f4f017b0a100e73ea74d4cf2 Mon Sep 17 00:00:00 2001 From: Lex Date: Thu, 20 Aug 2026 20:52:49 +0800 Subject: [PATCH 1/5] docs(release): disclose acceptance-workflow rollback chain and add series-file step to release train --- workflows/release-train.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 workflows/release-train.md diff --git a/workflows/release-train.md b/workflows/release-train.md new file mode 100644 index 000000000..ee79ee2df --- /dev/null +++ b/workflows/release-train.md @@ -0,0 +1,23 @@ +# Release Train(发布列车) + +一条从 issue 清理到正式发版的批次交付循环。全程 SpecGit 化:issue → delivery PR → CI 门禁 → 合并 → 发版。所有条目先处理完,再统一处理 PR 问题——batch 住操作,不逐个排队。 + +## Trigger + +人工发起:用户说"发版 / 跑一趟发布列车",且满足发车条件——dev 上无开放 delivery PR。 + +## Steps + +1. **验车**:确认 dev 分支 CI 全绿(push 触发的 Typecheck + 全量测试),open issue 与已合入 dev 的交付一一对应(合并到 main 时 GitHub 才自动关 issue,开着 ≠ 未处理)。 +2. **复盘**:对目标子系统做完整性复盘(每次发车指定一个;本轮为 MEMORY ON:`/init` 盖章 `project.time_initialized` → `/memory on` → `memory_search` 可用的启用链路,外加写入路径验证)。发现按 specgit 粒度开 issue——一个独立可验证的 WHY 一个 issue。 +3. **Checkpoint(唯一的阻塞确认)**:呈现复盘报告——发现清单、新建 issues、修复计划、本班车范围——一次确认。确认后连续执行到发版,不再打断。 +4. **修复班车**:`specgit issue ...` 把全部新 issue 绑进一个 delivery(多 issue 一 PR),从 main 切出 `fix/**` 分支,TDD 修复,PR → dev。PR 上 CI/TDD 失败 → 原 delivery 内追加 commit 修复;已合入 dev 后才暴露的回退 → 开新 fix issue 进下一班车。 +5. **升级**:修复 PR 合并、dev push 全量绿后,立即开 dev → main PR(protect-main 全量门禁:Typecheck + Unit Tests + E2E 双平台)。全程监控,失败即修。 +6. **发版**:main 合并后、触发 `release-fork` 前,先写 series 文件——按 `.github/RELEASE_NOTES_TEMPLATE.md` 渲染并提交 `.github/releases/vX.Y.Z.md`(版本号由 latest tag + commit 类型推导;渲染 fail-closed,失败即阻断发版)。随后 `release-fork` 触发正式版。issue 随 dev→main 合并自动关闭。 +7. **Brief**:一趟车一份收尾汇报——本班次 issue 清单、PR、CI 结论、版本号与 release 链接、遗留(进下一班车的条目)。 + +## Rules + +- SpecGit 铁律优先:`specgit finish` 非 0 不请求合并;不削弱 policy;只认 `--json`。 +- 发布已由步骤 3 的确认授权,正式版不再二次询问。 +- 回退(合并后 CI 挂)永不静默:开 issue、进下一班车、在 Brief 中显式列出。 From b4c58cbfa4e3c0a0a072269e7857768e7cdd6df1 Mon Sep 17 00:00:00 2001 From: Lex Date: Thu, 20 Aug 2026 21:00:37 +0800 Subject: [PATCH 2/5] docs(release): add v1.18.0 series notes --- .github/releases/v1.18.0.md | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/releases/v1.18.0.md diff --git a/.github/releases/v1.18.0.md b/.github/releases/v1.18.0.md new file mode 100644 index 000000000..069123ea5 --- /dev/null +++ b/.github/releases/v1.18.0.md @@ -0,0 +1,44 @@ +## opencode {VERSION} + +{Prerelease/Stable} release from `{branch}` branch. Session todo reminders, per-series release notes, truthful MEMORY state, and DAG output-duplication fixes. + +--- + +### 🎯 Features + +- **Stale todo reminders (PR #394)**: sessions with uncompleted todos now inject a one-shot synthetic reminder on every model step, including steps without tool calls, so stale items stay visible to the model until they are completed or cancelled; sub-agent sessions track their own todos, and a freshness guard skips the reminder right after a successful todowrite call. +- **Per-series release notes (PR #394)**: each release series renders its GitHub Release body from `.github/releases/vX.Y.Z.md` with fail-closed validation before `gh release create`; a missing or invalid series file stops the release instead of shipping placeholder notes. +- **/dag-auto as pure workflow routing (PR #393)**: `/dag-auto` no longer embeds orchestration logic of its own and only routes to workflows; `/dag-init`, `/dag-flow`, and `/dag-template-update` are retired. + +--- + +### 🐛 Bug Fixes + +- **DAG prompt and structured-output duplication, #386-388 (PR #390)**: schema-node prompts and the `submit_result` tool description now state a single authority contract (summary only in the payload, no restating in the body, end the turn after a successful submit); block compilation drops instructions that merely duplicate the objective; crash recovery reuses the live output-file-reference capture so durable receipts match between live and recovered runs. +- **MEMORY silent-failure cluster, #395-397 (PR #398)**: the response schema is now rendered into the system prompt for schema-blind providers whose `response_format` downgrade made every topic commit fail validation; `/memory` replies report the true state instead of a hardcoded "Memory remains off"; `statusReason` surfaces the model gate so an enabled config whose model no longer resolves reads as unavailable instead of "on" and inert. +- **CI acceptance workflow rollback (PR #400)**: the specgit-accept pnpm rewrite that broke `Setup pnpm` on the first main-target PR was rolled back to the verified node22 + `npm i -g specgit@^0.5.0` install, keeping the main-only trigger. + +--- + +### 🧪 Test Summary + +``` +CI gates on the dev-to-main promotion (PR #399): +Typecheck: pass +Unit Tests (linux): pass +E2E Tests (linux): pass +E2E Tests (windows): pass +SpecGit Acceptance: pass +``` + +--- + +### 🔍 Verification + +- Provider wire behavior behind the MEMORY fixes is pinned by `test/memory/model-wire.test.ts`; the todo-reminder run-loop guarantees are pinned by `test/session/todo-reminders.test.ts` (empty-list skip, settled-list skip, freshness guard, failed-write guard). +- MEMORY was verified end-to-end against the live provider: a checkpoint run over an initialized git project committed a real memory topic; topic id, Memory home path, and timings are recorded in the release-remediation workflow evidence. +- Every delivery in this batch (PRs #390, #393, #394, #398, #400) shipped through the specgit harness with an accepted verdict, and all promotion gates are green on PR #399. + +--- + +**Full changelog:** [`{previous_tag}`...`{current_tag}`](https://github.com/LeXwDeX/OpenCode-GraphAgent/compare/{previous_tag}...{current_tag}) From ab4c2be1e5d455469399ec35ba798a9516506a69 Mon Sep 17 00:00:00 2001 From: Lex Date: Thu, 20 Aug 2026 21:16:16 +0800 Subject: [PATCH 3/5] chore: record delivery binding for release-train-remediation --- .specgit.yaml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.specgit.yaml b/.specgit.yaml index 78c488e2c..0dc7b3717 100644 --- a/.specgit.yaml +++ b/.specgit.yaml @@ -1,10 +1,8 @@ version: 1 -delivery: memory-topic-creation +delivery: release-train-remediation context: kind: branch - branch: fix/395-memory-topic-creation + branch: fix/401-release-train-remediation issues: - - 395 - - 396 - - 397 -pr: 398 + - 401 + - 402 From 0407e0ece8fac9e38ba134ca93be0905a1652ffd Mon Sep 17 00:00:00 2001 From: Lex Date: Thu, 20 Aug 2026 21:39:07 +0800 Subject: [PATCH 4/5] docs(release): rename series file to mechanically derived v1.0.29 and align release-train spec Review findings R2/S2/S3: release-version.ts derives patch+1 over graphagent-v* tags only (1.0.28 -> 1.0.29; the v1.17.11-* family is invisible to it), so the series file must be named for the derived version. The train spec now states the mechanical derivation, requires closing keywords on the promotion PR (R1 lesson), and branches fix deliveries from dev. Local workflow state dirs are gitignored. --- .github/releases/{v1.18.0.md => v1.0.29.md} | 0 .gitignore | 6 ++++++ workflows/release-train.md | 8 ++++---- 3 files changed, 10 insertions(+), 4 deletions(-) rename .github/releases/{v1.18.0.md => v1.0.29.md} (100%) diff --git a/.github/releases/v1.18.0.md b/.github/releases/v1.0.29.md similarity index 100% rename from .github/releases/v1.18.0.md rename to .github/releases/v1.0.29.md diff --git a/.gitignore b/.gitignore index 1ede19fc3..ee0809b00 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,9 @@ tsconfig.tsbuildinfo .opencode/skills .qoder .opencode/workflow-reports/ + +# opencode local workflow state +.opencode/.dag-specs/ +.opencode/dag-init.json +.opencode/workflow-drafts/ +.opencode/workflow-reports/ diff --git a/workflows/release-train.md b/workflows/release-train.md index ee79ee2df..74bb74942 100644 --- a/workflows/release-train.md +++ b/workflows/release-train.md @@ -8,12 +8,12 @@ ## Steps -1. **验车**:确认 dev 分支 CI 全绿(push 触发的 Typecheck + 全量测试),open issue 与已合入 dev 的交付一一对应(合并到 main 时 GitHub 才自动关 issue,开着 ≠ 未处理)。 +1. **验车**:确认 dev 分支 CI 全绿(push 触发的 Typecheck + 全量测试),open issue 与已合入 dev 的交付一一对应。注意:issue 只在 dev→main PR body 含 closing keywords(`Closes #N`)时才自动关闭——开升级 PR 时必须带上本班次的全部 closing 行。 2. **复盘**:对目标子系统做完整性复盘(每次发车指定一个;本轮为 MEMORY ON:`/init` 盖章 `project.time_initialized` → `/memory on` → `memory_search` 可用的启用链路,外加写入路径验证)。发现按 specgit 粒度开 issue——一个独立可验证的 WHY 一个 issue。 3. **Checkpoint(唯一的阻塞确认)**:呈现复盘报告——发现清单、新建 issues、修复计划、本班车范围——一次确认。确认后连续执行到发版,不再打断。 -4. **修复班车**:`specgit issue ...` 把全部新 issue 绑进一个 delivery(多 issue 一 PR),从 main 切出 `fix/**` 分支,TDD 修复,PR → dev。PR 上 CI/TDD 失败 → 原 delivery 内追加 commit 修复;已合入 dev 后才暴露的回退 → 开新 fix issue 进下一班车。 -5. **升级**:修复 PR 合并、dev push 全量绿后,立即开 dev → main PR(protect-main 全量门禁:Typecheck + Unit Tests + E2E 双平台)。全程监控,失败即修。 -6. **发版**:main 合并后、触发 `release-fork` 前,先写 series 文件——按 `.github/RELEASE_NOTES_TEMPLATE.md` 渲染并提交 `.github/releases/vX.Y.Z.md`(版本号由 latest tag + commit 类型推导;渲染 fail-closed,失败即阻断发版)。随后 `release-fork` 触发正式版。issue 随 dev→main 合并自动关闭。 +4. **修复班车**:`specgit issue ...` 把全部新 issue 绑进一个 delivery(多 issue 一 PR),从 dev 切出 `fix/**` 分支,TDD 修复,PR → dev。PR 上 CI/TDD 失败 → 原 delivery 内追加 commit 修复;已合入 dev 后才暴露的回退 → 开新 fix issue 进下一班车。 +5. **升级**:修复 PR 合并、dev push 全量绿后,立即开 dev → main PR(protect-main 全量门禁:Typecheck + Unit Tests + E2E 双平台),body 带本班次全部 closing keywords。全程监控,失败即修。 +6. **发版**:main 合并后、触发 `release-fork` 前,先写 series 文件——按 `.github/RELEASE_NOTES_TEMPLATE.md` 渲染并提交 `.github/releases/vX.Y.Z.md`。版本号是 `release-version.ts` 的机械推导(`graphagent-v*` 标签上的 patch+1,不读 commit 类型),系列文件必须以推导出的版本命名;渲染 fail-closed,失败即阻断发版。随后 `release-fork` 触发正式版。 7. **Brief**:一趟车一份收尾汇报——本班次 issue 清单、PR、CI 结论、版本号与 release 链接、遗留(进下一班车的条目)。 ## Rules From 29c787392aae6be6cc5a084dc2b5c996581a3e29 Mon Sep 17 00:00:00 2001 From: Lex Date: Thu, 20 Aug 2026 21:39:37 +0800 Subject: [PATCH 5/5] chore: record delivery binding for release-train-remediation --- .specgit.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.specgit.yaml b/.specgit.yaml index 0dc7b3717..63243e620 100644 --- a/.specgit.yaml +++ b/.specgit.yaml @@ -6,3 +6,4 @@ context: issues: - 401 - 402 +pr: 403