<?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: CarpseDeam</title>
    <description>The latest articles on DEV Community by CarpseDeam (@carpsedeam).</description>
    <link>https://dev.to/carpsedeam</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%2F3968307%2Fc85131e1-eff4-44bd-99c9-9ba84eda4f20.png</url>
      <title>DEV Community: CarpseDeam</title>
      <link>https://dev.to/carpsedeam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/carpsedeam"/>
    <language>en</language>
    <item>
      <title>How I Used Aura to Build a Lead Discovery Tool Without Burning Tokens</title>
      <dc:creator>CarpseDeam</dc:creator>
      <pubDate>Sun, 07 Jun 2026 19:45:00 +0000</pubDate>
      <link>https://dev.to/carpsedeam/how-i-used-aura-to-build-a-lead-discovery-tool-without-burning-tokens-4be2</link>
      <guid>https://dev.to/carpsedeam/how-i-used-aura-to-build-a-lead-discovery-tool-without-burning-tokens-4be2</guid>
      <description>&lt;p&gt;Signal Desk finds relevant conversations, ranks them as leads, writes reviewable inbox cards, and helps draft outreach replies. I built it with Aura’s phased workflow, visible diffs, validation, and cheap models for about ten cents.&lt;/p&gt;




&lt;p&gt;While building Aura, I try to greenfield real projects with it as often as possible.&lt;/p&gt;

&lt;p&gt;Not toy prompts. Not “make a todo app.” I mean projects that are actually useful, a little messy, and close to the kind of work I do in real life.&lt;/p&gt;

&lt;p&gt;Most of the time, I run the same project twice: once before a major Aura change, and once after. It becomes a practical A/B test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did Aura get faster?&lt;/li&gt;
&lt;li&gt;Did the output get cleaner?&lt;/li&gt;
&lt;li&gt;Did the project shape improve?&lt;/li&gt;
&lt;li&gt;Did I have to fight it less?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the test I care about, because real codebases do not behave like polished demos. They evolve in phases. Requirements shift. Some parts are obvious, some are fuzzy, and the tool has to stay useful through all of it.&lt;/p&gt;

&lt;p&gt;For this release, the dogfood project was &lt;strong&gt;Signal Desk&lt;/strong&gt;, a local lead discovery and outreach tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Signal Desk Does
&lt;/h2&gt;

&lt;p&gt;Signal Desk scans sources like RSS and Hacker News, turns relevant posts into candidates, scores them as potential leads, writes reviewable inbox cards, and helps draft replies.&lt;/p&gt;

&lt;p&gt;The product loop is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sources → candidates → dedupe → scoring → findings → inbox cards → show / ignore / reply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the kind of workflow I like testing Aura against. It is small enough to build quickly, but real enough to expose whether the generated code has an actual product shape.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;For this run, I used cheap models for both planning and implementation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftv1bgwndfye9mscgypjp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftv1bgwndfye9mscgypjp.png" alt=" " width="229" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aura running Planner and Worker on DeepSeek V4 Flash. The full dogfood build cost about ten cents in model usage._&lt;/p&gt;

&lt;p&gt;That cost matters, but the point is not just “cheap tokens.”&lt;/p&gt;

&lt;p&gt;The point is that cheap models are getting good enough that the harness around them matters more and more. If Aura can keep the work focused, visible, and validated, low-cost models can go much further than people expect.&lt;/p&gt;

&lt;p&gt;The model is the fuel.&lt;/p&gt;

&lt;p&gt;Aura is the harness that turns it into controlled work.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Aura Workflow for Larger Projects
&lt;/h2&gt;

&lt;p&gt;For larger projects, I usually do &lt;strong&gt;not&lt;/strong&gt; ask Aura to build the whole thing in one giant prompt.&lt;/p&gt;

&lt;p&gt;My workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write a real spec.&lt;/li&gt;
&lt;li&gt;Ask Aura to split it into phases.&lt;/li&gt;
&lt;li&gt;Dispatch one phase at a time.&lt;/li&gt;
&lt;li&gt;Let Aura execute the slice.&lt;/li&gt;
&lt;li&gt;Inspect the output, validation, files, and commits.&lt;/li&gt;
&lt;li&gt;Move to the next phase.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This keeps the model focused, and it keeps me in control.&lt;/p&gt;

&lt;p&gt;Instead of reviewing a huge mystery blob at the end, I can inspect each slice as it lands.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Phase Plan
&lt;/h2&gt;

&lt;p&gt;Signal Desk was split into phases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phase 1:&lt;/strong&gt; Project skeleton and init command&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 2:&lt;/strong&gt; Data models and storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 3:&lt;/strong&gt; Source adapters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 4:&lt;/strong&gt; Scoring and ranking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 5:&lt;/strong&gt; Reply drafting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 6:&lt;/strong&gt; Inbox and remaining CLI commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 7:&lt;/strong&gt; Tests and polish&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzb4s898w000zclpkrf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzb4s898w000zclpkrf5.png" alt=" " width="456" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aura starts from a real spec, then turns it into a focused phase with concrete files and validation targets._&lt;/p&gt;

&lt;p&gt;That phase structure matters. Aura is not just being asked to “make an app.” Each dispatch has a focused job.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Flow Is the Feature
&lt;/h2&gt;

&lt;p&gt;My favorite part of using Aura is the flow.&lt;/p&gt;

&lt;p&gt;When Aura is working well, it feels smooth and quick. Planner shapes the slice, Worker moves through the files, validation runs, the project tree changes, and the output starts becoming real.&lt;/p&gt;

&lt;p&gt;That is the feeling I am chasing: AI coding that does not feel like wrestling. It feels like watching the work click into place.&lt;/p&gt;

&lt;p&gt;A good run looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spec → phase → files → validation → next phase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not chaos. Not blind trust. Not “hope the agent did the right thing.”&lt;/p&gt;

&lt;p&gt;Just a controlled build loop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc353zaw06wgfme3t00w3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc353zaw06wgfme3t00w3.png" alt=" " width="469" height="1109"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Phase 1 completed with acceptance criteria checked, validation run, and a clean handoff to the next phase.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What Aura Built
&lt;/h2&gt;

&lt;p&gt;By the end, Signal Desk had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an installable Python package&lt;/li&gt;
&lt;li&gt;&lt;code&gt;signal-desk init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;local config and workspace setup&lt;/li&gt;
&lt;li&gt;SQLite storage&lt;/li&gt;
&lt;li&gt;RSS and Hacker News sources&lt;/li&gt;
&lt;li&gt;candidate deduplication&lt;/li&gt;
&lt;li&gt;deterministic scoring&lt;/li&gt;
&lt;li&gt;markdown inbox cards&lt;/li&gt;
&lt;li&gt;reply drafting&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scan&lt;/code&gt;, &lt;code&gt;watch&lt;/code&gt;, &lt;code&gt;inbox&lt;/code&gt;, &lt;code&gt;show&lt;/code&gt;, &lt;code&gt;ignore&lt;/code&gt;, and &lt;code&gt;reply&lt;/code&gt; commands&lt;/li&gt;
&lt;li&gt;109 tests passing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw3j6i55ir4c1ehhre2ct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw3j6i55ir4c1ehhre2ct.png" alt=" " width="800" height="696"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caption: By the end, Signal Desk had a full project structure and 109 tests passing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The final user loop looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scan sources → rank leads → review inbox → inspect details → ignore or draft a reply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the difference between generated files and a usable product slice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: The Main Product Loop
&lt;/h2&gt;

&lt;p&gt;This is the kind of output I am looking for from Aura.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;scan&lt;/code&gt; command is not just a placeholder. It follows the actual product flow.&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_run_scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config_dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;started_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init_db&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_db_path&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;logging_setup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setup_logging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_logs_dir&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="n"&gt;sources_cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config_dict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sources&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="n"&gt;scoring_cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config_dict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scoring&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="n"&gt;dedupe_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scoring_cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dedupe_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;source_instances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sources_cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enabled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;source_instances&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RSSSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sources_cfg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;config_dict&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sources_cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hackernews&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enabled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;source_instances&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HNSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sources_cfg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hackernews&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;config_dict&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;all_candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;source_instances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;all_candidates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;new_candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;all_candidates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;find_candidate_by_url_or_normalized_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;dedupe_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;new_candidates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;findings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rank_candidates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_candidates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;finding&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nf"&gt;write_inbox_card&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_inbox_dir&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="nf"&gt;insert_scan_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scan_run&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What I like here is the shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config → sources → candidates → dedupe → scoring → inbox → scan record
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a real product loop. The code is not trying to be impressive. It is trying to be useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: Domain-Shaped State
&lt;/h2&gt;

&lt;p&gt;Signal Desk has a simple domain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sources produce candidates&lt;/li&gt;
&lt;li&gt;candidates become findings&lt;/li&gt;
&lt;li&gt;findings go into the inbox&lt;/li&gt;
&lt;li&gt;scan runs record what happened
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Candidate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;source_item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;fetched_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;


&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Finding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;candidate_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;best_angle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;avoid_note&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;draft_reply&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;new&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ScanRun&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;started_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;finished_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;candidates_found&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;new_candidates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;findings_created&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is boring in the right way.&lt;/p&gt;

&lt;p&gt;The names match the product. The state is explicit. The rest of the project has something clean to build around.&lt;/p&gt;

&lt;p&gt;That is the kind of code I want from AI: not generic &lt;code&gt;DataManager&lt;/code&gt; soup, but simple concepts that belong to the thing being built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: Scoring That Explains Itself
&lt;/h2&gt;

&lt;p&gt;For a lead discovery tool, scoring needs to be inspectable. I do not just want a number. I want to know &lt;strong&gt;why&lt;/strong&gt; something landed in the inbox.&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;score_candidate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Candidate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;aura_cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aura&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;

    &lt;span class="n"&gt;include_kw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aura_cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;include_keywords&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;pain_kw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aura_cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pain_keywords&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;avoid_kw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aura_cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avoid_keywords&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;combined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;

    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;reason_parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;avoid_note_parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;_check_exact_matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;include_kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;
        &lt;span class="n"&gt;reason_parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Matched &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; in title (+35)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;_check_exact_matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;include_kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
        &lt;span class="n"&gt;reason_parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Matched &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; in body (+20)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;_has_alternative_intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;combined&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
        &lt;span class="n"&gt;reason_parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alternative intent detected (+10)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;_check_exact_matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;combined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avoid_kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;
        &lt;span class="n"&gt;avoid_note_parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Avoid keyword &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; matched (-40)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reason&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reason_parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No strong signals detected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;best_angle&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;best_angle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avoid_note&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;avoid_note_parts&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is exactly what I want for this kind of tool.&lt;/p&gt;

&lt;p&gt;The scoring is deterministic. The reasons are visible. The user can inspect why something matched before deciding whether to respond.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: Reviewable Inbox Cards
&lt;/h2&gt;

&lt;p&gt;Signal Desk does not just dump rows into a database. It writes markdown cards that can be reviewed directly.&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;format_finding_card&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Finding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;include_draft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;priority_emoji&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🟢&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🟡&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;⚪&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;⚪&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;# &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;priority_emoji&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; · score &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**Source:** &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**Title:** &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**URL:** &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**Status:** &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;## Why this matters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reason&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No reason recorded.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;## Best angle&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;best_angle&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No angle recorded.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;## Avoid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;avoid_note&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;None&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;include_draft&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draft_reply&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;## Draft reply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draft_reply&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is product thinking.&lt;/p&gt;

&lt;p&gt;The user’s job is not “own a database.” The user’s job is to review useful conversations and decide whether to respond.&lt;/p&gt;

&lt;p&gt;The output supports that job.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslcjxu0uop4voeemdjg1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslcjxu0uop4voeemdjg1.png" alt=" " width="706" height="888"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Signal Desk generated ranked lead cards from scanned conversations.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Example: Reply Drafting
&lt;/h2&gt;

&lt;p&gt;Signal Desk also helps draft replies from a finding.&lt;/p&gt;

&lt;p&gt;It supports different styles and a no-Aura mode for cases where I want to respond without mentioning the project directly.&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Finding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;helpful&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;no_aura&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_build_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;no_aura&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;no_aura_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;technical&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;technical_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;short&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;short_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;helpful_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;no_aura&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aura&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;no_aura_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, this connects back to the workflow.&lt;/p&gt;

&lt;p&gt;Signal Desk is not just finding leads. It helps move from discovery to outreach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;What I liked about this run was not that Aura generated a lot of code.&lt;/p&gt;

&lt;p&gt;It was that the code had a shape I could keep working with.&lt;/p&gt;

&lt;p&gt;The CLI followed the user flow. The models matched the domain. The storage layer served the product. The scoring explained itself. The inbox output was reviewable. The reply drafting connected back to the findings.&lt;/p&gt;

&lt;p&gt;That is what I want from AI coding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;not a pile of files&lt;/li&gt;
&lt;li&gt;not blind trust&lt;/li&gt;
&lt;li&gt;not an expensive black box&lt;/li&gt;
&lt;li&gt;not code I have to babysit forever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I want a useful slice I still control.&lt;/p&gt;

&lt;p&gt;That is what Aura is built around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Aura Is Headed
&lt;/h2&gt;

&lt;p&gt;Aura is an open-source desktop AI coding harness.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ask for something real.
Break it into phases.
Keep control.
Review the work.
Validate the result.
Spend almost nothing.
Get code that feels like it belongs in the repo.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the workflow I want to build with every day.&lt;/p&gt;

&lt;p&gt;Aura is open source on GitHub:&lt;/p&gt;

&lt;p&gt;[(&lt;a href="https://github.com/CarpseDeam/Aura-IDE)" rel="noopener noreferrer"&gt;https://github.com/CarpseDeam/Aura-IDE)&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>python</category>
    </item>
    <item>
      <title>Building Aura: An Open Source AI Coding Harness You Can Control</title>
      <dc:creator>CarpseDeam</dc:creator>
      <pubDate>Thu, 04 Jun 2026 13:43:28 +0000</pubDate>
      <link>https://dev.to/carpsedeam/building-aura-an-open-source-ai-coding-harness-you-can-control-21gl</link>
      <guid>https://dev.to/carpsedeam/building-aura-an-open-source-ai-coding-harness-you-can-control-21gl</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published on Hashnode: [(&lt;a href="https://aura-ide.hashnode.dev/building-aura-an-open-source-ai-coding-harness-you-can-control?utm_source=hashnode&amp;amp;utm_medium=feed)" rel="noopener noreferrer"&gt;https://aura-ide.hashnode.dev/building-aura-an-open-source-ai-coding-harness-you-can-control?utm_source=hashnode&amp;amp;utm_medium=feed)&lt;/a&gt;]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Own the Harness: An AI Coding Tool Where You See the Plan, Inspect the Edits, and Trust the Result
&lt;/h2&gt;

&lt;p&gt;AI coding tools are powerful, but the workflow often feels fragile.&lt;br&gt;
You ask for a change. The agent reads some files. It edits something. Maybe it runs a command. Maybe it says the task is done.&lt;/p&gt;

&lt;p&gt;But as the user, you are often left wondering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What did it actually plan?&lt;/li&gt;
&lt;li&gt;What files did it touch?&lt;/li&gt;
&lt;li&gt;Did the write really apply?&lt;/li&gt;
&lt;li&gt;Did validation run?&lt;/li&gt;
&lt;li&gt;Is it fixing a real issue, or thrashing on noise?&lt;/li&gt;
&lt;li&gt;What changed between the tool I trusted yesterday and the one I am using today?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aura is my attempt to build an AI coding environment around that trust problem.&lt;/p&gt;

&lt;p&gt;It is a local, open source AI coding harness with a Planner/Worker architecture, safe file edits, visible workflow state, provider flexibility, persistent project memory, MCP integration, and Craft, a code quality pass designed to reduce common AI generated code slop.&lt;/p&gt;

&lt;p&gt;The goal is not just to make a model write code.&lt;/p&gt;

&lt;p&gt;The goal is to make the whole process inspectable.&lt;/p&gt;




&lt;h2&gt;
  
  
  The core idea: own the harness
&lt;/h2&gt;

&lt;p&gt;Most AI coding workflows are controlled by someone else.&lt;/p&gt;

&lt;p&gt;The interface changes. The model behavior changes. The limits change. The workflow you built habits around can suddenly feel different.&lt;/p&gt;

&lt;p&gt;Aura is open source because I want the opposite.&lt;/p&gt;

&lt;p&gt;If a version works for you, you can keep it. If a provider changes, you can switch. If the workflow does not fit your brain, you can modify it.&lt;/p&gt;

&lt;p&gt;Aura treats the harness itself as the product.&lt;/p&gt;

&lt;p&gt;Not just the model.&lt;/p&gt;

&lt;p&gt;Not just the chat box.&lt;/p&gt;

&lt;p&gt;The harness: how context is gathered, how plans are formed, how edits are applied, how failures are reported, how quality is checked, and how the user stays in control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Planner and Worker
&lt;/h2&gt;

&lt;p&gt;Aura separates thinking from execution.&lt;/p&gt;

&lt;p&gt;The Planner is responsible for understanding the request, inspecting context, and writing a focused implementation spec.&lt;/p&gt;

&lt;p&gt;The Worker is responsible for doing the actual codebase work: reading files, applying edits, running commands, and reporting what happened.&lt;/p&gt;

&lt;p&gt;That split matters because single agent coding often collapses different jobs into one messy loop. The same model is trying to understand the user, search the repo, decide architecture, edit files, debug tools, and summarize results.&lt;/p&gt;

&lt;p&gt;Aura gives those responsibilities clearer boundaries.&lt;/p&gt;

&lt;p&gt;The Planner should answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is being changed?&lt;/li&gt;
&lt;li&gt;Why?&lt;/li&gt;
&lt;li&gt;Which files are likely involved?&lt;/li&gt;
&lt;li&gt;What does done look like?&lt;/li&gt;
&lt;li&gt;Should the Worker actually be dispatched?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Worker should answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What did I read?&lt;/li&gt;
&lt;li&gt;What did I edit?&lt;/li&gt;
&lt;li&gt;Did the write apply?&lt;/li&gt;
&lt;li&gt;What validation ran?&lt;/li&gt;
&lt;li&gt;What still needs attention?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recent Planner diagnostic tools like &lt;code&gt;get_workspace_snapshot&lt;/code&gt; and &lt;code&gt;run_diagnostic_command&lt;/code&gt; help the Planner inspect the current workspace state before deciding whether to dispatch the Worker.&lt;/p&gt;

&lt;p&gt;That matters because good planning starts with knowing what is actually true about the repo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Safe writes and visible outcomes
&lt;/h2&gt;

&lt;p&gt;One of Aura's most important rules is simple:&lt;/p&gt;

&lt;p&gt;A write result is not success unless the write actually applied.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but it is one of the places AI coding workflows can quietly lose user trust.&lt;/p&gt;

&lt;p&gt;A tool can return cleanly while still not changing a file. A patch can fail to apply. A symbol edit can miss its target. A validation command can fail for reasons that are unrelated to the edit.&lt;/p&gt;

&lt;p&gt;Aura tracks write outcomes explicitly. The workflow is designed around making those states visible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;applied&lt;/li&gt;
&lt;li&gt;not applied&lt;/li&gt;
&lt;li&gt;needs follow-up&lt;/li&gt;
&lt;li&gt;validation failed&lt;/li&gt;
&lt;li&gt;Craft blocked&lt;/li&gt;
&lt;li&gt;edit mechanics failed&lt;/li&gt;
&lt;li&gt;harness error&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This avoids one of the worst AI coding failure modes: fake completion.&lt;/p&gt;

&lt;p&gt;If Aura did not apply the patch, it should not pretend it did.&lt;/p&gt;




&lt;h2&gt;
  
  
  Craft: code quality without thrash
&lt;/h2&gt;

&lt;p&gt;Craft exists because LLM generated code often has a texture.&lt;/p&gt;

&lt;p&gt;It may be functional, but still full of little tells:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;narration comments&lt;/li&gt;
&lt;li&gt;placeholder scaffolding&lt;/li&gt;
&lt;li&gt;generic helper soup&lt;/li&gt;
&lt;li&gt;decorative banners&lt;/li&gt;
&lt;li&gt;pointless abstraction&lt;/li&gt;
&lt;li&gt;swallowed exceptions&lt;/li&gt;
&lt;li&gt;fake completeness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Craft is Aura's quality pass. Its job is to clean common AI slop and catch real hazards without becoming abrasive.&lt;/p&gt;

&lt;p&gt;The design philosophy is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;if Craft can safely clean it, clean it silently&lt;/li&gt;
&lt;li&gt;if Craft merely dislikes the style, warn&lt;/li&gt;
&lt;li&gt;if Craft knows it will break, block&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That distinction is important.&lt;/p&gt;

&lt;p&gt;Early versions of Craft were too strict and could cause repair loops. A low confidence static analysis warning could be treated like a hard failure, which made the Worker thrash instead of move forward.&lt;/p&gt;

&lt;p&gt;Recent work adjusted the system so lower confidence diagnostics become warnings, while hard blockers remain hard.&lt;/p&gt;

&lt;p&gt;Hard blockers include things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;syntax errors&lt;/li&gt;
&lt;li&gt;obvious stub bodies&lt;/li&gt;
&lt;li&gt;explicit contract violations&lt;/li&gt;
&lt;li&gt;unsafe destructive operations&lt;/li&gt;
&lt;li&gt;introduced undefined names&lt;/li&gt;
&lt;li&gt;introduced broken imports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Warnings include things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;guessed call signature concerns&lt;/li&gt;
&lt;li&gt;missing attribute concerns&lt;/li&gt;
&lt;li&gt;generic style issues&lt;/li&gt;
&lt;li&gt;advisory code quality observations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Craft should make the code better without making Aura feel like it is fighting itself.&lt;/p&gt;

&lt;p&gt;The goal is not to create a second angry compiler.&lt;/p&gt;

&lt;p&gt;The goal is to make generated code feel less generated.&lt;/p&gt;




&lt;h2&gt;
  
  
  Memory without wasting tokens
&lt;/h2&gt;

&lt;p&gt;Aura also persists project understanding locally.&lt;/p&gt;

&lt;p&gt;There are three layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A BM25 codebase index so search stays fast across restarts.&lt;/li&gt;
&lt;li&gt;An AST based repo map that gives the Planner a compact structural view of the project.&lt;/li&gt;
&lt;li&gt;A SQLite FTS5 project memory database for completed tasks and saved notes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal is to avoid paying the model to rediscover the same project every session.&lt;/p&gt;

&lt;p&gt;Aura can keep useful project context local, searchable, and reusable. Code and memory stay on the machine unless explicitly sent to a model provider.&lt;br&gt;
The BM25 cache makes codebase search fast.&lt;br&gt;
The repo map gives the Planner a lightweight structural view of classes, functions, and signatures.&lt;/p&gt;

&lt;p&gt;The project memory database stores completed Worker dispatch records, including goals, specs, touched files, outcomes, and notes. That means Aura can eventually recall past decisions instead of rediscovering them from scratch.&lt;/p&gt;

&lt;p&gt;Memory is not just about convenience.&lt;/p&gt;

&lt;p&gt;It is about continuity.&lt;/p&gt;




&lt;h2&gt;
  
  
  MCP and tool ecosystems
&lt;/h2&gt;

&lt;p&gt;Aura is also designed to fit into the broader tool ecosystem through MCP.&lt;/p&gt;

&lt;p&gt;The goal is not for Aura to be a closed island. Aura can use external tools, expose useful capabilities, and participate in workflows that extend beyond one app or one provider.&lt;/p&gt;

&lt;p&gt;That fits the same core idea: the harness should belong to the developer.&lt;/p&gt;

&lt;p&gt;Tools, providers, project memory, and workflow rules should be composable instead of trapped behind a single interface.&lt;/p&gt;




&lt;h2&gt;
  
  
  Provider flexibility
&lt;/h2&gt;

&lt;p&gt;Aura is not tied to one model company.&lt;/p&gt;

&lt;p&gt;The harness is designed so providers can change. You can use remote APIs, local models, or whatever makes sense for the job.&lt;/p&gt;

&lt;p&gt;That matters because the AI coding space changes constantly. Models improve, regress, get repriced, disappear, or shift behavior.&lt;/p&gt;

&lt;p&gt;Aura's goal is to keep the workflow stable even when the provider changes.&lt;/p&gt;

&lt;p&gt;If the model changes, the harness should still make the work inspectable.&lt;/p&gt;

&lt;p&gt;If the provider changes, the project memory should still be yours.&lt;/p&gt;

&lt;p&gt;If a version works for you, you should be able to keep it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why local first matters
&lt;/h2&gt;

&lt;p&gt;Local first does not mean every model must run locally.&lt;/p&gt;

&lt;p&gt;It means the project, memory, workflow, and control surface live with the user.&lt;/p&gt;

&lt;p&gt;Aura can use APIs, but the harness does not belong to the API provider. The repo, project memory, rules, workflow state, and release version stay yours.&lt;/p&gt;

&lt;p&gt;That is the difference between renting a coding workflow and owning one.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Aura is trying to become
&lt;/h2&gt;

&lt;p&gt;The long term direction is an AI coding harness that can be shaped around the way a developer actually works.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open source core&lt;/li&gt;
&lt;li&gt;visible planning&lt;/li&gt;
&lt;li&gt;safe writes&lt;/li&gt;
&lt;li&gt;provider swapping&lt;/li&gt;
&lt;li&gt;local project memory&lt;/li&gt;
&lt;li&gt;code quality checks&lt;/li&gt;
&lt;li&gt;workflow customization&lt;/li&gt;
&lt;li&gt;eventually, training data from Aura's own successful sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most interesting future version of Aura is not just an app.&lt;/p&gt;

&lt;p&gt;It is a harness that can teach models how to behave inside it.&lt;/p&gt;

&lt;p&gt;Aura already records structured dispatch data around completed work: goals, specs, touched files, outcomes, validation, and repair notes. Over time, those records can become curated training examples.&lt;/p&gt;

&lt;p&gt;The future version of this is an Aura native dataset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;task&lt;/li&gt;
&lt;li&gt;repo context&lt;/li&gt;
&lt;li&gt;plan&lt;/li&gt;
&lt;li&gt;tool calls&lt;/li&gt;
&lt;li&gt;write outcomes&lt;/li&gt;
&lt;li&gt;Craft results&lt;/li&gt;
&lt;li&gt;validation&lt;/li&gt;
&lt;li&gt;final summaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That data could eventually train Aura native chat, planner, and coder models.&lt;/p&gt;

&lt;p&gt;Not a generic coding model.&lt;/p&gt;

&lt;p&gt;A model that understands Aura's workflow.&lt;/p&gt;

&lt;p&gt;A model trained not only to write code, but to behave inside a real coding harness: read before editing, patch carefully, respect tool results, avoid false success, validate when possible, and stop thrashing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The point
&lt;/h2&gt;

&lt;p&gt;Aura exists because AI coding should not feel like guessing whether the agent actually did the work.&lt;/p&gt;

&lt;p&gt;You should be able to see the plan, inspect the edits, understand the result, and keep control of the workflow.&lt;/p&gt;

&lt;p&gt;That is the bet.&lt;/p&gt;

&lt;p&gt;Own the harness.&lt;/p&gt;

&lt;p&gt;See what changed.&lt;/p&gt;

&lt;p&gt;Trust what applied.&lt;/p&gt;

&lt;p&gt;Aura is open source:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/CarpseDeam/Aura-IDE" rel="noopener noreferrer"&gt;https://github.com/CarpseDeam/Aura-IDE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the project resonates with you and you want to support continued development:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://buymeacoffee.com/snowballkori" rel="noopener noreferrer"&gt;https://buymeacoffee.com/snowballkori&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>python</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
