<?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: Paul Bennet</title>
    <description>The latest articles on DEV Community by Paul Bennet (@paulbennetjoshua).</description>
    <link>https://dev.to/paulbennetjoshua</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%2F832804%2F43ced898-3a26-4443-85f1-75b98aabce8f.jpeg</url>
      <title>DEV Community: Paul Bennet</title>
      <link>https://dev.to/paulbennetjoshua</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/paulbennetjoshua"/>
    <language>en</language>
    <item>
      <title>Stop scrolling agent replies</title>
      <dc:creator>Paul Bennet</dc:creator>
      <pubDate>Mon, 09 Nov 2026 22:06:41 +0000</pubDate>
      <link>https://dev.to/paulbennetjoshua/stop-scrolling-agent-replies-1o17</link>
      <guid>https://dev.to/paulbennetjoshua/stop-scrolling-agent-replies-1o17</guid>
      <description>&lt;p&gt;I use coding agents all day. Claude Code in the terminal, Codex for a second opinion, Copilot in VS Code. They are good at the work. They are less good at telling me about it.&lt;/p&gt;

&lt;p&gt;A typical reply to "the test is failing, fix it" looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Great question! I took a look at the failing test, and I think I understand what's going on here. The test &lt;code&gt;parses an empty config&lt;/code&gt; in &lt;code&gt;tests/config.test.mjs&lt;/code&gt; is failing with &lt;code&gt;TypeError: Cannot read properties of undefined (reading 'trim')&lt;/code&gt;. This happens because &lt;code&gt;parseConfig&lt;/code&gt; assumes the file always has at least one line, but when the file is empty, &lt;code&gt;lines[0]&lt;/code&gt; is undefined.&lt;/p&gt;

&lt;p&gt;To fix this, I've updated &lt;code&gt;parseConfig&lt;/code&gt; so that it returns the default config when the input is empty. I also took the opportunity to tidy up the function a little, which should make it easier to maintain going forward.&lt;/p&gt;

&lt;p&gt;Now all 14 tests pass! 🎉&lt;/p&gt;

&lt;p&gt;There are a few things you might want to consider next. First, you may want to commit this change. It could also be worth adding a test for a config file that only contains comments, since that is a similar edge case. Additionally, I was wondering whether an empty file should produce a warning or whether it should stay silent; both approaches have trade-offs. Another thing to think about is where the default should live: it could stay in &lt;code&gt;parseConfig&lt;/code&gt;, or each caller could supply its own. Let me know how you'd like to proceed, and I'm happy to help with any of these!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;After&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fixed parseConfig crashing on an empty file; 14 of 14 tests pass.

## Actions
- 🔵 A1 Commit the fix: git commit -am "Handle empty config"
- 🔵 A2 Add a test for a config that has only comments.

## Questions
- 🔵 Q1 Should an empty file warn? (yes/no)

## Decisions
- 🔵 D1 Where should the default live?
  (a) in parseConfig (recommended)
  (b) in each caller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both replies say the same thing. The first one hides four next steps, a question and a decision inside 230 words of prose. To answer it, I have to read all of it, remember which "thing to consider" was which, and write a paragraph back.&lt;/p&gt;

&lt;p&gt;The second one I can answer in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;done A1, Q1: yes, D1: a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is what &lt;a href="https://github.com/paulbennet/agent-response-config" rel="noopener noreferrer"&gt;response-config&lt;/a&gt; does. It is one agent skill, with optional hooks, for Claude Code, Codex and GitHub Copilot. It is free and MIT licensed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reply by ID
&lt;/h2&gt;

&lt;p&gt;Every reply starts with a short summary of what happened. Then come up to four sections, each with numbered items:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Actions&lt;/strong&gt; (A1, A2, ...): steps for you or the agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suggestions&lt;/strong&gt; (S1, ...): things you can do or skip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Questions&lt;/strong&gt; (Q1, ...): each with an answer form, such as &lt;code&gt;(yes/no)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decisions&lt;/strong&gt; (D1, ...): lettered options, with the agent's pick marked "(recommended)".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You answer by ID, in any order, in one message: &lt;code&gt;done A1&lt;/code&gt;, &lt;code&gt;skip S2&lt;/code&gt;, &lt;code&gt;Q1: yes&lt;/code&gt;, &lt;code&gt;D1: b&lt;/code&gt;, &lt;code&gt;please do A2&lt;/code&gt;. Each item starts with a status, 🔵 open or ⏳ in progress. Finished items are not listed again. The agent closes them in one line at the end:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Added the warning and moved the default into parseConfig; tests pass.

## Actions
- 🔵 A3 Add the change to the CHANGELOG.

Resolved: ✅ A1, 💬 Q1, 💬 D1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The IDs count up for the whole session and are never reused. A3 comes after A2, even if A2 is still open twenty prompts later. So "A2" always means the same thing.&lt;/p&gt;

&lt;p&gt;That only works if something remembers the items. A skill alone cannot: the model forgets after the context is compacted, and a resumed session starts cold. The optional hooks fix this. After each reply, a Stop hook reads the items into a small ledger file per session. On each prompt, a short hint tells the model which items are still open and which IDs come next. Your &lt;code&gt;done A1&lt;/code&gt; updates the ledger directly, so the item closes even if the model forgets to say so.&lt;/p&gt;

&lt;p&gt;The hooks only add instructions. They never rewrite or block an answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick your English level
&lt;/h2&gt;

&lt;p&gt;I wrote this for myself first. Then I watched colleagues who read English as a second language copy agent replies into a translator. Long sentences and idioms ("let's circle back", "low-hanging fruit") make that harder than it needs to be.&lt;/p&gt;

&lt;p&gt;So response-config can set a reading level:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CEFR levels&lt;/strong&gt;, A1 to C2. At A2 the agent keeps sentences short and uses common words. At C1 it writes like a fluent colleague.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plain language&lt;/strong&gt;: the main point first, "you" instead of "the user", active voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readability targets&lt;/strong&gt;, such as Flesch-Kincaid grade 8 or Gunning Fog.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controlled vocabularies&lt;/strong&gt;: Simplified Technical English (ASD-STE100), Globish, the Oxford 3000.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three presets cover the usual cases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Preset&lt;/th&gt;
&lt;th&gt;Sets&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;simple&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A2, plain language, Oxford 3000 words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;global&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;B1, Globish words, for readers of any first language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;technical&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;B2, Simplified Technical English&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Set one for good with &lt;code&gt;config.mjs --level global&lt;/code&gt;, or just ask the agent: "use B1 English". You can also change it for one message. &lt;code&gt;!level=A2&lt;/code&gt; in a prompt gives one simple reply. Add &lt;code&gt;!keep&lt;/code&gt; to keep the level for the rest of the session. Here is the fix above, at &lt;code&gt;!level=A2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I fixed the crash. The config file was empty, and the code did not expect that. Now all 14 tests pass.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Code, commands, error messages and file paths are never simplified. Only the prose around them changes.&lt;/p&gt;

&lt;p&gt;How well does it hold? The repo has headless evals that run the same cases on all three agents and measure the replies. In the last Claude run, an A1 reply had a longest sentence of 8 words, and a 30-word cap came back at 27 words. Those are model results, not guarantees, but they are measured.&lt;/p&gt;

&lt;h2&gt;
  
  
  One skill, three agents
&lt;/h2&gt;

&lt;p&gt;The skill uses the open &lt;a href="https://agentskills.io" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; format, so one folder works in every agent that reads it. Install it the way you install other skills:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You use&lt;/th&gt;
&lt;th&gt;Install&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Any agent (skills.sh)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npx skills add paulbennet/agent-response-config --skill response-config&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub CLI 2.90+&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gh skill install paulbennet/agent-response-config response-config --agent claude-code --scope user&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code plugin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/plugin install response-config --marketplace paulbennet/agent-response-config&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex plugin&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;codex plugin marketplace add paulbennet/agent-response-config&lt;/code&gt;, then &lt;code&gt;codex plugin add response-config@response-config&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two plugins also bring the hooks. In Claude Code they are on as soon as the plugin is enabled. In Codex, run &lt;code&gt;/hooks&lt;/code&gt; once and trust the three hooks. For Copilot, or to add hooks to a plain skill install, one command writes them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node &amp;lt;skill-dir&amp;gt;/scripts/setup.mjs --agent copilot --scope user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then make it yours. Say "configure response-config", and the agent walks you through each setting, one group at a time, with lettered options. Or set keys directly: &lt;code&gt;config.mjs --set minimal.level=extreme&lt;/code&gt; for the shortest replies, &lt;code&gt;--set structured.sections='["actions","questions"]'&lt;/code&gt; for only two sections. Config lives in your user folder, with an optional &lt;code&gt;.response-config.json&lt;/code&gt; in a repo, so a team can share one style.&lt;/p&gt;

&lt;p&gt;When you need the long version, put &lt;code&gt;!verbose&lt;/code&gt; in your message. &lt;code&gt;!off&lt;/code&gt; turns everything off for one turn.&lt;/p&gt;

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

&lt;p&gt;Some limits, up front.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It instructs; it does not enforce.&lt;/strong&gt; The rules are text that the model follows well, not a validator. A model can still run long, and nothing regenerates the reply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copilot item tracking is best effort.&lt;/strong&gt; Copilot's Stop hook gives a transcript path, not the final message, so the ledger can miss items there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex plugin hooks need your trust once&lt;/strong&gt;, through &lt;code&gt;/hooks&lt;/code&gt;. Until you trust them, only the skill is active.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Install it with one of the commands above, then ask your agent for something with a few steps in it. Answer the reply with &lt;code&gt;done A1&lt;/code&gt;, and see how it feels.&lt;/p&gt;

&lt;p&gt;The code, the full docs and the test plan are on &lt;a href="https://github.com/paulbennet/agent-response-config" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. If a reply comes back wrong, &lt;a href="https://github.com/paulbennet/agent-response-config/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; with your agent, its version and the output of &lt;code&gt;config.mjs --show&lt;/code&gt;.&lt;/p&gt;

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