<?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: MadeByBrain</title>
    <description>The latest articles on DEV Community by MadeByBrain (@madebybrain).</description>
    <link>https://dev.to/madebybrain</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%2F4224786%2F8fbd66cc-0763-4bb9-aa0f-d281925acc53.jpg</url>
      <title>DEV Community: MadeByBrain</title>
      <link>https://dev.to/madebybrain</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/madebybrain"/>
    <language>en</language>
    <item>
      <title>I built a style checker for my AI agent's answers (dashes, stock phrases, du/Sie)</title>
      <dc:creator>MadeByBrain</dc:creator>
      <pubDate>Wed, 04 Nov 2026 20:10:02 +0000</pubDate>
      <link>https://dev.to/madebybrain/i-built-a-style-checker-for-my-ai-agents-answers-dashes-stock-phrases-dusie-4odi</link>
      <guid>https://dev.to/madebybrain/i-built-a-style-checker-for-my-ai-agents-answers-dashes-stock-phrases-dusie-4odi</guid>
      <description>&lt;p&gt;I write a lot of text with my AI agent: LinkedIn posts, client mails, web pages. My style rule is short. No em dashes. No stock AI phrases. And in German, one form of address per text, either "du" or "Sie".&lt;/p&gt;

&lt;p&gt;Models break that rule all the time. Not because the prompt is bad, but because the habit is stronger than the instruction. I kept finding dashes in posts that were already scheduled.&lt;/p&gt;

&lt;p&gt;So I built a plugin that checks every answer before I see it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What writing-guard does
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/MadeByBrain/hermes-extensions/tree/main/plugins/writing-guard" rel="noopener noreferrer"&gt;writing-guard&lt;/a&gt; is a plugin for &lt;a href="https://hermes-agent.nousresearch.com" rel="noopener noreferrer"&gt;Hermes Agent&lt;/a&gt;, the open source agent by Nous Research. It reads the final answer of every turn and checks three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dashes:&lt;/strong&gt; em and en dashes outside code, links and quotes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stock AI phrases&lt;/strong&gt; in English and German, like "It's important to note", "delve", "seamless", "Ich hoffe, das hilft" or "Gute Frage".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;du and Sie:&lt;/strong&gt; both forms in the same paragraph, a switch against the previous answer in the same chat, or the wrong form when you set one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default it does not change anything. When it finds something, it appends one line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;writing-guard: 2 Gedankenstriche; 1 KI-Floskel („Gute Frage“).&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That line was enough to change my workflow. I see the problem before I copy the text anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why rules and not another model
&lt;/h2&gt;

&lt;p&gt;The obvious idea is to ask a second model to review the text. I decided against it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It costs a call per answer.&lt;/strong&gt; writing-guard needs about 5 ms and makes no network calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is not reproducible.&lt;/strong&gt; A rule gives the same result every time, a model does not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is easy to explain.&lt;/strong&gt; Every finding has a rule id. If a rule is wrong for you, you switch it off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off is honest: a rule cannot judge tone or meaning. That is why phrases and the form of address are only reported, never rewritten. Only dashes can be fixed automatically, because there the rule is clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix mode for dashes
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;mode: fix&lt;/code&gt;, dashes are replaced by simple rules:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The plugin—built in a day—works.&lt;/td&gt;
&lt;td&gt;The plugin, built in a day, works.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mon–Fri 9–17&lt;/td&gt;
&lt;td&gt;Mon-Fri 9-17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;– first item&lt;/td&gt;
&lt;td&gt;- first item&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Code blocks, inline code, URLs, &lt;code&gt;MEDIA:&lt;/code&gt; lines and quotes are never touched.&lt;/p&gt;

&lt;h2&gt;
  
  
  The du/Sie check was the hard part
&lt;/h2&gt;

&lt;p&gt;German has two forms of address, and mixing them in one text looks careless. A model happily writes "du" in the first paragraph and "Sie" in the third.&lt;/p&gt;

&lt;p&gt;The difficult part is avoiding false alarms. "Sie" at the start of a sentence can mean "they" or "she". Quotes can contain the other form on purpose. A chat answer in "du" can contain a mail draft in "Sie" for a client. So the plugin only counts "Sie" with a capital letter inside a sentence, skips quotations, and checks per paragraph.&lt;/p&gt;

&lt;p&gt;I ran it over 1,000 of my own recent German answers (read only). 133 contained dashes, 1 contained a listed phrase, and after tuning there were 0 false du/Sie alarms.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model can check its own drafts
&lt;/h2&gt;

&lt;p&gt;writing-guard also registers a tool, &lt;code&gt;writing_guard_check&lt;/code&gt;, and a small skill that tells the model to use it before it delivers a mail, post or page. In my tests the model called the tool on its own for a LinkedIn draft, fixed the dashes and rewrote the reported phrases itself.&lt;/p&gt;

&lt;p&gt;There is also a slash command: &lt;code&gt;/writing-guard check &amp;lt;text&amp;gt;&lt;/code&gt; checks any text you paste in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes plugins &lt;span class="nb"&gt;install &lt;/span&gt;MadeByBrain/hermes-extensions/plugins/writing-guard &lt;span class="nt"&gt;--enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It needs Hermes Agent v0.22.2 or newer and has no Python dependencies. Since 2 November it is listed in the official &lt;a href="https://hermes-agent.nousresearch.com/docs/plugins/writing-guard" rel="noopener noreferrer"&gt;Hermes plugin catalog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not do
&lt;/h2&gt;

&lt;p&gt;It checks surface rules. It does not know your brand voice, your product names or your legal wording, and the phrase list is not complete. You can add your own phrases with &lt;code&gt;extra_phrases&lt;/code&gt; and ignore rules with &lt;code&gt;ignore_phrases&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tested live on the Hermes CLI with three models. Not tested live yet: the desktop app, Telegram and other gateways. Same hook, but that is an assumption, and I say so in the README.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The plugin is MIT licensed and free. If you write German or English texts with Hermes, I would like to hear which phrases it misses. Open an issue on &lt;a href="https://github.com/MadeByBrain/hermes-extensions" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or leave a comment here.&lt;/p&gt;

&lt;p&gt;I build more plugins and skills for Hermes at &lt;a href="https://madebybrain.com/hermes-plugins" rel="noopener noreferrer"&gt;madebybrain.com/hermes-plugins&lt;/a&gt;.&lt;/p&gt;

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