Repository navigation
OpenCode GraphAgent v1.0.83
opencode 1.0.83
Stable release from main branch. This release removes avoidable work from interface and runtime hot paths, keeps the prompt cache intact across a turn, hardens core agent tools against silent data loss, and repairs DAG review pipelines and replans.
🐛 Bug Fixes
-
DAG review pipelines reach a decision (#856, #857).
- When a review route's verification fails, the lanes gated on it are skipped. The decision node over those lanes is now scheduled in the same round instead of staying pending forever.
- By default, the verification gate now reports to the parent, so the parent sees a FAIL verdict and can reopen the workflow with extend. An explicit
report_to_parentstill takes precedence. - A failed optional review lane no longer fails the required decision. Strict input mappings receive the same explicit
Dependency "x" failed: <reason>text that default mappings use.
-
Replans rewrite the path instead of breaking it (#856, #857).
- A replan that cancels a running required node and rewires its old dependents keeps running. Only the runtime that matches the durable graph revision may finish a workflow.
- A replan that adds a dependency on a node superseded by an earlier replan is now rejected with guidance. Before, the edge was silently dropped and the new node ran as a root.
- When a rebuilt, queued attempt is refused re-admission, the live attempt keeps its fiber, so cancel still interrupts the real child session.
-
Verdicts are read the same way everywhere (#857). Condition gates, the replan checkpoint and review checks share one normalization:
- JSON strings and a single code fence are parsed.
- Verdict values are matched case-insensitively.
Before, a schemaless verification could satisfy a condition gate and then fail its review input check.
-
Tools no longer lose data silently (#854, #855).
editandapply_patchrefuse to rewrite files that are not valid UTF-8. Before, every non-UTF-8 byte across the file was replaced with U+FFFD.writeand deletion are unchanged.- An
apply_patchmove onto the same path is an in-place update. Before, the file was written and then deleted. editwithreplaceAllkeeps$&,$$and$'in the replacement literal.
-
Agents see real failures (#854, #855).
- A
taskwhose child ended on a provider or output error now returns a tool error in the foreground andtask_errorin the background. Before, it reported a completed task with an empty or partial answer. Cancellation is unchanged. webfetchrefuses binary responses such as PDFs and archives instead of decoding them into noise.- A 4xx response whose body merely contains a number such as
150000is no longer retried five times with the full context.
- A
-
Search stays useful on real repositories (#854, #855).
- A match on a non-UTF-8 line is decoded instead of failing the whole search. An oversized match in a minified file is skipped instead of discarding every other match.
- Grep output now stays within the shared 50 KB output budget.
-
Prompts match the tools that exist (#855). The codex system prompt and the shell tool description no longer direct apply_patch models to Edit and Write tools they do not have.
No public HTTP shape, durable event version, database schema or migration changed. The report_to_parent description in the workflow tool schema changed.
🏗️ Architecture / Refactor
- Lighter hot paths (#854, #855).
- Streaming shell output is coalesced into at most one durable part update every 200 ms. Before, there was one update per chunk: a 40-chunk command wrote 40 events.
- A preview is published only after its chunk, including any spill to the truncation file, has been fully handled.
- The 250 ms DAG mailbox scan reads without taking SQLite's write reservation.
apply_patchwaits for LSP diagnostics on all edited files concurrently instead of one file at a time.
- Stable prompt prefix within a turn (#855).
- The todo reminder is now decided once per user message. Before, a mid-turn
todowritechanged text placed ahead of every tool round-trip, which invalidated the cached prompt for the rest of the turn. - Current todo state still reaches the model at the tail, through the existing pre-tool-call reminder.
- The todo reminder is now decided once per user message. Before, a mid-turn
- Responsive TUI (#855).
- The DAG inspector keeps an unchanged two-second snapshot instead of rebuilding every wave row.
- Session hydration merges messages and parts through indexes rather than nested scans.
🧪 Test Summary
Branch evidence (each new regression failed on the previous main and passes):
Opencode tool + session + mailbox suites: 710 passed, 0 failed
Opencode DAG suites (test/dag): 1,021 passed, 3 skipped, 0 failed
DAG core gate (test:dag-core): all behavior and coverage floors passed
Core DAG + ripgrep suites: 201 passed, 0 failed
TUI suite: 312 passed, 0 failed
Workspace typecheck: 31/31 tasks passed
Lint: 4,673 warnings, 0 errors (cap 4,675)
Tests that bind local ports were run outside the sandbox. The new regressions cover:
- Interface and runtime: chatty shell output, concurrent diagnostics.
- Prompt and retries: a stable turn reminder across a mid-turn
todowrite, a 4xx body with token counts. - Tools: GBK files, a move onto the same path, an errored child task, binary fetches, and a mixed grep over GBK, minified and plain files.
- DAG pipelines: a failed verification that reaches the parent and reopens via extend, a crashed optional lane, a replan that cancels a required node, a dependency on a superseded node, fenced and upper-case verdicts, and a rejected re-admission.
🔍 Verification
- Every fix landed through a pull request with its own commit and with the required native checks passing on its head. The checks are Typecheck, Unit Tests (linux) and both E2E platforms.
- An audit of the interface, runtime, agent tools, prompts and DAG engine selected these fixes. Candidates that would change persisted contracts or product policy were left out of this release.
- Examples left out:
- Classifying block review lanes for the advanced model tier, which needs a new node field.
- Narrowing how parent mailboxes are discarded on cancellation.
Full changelog: graphagent-v1.0.82...graphagent-v1.0.83