Skip to content

Run manager: decision extraction, memory-log parity, analyst-subset crash - #5

Open
cdwashi wants to merge 3 commits into
TheLocalLab:mainfrom
cdwashi:fix/run-state-handling
Open

cdwashi wants to merge 3 commits into
TheLocalLab:mainfrom
cdwashi:fix/run-state-handling

Conversation

@cdwashi

@cdwashi cdwashi commented Jul 14, 2026

Copy link
Copy Markdown

Hi! I found these while running the GUI on my home server (Kubernetes/Olares, remote Ollama). All fixes are validated in that deployment and the full test suite passes on this branch. First-time contributor — happy to adjust anything, and maintainer edits are welcome.

  1. Every run displays "No Decision". graph.stream() yields chunks keyed by node name, so final_state.get("final_trade_decision") can never hit — for any model or market view. The verdict is now parsed from the Portfolio Manager's judge_decision text via the shared deterministic parse_rating. The settle-time report copy used the same wrong shape and is fixed too.
  2. History tab permanently empty / memory never used in GUI runs. The GUI streams the graph directly, bypassing propagate() — so store_decision never ran (no trading_memory.md), past_context was never injected (agents never saw prior decisions), and pending outcomes were never resolved. All three now happen in the GUI run path, failure-isolated so memory issues can't block an analysis.
  3. KeyError when fewer than 4 analysts are selected. Bull/bear researchers, all three risk debators, and the final-state report extraction hard-read every report key. Reproduce: run with analysts=["market"]KeyError: 'sentiment_report'. All report reads now .get() with an explicit "(not produced this run)" marker.

Full test suite green on each commit.

cdogwash72 and others added 3 commits July 14, 2026 01:34
final_state accumulates {node_name: state} chunks, so
final_state.get('final_trade_decision') could never hit - every run
displayed 'No Decision' regardless of model or market view. Parse the
5-tier rating from the Portfolio Manager's judge_decision text via the
shared deterministic parse_rating; also fix the settle-time report copy
that used the same wrong shape.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The GUI streams graph.graph.stream() directly, bypassing propagate() -
so store_decision never ran (trading_memory.md never created), agents
never received past_context, and pending outcomes were never resolved.
All three now happen in the GUI run path, failure-isolated so memory
problems can never block an analysis.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The GUI (and library callers) allow any analyst subset, but the bull/
bear researchers, all three risk debators, and the final-state report
extraction hard-read every report key - selecting fewer than 4 analysts
raised KeyError mid-debate. All report reads now .get() with an explicit
'(not produced this run)' marker.

Reproduce (before): run with analysts=['market'] -> KeyError:
'sentiment_report' in bull_researcher.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant