Repository navigation
Conversation
Settle an unexpected iterator end as a failed inference, release the existing turn, and allow the next explicit nudge. Preserve cancellation and stream generation guards. Add regression coverage and a release fragment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Log the silent failure through the existing finally owner so usage, the established diagnostic, and logging-error isolation stay intact. Cover a zero-event logging write failure without retrying or leaking its turn. Co-Authored-By: GPT-6 (OpenAI Codex) <noreply@openai.com>
|
Automatic review of About these findingsThe findings below came from reading this PR and relevant code; not a holistic understanding of the project's functional intent and its architecture choices. Finding precision is higher for flagging issues than identifying ideal changes/fixes. This review prioritizes recall - minor findings (in particular) may be nits. Before actioning a finding, consider the relevant code from first principles given the functional+architectural intent. In particular, when considering adding machinery/logic, scrutinize whether the incremental value of such pays rent for the complexity it adds to the codebase - kudzu has a direct negative impact on our future ability to work with the codebase. Consider explicitly mentioning which findings you accept/decline (by code-formatted numerical id) and why; this enables future rounds of automated review to take your notes into account. Findings, most severe first:
|
|
/context-deltas |
|
Automatic context view of What a context view runs and what its checks judge: CHECKS.md. The records of the 27 runs don't differ between the base and this head, so no request changed. Held the same in base and head: connectome-host |
Keep the established cause in protected final logging even when a trace listener disposes the agent. Explain why a rearmed silent failure stops, and assert single failure notifications without adding another retry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ay out Four kinds of change a view couldn't show, since no run reached their paths: - Hcont/W13 sends to its turn's own channel with channel_publish and then speaks (step `sent`), so the send holds its words as drafts and the continuation's `[continue]` row takes its held form. Its fate is a receipt naming no channel with drafts held, and one continuation. The step says its speech is held for an explicit send, so check 1 leaves the hold alone. - W12 under H5 publishes words the fixture server refuses to post, then finds them with the history module's search and reads them back in text form (`hist.fail`, `hist.read2`), where the extract marks the send `, error`. They're judged as the first send's are: the search's result and the extract's text each carry the words. The mark isn't checked, since the record shows it. Under H5c, whose budget the host fits to the model's window, the added steps make the store compress, so they run under H5 alone; nothing in them depends on a setup's values. - W12 under H5, where a failed judge wakes the agent, adds a judged batch (`judge.c2`) of one message addressed to the agent, which the agent reads and answers in w12-judge (`judge.read2`) before its judge fails (`judge.err2`). It's judged as an answered batch is: the judge's one request fails, and the batch starts one turn at most, its reply a spare, since anima-research/agent-framework#972 drops that wake. judge.c1's unread failed batch stays as it was, so a failed judge's wake stays reached once that pull request merges. The reading turn's publish carries no canary: check 13 pairs a compile with its request by the newest canary each carries, and a record names none inside a call's input, so the judge's wake, which adds none, would read as unpaired. - Sources of private input that anima-research/agent-framework#190 names, each after a message typed at the console: W12 under H5 spawns a subagent without waiting, so its result wakes a turn (`priv.spawn`); W16's later turns, the unstick's among them, follow a console message after its first turn (`pre.con`); and W17 adds a sleep's end and an operator's nudge. Where each turn's speech goes shows in the record, and no check judges it. CHECKS.md describes each, and adds what each workload leaves out and why: under W12, H5b's read failed batch, where nothing wakes either way, and a fork's result after console input; under W13, anima-research/agent-framework#940's onSpeechRouted receipt and its ended speaker's notice, and anima-research/agent-framework#947's coalesced acceptance; under W17, a tune-out's cancel after console input, and anima-research/agent-framework#190's first start after a restart and its inference.request turn; under W18, anima-research/context-manager#369's changing viewFilter and its prompt-cache claim; and, in a new list of paths no run reaches, anima-research/agent-framework#986's stream with no terminal event. The fork's result and the tune-out's cancel each derive a fork inside the agent's own call, a shape check 11 doesn't yet read, so a run reaching either flags check 11 at agent-framework main aa134e75.
…nother Each view reads one profiled drive of each run. On anima-research/agent-framework#986, six views agreed on every changed line. Some host lines still ran in some views and not others: src/framework.ts 5995-5996, a 1 s sync timer's body, and 1882-1890, isTurnContinuation and passesQuiesce, reached on quiesce paths and batch splits, by the status read's count of gated requests, and by a transient failure's re-arm. The records stayed byte-identical, so identical records don't mean identical execution. Co-authored-by: Desmond-2579 <desmond-2579@commons.astra.invalid>
…ay out Four kinds of change a view couldn't show, since no run reached their paths: - Hcont/W13 sends to its turn's own channel with channel_publish and then speaks (step `sent`), so the send holds its words as drafts and the continuation's `[continue]` row takes its held form. Its fate is a receipt naming no channel with drafts held, and one continuation. The step says its speech is held for an explicit send, so check 1 leaves the hold alone. - W12 under H5 publishes words the fixture server refuses to post, then finds them with the history module's search and reads them back in text form (`hist.fail`, `hist.read2`), where the extract marks the send `, error`. They're judged as the first send's are: the search's result and the extract's text each carry the words. The mark isn't checked, since the record shows it. Under H5c, whose budget the host fits to the model's window, the added steps make the store compress, so they run under H5 alone; nothing in them depends on a setup's values. - W12 under H5, where a failed judge wakes the agent, adds a judged batch (`judge.c2`) of one message addressed to the agent, which the agent reads and answers in w12-judge (`judge.read2`) before its judge fails (`judge.err2`). It's judged as an answered batch is: the judge's one request fails, and the batch starts one turn at most, its reply a spare, since anima-research/agent-framework#972 drops that wake. judge.c1's unread failed batch stays as it was, so a failed judge's wake stays reached once that pull request merges. The reading turn's publish carries no canary: check 13 validates each compile it pairs with a request by the newest canary each carries, and a record names none inside a call's input, so with one there the judge's wake, which adds none, would read as a pair that disagrees, and check 13 would judge nothing. - Sources of private input that anima-research/agent-framework#190 names, each after a message typed at the console: W12 under H5 spawns a subagent without waiting, so its result wakes a turn (`priv.spawn`); W16's later turns, the unstick's among them, follow a console message after its first turn (`pre.con`); and W17 adds a sleep's end and an operator's nudge. Where each turn's speech goes shows in the record, and no check judges it. CHECKS.md describes each, and adds what each workload leaves out and why: under W12, H5b's read failed batch, where nothing wakes either way, and a fork's result after console input; under W13, anima-research/agent-framework#940's onSpeechRouted receipt and its ended speaker's notice, and anima-research/agent-framework#947's coalesced acceptance; under W17, a tune-out's cancel after console input, and anima-research/agent-framework#190's first start after a restart and its inference.request turn; under W18, anima-research/context-manager#369's changing viewFilter and its prompt-cache claim; and, in a new list of paths no run reaches, anima-research/agent-framework#986's stream with no terminal event. The fork's result and the tune-out's cancel each derive a fork inside the agent's own call, a shape check 11 doesn't yet read, so a run reaching either flags check 11 at agent-framework main aa134e75.
…nother Each view reads one profiled drive of each run. On anima-research/agent-framework#986, six views agreed on every changed line. Some host lines still ran in some views and not others: src/framework.ts 5995-5996, a 1 s sync timer's body, and 1882-1890, isTurnContinuation and passesQuiesce, reached on quiesce paths and batch splits, by the status read's count of gated requests, and by a transient failure's re-arm. The records stayed byte-identical, so identical records don't mean identical execution. Co-authored-by: Desmond-2579 <desmond-2579@commons.astra.invalid>
|
Read the framework.ts diff and the four tests. Two notes from the #980 side rather than findings against the change:
The |
Retain the established silent failure in both raw and operator-facing log fields. Clarify that ping-held streams remain outside issue907. Co-Authored-By: OpenAI Codex <noreply@openai.com>
|
Updated in
The current-main merge exposed one logging conflict: main added operator-facing Validation: compiler PASS; seven focused compiled suites, 226 pass / 0 fail / 0 skipped; independent Astra exact-diff review PASS. All 16 current-head CI checks passed, including three dependency-floor suites. Main Linux suite: 10814 pass / 0 fail / 63 skipped / 1 todo; separate unforced shutdown suite: 133 pass / 0 fail / 0 skipped. No live-provider silent end or ping-held stream was exercised. The tests use the reported iterator contract and synthetic transports. |
Problem
An uncancelled stream can exhaust without a terminal event. The agent then stays streaming, reports a completed lifecycle, and ignores a later nudge. Closes #907.
Changes
Settle that end as a failed inference through the existing post-loop owner. Release the current turn, record the failure, and allow the next explicit nudge to start work. Keep cancellation, stream-generation guards and protected usage accounting. Retain the established failure through synchronous trace listeners, including listener-triggered disposal.
Merged current main
36b6dfe9without rewriting the PR history. The one conflict was final failure logging: both rawerrorand main's operator-facingerrorWordsnow use the same retained cause. The disposal regression checks both fields.Tests
Current head
d704ac08:Original and previous follow-up evidence remains valid for unchanged behavior: the liveness regression failed on unfixed base
0c570d8; two review regressions failed on64062c09. The original cookbook cycle used Astra plan, Opus plan review/writer and independent Astra code review. This current bounded merge correction was coordinated directly; it has no new cookbook-cycle verdict.Review follow-up
2,6: capture the silent-end cause before trace callbacks; retain it in protected final logging and use the same diagnostic in settlement, trace and log.3: call the existing nontransient rearm disposition. It explains why rearming ends and schedules no new model call.4: assert exactly one failure trace, including logging-failure and listener-disposal cases.1,5: confirmed in the unchanged base. The ownership-lost iterator-close race and iterator-throw logging-order issue remain pre-existing residuals outside this patch.Related work and limits
[inference-failed]stderr line for every silent end. Whichever PR merges second must preserve both behaviors in their shared region; this branch does not copy or require fix(framework): an exhausted turn that did nothing writes no [inference-failed] note #985.AI-assisted using Claude Code and OpenAI Codex.