fix(langgraph): guard replace_state() against closed StateManager in execute() #10768

Merged
HAL9000 merged 3 commits from bugfix/m3-langgraph-execute-state-bypass into master 2026-05-05 04:04:13 +00:00

3 Commits

Author SHA1 Message Date
HAL9000 6c0196dcd6 fix(langgraph): guard replace_state() against closed StateManager in execute()
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 1m2s
CI / build (pull_request) Successful in 1m7s
CI / helm (pull_request) Successful in 41s
CI / quality (pull_request) Successful in 1m14s
CI / push-validation (pull_request) Successful in 36s
CI / typecheck (pull_request) Successful in 1m29s
CI / security (pull_request) Successful in 1m42s
CI / e2e_tests (pull_request) Successful in 4m55s
CI / unit_tests (pull_request) Successful in 5m29s
CI / integration_tests (pull_request) Successful in 7m40s
CI / docker (pull_request) Successful in 2m17s
CI / coverage (pull_request) Successful in 16m59s
CI / status-check (pull_request) Successful in 5s
CI / benchmark-regression (pull_request) Successful in 1h12m33s
Replace direct state assignment in LangGraph.execute() with
state_manager.replace_state(), which enforces the is_closed guard and
notifies state stream subscribers through the proper StateManager API,
preventing silent state corruption after StateManager.close() is called.

replace_state() is the semantically correct method for this use case:
it atomically replaces the entire state for a fresh execution context,
enforces the is_closed guard, and notifies subscribers. update_state()
is designed for incremental updates with execution_count tracking, not
for resetting state to a fresh execution context.

Closes #9994
2026-05-05 01:20:40 +00:00
HAL9000 9e67909c8e style: fix ruff format quote style in tdd_langgraph_execute_closed_state_steps.py
CI / benchmark-publish (pull_request) Has been skipped
CI / push-validation (pull_request) Successful in 25s
CI / helm (pull_request) Successful in 35s
CI / build (pull_request) Successful in 53s
CI / lint (pull_request) Successful in 1m3s
CI / quality (pull_request) Successful in 1m13s
CI / typecheck (pull_request) Successful in 1m31s
CI / security (pull_request) Successful in 1m32s
CI / e2e_tests (pull_request) Successful in 4m54s
CI / integration_tests (pull_request) Successful in 5m0s
CI / unit_tests (pull_request) Successful in 5m53s
CI / docker (pull_request) Successful in 1m35s
CI / coverage (pull_request) Successful in 11m36s
CI / status-check (pull_request) Successful in 3s
CI / benchmark-regression (pull_request) Successful in 1h3m5s
Apply ruff format to fix single-quote vs double-quote inconsistency in
f-string in step assertion, resolving CI lint/format check failure.
2026-04-23 16:44:18 +00:00
HAL9000 09c58ea81c fix(langgraph): use update_state() in LangGraph.execute() instead of direct state assignment
CI / lint (pull_request) Failing after 1s
CI / quality (pull_request) Failing after 1s
CI / integration_tests (pull_request) Failing after 0s
CI / helm (pull_request) Failing after 0s
CI / push-validation (pull_request) Failing after 0s
CI / build (pull_request) Successful in 3m42s
CI / typecheck (pull_request) Successful in 4m26s
CI / e2e_tests (pull_request) Failing after 3m59s
CI / security (pull_request) Successful in 4m29s
CI / coverage (pull_request) Has been skipped
CI / unit_tests (pull_request) Successful in 7m45s
CI / docker (pull_request) Has been skipped
CI / status-check (pull_request) Failing after 0s
CI / benchmark-publish (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Successful in 1h5m58s
Add is_closed guard to StateManager.replace_state() so that LangGraph.execute() — which delegates to replace_state() — raises RuntimeError when the StateManager has been closed. This prevents silent state corruption after StateManager.close() is called.

Add Behave BDD scenarios verifying the guard and the happy path.

ISSUES CLOSED: #9994
2026-04-22 23:42:41 +00:00