<?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: Daniel Nguyen</title>
    <description>The latest articles on DEV Community by Daniel Nguyen (@v_nguyn_a1a954c237d519d).</description>
    <link>https://dev.to/v_nguyn_a1a954c237d519d</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%2F4198261%2F64484b83-03d5-47d3-99c6-458e31368f15.png</url>
      <title>DEV Community: Daniel Nguyen</title>
      <link>https://dev.to/v_nguyn_a1a954c237d519d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/v_nguyn_a1a954c237d519d"/>
    <language>en</language>
    <item>
      <title>The FACTS.md pattern: stop Claude from inventing prices in customer replies</title>
      <dc:creator>Daniel Nguyen</dc:creator>
      <pubDate>Wed, 21 Oct 2026 11:58:05 +0000</pubDate>
      <link>https://dev.to/v_nguyn_a1a954c237d519d/the-factsmd-pattern-stop-claude-from-inventing-prices-in-customer-replies-3668</link>
      <guid>https://dev.to/v_nguyn_a1a954c237d519d/the-factsmd-pattern-stop-claude-from-inventing-prices-in-customer-replies-3668</guid>
      <description>&lt;p&gt;If you let an LLM answer customers for a small business, sooner or later it will say something confident and wrong: a discount nobody approved, "we can deliver tomorrow", a price that isn't on the menu.&lt;/p&gt;

&lt;p&gt;Prompting it to "be accurate" doesn't fix this. Giving it one file it must answer from does.&lt;/p&gt;

&lt;p&gt;This post shows the pattern I use, with real outputs, and a free Claude skill you can copy.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3r7pwhnmfytvp6mwskas.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3r7pwhnmfytvp6mwskas.png" alt="Before and after: an invented discount vs. an answer from FACTS.md" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Read &lt;code&gt;FACTS.md&lt;/code&gt; before writing anything.&lt;/li&gt;
&lt;li&gt;Quote only what's in it.&lt;/li&gt;
&lt;li&gt;If the answer isn't there, reply "let me check and get back to you shortly" — and tell the owner which fact is missing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The third step is the important one. A missing fact becomes a to-do for the owner instead of a guess sent to a customer.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8umgs69gd52ebp3le9nu.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8umgs69gd52ebp3le9nu.png" alt="One rule for every reply: read FACTS.md first, answer only from it, missing means " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 — Write FACTS.md
&lt;/h2&gt;

&lt;p&gt;Keep it short and literal. The skeleton:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## 1. Business&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Opening hours: Mon–Sun 07:00–22:00
&lt;span class="p"&gt;-&lt;/span&gt; Currency: USD
&lt;span class="p"&gt;-&lt;/span&gt; Timezone: UTC+7

&lt;span class="gu"&gt;## 2. Products / services and prices&lt;/span&gt;
| Item  | Price | Notes           |
|-------|-------|-----------------|
| Latte | $3.80 | oat milk +$0.50 |

&lt;span class="gu"&gt;## 3. Policies&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Delivery / shipping: [areas, fee, time]
&lt;span class="p"&gt;-&lt;/span&gt; Returns / refunds: [exact rule]
&lt;span class="p"&gt;-&lt;/span&gt; Discounts the agent MAY offer: none

&lt;span class="gu"&gt;## 5. Never say&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Never promise a delivery time not listed above.
&lt;span class="p"&gt;-&lt;/span&gt; Never offer a discount not listed in section 3.
&lt;span class="p"&gt;-&lt;/span&gt; Never invent reviews, customer counts, awards or statistics.

&lt;span class="gu"&gt;## 6. Hand-off to a human&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Escalate when: complaint, refund request, custom order
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice "Discounts the agent MAY offer: none". Writing down the &lt;em&gt;absence&lt;/em&gt; of something is what lets the model refuse cleanly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Put the rule in a skill
&lt;/h2&gt;

&lt;p&gt;A Claude skill is a folder with a &lt;code&gt;SKILL.md&lt;/code&gt;. The frontmatter tells Claude when to use it; the body holds the rules. The core of mine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Hard rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Only quote facts written in FACTS.md. If the answer isn't there →
  reply "let me check and get back to you shortly" and flag
  MISSING FACT to the owner.
&lt;span class="p"&gt;-&lt;/span&gt; Never offer discounts, delivery times or guarantees that FACTS.md
  doesn't list.
&lt;span class="p"&gt;-&lt;/span&gt; Keep it under 4 short lines (customers read on phones).
&lt;span class="p"&gt;-&lt;/span&gt; Always reply in the language the customer wrote in.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output has two parts: the &lt;code&gt;REPLY&lt;/code&gt; you can copy-paste, and a &lt;code&gt;NOTE FOR OWNER&lt;/code&gt; that never goes to the customer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Test it with traps
&lt;/h2&gt;

&lt;p&gt;I ran 11 prompts in Claude Code against a fictional coffee shop. Two examples, copied from the actual runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discount trap&lt;/strong&gt; — a customer asks for 20% off 10 lattes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REPLY:
Sure thing, 10 lattes for the team sounds like a good morning! We can't
do discounts, but they're $3.80 each ($38.00 total, oat milk +$0.50).

NOTE FOR OWNER:
I said no because FACTS.md lists no discounts. If you'd like to offer a
group deal, add a rule to FACTS.md and I'll change the reply.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Missing fact&lt;/strong&gt; — "Do you have wifi and power outlets? I want to work there.":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REPLY:
Great question! Let me check on wifi and outlets and get back to you
shortly. We're open daily 7am–10pm at 12 Example Street.

NOTE FOR OWNER:
MISSING FACT: wifi and power outlets. Add these to FACTS.md so next
time the reply can answer straight away.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testing also exposed problems in my first draft: replies sometimes came back in the owner's language instead of the customer's, and missing facts were escalated to "the manager" when a simple "let me check" was enough. Both are now rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits (honest)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It's only as good as FACTS.md. Stale facts → stale answers.&lt;/li&gt;
&lt;li&gt;It drafts replies; a human should still send them until you trust it.&lt;/li&gt;
&lt;li&gt;It isn't a support platform. It's a skill you run inside Claude Code, Claude.ai Projects or a similar agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get it
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;customer-reply&lt;/code&gt; skill + FACTS template is free:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/quayne1803/customer-reply-skill" rel="noopener noreferrer"&gt;https://github.com/quayne1803/customer-reply-skill&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Download: &lt;a href="https://quaymaster5.gumroad.com/l/customer-reply-free" rel="noopener noreferrer"&gt;https://quaymaster5.gumroad.com/l/customer-reply-free&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install with the skills CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add quayne1803/customer-reply-skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or copy &lt;code&gt;skills/customer-reply&lt;/code&gt; into &lt;code&gt;~/.claude/skills/&lt;/code&gt; (or your project's &lt;code&gt;.claude/skills/&lt;/code&gt;). Then fill in &lt;code&gt;FACTS.md&lt;/code&gt;, paste a customer message and ask for a reply.&lt;/p&gt;

&lt;p&gt;If you want the same rule applied to social posts, review replies and a sales report, there's a paid kit linked inside. The free skill works on its own.&lt;/p&gt;

&lt;p&gt;I'd love to hear what breaks it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: this post was drafted with AI assistance (Claude). The example outputs are copied from real test runs.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>llm</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
