Conversation
wake_reported landed only after the whole wake-driven turn completed, so a restart or mid-turn interruption left the synthetic part durable but the mark absent, and the startup sweep re-injected a byte-identical wake. Mark the batch (and unregister terminal workflows) immediately after admitIfIdle, before awaiting the turn; drop the turn-failure-redelivery semantics. Mark failures degrade to retry-later while the admitted turn still runs. Flips the two dag-wake-integration failure-redelivery assertions and reworks the two timeout-escalation Q2-gate tests (their "held turn => wakeReported=false" window no longer exists; they now hold the wake via a busy parent session). Adds regression tests for failed-turn no-redelivery and a simulated restart.
…rns verdict replan
A reporting checkpoint submitting {verdict: "replan"} now pauses the workflow durably before any spawn round, so dependents can never run on the rejected direction; the parent is woken by the existing report_to_parent wake. control(replan) resumes a paused workflow so corrective nodes run, with TOCTOU-safe resume handling and updated pause guidance. continue verdicts and non-verdict outputs advance unchanged. Closes#322Guarantee the literal json token at the MemoryModel seam (providers reject json_object calls without it), size match/maintain output budgets so structured replies survive reasoning, and retire the wall-clock prepare/checkpoint/in-model timeouts that killed active reasoning calls (issue #324 tracks the remaining streaming-liveness debt). Checkpoint maintenance runs in the background with an atomic per-project in-flight guard and commits under fence+lock only; prepare/search semantics unchanged.
fix(dag): halt downstream scheduling when a reporting checkpoint returns verdict replan
fix(memory): repair the MEMORY write path for thinking-mode providers
fix(dag): reject ungated reporting checkpoints at authoring
fix(dag): mark wake reported at admit time
Retire the whole-call wall clock in favor of activity-based liveness on the memory model seam: switch generateObject -> streamObject and re-arm an idle watchdog on every arriving part (reasoning deltas included), so an actively streaming call is never killed however long the reasoning runs. Add a connect timeout (no first part) and an idle timeout (gap between parts), both pure non-response detectors; generation still terminates via max_output_tokens / a natural stop. Addresses the streaming-liveness half of #324; the periodic prepare lock hardening remains tracked there.
fix(memory): replace wall-clock timeout with per-chunk SSE liveness
…ransient pause failure Audit follow-up to #327/#322. (1) Parse a string-typed checkpoint output as JSON before matching the replan verdict, so a report_to_parent gate without output_schema (or a string-typed child reply, reachable via replan fragments which skip the authoring check) cannot bypass the pause gate and reproduce the #322 spin. (2) Retry the gate pause once before falling back to the durable status, so a transient pause failure (e.g. the workflow lock held by a concurrent long replan) never silently strands the workflow with no spawn round and no parent wake.
fix(dag): harden replan verdict gate — string-output bypass + transient pause strand
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release batch: MEMORY write-path repair + DAG gate hardening (since graphagent-v1.0.24)
Promote the dev integration line to main. Dev's full CI (Typecheck + full test suite incl. app e2e) is green at
f1c2c8c33.MEMORY
fix(memory): repair the MEMORY write path for thinking-mode providers— D1 json-token guarantee at the seam; D2 match/maintain output budgets sized for reasoning (MATCH_OUTPUT_TOKENS 2048/MAINTAIN_OUTPUT_TOKENS 16384); D3 retire prepare/checkpoint/in-model wall-clock timeouts; checkpoint maintenance runs in the background with an atomic per-project in-flight guard, model calls outside fence/lock, commits under lock (Closes the write-path failure; the prepare-lock hardening stays tracked in fix(memory): SSE-liveness debt — wall-clock guard contradicts streaming principle; periodic prepare path still long-holds locks #324).fix(memory): replace wall-clock timeout with per-chunk SSE liveness—generateObject→streamObject; a liveness watchdog re-arms on every arriving part (reasoning deltas included) so an actively streaming call is never wall-clock killed; connect/idle timeouts are pure non-response detectors. Adds 4 boundary regressions (long-stream survival, stall, dead-connection, error-part). Addresses the streaming-liveness half of fix(memory): SSE-liveness debt — wall-clock guard contradicts streaming principle; periodic prepare path still long-holds locks #324.DAG orchestration
fix(dag): halt downstream scheduling when a reporting checkpoint returns verdict replan— closes the fix(dag): replan verdict is advisory — a rejected checkpoint cannot structurally halt downstream execution #322 spin: dependents never run on a vetoed direction; paused workflow resumes as part ofcontrol(replan).fix(dag): reject ungated reporting checkpoints at authoring(issue fix(dag): reject ungated reporting checkpoints at authoring #320).fix(dag): mark wake reported at admit time(issue fix(dag): mark wake reported at admit time (restart-safe wake delivery) #321) + a stale-comment correction.fix(dag): harden replan verdict gate — string-output bypass + transient pause strand— parses a string-typed verdict before matching (closes a fix(dag): replan verdict is advisory — a rejected checkpoint cannot structurally halt downstream execution #322-reproducing bypass reachable via replan fragments) and retries the gate pause before falling back to durable status. Closesfix(dag): harden replan verdict gate — string-output bypass + transient pause strand (audit follow-up) #330.Verification
f1c2c8c33(run 32078870791, exit 0).test/memory/90 pass; DAG:test/dag/561 pass; compaction suites green; packages/opencode typecheck clean.Notes
--no-verify) on two PRs solely because a GitHub codeload 429 on the unrelatedghostty-webdep blocked the workspace-widebun install; CI (fresh env) was the gate and passed.