diff --git a/.github/releases/v1.0.29.md b/.github/releases/v1.0.29.md new file mode 100644 index 000000000..069123ea5 --- /dev/null +++ b/.github/releases/v1.0.29.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}) 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/.specgit.yaml b/.specgit.yaml index 78c488e2c..63243e620 100644 --- a/.specgit.yaml +++ b/.specgit.yaml @@ -1,10 +1,9 @@ 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 +pr: 403 diff --git a/workflows/release-train.md b/workflows/release-train.md new file mode 100644 index 000000000..74bb74942 --- /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 的交付一一对应。注意: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),从 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 + +- SpecGit 铁律优先:`specgit finish` 非 0 不请求合并;不削弱 policy;只认 `--json`。 +- 发布已由步骤 3 的确认授权,正式版不再二次询问。 +- 回退(合并后 CI 挂)永不静默:开 issue、进下一班车、在 Brief 中显式列出。