Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
9a69eb0
fix(test): declare per-test timeouts for dag-node-supervision long te…
LeXwDeX Aug 19, 2026
f32d037
chore: record delivery binding for issue384
LeXwDeX Aug 19, 2026
2dc9cd0
Merge pull request #385 from LeXwDeX/feat/384-issue384
LeXwDeX Aug 19, 2026
74a15ec
chore(dag): record delivery binding for issues 386-388
LeXwDeX Aug 20, 2026
1c4d30a
fix(dag): instruct schema nodes to report only through submit_result
LeXwDeX Aug 20, 2026
eb3240c
fix(dag): drop block instructions that duplicate the objective
LeXwDeX Aug 20, 2026
bee75d5
fix(dag): preserve output file references during crash recovery
LeXwDeX Aug 20, 2026
9ed10e7
fix(dag): close review gaps on duplication fixes
LeXwDeX Aug 20, 2026
4f4d9df
chore(dag): record pr binding for delivery 386-388
LeXwDeX Aug 20, 2026
d9975be
test(dag): cover recovery persistence-failure and reader paths
LeXwDeX Aug 20, 2026
eee0972
Merge pull request #390 from LeXwDeX/fix/386-end-structured-output
LeXwDeX Aug 20, 2026
2d3623c
refactor(dag): reduce /dag-auto to pure workflow routing, retire /dag…
LeXwDeX Aug 20, 2026
8db3b72
chore: record delivery binding for reduce-dag-auto
LeXwDeX Aug 20, 2026
a0f23e4
Merge pull request #393 from LeXwDeX/refactor/392-reduce-dag-auto
LeXwDeX Aug 20, 2026
d3e2772
chore(session): record delivery binding for issue 389
LeXwDeX Aug 20, 2026
b8317bc
feat(session): re-surface uncompleted todos each model step
LeXwDeX Aug 20, 2026
44f4095
docs(session): correct todo-reminders precedent note and simplify tes…
LeXwDeX Aug 20, 2026
bed6ac7
feat(release): render per-series release notes with fail-closed valid…
LeXwDeX Aug 20, 2026
d6ce53a
chore(specgit): narrow acceptance workflow to main and document dupli…
LeXwDeX Aug 20, 2026
fa674a3
test(session): pin todo-reminder run-loop guarantees
LeXwDeX Aug 20, 2026
a9cf900
chore: rename branch to feat/todo-step-reminders and drop redundant a…
LeXwDeX Aug 20, 2026
e9f38a0
Merge pull request #394 from LeXwDeX/feat/todo-step-reminders
LeXwDeX Aug 20, 2026
a1ce6d4
fix(memory): deliver the response schema to schema-blind providers an…
LeXwDeX Aug 20, 2026
c98e053
chore: record delivery binding for memory-topic-creation
LeXwDeX Aug 20, 2026
7f2e06c
refactor(memory): replace jsonSchemaText assertions with type guards
LeXwDeX Aug 20, 2026
f9e90ba
Merge pull request #398 from LeXwDeX/fix/395-memory-topic-creation
LeXwDeX Aug 20, 2026
43d6915
fix(ci): restore the proven specgit-accept install strategy on main-o…
LeXwDeX Aug 20, 2026
c0deac3
Merge pull request #400 from LeXwDeX/fix/specgit-accept-install
LeXwDeX Aug 20, 2026
d904141
docs(release): disclose acceptance-workflow rollback chain and add se…
LeXwDeX Aug 20, 2026
b4c58cb
docs(release): add v1.18.0 series notes
LeXwDeX Aug 20, 2026
ab4c2be
chore: record delivery binding for release-train-remediation
LeXwDeX Aug 20, 2026
0407e0e
docs(release): rename series file to mechanically derived v1.0.29 and…
LeXwDeX Aug 20, 2026
29c7873
chore: record delivery binding for release-train-remediation
LeXwDeX Aug 20, 2026
1902357
Merge pull request #403 from LeXwDeX/fix/401-release-train-remediation
LeXwDeX Aug 20, 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
2 changes: 1 addition & 1 deletion .github/RELEASE_NOTES_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,4 @@ typecheck: N/N packages green

---

**Full changelog:** `{previous_tag}...{current_tag}`
**Full changelog:** [`{previous_tag}`...`{current_tag}`](https://github.com/LeXwDeX/OpenCode-GraphAgent/compare/{previous_tag}...{current_tag})
59 changes: 59 additions & 0 deletions .github/releases/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Release Notes Series Files

One markdown file per release series — `.github/releases/vX.Y.Z.md` — is the
source of truth for the GitHub Release body. The `dev` prereleases
(`X.Y.Z-dev.1 … dev.N`) and the `main` stable promotion (`X.Y.Z`) of a series
all render the **same** file; only the channel word differs.

The release job (`.github/workflows/release-fork.yml`) renders and validates
the file **before** `gh release create` and fails closed on any violation — a
release can never ship with placeholder notes.

## Lifecycle

1. **Series starts** — when `X.Y.Z` becomes the next version, the release job
looks for `.github/releases/vX.Y.Z.md`. Until that file is committed, every
release attempt of the series fails; the validator error names the exact
expected path. This is intentional.
2. **Dev prereleases** — each `X.Y.Z-dev.N` build re-renders the current file
content. Update the file as the series evolves.
3. **Stable promotion** — the `main` release of `X.Y.Z` renders the same file;
`{Prerelease/Stable}` becomes `Stable`. The compare range always spans from
the last stable tag, not from the previous `-dev.N`.
4. **Series closes** — after the stable release ships, the file remains as the
historical record. The next series needs its own new `vX.Y.(Z+1).md`.

## Placeholders

Five tokens are machine-substituted at render time:

| Token | Replaced with |
| -------------------- | --------------------------------------------------------- |
| `{VERSION}` | bare semver, e.g. `1.0.10` (no `v` prefix) |
| `{Prerelease/Stable}` | `Prerelease` on `dev`, `Stable` on `main` |
| `{branch}` | releasing branch name (`dev` or `main`) |
| `{previous_tag}` | latest existing stable tag, e.g. `graphagent-v1.0.9` |
| `{current_tag}` | the tag being released, e.g. `graphagent-v1.0.10` |

The template also contains authoring-guidance braces (`{Feature name}`,
`{module}`, `{One-sentence summary …}`). These are **not** substituted —
replace every one of them with real content. The validator fails on any
residual `{` or `}` in the rendered notes.

## Authoring rules (enforced fail-closed)

- Start from `.github/RELEASE_NOTES_TEMPLATE.md` and keep the exact `### `
emoji headings, their canonical order, and the `---` separators between
sections. Omit sections that have no content — do not leave empty headers.
- Copy the emoji headings verbatim from the template; never retype them. The
🏗️ (Architecture / Refactor) and ⚙️ (CI / Engineering) headings end with an
invisible U+FE0F variation selector that editors and copy-paste can strip.
- Prose must be ASCII everywhere except the emoji headings themselves.
- `### 🧪 Test Summary` and `### 🔍 Verification` are mandatory in every
release; the Test Summary body needs at least one fenced code block.
- The final line is the full-changelog compare link with the repository slug
written out literally (`https://github.com/LeXwDeX/OpenCode-GraphAgent/compare/{previous_tag}...{current_tag}`).
A repository rename fails validation on purpose — update the series file.

The grammar is implemented in `packages/opencode/script/release-notes.ts`
(rule errors are prefixed `[release-notes]`).
44 changes: 44 additions & 0 deletions .github/releases/v1.0.29.md
Original file line number Diff line number Diff line change
@@ -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})
27 changes: 26 additions & 1 deletion .github/workflows/release-fork.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ jobs:
tag: ${{ steps.release-version.outputs.tag }}
prerelease: ${{ steps.release-version.outputs.prerelease }}
latest: ${{ steps.release-version.outputs.latest }}
previous_tag: ${{ steps.release-version.outputs.previous_tag }}

steps:
- name: Checkout Repository
uses: actions/checkout@v4
Expand Down Expand Up @@ -270,6 +272,29 @@ jobs:
echo "--- SHA256SUMS ---"
cat SHA256SUMS

- name: Setup Bun
uses: ./.github/actions/setup-bun
with:
save-cache: false

# Render + validate the per-series notes file (.github/releases/vX.Y.Z.md)
# BEFORE creating the release. Fail closed: a missing or invalid series
# file stops the job here, so a release can never ship with placeholder
# notes. The script derives the series filename from --version; the
# workflow passes only primitives. Rendered notes go to RUNNER_TEMP and
# are never attached as a release asset.
- name: Render Release Notes (fail closed)
run: |
bun run ./packages/opencode/script/release-notes.ts \
--notes-dir ".github/releases" \
--version "${{ needs.version.outputs.version }}" \
--channel "${{ needs.version.outputs.channel }}" \
--branch "${{ github.ref_name }}" \
--tag "${{ needs.version.outputs.tag }}" \
--previous-tag "${{ needs.version.outputs.previous_tag }}" \
--repo "${{ github.repository }}" \
--out "$RUNNER_TEMP/RELEASE_NOTES.md"

- name: Create GitHub Release
env:
GH_TOKEN: ${{ github.token }}
Expand All @@ -284,7 +309,7 @@ jobs:
fi
gh release create "${{ needs.version.outputs.tag }}" \
--title "OpenCode GraphAgent v${{ needs.version.outputs.version }}" \
--notes "GraphAgent release from branch ${{ github.ref_name }}" \
--notes-file "$RUNNER_TEMP/RELEASE_NOTES.md" \
--target "${{ github.sha }}" \
"${EXTRA_FLAGS[@]}" \
release-assets/*
Expand Down
11 changes: 5 additions & 6 deletions .github/workflows/specgit-accept.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@ name: SpecGit Acceptance

on:
pull_request:
# Delivery PRs target dev (fast-integration layer) and are promoted to
# main via the release PR — main's legacy branch protection also requires
# the SpecGit Acceptance check, so the verdict must run on both targets.
# dev→main promotion stays governed by the protect-main Ruleset's four
# required checks.
branches: [dev, main]
# Delivery PRs target dev (fast-integration layer); the acceptance
# verdict runs only on the dev→main promotion PR, where protect-main's
# checks apply. Keep the trigger main-only (d6ce53a83): running it on
# dev PRs duplicated the verdict against the lighter dev gate.
branches: [main]

permissions:
contents: read
Expand Down
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,10 @@ tsconfig.tsbuildinfo
.opencode/commands/
.opencode/skills
.qoder
.opencode/workflow-reports/

# opencode local workflow state
.opencode/.dag-specs/
.opencode/dag-init.json
.opencode/workflow-drafts/
.opencode/workflow-reports/
12 changes: 5 additions & 7 deletions .specgit.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
version: 1
delivery: issue378
delivery: release-train-remediation
context:
kind: branch
branch: feat/378-issue378
branch: fix/401-release-train-remediation
issues:
- 378
- 379
- 380
- 381
pr: 382
- 401
- 402
pr: 403
15 changes: 14 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ This repository owns the DAG schema, compiler, validator, runtime, and release i

## DAG command family

- Built-in commands ship compiled into the binary: `/dag-flow` (resident orchestration router), `/dag-init` (platform handshake → writes `.opencode/dag-init.json`), `/dag-auto` (six-block ultra-flow driver), `/dag-template-update` (template refresh without git). User command files shadow built-ins by name; register new built-ins through `packages/core/src/plugin/command.ts` + `packages/opencode/src/command/index.ts` (`Default` registry).
- Built-in commands ship compiled into the binary: `/dag-auto` (requirement → workflow routing: classify, match a saved DAG route, retarget, validate, start). Platform delivery (issues, PRs, CI, merge, release) is specgit's job — never part of `/dag-*`. User command files shadow built-ins by name; register new built-ins through `packages/core/src/plugin/command.ts` + `packages/opencode/src/command/index.ts` (`Default` registry).
- Templates come from `opencode-dag-config`: 7 domains × `full`/`lite` plus cross-domain routes (`ultra-flow-route`, `release-route`). Precedence: project `.opencode/workflows/` > global config dir > builtin snapshot (the release pipeline compiles the config repo into the binary via `DAG_TEMPLATES_DIR`).
- `dag.jsonc` supplies DAG node model tiers: `advanced` for `required: true` and review nodes, `standard` otherwise. Never pin `model` inside saved workflow specs.

Expand Down Expand Up @@ -265,6 +265,19 @@ re-init; keep manual guidance outside them.
origin. `specgit doctor` probes git, repository, origin, gh, and
policy.

### Before creating an issue, check for duplicates

- Before running `specgit issue` with a new title, search the tracker for
similar open work: `gh issue list` with keywords from the title
(state, labels, and search terms via `gh search issues`).
- Open and read every plausible candidate (`gh issue view <n>`) — compare
the WHY, not just the wording.
- If a candidate covers the same WHY, continue that issue instead of
creating a new one; if it is close but different, say how they differ.
- When unsure, ask the requester to decide between continuing the existing
issue and creating a duplicate. The team ships one line of work per WHY,
never two.

### Issue granularity

One issue = one independently verifiable WHY. If a deliverable cannot be
Expand Down
13 changes: 13 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,19 @@ re-init; keep manual guidance outside them.
origin. `specgit doctor` probes git, repository, origin, gh, and
policy.

### Before creating an issue, check for duplicates

- Before running `specgit issue` with a new title, search the tracker for
similar open work: `gh issue list` with keywords from the title
(state, labels, and search terms via `gh search issues`).
- Open and read every plausible candidate (`gh issue view <n>`) — compare
the WHY, not just the wording.
- If a candidate covers the same WHY, continue that issue instead of
creating a new one; if it is close but different, say how they differ.
- When unsure, ask the requester to decide between continuing the existing
issue and creating a duplicate. The team ships one line of work per WHY,
never two.

### Issue granularity

One issue = one independently verifiable WHY. If a deliverable cannot be
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ Three terms worth knowing:

- Composable blocks (`explore`, `plan`, `prototype`, `debug`, `coding`, `verify`, `review`, `synthesize`) compile into the node graph; low-level node fields remain available for anything blocks cannot express.
- `workflow(action="draft")` renders a structured graph through the tool schema into a validated YAML spec — field-name mistakes are rejected by the provider, not discovered at validation time.
- Saved workflow libraries at three scopes (project / global / builtin), startable by name; the `/dag-flow` command picks a curated reference topology and retargets it to the task at hand.
- Saved workflow libraries at three scopes (project / global / builtin), startable by name; the `/dag-auto` command routes a requirement to a curated reference topology and retargets it to the task at hand.
- Model tiers in `dag.jsonc` separate decisions from volume: critical nodes on the `advanced` model, fan-out work on `standard`.

**Reliability**
Expand All @@ -67,7 +67,7 @@ Three terms worth knowing:
## Using workflows

Nothing has to be configured to try it: ask for work that has stages, parallel
parts, or a review gate in the middle (`/dag-flow <task>`), and the agent
parts, or a review gate in the middle (`/dag-auto <task>`), and the agent
designs a graph and runs it. Three things turn that into a repeatable setup of
your own.

Expand Down Expand Up @@ -108,8 +108,8 @@ directory and it gains a **name**:
Resolution takes the first match in that order, so a project file shadows a
global one with the same name, and both shadow the builtin tier. The global
scope is maintained by the [`opencode-dag-config`](https://github.com/LeXwDeX/opencode-dag-config)
repository; the `/dag-template-update` command syncs it (preview of
new/changed/unchanged files, backup before overwrite, QA decision gate). A minimal spec:
repository (sync it with a plain `git clone`/`git pull` into your config
dir). A minimal spec:

```yaml
title: Dependency audit
Expand Down
6 changes: 3 additions & 3 deletions README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ GraphAgent 是本项目对外的产品名;仓库以 **OpenCode-GraphAgent**

- 可组合块(`explore`、`plan`、`prototype`、`debug`、`coding`、`verify`、`review`、`synthesize`)编译成节点图;块表达不了的还有低级节点字段兜底。
- `workflow(action="draft")` 通过工具参数传结构化图,harness 渲染并校验出 YAML spec——字段写错在 provider 侧就被拒,不用等到校验才发现。
- 三级作用域的工作流库(项目 / 全局 / 内嵌),按名字启动;`/dag-flow` 命令挑选合适的参考拓扑并注入当前任务
- 三级作用域的工作流库(项目 / 全局 / 内嵌),按名字启动;`/dag-auto` 命令把需求路由到合适的参考拓扑并注入当前任务
- `dag.jsonc` 的模型分层把决策和跑量分开:关键节点用 `advanced` 模型,扇出跑量用 `standard`。

**可靠性**
Expand All @@ -60,7 +60,7 @@ GraphAgent 是本项目对外的产品名;仓库以 **OpenCode-GraphAgent**

## 工作流怎么用

不配置也能直接试:给它一件有阶段、有可并行部分、或者中间需要一道审查门禁的活(`/dag-flow <任务>`),智能体自己会建图并跑起来。想把它变成你自己的一套固定流程,有三件事:
不配置也能直接试:给它一件有阶段、有可并行部分、或者中间需要一道审查门禁的活(`/dag-auto <任务>`),智能体自己会建图并跑起来。想把它变成你自己的一套固定流程,有三件事:

### 1. 选定模型分层 —— `.opencode/dag.jsonc`

Expand Down Expand Up @@ -90,7 +90,7 @@ GraphAgent 是本项目对外的产品名;仓库以 **OpenCode-GraphAgent**
| 全局级 | `<opencode 配置目录>/workflows/<name>.yaml` | 本机所有项目 |
| 内嵌级 | 编译进正式版二进制 | 每个正式版安装——兜底解析层 |

解析按此顺序取第一个命中的名字:项目级遮蔽同名的全局级,二者都遮蔽内嵌级。全局作用域由 [`opencode-dag-config`](https://github.com/LeXwDeX/opencode-dag-config) 仓库维护,`/dag-template-update` 命令负责同步(预览新增/变更/不变清单,覆盖前备份,QA 决策门禁)。一个最小的 spec:
解析按此顺序取第一个命中的名字:项目级遮蔽同名的全局级,二者都遮蔽内嵌级。全局作用域由 [`opencode-dag-config`](https://github.com/LeXwDeX/opencode-dag-config) 仓库维护(直接 `git clone`/`git pull` 到配置目录即可同步)。一个最小的 spec:

```yaml
title: Dependency audit
Expand Down
Loading
Loading