<?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: Aaron</title>
    <description>The latest articles on DEV Community by Aaron (@aaron_815c6e462bfcdfb46ba).</description>
    <link>https://dev.to/aaron_815c6e462bfcdfb46ba</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3934236%2F868e9341-4d7e-46d8-87f5-d806bf8928d6.png</url>
      <title>DEV Community: Aaron</title>
      <link>https://dev.to/aaron_815c6e462bfcdfb46ba</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aaron_815c6e462bfcdfb46ba"/>
    <language>en</language>
    <item>
      <title>Dev.to: We had AI pitching our customers' aunts. Here's the three-axis classification fix.</title>
      <dc:creator>Aaron</dc:creator>
      <pubDate>Sun, 17 May 2026 04:20:46 +0000</pubDate>
      <link>https://dev.to/aaron_815c6e462bfcdfb46ba/devto-we-had-ai-pitching-our-customers-aunts-heres-the-three-axis-classification-fix-3h6l</link>
      <guid>https://dev.to/aaron_815c6e462bfcdfb46ba/devto-we-had-ai-pitching-our-customers-aunts-heres-the-three-axis-classification-fix-3h6l</guid>
      <description>&lt;h2&gt;
  
  
  The bug report
&lt;/h2&gt;

&lt;p&gt;A customer wrote in:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why is the tool drafting a SaaS sales pitch to my aunt?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I didn't know whether to laugh or hide. We'd just shipped warm-market draft-generation in our Chrome extension — a tool that scrapes a user's Facebook + LinkedIn connections and drafts personalized outreach messages they can edit and send. The AI was supposed to read each contact's profile, infer the relationship, and tune the message accordingly.&lt;/p&gt;

&lt;p&gt;The customer was an MLM team leader. We'd correctly inferred their aunt ran a small business. So we drafted a polished, professional pitch about how our customer's MLM product could help her growing operation.&lt;/p&gt;

&lt;p&gt;The aunt thought our customer had been hacked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we shipped first (and why it didn't work)
&lt;/h2&gt;

&lt;p&gt;The first version had ONE classification field on each contact: &lt;code&gt;segment&lt;/code&gt;. Values like &lt;code&gt;family&lt;/code&gt;, &lt;code&gt;friend&lt;/code&gt;, &lt;code&gt;coworker&lt;/code&gt;, &lt;code&gt;biz_owner&lt;/code&gt;, &lt;code&gt;influencer&lt;/code&gt;. The drafter prompt would adjust tone based on whichever segment was set.&lt;/p&gt;

&lt;p&gt;The bug above happened because the AI fit-assessment step looked at the aunt's profile bio ("Owner @ Lake View Florals") and set &lt;code&gt;segment = 'biz_owner'&lt;/code&gt;. The drafter then dutifully produced a pitch that would land fine to a stranger named Lake View Florals — but read as deeply weird to a family member who happened to also run a business.&lt;/p&gt;

&lt;p&gt;Our first patch was to add a "family override": if the operator had explicitly tagged a contact as family, force &lt;code&gt;segment = 'family'&lt;/code&gt;. This worked! ...for the contacts the operator had pre-tagged.&lt;/p&gt;

&lt;p&gt;The deeper bug remained: the AI was inferring relationship from the wrong data. A profile bio tells you what someone DOES, not who they ARE to YOU.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three axes
&lt;/h2&gt;

&lt;p&gt;The fix took two more iterations to land. Here's what we ended up with:&lt;/p&gt;

&lt;p&gt;Each contact gets three independent classification dimensions, never conflated:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Relationship&lt;/strong&gt; — who they ARE to you. Family, close friend, friend, coworker, former coworker, acquaintance, business contact. This can ONLY come from operator input. AI cannot guess this from a profile.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Approach&lt;/strong&gt; — what pitch angle to weave in if any. None, MLM, biz_owner, partner, playbook. The AI fit-assessment step CAN seed this from a profile bio. But it's ONLY about the &lt;em&gt;content&lt;/em&gt; of the pitch, not whether to pitch at all.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt; — close-pressure dial. Build the relationship long-term, pure relationship (never pitch even if approach is set), or sell close now. This is operator-set per contact and modulates output independently of approach.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The hard rule: &lt;strong&gt;family or close friend hard-overrides approach&lt;/strong&gt; to no-pitch tone, REGARDLESS of what approach the AI assessed from the profile. The aunt scenario triggers this: even if approach=biz_owner, relationship=family means the drafter generates a no-pitch family-tone message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why three axes, not one
&lt;/h2&gt;

&lt;p&gt;The original "one segment field" assumption smuggled in a bunch of tacit equivalences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;relationship = family → pitch tone = no_pitch&lt;/li&gt;
&lt;li&gt;relationship = biz_owner → pitch tone = sales&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are usually right but break in edge cases. A family member who runs a business. A close friend who wants you to recruit them. A business contact you've decided to keep purely social.&lt;/p&gt;

&lt;p&gt;Three axes makes those edge cases expressible. Family aunt who runs a business: relationship=family, approach=biz_owner (irrelevant, hard-overridden), goal=pure_relationship (extra protection). The drafter sees those three values and writes "hey, hope the shop is doing well!" instead of "I'd love to introduce you to a tool that's grown my MLM team 3x."&lt;/p&gt;

&lt;h2&gt;
  
  
  Production data after the fix
&lt;/h2&gt;

&lt;p&gt;Customer-facing complaint rate on warm-market drafts went from ~7% to under 1%. The 1% that remain are mostly the AI guessing wrong on approach (e.g., flagging a hobbyist's portfolio site as a real business). The three-axis structure makes those failures recoverable — the operator flips one field and the next draft is clean.&lt;/p&gt;

&lt;p&gt;Two months in, the most common operator action is changing &lt;code&gt;goal&lt;/code&gt; from &lt;code&gt;build_close&lt;/code&gt; to &lt;code&gt;pure_relationship&lt;/code&gt; for contacts they decided to keep as friends. That's a feature: the tool exposed an explicit dial for something operators were doing implicitly anyway, and now they can do it deliberately.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;When you're modeling a thing the AI is going to act on, ask whether your classification scheme is letting it conflate facts with intentions. "Family member" and "no-pitch tone" are correlated, not identical. Same with "business owner" and "OK to pitch." Build the schema so the AI can express the awkward middle cases — even if you think they're rare. They aren't.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm building &lt;a href="https://ironfrontdigital.com" rel="noopener noreferrer"&gt;Iron Front Digital&lt;/a&gt; — an AI marketing team for solo operators and small businesses. The Recon extension that learned this lesson is part of the stack.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>saas</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
