<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sam_Jia</title>
    <description>The latest articles on DEV Community by Sam_Jia (@campnoumiracle2022).</description>
    <link>https://dev.to/campnoumiracle2022</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4005714%2Ff6bd0bf8-a04d-4106-bfcb-20582371383d.png</url>
      <title>DEV Community: Sam_Jia</title>
      <link>https://dev.to/campnoumiracle2022</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/campnoumiracle2022"/>
    <language>en</language>
    <item>
      <title>I got tired of vibe investing, so I built an AI committee that shows its work</title>
      <dc:creator>Sam_Jia</dc:creator>
      <pubDate>Mon, 29 Jun 2026 19:34:16 +0000</pubDate>
      <link>https://dev.to/campnoumiracle2022/i-got-tired-of-vibe-investing-so-i-built-an-ai-committee-that-shows-its-work-44md</link>
      <guid>https://dev.to/campnoumiracle2022/i-got-tired-of-vibe-investing-so-i-built-an-ai-committee-that-shows-its-work-44md</guid>
      <description>&lt;p&gt;We have vibe coding now — so I guess we have vibe investing too. Most "AI stock picker" tools work the same way: you feed in a ticker, and out comes &lt;strong&gt;"BUY — confidence 87%"&lt;/strong&gt; with no way to see &lt;em&gt;why&lt;/em&gt;. You're not analyzing anything; you're trusting a vibe. If I can't inspect the reasoning, I can't trust the call, and I definitely can't learn from it.&lt;/p&gt;

&lt;p&gt;So I built the opposite: a multi-agent committee where the output isn't a score — it's an auditable trail from raw evidence to a final trade thesis. Bull and bear analysts argue the ticker out, a risk manager signs off, and the final decision is &lt;em&gt;required to cite the specific evidence it rests on&lt;/em&gt;. I called it VerumTrade (Latin &lt;em&gt;verum&lt;/em&gt;, "truth"). It's open source (Apache-2.0), and this post is about how it's put together, not a pitch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea: audit the call instead of trusting the vibe
&lt;/h2&gt;

&lt;p&gt;The design constraint that drove everything: &lt;strong&gt;at every step, you should be able to read the reasoning and inspect the evidence it was built on.&lt;/strong&gt; No black box. That turned out to map naturally onto a multi-agent graph, where each stage produces structured output the next stage consumes.&lt;/p&gt;

&lt;p&gt;The pipeline runs six stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Analysts&lt;/strong&gt; gather market, news, social, fundamental, and catalyst evidence in parallel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence graph&lt;/strong&gt; distills those raw findings into structured, deduplicated facts — each with a stable ID.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bull/Bear debate&lt;/strong&gt; — two agents argue the thesis from opposite sides.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trader plan&lt;/strong&gt; turns the debate into an actionable proposal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk review&lt;/strong&gt; checks sizing, timing, concentration, and downside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision&lt;/strong&gt; records the final rationale plus the full trace.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each arrow in that chain is a structured handoff, not a vibe. The debate step was the one that surprised me most — forcing an explicit adversarial pass (a Bear agent whose only job is to attack the thesis) catches a lot of motivated reasoning that a single "analyst" agent happily glosses over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Standing on a predecessor's shoulders — and what I added
&lt;/h2&gt;

&lt;p&gt;I'll be upfront: VerumTrade started from &lt;a href="https://github.com/TauricResearch/TradingAgents" rel="noopener noreferrer"&gt;TradingAgents&lt;/a&gt;, an excellent open-source multi-agent trading framework. The committee, the bull/bear debate, the risk discussion — that lineage is theirs, and credit where it's due.&lt;/p&gt;

&lt;p&gt;What bugged me about most of these systems (mine included, early on) is that the "reasoning" is just &lt;em&gt;printed&lt;/em&gt;. You get nice markdown reports, but the final BUY/SELL/HOLD is effectively text-extracted, and nothing structurally ties the verdict to the facts that produced it. So I added the layer that was missing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A typed evidence graph.&lt;/strong&gt; Every fact, inference, and conflict is a structured object with an &lt;code&gt;id&lt;/code&gt;, supporting/contradicting fact IDs, a confidence, and a falsifier — not free-floating prose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A decision that must cite its evidence.&lt;/strong&gt; The final decision contract &lt;em&gt;requires&lt;/em&gt; a &lt;code&gt;rationale_evidence_ids&lt;/code&gt; field — a non-empty list of the evidence IDs the call rests on. If the model can't point to what justifies the trade, validation fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A schema-validated trade object.&lt;/strong&gt; Action, order type, time-in-force are enums; &lt;code&gt;stop_loss&lt;/code&gt; and &lt;code&gt;take_profit&lt;/code&gt; are required numeric fields; limit/stop prices are checked for coherence. No "BUY, idk, maybe set a stop somewhere."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A self-audit + decision guard.&lt;/strong&gt; A validation pass records violations, repairs applied, and whether the final action stayed consistent — and can abort with a reason instead of shipping a broken plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point isn't that the predecessor is bad — it's that "show your work" should mean &lt;em&gt;structured, linked, and validated&lt;/em&gt;, not &lt;em&gt;printed&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things I had to get right
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A two-tier LLM setup.&lt;/strong&gt; Running every agent on a frontier model is slow and expensive; running everything on a cheap model is unreliable on the steps that matter. So routine extraction and summarization run on a fast/cheap tier, while the debate and risk judgment run on a stronger tier. This kept cost sane without gutting quality on the decisions that actually move the recommendation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provider independence.&lt;/strong&gt; I started on one provider and immediately regretted hardcoding it. The pipeline now runs against OpenAI-compatible endpoints generally — I've run full pipelines on Qwen and other backends by overriding the base URL. If you're building anything multi-agent, decouple from a single vendor early; retrofitting it later is painful.&lt;/p&gt;

&lt;p&gt;The piece I'm most proud of is a &lt;strong&gt;crowding / macro-pullback awareness&lt;/strong&gt; check — a guard that flags when a thesis is leaning on a crowded, macro-sensitive setup that looks great right up until it doesn't. It came directly from watching the naive version confidently recommend names that were one Fed headline away from unwinding.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like to use
&lt;/h2&gt;

&lt;p&gt;There's a web app, a CLI, and a plain Python API. The programmatic entry point is about as minimal as I could make it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;verumtrade&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;run_pipeline&lt;/span&gt;

&lt;span class="c1"&gt;# Returns the full state plus a structured trade decision
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;run_pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MU&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rationale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# the human-readable thesis
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rationale_evidence_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# the evidence IDs the call rests on
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;traces&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                   &lt;span class="c1"&gt;# evidence -&amp;gt; debate -&amp;gt; decision, step by step
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output isn't just a verdict — &lt;code&gt;result.traces&lt;/code&gt; is the whole reasoning chain, and every decision points back at the evidence that justifies it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest disclaimer
&lt;/h2&gt;

&lt;p&gt;This is a &lt;strong&gt;research and decision-support&lt;/strong&gt; tool, not an oracle and not financial advice. Market data can be delayed or wrong, LLM outputs can be wrong, and trading involves real risk of loss. I treat its output as a structured second opinion — something to challenge, not obey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it's at
&lt;/h2&gt;

&lt;p&gt;It's early and I'm actively building. If the architecture is interesting to you, or you want to poke holes in the multi-agent design, the repo is here: &lt;strong&gt;&lt;a href="https://github.com/muye1202/VerumTrade" rel="noopener noreferrer"&gt;https://github.com/muye1202/VerumTrade&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd genuinely like feedback on the evidence-graph and the "decision must cite its evidence" constraint — what would &lt;em&gt;you&lt;/em&gt; want to see in the trace to actually trust a recommendation? That question is most of why I open-sourced it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
