<?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: Konstantin Konovalov</title>
    <description>The latest articles on DEV Community by Konstantin Konovalov (@academy_agineai).</description>
    <link>https://dev.to/academy_agineai</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%2F4040910%2F05a38bfa-6cf8-48e0-be15-1426de32278b.jpg</url>
      <title>DEV Community: Konstantin Konovalov</title>
      <link>https://dev.to/academy_agineai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/academy_agineai"/>
    <language>en</language>
    <item>
      <title>You Don't Need a Better Prompt. You Need a Brief.</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Fri, 07 Aug 2026 06:15:04 +0000</pubDate>
      <link>https://dev.to/academy_agineai/you-dont-need-a-better-prompt-you-need-a-brief-58cg</link>
      <guid>https://dev.to/academy_agineai/you-dont-need-a-better-prompt-you-need-a-brief-58cg</guid>
      <description>&lt;p&gt;Every few days someone asks me for the prompt that makes the model behave. The secret opener, the magic system message. I used to hunt for it too. It doesn't exist, and looking for it kept me stuck longer than it should have.&lt;/p&gt;

&lt;p&gt;What actually moved my results was treating the model like a contractor I hired an hour ago. Fast, literal, no context about my codebase, and it will do exactly what I write down, including the parts I only meant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch a vague ask fall apart
&lt;/h2&gt;

&lt;p&gt;Say I want to parse a date out of some messy user field. The lazy version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Parse the date from this string.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model returns something. It handles &lt;code&gt;2024-03-01&lt;/code&gt; fine and quietly falls over on &lt;code&gt;1/3/24&lt;/code&gt;, or &lt;code&gt;March 1st&lt;/code&gt;, or an empty cell. Not because it's dumb. Because "parse the date" didn't say which formats exist, what a two-digit year means, or what to do when there's no date at all. I had answers to all of those in my head. I just never wrote them down, so the model guessed, and its guess came from the average of the internet, not from my data.&lt;/p&gt;

&lt;p&gt;Here's the same task as a brief:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Write&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;parseDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;that&lt;/span&gt; &lt;span class="nx"&gt;accepts&lt;/span&gt; &lt;span class="nx"&gt;these&lt;/span&gt; &lt;span class="nx"&gt;formats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nx"&gt;YYYY&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;MM&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;DD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;M&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;YY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Month Dth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nx"&gt;Two&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;digit&lt;/span&gt; &lt;span class="nx"&gt;years&lt;/span&gt; &lt;span class="nx"&gt;are&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2099&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nx"&gt;Return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="nx"&gt;has&lt;/span&gt; &lt;span class="nx"&gt;no&lt;/span&gt; &lt;span class="nx"&gt;recognizable&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Don&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;t throw.
Return a Date object, UTC, time set to midnight.
Example: parseDate("1/3/24") -&amp;gt; 2024-03-01T00:00:00Z
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same model. The output is now something I can actually check, because I said what "done" looks like and what the weird inputs are. That's the whole trick, and it isn't a trick.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four gaps that ruin most prompts
&lt;/h2&gt;

&lt;p&gt;When output disappoints me, I can nearly always trace it to a decision I made silently. So before I send anything, I check four things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The input, and its ugly version. Empty, huge, wrong type, wrong encoding.&lt;/li&gt;
&lt;li&gt;What happens when something's missing. Fail loud, skip it, or substitute a default.&lt;/li&gt;
&lt;li&gt;What must not change. The signature, the existing behavior, the file I didn't mention.&lt;/li&gt;
&lt;li&gt;What done looks like. One concrete input paired with the output I expect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last one carries more weight than the other three together. A single worked example pins down intent that a paragraph of adjectives never will.&lt;/p&gt;

&lt;h2&gt;
  
  
  The expensive failure nobody warns you about
&lt;/h2&gt;

&lt;p&gt;The costly mistake isn't the model refusing or spitting out junk. You catch those immediately. The expensive one is the model helpfully fixing something you never asked it to touch. You said "add a field to this form," and it also tidied the validation, and two days later a different flow is broken and you have no idea why.&lt;/p&gt;

&lt;p&gt;One line prevents it: say what stays put.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add the phone field. Leave the email validation, the submit
handler, and the styles exactly as they are.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Models are eager. Unbounded eagerness looks like helpfulness right up to the moment it rewrites a working thing. Naming the untouchables costs five seconds and saves the debugging session where you diff two files hunting for what moved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small steps you can actually verify
&lt;/h2&gt;

&lt;p&gt;The other habit: stop asking for the whole feature at once. Not because the model can't produce it, but because you can't check it. One function with clear edges, you read and run in a minute. "The whole auth flow" comes back as a plausible wall of code that takes longer to verify than it would have taken to write. You didn't get leverage, you got a thing you can't inspect.&lt;/p&gt;

&lt;p&gt;Break the work into steps small enough that each has an obvious pass or fail. Get one right, build on it. Slower to type, much faster to finish, because you're not unpicking a wrong assumption baked in three layers deep.&lt;/p&gt;

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

&lt;p&gt;If you tried these tools, got mush, and blamed the model, check the ask first. Most of the time the ceiling was the brief, not the model. The skill that matters now isn't clever phrasing. It's thinking one level more carefully about what you want and saying it in order: the input, the constraints, the thing that must not move, and one example of done.&lt;/p&gt;

&lt;p&gt;Pick one annoying task and write it up that way. The output changes, and it won't be because the tool got smarter.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written by the team behind AGINE Academy, an independent product by AGINE AI (not affiliated with Anthropic). We teach building with Claude by doing the work rather than watching lectures.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Inbox and Calendar on Autopilot with Claude: What's Actually Safe to Automate</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Wed, 05 Aug 2026 14:30:00 +0000</pubDate>
      <link>https://dev.to/academy_agineai/inbox-and-calendar-on-autopilot-with-claude-whats-actually-safe-to-automate-4fe3</link>
      <guid>https://dev.to/academy_agineai/inbox-and-calendar-on-autopilot-with-claude-whats-actually-safe-to-automate-4fe3</guid>
      <description>&lt;p&gt;The pitch: connect Claude to Gmail, Calendar, and Drive and let it run your day. What you actually get is smaller and more useful. It reads across your workspace, pulls the right context, summarizes it, and prepares actions. You still press the buttons that matter.&lt;/p&gt;

&lt;p&gt;Here is what works today, how to wire it up without handing over the keys, and the places you should never take yourself out of the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What connectors actually do
&lt;/h2&gt;

&lt;p&gt;Claude reaches Google Workspace through connectors built on the Model Context Protocol (MCP). Once you authorize access, it can search your mail, read threads, check your calendar, and open files in Drive, all inside a normal conversation. No glue code, no cron job to babysit.&lt;/p&gt;

&lt;p&gt;The split that matters is read versus write. Reading (search, summarize, list events, pull a doc) is where connectors are strong and the risk is low. Writing (sending mail, creating or moving events, editing files) is where you slow down and add checks.&lt;/p&gt;

&lt;p&gt;Think of it as a well briefed assistant who can see everything but has to ask before touching anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three workflows that hold up in real use
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The morning brief.&lt;/strong&gt; Instead of opening five tabs, ask for one summary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Look at my calendar for today and my inbox from the last 18 hours.
Give me: meetings that need prep, emails waiting on a reply from me,
and anything with a deadline this week. Keep it to one screen.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get a scannable digest. Claude reads across mail and calendar and stitches them together, which is the part that normally eats the start of your day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Inbox triage.&lt;/strong&gt; Not auto-archiving, just sorting your attention.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Group my unread mail into: needs a reply from me, FYI only,
and can wait. For the "needs a reply" ones, draft a short response
I can edit. Do not send anything.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "do not send" line matters. Triage is a read-plus-draft task, and the draft is a starting point, not an outbound message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Thread and meeting summaries.&lt;/strong&gt; Long threads and prep docs are what this is best at.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Summarize this thread, list who is waiting on what, and pull the
relevant doc from Drive if one is referenced. Flag any open decision.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Highest value, lowest risk. You are asking Claude to compress information you already have access to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting it up without regret
&lt;/h2&gt;

&lt;p&gt;A few habits keep this safe.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Least privilege.&lt;/strong&gt; Authorize only the scopes you need. If your goal is briefs and drafts, you may not need write access to Drive at all. Read-only is a real, useful mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start read-only, add write later.&lt;/strong&gt; Live for a week on summaries and drafts before you let anything create or send. You learn fast where it is reliable and where it is not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch what it retrieves.&lt;/strong&gt; Search can miss. When Claude says "no urgent emails," read that as "none in what it found," not a guarantee. Verify anything critical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mind the data.&lt;/strong&gt; You are sending email content to a model. Know your org's policy, and keep genuinely sensitive threads out of scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where the human stays in the loop
&lt;/h2&gt;

&lt;p&gt;Draw a hard line at anything that leaves your machine or changes shared state.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sending email.&lt;/strong&gt; Always review. A confident draft to the wrong person is worse than no draft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheduling and calendar edits.&lt;/strong&gt; Confirm times, guests, and time zones yourself. A time booked in the wrong zone is a real meeting someone missed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deleting or moving anything.&lt;/strong&gt; There is no upside to letting a model archive mail unattended.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything involving other people.&lt;/strong&gt; If the action reaches a colleague, a client, or your boss, you approve it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One rule covers most of it: Claude drafts, you dispatch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is weaker
&lt;/h2&gt;

&lt;p&gt;Retrieval is the soft spot. On a large or messy inbox, search-based access does not see everything, and a summary can quietly drop the one email that mattered. Claude can also state a detail with more confidence than the source supports, so a "confirmed for Tuesday" in a summary is a cue to go check, not a fact.&lt;/p&gt;

&lt;p&gt;There is latency and cost. Reading across a big mailbox is slower and pricier than a native filter. For simple rules ("label everything from billing"), a plain Gmail filter still wins. Use Claude where judgment and synthesis help, not where a deterministic rule already does the job.&lt;/p&gt;

&lt;p&gt;And it drifts. The same prompt on a busy day and a quiet day can format differently. If you want a stable daily brief, save the prompt and reuse it verbatim instead of rephrasing each morning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern worth keeping
&lt;/h2&gt;

&lt;p&gt;The version of "inbox and calendar on autopilot" that actually ships is narrow and a little boring: Claude gathers and drafts, you decide and send. That covers the morning brief, triage, and summaries, which is most of the daily overhead anyway. The sending, scheduling, and deleting stay human decisions until you have watched it behave long enough to trust it. Even then, keep the send button yours.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>Turn Your Routine Into an Assistant: A Practical Guide to Small AI Helpers</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Tue, 04 Aug 2026 15:20:00 +0000</pubDate>
      <link>https://dev.to/academy_agineai/turn-your-routine-into-an-assistant-a-practical-guide-to-small-ai-helpers-3fdh</link>
      <guid>https://dev.to/academy_agineai/turn-your-routine-into-an-assistant-a-practical-guide-to-small-ai-helpers-3fdh</guid>
      <description>&lt;h2&gt;
  
  
  AI is not a genie. Treat it like a function.
&lt;/h2&gt;

&lt;p&gt;Most people use AI the way they use a search box: type a question, read the answer, move on. That works for one-off curiosity. It is a bad fit for the work you repeat every week, because you re-explain the context every time and never build anything you can trust.&lt;/p&gt;

&lt;p&gt;A small assistant is different. It is one narrow task, wired up once, with a fixed input and a fixed output shape. You run it, check it, improve it. After a few iterations it stops being a demo and starts pulling real weight.&lt;/p&gt;

&lt;p&gt;Here is how to build one without drowning in frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start narrow: one task, one input, one output
&lt;/h2&gt;

&lt;p&gt;Do not build "an assistant for my job." Build the thing that turns a messy meeting note into three bullet points. Pick a task that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repetitive (you do it weekly or daily)&lt;/li&gt;
&lt;li&gt;Boring (nobody will miss the manual version)&lt;/li&gt;
&lt;li&gt;Verifiable (you can look at the output and know if it is wrong)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one matters most. If you cannot tell good output from bad in ten seconds, you cannot trust the assistant and you cannot improve it.&lt;/p&gt;

&lt;p&gt;Good starter tasks: drafting reply emails, summarizing documents, normalizing scrappy data, extracting fields from text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: an email draft as a function
&lt;/h2&gt;

&lt;p&gt;Think of your prompt as a function signature. Inputs go in, a structured draft comes out.&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;draft_reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;incoming_email&lt;/span&gt;&lt;span class="p"&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;tone&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;friendly, brief&lt;/span&gt;&lt;span class="sh"&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;prompt&lt;/span&gt; &lt;span class="o"&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;
    You are drafting a reply on my behalf. Do not invent facts.
    If information is missing, leave a [PLACEHOLDER].

    Tone: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
    Incoming email:
    ---
    &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;incoming_email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
    ---
    Write only the reply body.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# any model client you like
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two lines do the real work: "Do not invent facts" and the &lt;code&gt;[PLACEHOLDER]&lt;/code&gt; rule. Together they turn a confident hallucination into a visible gap you can fill. The goal is to make errors loud instead of silent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: summaries you can actually trust
&lt;/h2&gt;

&lt;p&gt;The failure mode of summaries is a plausible sentence that never appeared in the source. Force evidence and it disappears.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Summarize the document below in 5 bullets.
For each bullet, quote the exact sentence it is based on.
If a claim has no supporting quote, drop it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now checking takes seconds: skim the quotes, confirm they exist in the text. You are not leaning on the model's judgment, only on its ability to copy, which is far more reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: data cleanup, with a safety net
&lt;/h2&gt;

&lt;p&gt;Cleaning inconsistent data (country names, job titles, date formats) is a great fit, and also where silent errors hide. Never let the model rewrite your data in place. Have it output a mapping you review first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;Input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;values:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"USA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"u.s.a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"United States"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Amrica"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;original:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;normalized&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;merge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;values&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;unsure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;about;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;them&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"REVIEW"&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You keep the original column, apply the mapping in code, and eyeball anything marked REVIEW. The model proposes, your code decides.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify outputs (the step everyone skips)
&lt;/h2&gt;

&lt;p&gt;Before you rely on an assistant, build a tiny golden set: ten to twenty real inputs paired with the output you actually wanted. Re-run them every time you change the prompt. This is the difference between "it feels better" and "it got better."&lt;/p&gt;

&lt;p&gt;Cheap checks that catch most problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assertions in code: valid JSON? required fields present? no placeholders left behind?&lt;/li&gt;
&lt;li&gt;A spot-check habit: read one in five outputs, even after it "works"&lt;/li&gt;
&lt;li&gt;A refusal path: when the model is unsure, it should say so, not guess&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Add an agent only when there are real steps
&lt;/h2&gt;

&lt;p&gt;An agent is just an assistant that takes more than one step and calls a tool or two. Reach for it when a task genuinely has stages: fetch, then decide, then act. A triage helper that reads an inbox, classifies each message, and drafts replies for the easy ones is a reasonable first agent.&lt;/p&gt;

&lt;p&gt;Keep the non-AI parts deterministic. Let the model classify and draft; let ordinary code do the fetching, sending, and looping. Every step you hand to the model is a step that can drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is weaker
&lt;/h2&gt;

&lt;p&gt;Be honest about the limits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tasks with no cheap verification (strategy, judgment calls, anything with legal or financial stakes) are a bad fit. If checking the output takes as long as doing the work yourself, you saved nothing.&lt;/li&gt;
&lt;li&gt;Outputs drift once real inputs get weirder than your test set. The golden set slows this down; it does not stop it.&lt;/li&gt;
&lt;li&gt;Volume amplifies mistakes. A small error rate is fine for ten drafts you read by hand and a disaster for a thousand you send unread.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this kills the approach. It just means verification is not optional garnish. It is the load-bearing wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Iterate: promote good runs into the spec
&lt;/h2&gt;

&lt;p&gt;When a run comes out great, do not just enjoy it. Copy what worked back into the prompt as a rule or an example. Over a few weeks the prompt turns into a small spec of how the task should be done, and the assistant gets boring in the best way: predictable.&lt;/p&gt;

&lt;p&gt;Pick one task this week. Ship the narrow version, verify it, and let it earn the next feature.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Teach Claude one repeatable job: a field guide to Skills and Plugins</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Mon, 03 Aug 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/academy_agineai/teach-claude-one-repeatable-job-a-field-guide-to-skills-and-plugins-o3e</link>
      <guid>https://dev.to/academy_agineai/teach-claude-one-repeatable-job-a-field-guide-to-skills-and-plugins-o3e</guid>
      <description>&lt;h2&gt;
  
  
  You keep re-explaining the same job
&lt;/h2&gt;

&lt;p&gt;If you use Claude for real work, you have probably noticed a pattern. Every new chat starts with the same paragraph. "Here is how we format commit messages." "Use our error-handling style." "Summarize this the way I like." It works, and then the session ends and the knowledge is gone.&lt;/p&gt;

&lt;p&gt;Skills and Plugins are the two ways to make that knowledge stick. They are easy to confuse because both "extend" Claude, but they answer different questions. A Skill answers &lt;em&gt;how do I do this job?&lt;/em&gt; A Plugin answers &lt;em&gt;how do I ship this to a team and wire it to my tools?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Skill teaches Claude how to do a job
&lt;/h2&gt;

&lt;p&gt;A Skill is a folder with a &lt;code&gt;SKILL.md&lt;/code&gt; file at its root. The file has a small YAML header and a body of instructions:&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pr-description&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Write PR descriptions in our team format. Use when the user opens a PR or asks to summarize a branch.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# PR description writer&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Run &lt;span class="sb"&gt;`git diff main...HEAD`&lt;/span&gt; to read the changes.
&lt;span class="p"&gt;2.&lt;/span&gt; Group them by area (API, UI, migrations).
&lt;span class="p"&gt;3.&lt;/span&gt; Fill in &lt;span class="sb"&gt;`template.md`&lt;/span&gt;. Keep the risk section honest.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can drop extra files next to it: a template, a reference doc, a script Claude can run. The trick worth understanding is &lt;em&gt;progressive disclosure&lt;/em&gt;. The one-line &lt;code&gt;description&lt;/code&gt; is always in front of Claude. The body loads only when the task matches. Larger files load only if the body points to them. So a skill can carry a lot of detail without burning context on every message.&lt;/p&gt;

&lt;p&gt;The consequence that matters: skills are &lt;em&gt;model-invoked&lt;/em&gt;. Claude reads the description and decides whether the skill is relevant. You are not calling a function, you are writing a note-to-self that Claude picks up when the moment fits. That makes the description the most load-bearing line in the whole file.&lt;/p&gt;

&lt;p&gt;Reach for a Skill when you find yourself explaining the same procedure, format, or set of conventions more than twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Plugin ships capabilities and connects to tools
&lt;/h2&gt;

&lt;p&gt;A Skill lives in your setup. A Plugin is how you package it and hand it to other people. In Claude Code, a plugin can bundle several things at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt; (the know-how above)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slash commands&lt;/strong&gt; (e.g. &lt;code&gt;/deploy&lt;/code&gt;, &lt;code&gt;/triage&lt;/code&gt;) for jobs you trigger on purpose&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subagents&lt;/strong&gt; for delegated tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; that run at defined points, like before a commit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers&lt;/strong&gt; that connect Claude to external systems (a database, an issue tracker, an internal API)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Someone installs the plugin from a marketplace and the whole set arrives together. That is the real value: one install gives a teammate the same commands, the same conventions, and the same connections you have. Where a Skill teaches a job, a Plugin distributes a &lt;em&gt;workflow&lt;/em&gt; and plugs Claude into the systems that workflow touches.&lt;/p&gt;

&lt;p&gt;Reach for a Plugin when the thing you built should be repeatable across a team, or when the job needs to talk to a live tool rather than just follow instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  A mental model: three layers
&lt;/h2&gt;

&lt;p&gt;Think of extending an assistant as three layers, from throwaway to permanent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context:&lt;/strong&gt; what you paste in the moment. Fast, precise, gone when the chat ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills:&lt;/strong&gt; repeatable know-how Claude loads when relevant. This is the "job."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugins and MCP:&lt;/strong&gt; packaged capabilities and live connections to your tools. This is the "workflow," and it is shareable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most people live entirely in layer one and wonder why they keep repeating themselves. Moving a recurring task down a layer is usually the win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is weaker (the honest part)
&lt;/h2&gt;

&lt;p&gt;A few things bite in practice.&lt;/p&gt;

&lt;p&gt;Skills are instructions, not guarantees. Because Claude decides when to load one, a vague description means it fires at the wrong time or not at all. If a step &lt;em&gt;must&lt;/em&gt; happen every time (a lint pass, a redaction step), encode it as a script or a hook, not a paragraph of prose the model may skim.&lt;/p&gt;

&lt;p&gt;Skills also compete for attention. Ten overlapping skills with fuzzy descriptions will misfire more than three sharp ones. Curate. Delete the ones you do not use.&lt;/p&gt;

&lt;p&gt;Plugins and MCP add moving parts. An MCP server can be down, needs permissions, and comes from someone you are choosing to trust. Installing a plugin from a marketplace is a supply-chain decision, so read what it does before you wire it into your workflow.&lt;/p&gt;

&lt;p&gt;And there is a boring failure mode: building a skill for a job you only do once. If you will not repeat it, a good prompt is cheaper than a folder you have to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start small
&lt;/h2&gt;

&lt;p&gt;Pick one task you have re-explained this week. Write a ten-line &lt;code&gt;SKILL.md&lt;/code&gt; for it. Use it for a few days and fix the description until it triggers when you expect. If it turns out your team needs it too, that is when a plugin earns its place. Teach one repeatable job well before you try to ship a whole toolbox.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Pick Your AI by the Task, Not the Hype (A Simple Routing Framework)</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Sun, 02 Aug 2026 16:10:00 +0000</pubDate>
      <link>https://dev.to/academy_agineai/pick-your-ai-by-the-task-not-the-hype-a-simple-routing-framework-563e</link>
      <guid>https://dev.to/academy_agineai/pick-your-ai-by-the-task-not-the-hype-a-simple-routing-framework-563e</guid>
      <description>&lt;h2&gt;
  
  
  The wrong question
&lt;/h2&gt;

&lt;p&gt;Open any tech feed and someone is crowning a new "best AI." A model tops a leaderboard, the post goes viral, and a week later a different model tops a different leaderboard. If you pick your tools this way, you are optimizing for a number that was never about your job.&lt;/p&gt;

&lt;p&gt;The useful question is not "which model is smartest." It is "what does this task punish when it goes wrong?" A marketing email punishes a robotic tone. A migration script punishes a failed build. A finance sheet punishes an off-by-one column. A logo punishes looking generic. Those are four different failures, and they point to four different tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classify the task, then the tool
&lt;/h2&gt;

&lt;p&gt;Before you open a chat window, name two things: the type of work, and how you will know it failed. The failure mode does most of the picking for you.&lt;/p&gt;

&lt;p&gt;Here is a compact map. Treat the tool names as families, not gospel, because specific rankings shift every few months.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Tool that tends to fit&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Long-form writing, editing, tone&lt;/td&gt;
&lt;td&gt;A general chat model with long context (Claude, GPT, Gemini)&lt;/td&gt;
&lt;td&gt;Prose quality is about voice and coherence. There is no unit test for "sounds human," so you judge by reading, and long context lets it hold a whole doc in view.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code, refactoring, debugging&lt;/td&gt;
&lt;td&gt;A coding-focused model wired into your editor or terminal&lt;/td&gt;
&lt;td&gt;Code has a hard pass/fail. The model that sees your repo and can run tests beats a smarter model guessing at files it cannot read.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data, spreadsheets, analysis&lt;/td&gt;
&lt;td&gt;A model that writes and runs code (Python execution)&lt;/td&gt;
&lt;td&gt;LLMs are weak at arithmetic done in their head. One that executes code is correct by construction, not by luck.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Images, mockups, design&lt;/td&gt;
&lt;td&gt;A dedicated image model (diffusion tools, plus the image modes of the big labs)&lt;/td&gt;
&lt;td&gt;Different architecture entirely. Text models describe a picture. Image models render one.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Research, current facts&lt;/td&gt;
&lt;td&gt;A tool with real retrieval and citations (browsing modes, Perplexity)&lt;/td&gt;
&lt;td&gt;Any model without live retrieval will invent recent facts with full confidence. Citations are the point.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The pattern behind the table
&lt;/h2&gt;

&lt;p&gt;Two ideas do most of the work here.&lt;/p&gt;

&lt;p&gt;First, match the tool to the failure the task cannot tolerate. If the task has a hard check (it compiles, the numbers add up, the fact is real), pick the tool that connects to that check: code execution, repo access, web retrieval. A model that guesses is fine for a first draft and dangerous for a payroll formula.&lt;/p&gt;

&lt;p&gt;Second, general chat models are generalists. They are the right default for open-ended work with soft criteria, like writing and thinking out loud. They are the wrong default the moment the task has a mechanical ground truth, because then you want the tool holding the ground truth, not the one with the highest leaderboard score.&lt;/p&gt;

&lt;p&gt;A quick example. Ask a plain chat model to "sum column C where region is EU" over pasted data and it will often produce a confident, slightly wrong number. Ask a code-executing tool the same thing and it writes:&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="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EU&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;C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;runs it, and returns a number you can trust. Same request, different failure surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  The only benchmark that counts: your own work
&lt;/h2&gt;

&lt;p&gt;Public benchmarks are averaged over tasks that are not yours. The model that wins on a coding benchmark may lose on your codebase, your naming conventions, your weird legacy module.&lt;/p&gt;

&lt;p&gt;So run a small bake-off on tasks you actually own. It costs an afternoon, and the result reflects your work instead of an average of everyone else's.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick three real tasks you actually do, one per category that matters to you.&lt;/li&gt;
&lt;li&gt;Run each on two or three candidate tools with the same prompt.&lt;/li&gt;
&lt;li&gt;Score on what you care about: correctness, edits needed, time saved. Not vibes.&lt;/li&gt;
&lt;li&gt;Keep a note of which tool won which category. That note is your real leaderboard.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Re-run it maybe twice a year, or when a tool you use ships a major update. The rankings move, but your test does not, so re-checking is cheap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this framework is weaker
&lt;/h2&gt;

&lt;p&gt;Two honest caveats.&lt;/p&gt;

&lt;p&gt;The categories blur. A lot of real work is mixed: a data task that ends in a written summary, a coding task that needs current library docs. For mixed work, split the job and route each part, or accept that one tool will be merely good at all of it instead of great at one.&lt;/p&gt;

&lt;p&gt;And "tends to fit" is a starting bet, not a verdict. The labels above reflect how these tool families are built, not a guarantee for your exact prompt. If your own bake-off disagrees with the table, trust your bake-off. That is the whole point of running it.&lt;/p&gt;

&lt;p&gt;Pick by the task, verify on your own work, and let the leaderboards crown whoever they like.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stop Re-Explaining Yourself to Claude: Structure a Project That Remembers Your Work</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Sat, 01 Aug 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/academy_agineai/stop-re-explaining-yourself-to-claude-structure-a-project-that-remembers-your-work-3dh4</link>
      <guid>https://dev.to/academy_agineai/stop-re-explaining-yourself-to-claude-structure-a-project-that-remembers-your-work-3dh4</guid>
      <description>&lt;h2&gt;
  
  
  Every new chat makes Claude a stranger again
&lt;/h2&gt;

&lt;p&gt;You explain the codebase. You paste the style guide. You re-describe the client, the constraints, the one legacy decision you have to live with. Then the chat gets long, you start a fresh one, and you do it all again.&lt;/p&gt;

&lt;p&gt;That re-briefing tax is a big part of why AI assistants still feel like a demo instead of a coworker. Claude Projects exist to remove it: a workspace where your instructions, files, and context live in one place, so every conversation inside it starts already knowing your work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Project actually is
&lt;/h2&gt;

&lt;p&gt;A Project bundles three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom instructions&lt;/strong&gt; that apply to every chat in the Project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project knowledge&lt;/strong&gt;: files and text you upload once (docs, specs, schemas, style guides).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A shared context boundary&lt;/strong&gt;: every conversation you start inside the Project can draw on those instructions and that knowledge, without you pasting anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Project is not a longer chat. It is a room: you walk in, the reference material is already on the shelves, the house rules are on the wall, and each conversation is a separate desk. What you learn at one desk does not carry to the next, but the shelves and the rules are shared.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write instructions like a job description, not a wish
&lt;/h2&gt;

&lt;p&gt;The weakest Projects have instructions like "You are a helpful assistant for my startup." That tells Claude nothing it did not already assume.&lt;/p&gt;

&lt;p&gt;Treat the instructions as onboarding for a competent new hire. Cover role, constraints, and output shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Role: You help maintain a Django + Postgres API for a logistics app.
Audience: mid-level backend devs on our team.
Rules:
&lt;span class="p"&gt;-&lt;/span&gt; Match our style guide (see knowledge). Type hints required.
&lt;span class="p"&gt;-&lt;/span&gt; Prefer stdlib and existing deps; ask before adding a package.
&lt;span class="p"&gt;-&lt;/span&gt; When unsure about business logic, ask instead of guessing.
Output: code first, then a short "why" note. No filler intros.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Constraints do more work than encouragement. "Ask before adding a package" prevents more bad output than any amount of "be smart and thorough."&lt;/p&gt;

&lt;h2&gt;
  
  
  Curate knowledge, do not dump a drive
&lt;/h2&gt;

&lt;p&gt;It is tempting to upload everything. Resist it. Project knowledge is signal you are handing the model, and noise dilutes it. An outdated PRD sitting next to the current spec gets cited as if both are true.&lt;/p&gt;

&lt;p&gt;Good candidates: the current architecture overview, the API schema, the style guide, a glossary of domain terms, a few representative examples of "good" output. Bad candidates: entire meeting-note archives, superseded drafts, anything you would not want quoted back at you as fact.&lt;/p&gt;

&lt;p&gt;If a file has a stale section, trim it before uploading. You are curating a reference shelf, not backing up a folder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a map file
&lt;/h2&gt;

&lt;p&gt;One small file earns its place fast: a short index, something like &lt;code&gt;_START_HERE.md&lt;/code&gt;, that says what every other file is and when to trust it.&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="p"&gt;-&lt;/span&gt; architecture.md : current system design. Source of truth.
&lt;span class="p"&gt;-&lt;/span&gt; style-guide.md  : code conventions. Always apply.
&lt;span class="p"&gt;-&lt;/span&gt; glossary.md     : domain terms (a "shipment" != an "order").
&lt;span class="p"&gt;-&lt;/span&gt; old-spec.md     : historical only. Do NOT treat as current.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives Claude a way to weigh sources instead of averaging them, and it forces you to notice what is actually in the Project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it fresh (the step everyone skips)
&lt;/h2&gt;

&lt;p&gt;A Project is manual memory. Nothing updates itself. The schema changes, the file does not, and now your assistant is confidently wrong in a way that is harder to catch than an obvious blank.&lt;/p&gt;

&lt;p&gt;Build a small habit: when a decision changes, update the one file that records it, the way you would a README. Stale context is worse than no context, because it reads as authoritative.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Projects are weaker
&lt;/h2&gt;

&lt;p&gt;The honest limits, because they change how you use it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not a live knowledge base.&lt;/strong&gt; A Project reflects what you last uploaded, not your repo's current state. For code that changes hourly, it drifts fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval is not exact.&lt;/strong&gt; Large knowledge sets get drawn on selectively, not read cover to cover on every message. Ten focused files beat a hundred loosely relevant ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope is a boundary, not a brain.&lt;/strong&gt; Context does not carry between Projects. That is good for isolation, but it means you maintain each one by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensitive material is still material you put somewhere.&lt;/strong&gt; Client data and secrets in a Project deserve the same judgment you would apply to any shared workspace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this makes Projects less useful. You just want to know the edges before you lean on them.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minimal starting point
&lt;/h2&gt;

&lt;p&gt;Create one Project per real domain (one codebase, one client, one book), not a single mega-Project. Give it three files to start: a map, an architecture or overview doc, and a style guide. Write ten lines of real instructions. Then start a chat, watch what it still gets wrong, and fix the file instead of the prompt.&lt;/p&gt;

&lt;p&gt;Do that for a week and the pattern changes: you stop introducing yourself, and Claude starts picking up where you left off.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Stop Reaching for a Bigger Model. Fix the Prompt First.</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Thu, 30 Jul 2026 13:50:00 +0000</pubDate>
      <link>https://dev.to/academy_agineai/stop-reaching-for-a-bigger-model-fix-the-prompt-first-459k</link>
      <guid>https://dev.to/academy_agineai/stop-reaching-for-a-bigger-model-fix-the-prompt-first-459k</guid>
      <description>&lt;p&gt;Every time an AI feature disappoints, the reflex is the same: swap in the newer, bigger model. Sometimes that helps. More often, the same model would have nailed it if the prompt had actually told it what to do.&lt;/p&gt;

&lt;p&gt;I've watched teams burn a sprint on model comparisons when the real problem was a two-line prompt doing four jobs badly. The boring truth: for most day-to-day tasks, the gap between a weak prompt and a strong prompt is larger than the gap between two adjacent models. And the prompt is free to fix.&lt;/p&gt;

&lt;p&gt;Four fundamentals do the heavy lifting. None of them are clever tricks.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Give it context, not just a task
&lt;/h2&gt;

&lt;p&gt;Models don't know your situation. They know language. If you skip the context, the model fills the gap with the statistical average of the internet, which is almost never what you wanted.&lt;/p&gt;

&lt;p&gt;A task without context ("summarize this") forces the model to guess your audience, length, and purpose. Every guess is a place it can be wrong.&lt;/p&gt;

&lt;p&gt;Context worth adding: who reads the output, what they'll do with it, what to leave out, and any hard constraints (tone, length, forbidden words). Treat it like briefing a new contractor who is fast, literal, and has zero memory of your company.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Show examples (few-shot)
&lt;/h2&gt;

&lt;p&gt;Describing what you want is harder than showing it. One or two examples of input paired with the desired output pins down format, tone, and edge cases faster than a paragraph of instructions.&lt;/p&gt;

&lt;p&gt;This is "few-shot" prompting. It's underused because it feels like more typing, but it isn't: a good example replaces three rounds of "no, not like that."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Classify the ticket. Match this style:

Input: "App crashes when I upload a PDF over 20MB"
Output: { "type": "bug", "severity": "high", "area": "uploads" }

Input: "Can you add dark mode?"
Output: { "type": "feature", "severity": "low", "area": "ui" }

Now classify:
Input: "Login page loads forever on mobile Safari"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model now knows your schema, your severity scale, and your naming, none of which you had to explain in prose.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Demand an explicit output format
&lt;/h2&gt;

&lt;p&gt;If you don't specify the shape, you get prose. Then you write a parser, the parser breaks on the model's next mood, and you blame the model.&lt;/p&gt;

&lt;p&gt;Say exactly what you want back: JSON with these keys, a markdown table with these columns, three bullets and nothing else. "Return only valid JSON, no explanation" removes the friendly preamble that breaks &lt;code&gt;JSON.parse&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Being explicit about format also quietly improves quality. A model forced into a structure has to commit to specific fields instead of hedging in paragraphs.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Set a role
&lt;/h2&gt;

&lt;p&gt;"You are a senior security reviewer" is not theater. It shifts which patterns the model reaches for. A role narrows the space of plausible responses toward the vocabulary, priorities, and rigor of that persona.&lt;/p&gt;

&lt;p&gt;Keep it concrete and functional. "A technical editor who cuts filler and flags unsupported claims" beats "a world-class genius writer." The first tells the model what to &lt;em&gt;do&lt;/em&gt;; the second just flatters it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before and after
&lt;/h2&gt;

&lt;p&gt;Here's a weak prompt most people actually ship:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write release notes for these commits.
[commit log]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll get a generic changelog, probably too long, in whatever tone the model felt like, mixing internal refactors with user-facing changes.&lt;/p&gt;

&lt;p&gt;Now the same job with all four fundamentals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a product writer for a developer tool. Write release notes
for non-technical users of our billing dashboard.

Context:
- Readers are finance staff, not engineers.
- Skip internal refactors and dependency bumps entirely.
- Keep it under 120 words.

Format: markdown, grouped under "New", "Fixed", "Improved".
Each item is one sentence, plain language, no ticket numbers.

Example item:
- Invoices now download as PDF directly from the dashboard.

Commits:
[commit log]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same model, completely different result. And it's reproducible, because you removed the guesswork instead of hoping the model guessed well.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest caveat
&lt;/h2&gt;

&lt;p&gt;Prompting is not magic, and it has a ceiling. If the task needs knowledge the model doesn't have, better wording won't invent it. If it requires multi-step reasoning that strains the model's actual capability, a stronger model is the right call. For hard math, long-context work, or complex code, the model itself matters in ways no prompt can fix.&lt;/p&gt;

&lt;p&gt;There's also a failure mode in the other direction: over-engineered prompts. Piling on contradictory instructions, five personas, and a wall of rules can make output &lt;em&gt;worse&lt;/em&gt; and harder to debug. Start minimal, add only what fixes an observed problem, and cut anything that isn't earning its place.&lt;/p&gt;

&lt;p&gt;The rule of thumb I use: before upgrading the model, spend fifteen minutes rewriting the prompt with these four fundamentals. If it's still failing after that, then it's a model problem. Most of the time, you never get there.&lt;/p&gt;

&lt;p&gt;Prompting is a skill you can practice deliberately. Write the weak version, name what's ambiguous, and fix one thing at a time. It compounds faster than waiting for the next model release.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>promptengineering</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Claude vs Gemini: pick the model by the job, not the benchmark</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Wed, 29 Jul 2026 14:40:00 +0000</pubDate>
      <link>https://dev.to/academy_agineai/claude-vs-gemini-pick-the-model-by-the-job-not-the-benchmark-247c</link>
      <guid>https://dev.to/academy_agineai/claude-vs-gemini-pick-the-model-by-the-job-not-the-benchmark-247c</guid>
      <description>&lt;h2&gt;
  
  
  Nobody's "best model" survives contact with your actual work
&lt;/h2&gt;

&lt;p&gt;The "which AI is better" debate is mostly noise because it skips the one variable that actually decides the outcome: what you're doing and where your data already lives. Claude and Gemini are both strong general models. They split apart in the boring, practical places: where your files sit, how you feed them context, and how much you trust the output without re-reading it.&lt;/p&gt;

&lt;p&gt;Here's how I actually decide, task by task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemini: when the work lives in Google's world
&lt;/h2&gt;

&lt;p&gt;If your day runs through Gmail, Docs, Sheets, and Drive, Gemini has a structural advantage that has nothing to do with raw reasoning. It already sits inside those tools. Asking it to summarize a thread, draft a reply in context, or pull numbers from a sheet skips the copy-paste tax.&lt;/p&gt;

&lt;p&gt;Three places it tends to win:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Workspace tasks.&lt;/strong&gt; With access to your Gmail, Docs, and Drive context, there are fewer round trips. You're not pasting a document; the model can already see it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal input.&lt;/strong&gt; Feeding it images, screenshots, PDFs, and mixed media feels first-class, not bolted on. Good for "here's a screenshot of a dashboard, what changed?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search grounding.&lt;/strong&gt; When the answer depends on something current, grounding the response against live web results cuts down the "confidently wrong about last week" failure you get from a static model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the question is "what's the current state of X" or "look at this image and tell me what's off," Gemini is usually my first reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude: when precision and long context matter
&lt;/h2&gt;

&lt;p&gt;Claude's edge shows up when the job is reading a lot carefully and producing something you won't have to babysit.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Long-context precision.&lt;/strong&gt; Drop in a big codebase, a long contract, or a messy transcript and ask for specific things across all of it. It tends to hold detail across the whole window instead of degrading into vibes by the end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Careful editing.&lt;/strong&gt; For rewriting, refactoring prose, or surgical code changes, it's more likely to change only what you asked and leave the rest alone. That "did you touch something I didn't point at" trust matters more than people admit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Following instructions literally.&lt;/strong&gt; Give it a format, a set of constraints, a house style, and it holds the line better under complex, layered instructions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The kind of task I hand Claude without thinking twice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here are 40 pages of API docs and our current client wrapper.
Rewrite the wrapper to cover the endpoints we're missing.
Don't change the function signatures we already export.
Match the existing error-handling pattern.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That "don't change what I didn't ask about" clause is exactly where careful editing earns its keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  A decision guide you can use in ten seconds
&lt;/h2&gt;

&lt;p&gt;Match the job to the model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your task&lt;/th&gt;
&lt;th&gt;Reach for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Summarize or reply inside Gmail/Docs&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Look at this screenshot or PDF"&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Needs current, live info&lt;/td&gt;
&lt;td&gt;Gemini (grounded)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read a huge document, answer precisely&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refactor code without collateral damage&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rewrite prose, keep my voice&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow a long, strict spec&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rough rule: &lt;strong&gt;Gemini for reach&lt;/strong&gt; (into your data, the web, and images), &lt;strong&gt;Claude for depth&lt;/strong&gt; (careful reading and careful writing).&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest caveat
&lt;/h2&gt;

&lt;p&gt;This split is a starting bias, not a law. Two things keep it from being clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;These models leapfrog constantly.&lt;/strong&gt; Any specific claim about which one edits better or grounds better has a short shelf life. Treat "Claude for editing, Gemini for grounding" as a current tendency, not a permanent truth, and re-test on your own tasks every few months.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration is a real cost.&lt;/strong&gt; The "obvious" choice is often just the one already wired into your stack. If your whole team lives in Google Workspace, Gemini's convenience can beat Claude's editing edge for everyday work, because the friction of moving data out is a tax you pay on every single task.&lt;/p&gt;

&lt;p&gt;And neither one gets you out of reading the output. Grounding reduces hallucination; it doesn't remove it. Long-context precision means fewer misses, not zero. The moment a task has real consequences, you check the work regardless of the logo on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I actually run it
&lt;/h2&gt;

&lt;p&gt;I don't pick one. I keep both open and route by job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anything touching my email, docs, or "what's true right now" goes to Gemini.&lt;/li&gt;
&lt;li&gt;Anything that's read-this-carefully or write-this-precisely goes to Claude.&lt;/li&gt;
&lt;li&gt;When I'm unsure, I run the same prompt through both and keep the better answer. Two minutes of comparison beats loyalty to a brand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm not trying to crown a winner. I'm trying to stop treating "AI" as a single tool and start treating it as a small toolbox where I already know which one to grab for the job in front of me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>gemini</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Claude Artifacts: When a Chat Answer Becomes a Running Tool</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Tue, 28 Jul 2026 15:10:00 +0000</pubDate>
      <link>https://dev.to/academy_agineai/claude-artifacts-when-a-chat-answer-becomes-a-running-tool-418l</link>
      <guid>https://dev.to/academy_agineai/claude-artifacts-when-a-chat-answer-becomes-a-running-tool-418l</guid>
      <description>&lt;h2&gt;
  
  
  What an Artifact actually is
&lt;/h2&gt;

&lt;p&gt;An Artifact is what you get when you ask Claude for something buildable and it hands back a running thing instead of a code block you have to copy, paste, and wire up yourself. The chat generates a small, self-contained web page (HTML, CSS, and JavaScript, or a React component) and renders it live in a panel next to the conversation. You type, it runs. You ask for a change, it rebuilds in place.&lt;/p&gt;

&lt;p&gt;That's the whole shift. The output stops being &lt;em&gt;instructions for a tool&lt;/em&gt; and becomes &lt;em&gt;the tool&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Under the hood, each Artifact runs inside a sandboxed iframe. That sandbox is the source of both its powers and its limits, so keep it in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where they actually earn their keep
&lt;/h2&gt;

&lt;p&gt;The sweet spot is anything small, interactive, and self-contained:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Calculators.&lt;/strong&gt; Mortgage, tip, unit economics, runway math: anything that goes inputs → formula → output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-page landing previews.&lt;/strong&gt; Paste your headline and three bullets, get a laid-out page you can eyeball before a designer touches it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forms and their logic.&lt;/strong&gt; Field validation, conditional questions, a multi-step wizard. You can click through the whole flow even though nothing submits anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data views.&lt;/strong&gt; Drop in a CSV or JSON blob and ask for a sortable table or a chart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiny dev tools.&lt;/strong&gt; Regex testers, JSON formatters, a color-contrast checker, a cron-expression explainer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The common thread: things you'd otherwise spin up a CodePen or a throwaway repo for. Artifacts collapse that to one message.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to prompt for a good one
&lt;/h2&gt;

&lt;p&gt;Vague prompts give you vague apps. A few habits that consistently help:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask for one self-contained file.&lt;/strong&gt; The sandbox won't reliably load external scripts, so ask for everything inline up front:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build a mortgage calculator: principal, annual rate, term in years. Show the monthly payment and total interest. Single self-contained HTML file, inline CSS and JS, no external libraries.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Name the inputs and outputs explicitly.&lt;/strong&gt; "A pricing calculator" is a guess. "Three sliders for seats, months, and discount %, output monthly and annual totals" is a spec.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give sample data inline.&lt;/strong&gt; Paste the actual CSV rows or JSON you want rendered. Claude builds around real shapes better than imagined ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iterate in small steps.&lt;/strong&gt; "Make the total bold and add a reset button" edits the same Artifact in place rather than starting over. Treat it like pairing, not one-shotting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The sandbox rules that shape everything
&lt;/h2&gt;

&lt;p&gt;Almost every limitation traces back to one fact: the Artifact runs isolated, with no server behind it and its network access locked down.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No external requests.&lt;/strong&gt; It can't call a third-party API or pull a live exchange rate, and you can't count on an outside script loading. Everything has to be inlined or generated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No real backend.&lt;/strong&gt; Forms don't POST anywhere. There's no database, no auth, no place to keep a secret. A "login form" is a UI mockup, not a login.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State is ephemeral.&lt;/strong&gt; Reload and you're back to defaults unless you explicitly save or publish it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't an oversight. Isolation is what lets an Artifact run safely the instant it's generated. It also draws the line between prototype and product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Artifacts are weaker (the honest part)
&lt;/h2&gt;

&lt;p&gt;I'd stop short of a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anything needing live or private data.&lt;/strong&gt; No API keys, no fetching from your database. If the value is in the data source, an Artifact can only fake it with sample data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-screen apps with real routing and persistence.&lt;/strong&gt; You can push it there, but it gets unwieldy fast and you're better off in a real project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production hosting.&lt;/strong&gt; Publishing an Artifact shares a page. It is not a deploy pipeline, not versioned like git, not something to point a domain at and forget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pixel-exact design systems.&lt;/strong&gt; It'll get you most of a layout quickly. The last stretch, brand tokens and edge-case responsiveness, is faster in your actual codebase.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful mental model: Artifacts are the fastest path from "idea" to "clickable," and a slow, wrong path to "shipped."&lt;/p&gt;

&lt;h2&gt;
  
  
  A workflow that holds up
&lt;/h2&gt;

&lt;p&gt;The pattern that works for me is to use Artifacts to kill ambiguity early. Instead of arguing about how a calculator or a form should behave, build the clickable version in two or three messages, poke at it, and let the working thing settle the debate. Then, if it needs real data or real users, port the logic into your codebase where backends and version control live.&lt;/p&gt;

&lt;p&gt;That keeps Artifacts doing what they're genuinely good at, turning a description into something you can press buttons on before you've committed a single line to your repo, and keeps your production code where it belongs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Cheap Tokens or Reliable Work? Claude vs DeepSeek, Without the Hype</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Mon, 27 Jul 2026 13:20:00 +0000</pubDate>
      <link>https://dev.to/academy_agineai/cheap-tokens-or-reliable-work-claude-vs-deepseek-without-the-hype-254a</link>
      <guid>https://dev.to/academy_agineai/cheap-tokens-or-reliable-work-claude-vs-deepseek-without-the-hype-254a</guid>
      <description>&lt;p&gt;Every few months a cheaper model shows up and someone in the team channel asks the same question: "Why are we still paying for Claude when DeepSeek costs a fraction of the price?"&lt;/p&gt;

&lt;p&gt;Fair question. It's just the wrong metric. It compares what's easy to measure (price per token) against what actually pays the bills (cost per correct outcome). Here are the tradeoffs I keep hitting when I ship on both.&lt;/p&gt;

&lt;h2&gt;
  
  
  What DeepSeek genuinely wins on
&lt;/h2&gt;

&lt;p&gt;Two things, and both are real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Price.&lt;/strong&gt; DeepSeek's hosted API is much cheaper per token, often by a large multiple. If your workload is token-dominated (bulk summarization, classification, offline batch jobs), that difference is real money, not a rounding error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open weights, self-hostable.&lt;/strong&gt; This one gets underrated in these comparisons. If your data can't leave your VPC (health records, internal source code, anything under a strict data-residency clause), then a model you run yourself may be the only option that clears legal review, and cost barely enters into it. Claude is API-only. No budget lets you run it on your own hardware or audit the weights.&lt;/p&gt;

&lt;p&gt;For a lot of teams that single point ends the debate before price even comes up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude charges you for
&lt;/h2&gt;

&lt;p&gt;Consistency, mostly. Not raw intelligence: both models are smart enough for everyday code and text. The gap shows up in variance and instruction adherence across long, multi-step work.&lt;/p&gt;

&lt;p&gt;Three places I feel it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured output that feeds a machine.&lt;/strong&gt; When the next step is &lt;code&gt;JSON.parse()&lt;/code&gt; and not a human reading prose, a model that returns schema-correct output on the first try almost every time is worth a lot more than one that mostly gets there. The misses turn into failed pipelines and 3am pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic chains.&lt;/strong&gt; In a multi-step tool-using loop, per-step reliability compounds. If each step is 95% reliable, a five-step chain lands around 77% end to end (0.95 to the fifth). A reliability-first model holds that chain together; a less consistent one quietly drops a step, and the whole run is wrong in a way that's expensive to debug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long context that stays coherent.&lt;/strong&gt; Both advertise large context windows. The real question is whether the model still uses the middle of that window sensibly. This is where I've seen cheaper models fade first: the tokens fit, the reasoning doesn't hold.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost per token is the wrong metric
&lt;/h2&gt;

&lt;p&gt;Here's the model I actually use. Token price is the sticker. The number that matters is cost per &lt;em&gt;successful&lt;/em&gt; task:&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="n"&gt;effective_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_cost&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;success_rate&lt;/span&gt;
              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;failure_rate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;retry_cost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;human_review_cost&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now plug in your own numbers. Suppose the cheap model is several times cheaper per call but succeeds less often on your task, and each miss costs a retry plus a few minutes of an engineer noticing and fixing it. The reliable model costs more per call but rarely needs manual cleanup.&lt;/p&gt;

&lt;p&gt;On raw price the cheap model wins by a wide margin. Once you add review time on every failed output, the gap narrows fast, and for anything customer-facing the human-review term dominates everything else. The cheap model can end up costing more per shipped result.&lt;/p&gt;

&lt;p&gt;The point isn't "Claude always wins the arithmetic." It's that you can't do the arithmetic with token price alone. You need your own success rate, on your own task, or you're guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  When cheap is the right call
&lt;/h2&gt;

&lt;p&gt;Reach for the cheap or open model when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The work is &lt;strong&gt;high-volume and variance-tolerant&lt;/strong&gt;: first drafts, bulk tagging, internal tooling, anything a human reviews anyway.&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;need self-hosting&lt;/strong&gt; for privacy or data residency. Non-negotiable requirement, easy decision.&lt;/li&gt;
&lt;li&gt;You have &lt;strong&gt;evals and retries wired up&lt;/strong&gt;, so a bad output gets caught by a test, not a customer.&lt;/li&gt;
&lt;li&gt;Cost genuinely dominates: lots of low-stakes calls where a few percent of failures is cheap to absorb.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reach for the reliability-first model when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Output is &lt;strong&gt;one-shot with no human in the loop&lt;/strong&gt;: it goes straight to a user or a downstream system.&lt;/li&gt;
&lt;li&gt;You're running &lt;strong&gt;long agentic chains&lt;/strong&gt; where one wrong step poisons the rest.&lt;/li&gt;
&lt;li&gt;You depend on &lt;strong&gt;strict structured output&lt;/strong&gt; the pipeline can't recover from.&lt;/li&gt;
&lt;li&gt;Correctness is &lt;strong&gt;regulated or reputational&lt;/strong&gt;, and one bad answer costs more than the token savings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest caveats
&lt;/h2&gt;

&lt;p&gt;A few, because this isn't a Claude ad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-hosting isn't free.&lt;/strong&gt; "Cheap model" and "cheap to run" are different sentences. GPUs, inference ops, autoscaling, uptime: do that badly and you'll outspend any API bill, and now you own an on-call rotation too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gap is a moving target.&lt;/strong&gt; Open models improve fast. Any specific claim about which one is "better" has a short shelf life, including this article. Re-run your own evals every quarter and don't trust a six-month-old comparison.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most teams shouldn't pick one.&lt;/strong&gt; The practical move is routing: cheap model for the low-stakes bulk, reliability-first model for the paths where a wrong answer is expensive. Tag requests by stakes and route.&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;choose_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&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;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;needs_self_host&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stakes&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="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="s"&gt;deepseek&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;human_in_loop&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_agentic&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="s"&gt;claude&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# default cheap, escalate on failure
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Measure success rate per model on &lt;em&gt;your&lt;/em&gt; traffic, feed it back into the router, and let the data decide. "Cheap or reliable" was never really a versus. It's a routing problem you solve per request.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>claude</category>
      <category>deepseek</category>
    </item>
    <item>
      <title>From One Task to a Working Agent: Trigger, Data, Action, Deliver</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Sat, 25 Jul 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/academy_agineai/from-one-task-to-a-working-agent-trigger-data-action-deliver-51d8</link>
      <guid>https://dev.to/academy_agineai/from-one-task-to-a-working-agent-trigger-data-action-deliver-51d8</guid>
      <description>&lt;h2&gt;
  
  
  "Agent" is doing too much work
&lt;/h2&gt;

&lt;p&gt;The word "agent" now covers almost anything. A single chat prompt gets called an agent. A cron job with an LLM in the middle gets called an agent. So does a system that plans, calls ten tools, and retries on failure.&lt;/p&gt;

&lt;p&gt;Strip the branding and most useful agents share the same small shape: something happens, the system gathers what it needs, does the work, and puts the result where a human or another system will see it. Four steps: trigger, data, action, deliver. If you can name each step for your use case, you can build it. If you can't, you don't have an agent yet, you have a vague hope.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop: trigger, data, action, deliver
&lt;/h2&gt;

&lt;p&gt;Here it is as plain pseudocode:&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="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                 &lt;span class="c1"&gt;# a webhook, a cron, a new row, a message
&lt;/span&gt;    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;      &lt;span class="c1"&gt;# read files, query APIs, pull the record
&lt;/span&gt;    &lt;span class="n"&gt;result&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;act&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# the LLM call, tool use, or computation
&lt;/span&gt;    &lt;span class="nf"&gt;deliver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;# Slack, a PR, a DB write, an email
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every reliable agent I've shipped fits this. The interesting engineering is almost never in the LLM call. It lives in the other three steps: making the trigger fire at the right time, feeding the model exactly the data it needs and nothing more, and delivering somewhere that fails loudly when it breaks.&lt;/p&gt;

&lt;p&gt;A concrete example: "summarize new support tickets and flag the angry ones."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger:&lt;/strong&gt; a new row in the tickets table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; the ticket text plus the customer's plan and last three tickets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; classify sentiment, write a one-line summary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliver:&lt;/strong&gt; post to a Slack channel, add a label in the helpdesk.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No planning loop, no autonomy. It runs, and it's useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a prompt is enough
&lt;/h2&gt;

&lt;p&gt;Most tasks don't need an agent. They need a good prompt you run yourself.&lt;/p&gt;

&lt;p&gt;Use a plain prompt when the task is one-shot, you're already at the keyboard, and you can eyeball the output. Rewriting an email, drafting a SQL query, explaining a stack trace: opening a chat and pasting context is faster than any pipeline you'd build, and you catch mistakes on the spot.&lt;/p&gt;

&lt;p&gt;Building an agent has a real cost: a trigger to maintain, credentials to store, error handling, logging, and a new thing that can page you at 2am. That cost is worth paying only when the task repeats and the human in the loop is the bottleneck.&lt;/p&gt;

&lt;h2&gt;
  
  
  When it's worth building
&lt;/h2&gt;

&lt;p&gt;Build the agent when three things are true:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It repeats.&lt;/strong&gt; Same shape, many times a day or week. One-offs never earn back the setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The trigger is real, not you remembering.&lt;/strong&gt; If a system event can start it (a webhook, a schedule, a file landing), it's a candidate. If the only trigger is "when I feel like it," keep it a prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can define "done."&lt;/strong&gt; You know what good output looks like well enough to check it, automatically or at a glance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If any of these is missing, you're building a toy that will quietly rot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping it reliable
&lt;/h2&gt;

&lt;p&gt;The gap between a demo and something you trust is almost all error handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Narrow the job.&lt;/strong&gt; One agent, one task. "Read the invoice, extract totals, write a row" beats "handle all our finance ops." Small scope means you can actually verify it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make deliver idempotent.&lt;/strong&gt; Triggers fire twice. Retries happen. If your agent posts to Slack or writes a row, make a repeat run safe: check for an existing result, use an idempotency key, upsert instead of insert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constrain the action.&lt;/strong&gt; Give the model tools with tight signatures instead of free-form shell access. A function that takes a ticket ID and a label is auditable. "Run any command" is not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log the whole loop.&lt;/strong&gt; Store the trigger payload, the data you gathered, the model's output, and what you delivered. When it misbehaves you want to replay the exact run, not guess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fail loud.&lt;/strong&gt; A silent agent that stopped working is worse than no agent, because you stopped doing the task by hand and nobody noticed. Alert on zero runs, not just on errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is weaker
&lt;/h2&gt;

&lt;p&gt;This loop is honest about its limits. It fits tasks with a clear trigger and a checkable output. It does not fit open-ended research, long autonomous planning, or anything where "done" is fuzzy and a wrong action is expensive. Multi-step agents that plan and self-correct are real and sometimes worth it, but they are much harder to keep reliable, and most teams reach for them long before they need to. If you can collapse a problem into trigger, data, action, deliver, do that first. Add autonomy only when the simple loop provably can't do the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one task
&lt;/h2&gt;

&lt;p&gt;Pick the single most annoying repetitive thing you did this week. Write down its four steps. If you can fill in all four, you have your first agent, and it'll probably take an afternoon, not a sprint. Ship that one. You build reliability on small loops, not by bolting it onto a big one.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>The "what not to change" section: the cheapest fix for AI coding agents that quietly break things</title>
      <dc:creator>Konstantin Konovalov</dc:creator>
      <pubDate>Sat, 25 Jul 2026 05:16:50 +0000</pubDate>
      <link>https://dev.to/academy_agineai/the-what-not-to-change-section-the-cheapest-fix-for-ai-coding-agents-that-quietly-break-things-1g62</link>
      <guid>https://dev.to/academy_agineai/the-what-not-to-change-section-the-cheapest-fix-for-ai-coding-agents-that-quietly-break-things-1g62</guid>
      <description>&lt;p&gt;The scariest failure with an AI coding agent is not the one that throws an error. It is the one where the agent hands you code that runs, passes a quick glance, and quietly solves a slightly different problem than the one you had. Obvious failures you catch in seconds. This one you find in production, three days later, when something you never asked it to touch has changed.&lt;/p&gt;

&lt;p&gt;I keep seeing the same root cause, and it has almost nothing to do with the model. It is the brief.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "make it better" goes wrong
&lt;/h2&gt;

&lt;p&gt;When you hand an agent a loose instruction like "clean up this file" or "add caching here," you have not actually told it where the edges are. The model fills the gap with its own guess about scope. Usually that guess is reasonable. Sometimes it rewrites a function three files over, renames a variable that something else depended on, or "helpfully" swaps your logging library because it looked outdated. Each of those is defensible in isolation. Together they are a diff you now have to audit line by line, because you no longer trust that the change stayed inside the box you had in your head.&lt;/p&gt;

&lt;p&gt;The model was not being careless. You never drew the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  The habit: say what not to change
&lt;/h2&gt;

&lt;p&gt;The fix is almost embarrassingly small. Alongside what you want done, write a short explicit list of what must stay untouched, plus the exact files or targets in scope. Two or three lines is enough:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add a retry with backoff to the &lt;code&gt;fetchOrders&lt;/code&gt; call in &lt;code&gt;api/orders.ts&lt;/code&gt;.&lt;br&gt;
Do not change the function signature, do not touch other files, do not add new dependencies.&lt;br&gt;
If a retry still fails after 3 attempts, throw the existing &lt;code&gt;OrderFetchError&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the whole trick. You have turned a fuzzy ask into something with edges. Now the output is checkable: either it stayed inside the box or it did not, and you can tell at a glance instead of reading every line with suspicion.&lt;/p&gt;

&lt;p&gt;Notice what the "do not" lines are really doing. They are not there because the model is dumb. They are there because every unstated assumption is a place the model is free to improvise, and improvisation is exactly what you do not want in a change you have to trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Specificity beats cleverness
&lt;/h2&gt;

&lt;p&gt;There is a bias, especially early on, toward writing clever prompts. Long, elaborate instructions, role play, "you are a senior engineer who cares deeply about clean code." Most of that does far less than one boring line naming the exact file and the exact thing not to touch.&lt;/p&gt;

&lt;p&gt;The reason is simple. A clever prompt tries to make the model want the right outcome. A specific brief removes the room for the wrong one. The second is more reliable because it does not depend on the model reading your mind, it depends on you having said the quiet part out loud.&lt;/p&gt;

&lt;p&gt;This is also the fastest way to get better at working with any coding agent, Claude included. The skill that actually transfers is not memorizing syntax or prompt tricks. It is learning to write a brief tight enough that you can check the result against it in seconds. Once you can do that, the model stops being a slot machine and starts being a tool you point.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick before and after
&lt;/h2&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Refactor the checkout logic, it is getting messy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In &lt;code&gt;checkout/total.ts&lt;/code&gt;, extract the discount math into a pure function &lt;code&gt;applyDiscount(cart, code)&lt;/code&gt;.&lt;br&gt;
Keep the public behavior of &lt;code&gt;getTotal&lt;/code&gt; identical, same inputs and outputs.&lt;br&gt;
Do not touch the tax logic, do not reformat the rest of the file, do not add libraries.&lt;br&gt;
If &lt;code&gt;code&lt;/code&gt; is invalid, return the cart total unchanged, same as today.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The "before" invites the model to redesign your checkout. The "after" gets you one clean, reviewable change and nothing else. Same model, same day, completely different level of trust in the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this leads
&lt;/h2&gt;

&lt;p&gt;Once the "what not to change" habit is automatic, a lot of downstream pain disappears. Your diffs shrink. Your reviews get faster because you are checking a small, bounded change against an explicit spec instead of reverse engineering the agent's intent. And you stop getting those quiet, three-days-later surprises, because there was never room for the agent to wander in the first place.&lt;/p&gt;

&lt;p&gt;It is a small habit with an outsized payoff, and it is the kind of thing that is obvious once you have been burned by the alternative. If you are learning to build with Claude, this is one of the first instincts worth drilling: not a better prompt, a tighter box.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about turning AI from a chat toy into a working tool. I help build &lt;a href="https://academy.agineai.com" rel="noopener noreferrer"&gt;AGINE Academy&lt;/a&gt;, a game-based academy for learning Claude by real practice. It is an independent product and is not affiliated with Anthropic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
