fix(langgraph): gate pure graph concurrent node dispatch on per-node parallel flag #117

Merged
CoreRasurae merged 1 commit from bugfix/m1-pure-graph-parallel-node-gate into master 2026-08-06 12:19:18 +00:00
Member

Summary

Fixes issue #97: all three concurrent-dispatch sites in PureLangGraph (execute()'s _execute_from_node(), and both branches of execute_stream()) fired every candidate next-node concurrently via asyncio.gather/asyncio.create_task whenever the graph-level parallel_execution: true (the default) and there were 2+ candidates, without ever consulting each node's own parallel flag. This violated Actor Configuration Standard §6.7 and §12.3.

Fixed by adding a shared PureLangGraph._partition_by_parallel_flag() helper used at all three sites: the parallel-eligible subset is gathered concurrently and joined first (§6.7 steps 2-3), the remainder runs sequentially afterward (§6.7 step 4), and the parallel_execution: false override is unaffected. As a side effect, execute_stream() no longer silently drops the token output of every fan-out sibling except the last-completing one.

The three pre-existing TDD regression scenarios (issue #98, @tdd_issue_97) now pass with @tdd_expected_fail removed — confirmed via the project's TddExpectedFailPolicy hook flagging them as unexpectedly-passing before the tag was dropped. Five additional Behave scenarios cover all-parallel, mixed parallel/non-parallel, and parallel_execution: false, at both entrypoints. A new Robot integration test drives three real sibling agents with non-monotonic delays and verifies declaration-order completion (verified to genuinely fail against the pre-fix code). A new ASV benchmark tracks dispatch cost for the two flag configurations.

Closes #97

Test plan

  • nox -s lint — green
  • nox -s format -- --check — green
  • nox -s typecheck — green (Pyright strict, 0 errors)
  • nox -s security_scan — green
  • nox -s dead_code — green
  • nox -s unit_tests — green (148 features, 0 failures, including 8 scenarios in pure_graph_parallel_node_gate.feature)
  • nox -s integration_tests — green (341/341, including the new Robot test)
  • nox -s coverage_report — see CI for the final number on this branch
  • nox -s benchmark — new benchmark runs cleanly (PureGraphParallelDispatchBenchmark)
## Summary Fixes issue #97: all three concurrent-dispatch sites in `PureLangGraph` (`execute()`'s `_execute_from_node()`, and both branches of `execute_stream()`) fired every candidate next-node concurrently via `asyncio.gather`/`asyncio.create_task` whenever the graph-level `parallel_execution: true` (the default) and there were 2+ candidates, without ever consulting each node's own `parallel` flag. This violated Actor Configuration Standard §6.7 and §12.3. Fixed by adding a shared `PureLangGraph._partition_by_parallel_flag()` helper used at all three sites: the parallel-eligible subset is gathered concurrently and joined first (§6.7 steps 2-3), the remainder runs sequentially afterward (§6.7 step 4), and the `parallel_execution: false` override is unaffected. As a side effect, `execute_stream()` no longer silently drops the token output of every fan-out sibling except the last-completing one. The three pre-existing TDD regression scenarios (issue #98, `@tdd_issue_97`) now pass with `@tdd_expected_fail` removed — confirmed via the project's `TddExpectedFailPolicy` hook flagging them as unexpectedly-passing before the tag was dropped. Five additional Behave scenarios cover all-parallel, mixed parallel/non-parallel, and `parallel_execution: false`, at both entrypoints. A new Robot integration test drives three real sibling agents with non-monotonic delays and verifies declaration-order completion (verified to genuinely fail against the pre-fix code). A new ASV benchmark tracks dispatch cost for the two flag configurations. Closes #97 ## Test plan - [x] `nox -s lint` — green - [x] `nox -s format -- --check` — green - [x] `nox -s typecheck` — green (Pyright strict, 0 errors) - [x] `nox -s security_scan` — green - [x] `nox -s dead_code` — green - [x] `nox -s unit_tests` — green (148 features, 0 failures, including 8 scenarios in `pure_graph_parallel_node_gate.feature`) - [x] `nox -s integration_tests` — green (341/341, including the new Robot test) - [x] `nox -s coverage_report` — see CI for the final number on this branch - [x] `nox -s benchmark` — new benchmark runs cleanly (`PureGraphParallelDispatchBenchmark`)
CoreRasurae added this to the v2.1.0 milestone 2026-08-05 23:37:58 +00:00
hurui200320 requested changes 2026-08-06 06:41:00 +00:00
Dismissed
hurui200320 left a comment

PR Review: !117 (Ticket #97)

Verdict: Request Changes

The implementation correctly gates pure-graph concurrent dispatch on each node's parallel flag and covers all acceptance criteria with Behave, Robot, and ASV tests. However, the latest CI run failed the required coverage and benchmark jobs, so the branch cannot be merged until those gates are green.

Critical Issues

None.

Major Issues

  1. Required coverage CI job failed (appears to time out)

    • Location: CI run #31704, job coverage
    • Problem: The job failed after ~14 minutes. The log ends immediately after starting slipcover wrapped around Behave (nox > python -m slipcover ... -m behave -q --no-capture features/) with no coverage report or threshold check emitted. This prevents verifying the required ≥97% coverage gate. Note that the plain unit_tests job (Behave without slipcover) passed, so the tests themselves are not hanging; the failure is specific to the coverage session.
    • Recommendation: Run nox -s coverage_report locally and inspect whether the session completes and meets the threshold. If it is a runner timeout, reduce suite runtime or request a timeout increase. If coverage actually dropped below 97%, add tests for the newly uncovered paths (e.g., the new _partition_by_parallel_flag branches, exception/cancellation paths in the sequential subset, or the parallel_execution: false path).
  2. Required benchmark CI job failed (timed out)

    • Location: CI run #31704, job benchmark
    • Problem: The ASV continuous run failed after ~24 minutes, having only reached 66.55% of the benchmark matrix. The new PureGraphParallelDispatchBenchmark methods themselves completed successfully and quickly (~2 ms each), but the overall benchmark session did not finish, so the required benchmark gate is red.
    • Recommendation: Verify nox -s benchmark / nox -s benchmark_regression locally end-to-end. If the suite is simply too large for the runner's time limit, reduce the cost of the new benchmarks (fewer siblings/shorter warm-up) or work with infra to extend the runner timeout. Do not rely on "new benchmark runs cleanly" if the full ASV matrix cannot complete in CI.

Minor Issues

  1. Streaming still drops tokens for parallel-marked siblings
    • File: src/cleveractors/langgraph/pure_graph.py, lines ~1920-1939 and ~2040-2057
    • Problem: For the parallel_subset, _collect_stream_tokens buffers all tokens and only results[-1] is yielded. The PR description correctly notes that non-parallel siblings are now streamed sequentially (so their tokens are preserved), but parallel-marked siblings continue to lose all tokens except those from the last-completing branch. This is pre-existing behavior and is documented in execute_stream, but it is a genuine limitation of the current streaming fan-out semantics.
    • Recommendation: Consider a follow-up issue to merge or yield tokens from all parallel branches in declaration order, or update streaming documentation to clearly state that parallel: true on a node currently implies buffered, last-branch-only token delivery.

Nits

None.

Summary

The core fix is sound: _partition_by_parallel_flag is applied consistently at all three dispatch sites (_execute_from_node and both execute_stream branches), preserving parallel_execution: false and correctly running non-parallel-marked siblings sequentially. The test matrix (regression scenarios, all-parallel, mixed, and override cases across both execute and execute_stream) matches the acceptance criteria, and the Robot integration test plus ASV benchmark are welcome additions. Once the coverage and benchmark CI jobs are passing, this should be good to merge.

## PR Review: !117 (Ticket #97) ### Verdict: Request Changes The implementation correctly gates pure-graph concurrent dispatch on each node's `parallel` flag and covers all acceptance criteria with Behave, Robot, and ASV tests. However, the latest CI run failed the required `coverage` and `benchmark` jobs, so the branch cannot be merged until those gates are green. ### Critical Issues None. ### Major Issues 1. **Required `coverage` CI job failed (appears to time out)** - **Location:** CI run [#31704](https://git.cleverthis.com/cleveragents/cleveractors-core/actions/runs/31704), job `coverage` - **Problem:** The job failed after ~14 minutes. The log ends immediately after starting `slipcover` wrapped around Behave (`nox > python -m slipcover ... -m behave -q --no-capture features/`) with no coverage report or threshold check emitted. This prevents verifying the required ≥97% coverage gate. Note that the plain `unit_tests` job (Behave without slipcover) passed, so the tests themselves are not hanging; the failure is specific to the coverage session. - **Recommendation:** Run `nox -s coverage_report` locally and inspect whether the session completes and meets the threshold. If it is a runner timeout, reduce suite runtime or request a timeout increase. If coverage actually dropped below 97%, add tests for the newly uncovered paths (e.g., the new `_partition_by_parallel_flag` branches, exception/cancellation paths in the sequential subset, or the `parallel_execution: false` path). 2. **Required `benchmark` CI job failed (timed out)** - **Location:** CI run [#31704](https://git.cleverthis.com/cleveragents/cleveractors-core/actions/runs/31704), job `benchmark` - **Problem:** The ASV continuous run failed after ~24 minutes, having only reached 66.55% of the benchmark matrix. The new `PureGraphParallelDispatchBenchmark` methods themselves completed successfully and quickly (~2 ms each), but the overall benchmark session did not finish, so the required benchmark gate is red. - **Recommendation:** Verify `nox -s benchmark` / `nox -s benchmark_regression` locally end-to-end. If the suite is simply too large for the runner's time limit, reduce the cost of the new benchmarks (fewer siblings/shorter warm-up) or work with infra to extend the runner timeout. Do not rely on "new benchmark runs cleanly" if the full ASV matrix cannot complete in CI. ### Minor Issues 1. **Streaming still drops tokens for parallel-marked siblings** - **File:** `src/cleveractors/langgraph/pure_graph.py`, lines ~1920-1939 and ~2040-2057 - **Problem:** For the `parallel_subset`, `_collect_stream_tokens` buffers all tokens and only `results[-1]` is yielded. The PR description correctly notes that non-parallel siblings are now streamed sequentially (so their tokens are preserved), but parallel-marked siblings continue to lose all tokens except those from the last-completing branch. This is pre-existing behavior and is documented in `execute_stream`, but it is a genuine limitation of the current streaming fan-out semantics. - **Recommendation:** Consider a follow-up issue to merge or yield tokens from all parallel branches in declaration order, or update streaming documentation to clearly state that `parallel: true` on a node currently implies buffered, last-branch-only token delivery. ### Nits None. ### Summary The core fix is sound: `_partition_by_parallel_flag` is applied consistently at all three dispatch sites (`_execute_from_node` and both `execute_stream` branches), preserving `parallel_execution: false` and correctly running non-parallel-marked siblings sequentially. The test matrix (regression scenarios, all-parallel, mixed, and override cases across both `execute` and `execute_stream`) matches the acceptance criteria, and the Robot integration test plus ASV benchmark are welcome additions. Once the `coverage` and `benchmark` CI jobs are passing, this should be good to merge.
hurui200320 left a comment

PR Review Update: !117 (Ticket #97)

Verdict: Approve

The previously failing coverage job is now green (CI / coverage succeeded in 6m41s), and status-check is passing. As noted, the benchmark job is not a required gate. With the required CI gates green, the remaining concerns are minor and do not block merge.

Critical Issues

None.

Major Issues

None.

Minor Issues

  1. Streaming still drops tokens for parallel-marked siblings
    • File: src/cleveractors/langgraph/pure_graph.py, lines ~1920-1939 and ~2040-2057
    • Problem: For the parallel_subset, _collect_stream_tokens buffers all tokens and only results[-1] is yielded. The PR correctly preserves tokens for non-parallel siblings by streaming them sequentially, but parallel-marked siblings continue to lose all tokens except those from the last-completing branch. This is pre-existing, documented behavior in execute_stream, but it remains a limitation of the current streaming fan-out semantics.
    • Recommendation: Consider a follow-up issue to merge or yield tokens from all parallel branches in declaration order, or update streaming documentation to clearly state that parallel: true on a node currently implies buffered, last-branch-only token delivery.

Nits

None.

Summary

The fix correctly implements Actor Configuration Standard §6.7/§12.3: _partition_by_parallel_flag is applied at all three dispatch sites, the parallel_execution: false override is preserved, and the acceptance criteria are covered by Behave regression scenarios, additional flag-combination scenarios, a Robot integration test, and an ASV benchmark. With the required CI gates now green, this PR is approved for merge.

## PR Review Update: !117 (Ticket #97) ### Verdict: Approve The previously failing `coverage` job is now green (CI / coverage succeeded in 6m41s), and `status-check` is passing. As noted, the `benchmark` job is not a required gate. With the required CI gates green, the remaining concerns are minor and do not block merge. ### Critical Issues None. ### Major Issues None. ### Minor Issues 1. **Streaming still drops tokens for parallel-marked siblings** - **File:** `src/cleveractors/langgraph/pure_graph.py`, lines ~1920-1939 and ~2040-2057 - **Problem:** For the `parallel_subset`, `_collect_stream_tokens` buffers all tokens and only `results[-1]` is yielded. The PR correctly preserves tokens for non-parallel siblings by streaming them sequentially, but parallel-marked siblings continue to lose all tokens except those from the last-completing branch. This is pre-existing, documented behavior in `execute_stream`, but it remains a limitation of the current streaming fan-out semantics. - **Recommendation:** Consider a follow-up issue to merge or yield tokens from all parallel branches in declaration order, or update streaming documentation to clearly state that `parallel: true` on a node currently implies buffered, last-branch-only token delivery. ### Nits None. ### Summary The fix correctly implements Actor Configuration Standard §6.7/§12.3: `_partition_by_parallel_flag` is applied at all three dispatch sites, the `parallel_execution: false` override is preserved, and the acceptance criteria are covered by Behave regression scenarios, additional flag-combination scenarios, a Robot integration test, and an ASV benchmark. With the required CI gates now green, this PR is approved for merge.
Author
Member

In review issuecomment 322041, Minor Issue 1, "Streaming still drops tokens for parallel-marked siblings", this is actually a Major issue and must be fixed!

In review issuecomment 322041, Minor Issue 1, "Streaming still drops tokens for parallel-marked siblings", this is actually a Major issue and must be fixed!
fix(langgraph): gate pure graph concurrent node dispatch on per-node parallel flag
Some checks failed
CI / lint (pull_request) Successful in 52s
CI / typecheck (pull_request) Successful in 1m21s
CI / security (pull_request) Successful in 1m12s
CI / quality (pull_request) Successful in 1m49s
CI / build (pull_request) Successful in 1m52s
CI / integration_tests (pull_request) Successful in 3m30s
CI / unit_tests (pull_request) Successful in 5m51s
CI / benchmark (pull_request) Has been cancelled
CI / coverage (pull_request) Successful in 5m7s
CI / status-check (pull_request) Successful in 12s
CI / lint (push) Successful in 49s
CI / security (push) Successful in 1m21s
CI / typecheck (push) Successful in 1m32s
CI / quality (push) Successful in 1m21s
CI / build (push) Successful in 2m57s
CI / unit_tests (push) Successful in 4m46s
CI / benchmark (push) Successful in 25m5s
CI / integration_tests (push) Successful in 2m28s
CI / coverage (push) Successful in 4m59s
CI / status-check (push) Successful in 12s
6479902d50
All three concurrent-dispatch sites in PureLangGraph fired every
candidate next-node concurrently via asyncio.gather/asyncio.create_task
whenever the graph-level parallel_execution: true (the default) and
there were 2+ candidates, without consulting each node's own parallel
flag (NodeConfig.parallel / can_execute_parallel()). This violated
Actor Configuration Standard §6.7 and §12.3, which require that only
next-nodes individually marked parallel: true run concurrently, with
the rest running sequentially afterward.

Fixed by adding PureLangGraph._partition_by_parallel_flag(), a shared
helper that splits a next-node set into the parallel-eligible subset
and the rest, and using it at all three sites: execute()'s
_execute_from_node(), and both branches of execute_stream()
(intermediate-AGENT and non-AGENT). The parallel subset is gathered
concurrently and joined first (§6.7 steps 2-3); the remainder runs one
at a time afterward (§6.7 step 4), both subsets still receiving the
same input from their common parent. The parallel_execution: false
graph-level override is untouched — it still forces full sequential
chaining regardless of individual flags, exactly as before.

As a side effect of correctly routing non-parallel-marked siblings
away from the concurrent path, execute_stream() no longer silently
drops the token output of every fan-out sibling except the
last-completing one, a second, related defect in the pre-fix buffered
gather path shared by both streaming branches.

The three pre-existing regression scenarios (issue #98,
@tdd_issue_97) now pass without @tdd_expected_fail, confirmed via the
project's TddExpectedFailPolicy inversion hook flagging them as
unexpectedly-passing before the tag was removed. Five additional
Behave scenarios cover all-parallel, mixed parallel/non-parallel (via
a shared _build_two_sibling_graph/_partition helper refactor to avoid
duplicating the four trigger-type/flag combinations), and
parallel_execution: false, at both the non-streaming and streaming
entrypoints. A new Robot integration test drives three real sibling
agents with deliberately non-monotonic delays end-to-end and verifies
they complete in declaration order (verified to genuinely fail on the
pre-fix code before restoring the fix). A new ASV benchmark tracks the
dispatch cost of the two flag configurations the fix distinguishes.

ISSUES CLOSED: #97
CoreRasurae force-pushed bugfix/m1-pure-graph-parallel-node-gate from d8dc9d48d1
Some checks failed
CI / lint (pull_request) Successful in 57s
CI / security (pull_request) Successful in 1m49s
CI / build (pull_request) Successful in 58s
CI / typecheck (pull_request) Successful in 2m17s
CI / quality (pull_request) Successful in 1m56s
CI / integration_tests (pull_request) Successful in 4m17s
CI / unit_tests (pull_request) Successful in 4m58s
CI / coverage (pull_request) Successful in 6m41s
CI / status-check (pull_request) Successful in 3s
CI / benchmark (pull_request) Failing after 23m12s
to 6479902d50
Some checks failed
CI / lint (pull_request) Successful in 52s
CI / typecheck (pull_request) Successful in 1m21s
CI / security (pull_request) Successful in 1m12s
CI / quality (pull_request) Successful in 1m49s
CI / build (pull_request) Successful in 1m52s
CI / integration_tests (pull_request) Successful in 3m30s
CI / unit_tests (pull_request) Successful in 5m51s
CI / benchmark (pull_request) Has been cancelled
CI / coverage (pull_request) Successful in 5m7s
CI / status-check (pull_request) Successful in 12s
CI / lint (push) Successful in 49s
CI / security (push) Successful in 1m21s
CI / typecheck (push) Successful in 1m32s
CI / quality (push) Successful in 1m21s
CI / build (push) Successful in 2m57s
CI / unit_tests (push) Successful in 4m46s
CI / benchmark (push) Successful in 25m5s
CI / integration_tests (push) Successful in 2m28s
CI / coverage (push) Successful in 4m59s
CI / status-check (push) Successful in 12s
2026-08-06 11:55:50 +00:00
Compare
Author
Member

Response to review of !117 (Ticket #97)

Thanks for both review passes, @hurui200320, and for the escalation, @CoreRasurae.

Addressed

Minor Issue 1 from the Approve review — "Streaming still drops tokens for parallel-marked siblings" (reclassified to Major in the follow-up comment) — FIXED

  • Root cause confirmed: in both execute_stream() dispatch sites (_stream_from_node's intermediate-AGENT branch and its non-AGENT branch, pure_graph.py), the parallel_execution: true subset was collected via _collect_stream_tokens() into results = await asyncio.gather(*tasks), but only results[-1] (the last-declared branch, not even the last-completing one) was ever yielded to the caller. Every other concurrent sibling's tokens were silently discarded.
  • Spec check performed before fixing, per project process: neither §6.7 nor §12.3 of the Actor Configuration Standard constrain the shape of streamed output for a joined parallel subset — those sections govern dispatch scheduling only (already correctly fixed by _partition_by_parallel_flag() in the original commit). However, §6.9 requires pure-graph mode's "externally observable semantics" to be identical to mixed-mode operation, and in mixed mode (§6.10) each node wires into its own internal stream, so parallel siblings' outputs are independently observable rather than collapsed into one. The old behavior broke that equivalence. No ADR in docs/adr/ governs this — it's a straightforward bug fix aligning code to already-normative spec intent, not a new architectural decision, so no ADR was required.
  • Fix: both sites now yield every parallel branch's collected tokens in full, in declaration order (asyncio.gather preserves input task order regardless of completion order), before the sequential subset streams afterward. Verified the sole downstream consumer (runtime_dispatch.py's async for token in graph.execute_stream(...): yield token) has no single-token assumption, so emitting more tokens is safe.
  • Tests added: 2 new Behave scenarios (pure_graph_parallel_node_gate.feature) — one per streaming dispatch site (non-agent trigger, agent trigger) — asserting the streamed token list includes output from both parallel siblings, not just one. Coverage run scoped to this feature confirms the new/changed lines are exercised; the only nearby uncovered lines are the pre-existing except BaseException task-cancellation branch, unrelated to this change and not a regression.
  • Not changed: the non-streaming execute() path's return-value semantics (result = results[-1] if results else output_message) were intentionally left as-is. That method has a single-string return contract used to continue the (necessarily single) execution path forward — it isn't a fan-out-to-external-consumer API like execute_stream(), neither review flagged it, and altering it isn't required by §6.7/§12.3's "results joined before continuing" language, which is about scheduling, not the shape of the joined value.

Not actioned, with justification

  • "Consider a follow-up issue" recommendation (both reviews): rather than deferring, the fix is included directly in this PR. The follow-up comment reclassified the item as Major and stated it "must be fixed," so deferring to a separate issue/PR would leave a Major-severity item unresolved at merge time.
  • Coverage/benchmark CI failures (Request Changes review, review 1): no action needed here — these were already resolved before the Approve review superseded it (coverage job green in 6m41s; benchmark is not a required merge gate).

Verification performed (all via nox, per project convention — nothing invoked directly)

  • nox -s lint — green
  • nox -s typecheck — green (Pyright strict, 0 errors)
  • nox -s security_scan — green (bandit + semgrep, 0 findings)
  • nox -s dead_code — green (vulture)
  • nox -s unit_tests -- features/pure_graph_parallel_node_gate.feature — 10/10 scenarios pass (8 original + 2 new)
  • nox -s coverage_report -- features/pure_graph_parallel_node_gate.feature — confirms the fix's new lines are covered (scoped to this feature's tests, per the delta relevant to this change rather than the full-suite gate)

Amended into the existing commit (single commit on this branch) and pushed: 6479902d50f0cda68ae83d52e270d0f29f09b8a4. CHANGELOG entry updated in place to describe the final behavior (still unreleased/in-progress work, so no separate "fix" entry was added).

Ready for re-review.

## Response to review of !117 (Ticket #97) Thanks for both review passes, @hurui200320, and for the escalation, @CoreRasurae. ### Addressed **Minor Issue 1 from the Approve review — "Streaming still drops tokens for parallel-marked siblings" (reclassified to Major in the follow-up comment) — FIXED** - **Root cause confirmed:** in both `execute_stream()` dispatch sites (`_stream_from_node`'s intermediate-AGENT branch and its non-AGENT branch, `pure_graph.py`), the `parallel_execution: true` subset was collected via `_collect_stream_tokens()` into `results = await asyncio.gather(*tasks)`, but only `results[-1]` (the *last-declared* branch, not even the last-*completing* one) was ever yielded to the caller. Every other concurrent sibling's tokens were silently discarded. - **Spec check performed before fixing, per project process:** neither §6.7 nor §12.3 of the Actor Configuration Standard constrain the *shape* of streamed output for a joined parallel subset — those sections govern dispatch scheduling only (already correctly fixed by `_partition_by_parallel_flag()` in the original commit). However, §6.9 requires pure-graph mode's "externally observable semantics" to be identical to mixed-mode operation, and in mixed mode (§6.10) each node wires into its own internal stream, so parallel siblings' outputs are independently observable rather than collapsed into one. The old behavior broke that equivalence. No ADR in `docs/adr/` governs this — it's a straightforward bug fix aligning code to already-normative spec intent, not a new architectural decision, so no ADR was required. - **Fix:** both sites now yield every parallel branch's collected tokens in full, in declaration order (`asyncio.gather` preserves input task order regardless of completion order), before the sequential subset streams afterward. Verified the sole downstream consumer (`runtime_dispatch.py`'s `async for token in graph.execute_stream(...): yield token`) has no single-token assumption, so emitting more tokens is safe. - **Tests added:** 2 new Behave scenarios (`pure_graph_parallel_node_gate.feature`) — one per streaming dispatch site (non-agent trigger, agent trigger) — asserting the streamed token list includes output from *both* parallel siblings, not just one. Coverage run scoped to this feature confirms the new/changed lines are exercised; the only nearby uncovered lines are the pre-existing `except BaseException` task-cancellation branch, unrelated to this change and not a regression. - **Not changed:** the non-streaming `execute()` path's return-value semantics (`result = results[-1] if results else output_message`) were intentionally left as-is. That method has a single-string return contract used to continue the (necessarily single) execution path forward — it isn't a fan-out-to-external-consumer API like `execute_stream()`, neither review flagged it, and altering it isn't required by §6.7/§12.3's "results joined before continuing" language, which is about scheduling, not the shape of the joined value. ### Not actioned, with justification - **"Consider a follow-up issue" recommendation (both reviews):** rather than deferring, the fix is included directly in this PR. The follow-up comment reclassified the item as Major and stated it "must be fixed," so deferring to a separate issue/PR would leave a Major-severity item unresolved at merge time. - **Coverage/benchmark CI failures (Request Changes review, review 1):** no action needed here — these were already resolved before the Approve review superseded it (coverage job green in 6m41s; benchmark is not a required merge gate). ### Verification performed (all via `nox`, per project convention — nothing invoked directly) - `nox -s lint` — green - `nox -s typecheck` — green (Pyright strict, 0 errors) - `nox -s security_scan` — green (bandit + semgrep, 0 findings) - `nox -s dead_code` — green (vulture) - `nox -s unit_tests -- features/pure_graph_parallel_node_gate.feature` — 10/10 scenarios pass (8 original + 2 new) - `nox -s coverage_report -- features/pure_graph_parallel_node_gate.feature` — confirms the fix's new lines are covered (scoped to this feature's tests, per the delta relevant to this change rather than the full-suite gate) Amended into the existing commit (single commit on this branch) and pushed: `6479902d50f0cda68ae83d52e270d0f29f09b8a4`. CHANGELOG entry updated in place to describe the final behavior (still unreleased/in-progress work, so no separate "fix" entry was added). Ready for re-review.
CoreRasurae deleted branch bugfix/m1-pure-graph-parallel-node-gate 2026-08-06 12:19:25 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
cleveragents/cleveractors-core!117
No description provided.