Skip to content

OpenCode GraphAgent v1.0.83

Choose a tag to compare

@github-actions github-actions released this 21 Oct 19:47
Immutable release. Only release title and notes can be modified.
983d4dc

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_parent still 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).

    • edit and apply_patch refuse to rewrite files that are not valid UTF-8. Before, every non-UTF-8 byte across the file was replaced with U+FFFD. write and deletion are unchanged.
    • An apply_patch move onto the same path is an in-place update. Before, the file was written and then deleted.
    • edit with replaceAll keeps $&, $$ and $' in the replacement literal.
  • Agents see real failures (#854, #855).

    • A task whose child ended on a provider or output error now returns a tool error in the foreground and task_error in the background. Before, it reported a completed task with an empty or partial answer. Cancellation is unchanged.
    • webfetch refuses binary responses such as PDFs and archives instead of decoding them into noise.
    • A 4xx response whose body merely contains a number such as 150000 is no longer retried five times with the full context.
  • 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_patch waits 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 todowrite changed 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.
  • 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