<?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: Mykola (Nick) Skalenko</title>
    <description>The latest articles on DEV Community by Mykola (Nick) Skalenko (@nikolayskalenko).</description>
    <link>https://dev.to/nikolayskalenko</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%2F4210649%2F604adb12-03ac-4e43-9353-7dcdaba90308.jpg</url>
      <title>DEV Community: Mykola (Nick) Skalenko</title>
      <link>https://dev.to/nikolayskalenko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nikolayskalenko"/>
    <language>en</language>
    <item>
      <title>Intelligence Is a Budget: The 4-Level Pyramid I Use to Run AI Agents in Production</title>
      <dc:creator>Mykola (Nick) Skalenko</dc:creator>
      <pubDate>Wed, 28 Oct 2026 15:53:50 +0000</pubDate>
      <link>https://dev.to/nikolayskalenko/intelligence-is-a-budget-the-4-level-pyramid-i-use-to-run-ai-agents-in-production-53i</link>
      <guid>https://dev.to/nikolayskalenko/intelligence-is-a-budget-the-4-level-pyramid-i-use-to-run-ai-agents-in-production-53i</guid>
      <description>&lt;p&gt;&lt;em&gt;Why running a general-purpose agent harness on a large model spent 1,000+ tokens to log a coffee, and how I balance autonomy and strict rules across my stack.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5659hlvg8bz7j96pj10f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5659hlvg8bz7j96pj10f.png" alt="A financial-analyst-level model logging my coffee? Slow. Overloaded with tools. 10x the tokens." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Running a general-purpose agent harness on a large model burned 1,000+ tokens just to log a coffee.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The first version of my personal expense tracker ran inside a general-purpose AI agent harness backed by a large model smart enough to pass a financial analyst exam, even though its entire job was to log &lt;code&gt;"coffee, 120"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When I first wired the bot up in a messenger, I took the obvious shortcut: I connected incoming messages straight to a full agent harness with tool calling. The problem was not just the size of the model. It was the combination of a heavy model and a broad, general-purpose agent harness.&lt;/p&gt;

&lt;p&gt;Because a general-purpose harness is built to handle almost any task, it is not specialized for any single workflow. In practice, it burns roughly the same baseline token overhead on logging a coffee as it does on investigating a DevOps incident. Every message forced the harness to reload &lt;code&gt;AGENTS.md&lt;/code&gt; instructions, the full catalog of available tools, tool-selection reasoning, and tool-call requests. Logging one coffee cost &lt;strong&gt;1,000+ tokens&lt;/strong&gt;, and whenever the agent inspected state or chained calls, a single entry reached &lt;strong&gt;tens of thousands of tokens&lt;/strong&gt; for a parsing job that only needed a few hundred.&lt;/p&gt;

&lt;p&gt;Too much freedom also hurt reliability. Within a week of running daily entries in one long chat session, context piled up, responses slowed down, and the model started drifting on repetitive entries. Because an unconstrained LLM is non-deterministic, sending the exact same expense item on different days produced slightly different category names or landed in different categories altogether.&lt;/p&gt;

&lt;p&gt;That pushed me toward a simpler architecture: replace the open-ended agent with a deterministic backend application, keep just a drop of intelligence at the entry point to turn voice or text into structured data, and tune the application rules and the parsing prompt separately. Model cost dropped close to zero, latency disappeared, and the data became consistent.&lt;/p&gt;

&lt;p&gt;Building and breaking that tracker shaped how I design all of my AI systems today as a Senior Backend Engineer and AI Solutions Architect at a private marketing company in Thailand.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Continuous Balance, Not Rigid Walls
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fllnzldzuis3q8lvnzzg5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fllnzldzuis3q8lvnzzg5.png" alt="Not every job needs the biggest brain: The 4-Level Intelligence Pyramid" width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The 4-Level Intelligence Pyramid: a continuous scale balancing reasoning freedom against strict rules.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Coming from traditional backend engineering (PHP, Go, Python, SQL, Redis, RabbitMQ, and Elasticsearch), I am used to treating compute and memory as budgets. Combining heavy models with broad agent harnesses creates a huge space for optimization once I treat &lt;strong&gt;intelligence&lt;/strong&gt; the same way.&lt;/p&gt;

&lt;p&gt;I map my stack as a &lt;strong&gt;4-Level Intelligence Pyramid&lt;/strong&gt; with the &lt;strong&gt;Human&lt;/strong&gt; at the apex.&lt;/p&gt;

&lt;p&gt;The levels of this pyramid are not rigid walls between isolated tools. They represent a continuous balance between &lt;strong&gt;autonomy&lt;/strong&gt; and &lt;strong&gt;rules&lt;/strong&gt;. Moving &lt;strong&gt;up&lt;/strong&gt; the pyramid adds more intelligence, broader freedom of action, higher token cost, and more variance. Moving &lt;strong&gt;down&lt;/strong&gt; the pyramid tightens the rules, increases speed and determinism, and handles much higher volume.&lt;/p&gt;

&lt;p&gt;At the very top sits the &lt;strong&gt;Human&lt;/strong&gt; (ideas, product intent, and final accountability). Below that apex sit four execution layers, and any workflow can slide up or down between them depending on how much freedom it actually needs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 1: Strategic Agents (Architecture and Direction)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb0151s1eiwt102rljg8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb0151s1eiwt102rljg8c.png" alt="Level 1 of 4: Strategic Agents. The big brain plans. It doesn't type." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Level 1: High-level agents work with broad context to plan architecture and produce approved technical briefs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Right below the human apex sit &lt;strong&gt;Level 1: Strategic Agents&lt;/strong&gt;. This is where top reasoning models and broad exploration actually belong.&lt;/p&gt;

&lt;p&gt;When I start a new service or redesign a workflow, I intentionally state my vision at a high level so low-level implementation details do not clutter the core idea. A Strategic Agent helps me expand that vision: weighing trade-offs across data models, service boundaries, and security rules, and deciding which parts of the system genuinely need model intelligence and which parts should be plain code. Because architectural planning happens a few times per feature rather than thousands of times a day, paying for broad context and deep reasoning here makes sense.&lt;/p&gt;

&lt;p&gt;A Level 1 agent never types production code or touches live servers. Its output is an approved technical brief for the level below.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 2: Dev-Team Agents (Full Agents Inside a Static Pipeline)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8walpazozfbc27jysgow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8walpazozfbc27jysgow.png" alt="Level 2 of 4: Dev-Team Agents. Brief in. Working code out." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Level 2: A static pipeline orchestrates the workflow, while each step runs a specialized agent with its own toolset.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once I approve the brief, the work drops to &lt;strong&gt;Level 2: Dev-Team Agents&lt;/strong&gt;, where strong models turn that brief into working code.&lt;/p&gt;

&lt;p&gt;When coding agents are given too much freedom inside an open-ended harness, two things happen: they make unrequested decisions outside their scope, and side problems pull them away from the original plan. To prevent that, my development workflow is structured like an application with a strict, static pipeline: a lead agent splits the approved brief into small, atomic tasks, developer agents write the code, an independent review agent checks the diff against the spec, and automated test suites gate the merge.&lt;/p&gt;

&lt;p&gt;Inside each step of that static pipeline, however, the worker is still a &lt;strong&gt;full AI agent&lt;/strong&gt;. A developer or reviewer agent has real autonomy to inspect files, run commands, and solve problems, but it is constrained by three things: a &lt;strong&gt;narrow task&lt;/strong&gt;, an &lt;strong&gt;isolated context&lt;/strong&gt;, and a &lt;strong&gt;fixed set of tools&lt;/strong&gt; matched to its specialty. Splitting work into small, single-task sessions eliminates roughly 90% of context bloat while keeping every agent on track.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 3: Apps with a Drop of AI (Scripts Decide, Small Model Structures the Data)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foryna5wgqe998hlealgd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foryna5wgqe998hlealgd.png" alt="Level 3 of 4: Apps with a drop of AI. Scripts do the work. A small model fills the gaps." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Level 3: Scripts control every decision, calling a small model at a single point only to turn unstructured data into a strict schema.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It is easy to confuse &lt;strong&gt;Level 2&lt;/strong&gt; and &lt;strong&gt;Level 3&lt;/strong&gt; because both combine code and AI, but the degree of freedom is completely different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At &lt;strong&gt;Level 2&lt;/strong&gt;, the outer pipeline is fixed, but each step runs a &lt;strong&gt;full agent&lt;/strong&gt; that chooses which tools to call and how to solve its narrow task.&lt;/li&gt;
&lt;li&gt;At &lt;strong&gt;Level 3&lt;/strong&gt;, there are &lt;strong&gt;no agents and no tool-calling choices at all&lt;/strong&gt;. Level 3 is essentially a &lt;strong&gt;Level 4 script with a drop of intelligence at the entry point&lt;/strong&gt;: whenever incoming data is unstructured, a small model (optionally paired with speech-to-text) converts that raw input into a strict schema first, and then deterministic scripts execute the rest of the structured flow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My rebuilt expense tracker lives here. When I send a voice note or text message, speech-to-text transcribes the audio and a small (~24B parameter) self-hostable model extracts &lt;code&gt;amount&lt;/code&gt;, &lt;code&gt;currency&lt;/code&gt;, and a &lt;code&gt;category&lt;/code&gt; chosen strictly from a fixed list stored in my database. Standard backend scripts then show me a quick confirmation, write the validated record to the database, or run spending queries over any date range. Whenever I want to improve the tracker, I can either adjust the deterministic application rules or tune the narrow parsing prompt independently.&lt;/p&gt;

&lt;p&gt;When I build Level 3 services, I follow one rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I don't hope the model won't fail. I assume it will.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because I assume the model can fail at any moment, the model never controls application flow or touches storage directly. Deterministic scripts wrap that single inference call on both sides and validate every field before anything is saved.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 4: Plain Scripts (Pure Tools, Already Structured Data)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxbrfe9xgl0yeyizgj7i0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxbrfe9xgl0yeyizgj7i0.png" alt="Level 4 of 4: Plain Scripts. No AI at all. Just strict, repeatable steps." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Level 4: Purely deterministic scripts and tools that operate on structured inputs with zero AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At the base of the pyramid sits &lt;strong&gt;Level 4: Plain Scripts&lt;/strong&gt;, where inputs are already structured and there is no unstructured data to interpret at all.&lt;/p&gt;

&lt;p&gt;Level 4 serves two roles in my stack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Standalone static workflows&lt;/strong&gt; that run on a schedule or a button press with zero AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard-coded CLI tools for higher layers:&lt;/strong&gt; when an agent at Level 2 or an app at Level 3 needs to trigger a critical action, it calls a Level 4 script with strict rules and predefined parameters so it cannot improvise flags or break the system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My &lt;strong&gt;deployer&lt;/strong&gt; is the clearest example. When I tried letting capable agents run deployments directly, they occasionally added extra steps or skipped checks. Now my deployer is a pure Level 4 tool built on standard deterministic scripts. Whether I trigger a release from a button or through a voice command, the script runs the exact same sequence every time: fast, cheap, and identical on every run.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sliding Up and Down the Pyramid: Start Smart, Then Make It Dumber
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fauqd0x4rnhdgd5yprlnl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fauqd0x4rnhdgd5yprlnl.png" alt="The Rule: Start smart. Then make it dumber." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Each level does only what it is best at. The smarter the level, the fewer the tasks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As the pyramid diagram above shows, this architecture works in two ways at once.&lt;/p&gt;

&lt;p&gt;First, &lt;strong&gt;a single project flows top-to-bottom through the layers&lt;/strong&gt;: I start with an &lt;strong&gt;Idea&lt;/strong&gt; at the apex, Level 1 turns it into an architectural &lt;strong&gt;Plan&lt;/strong&gt;, Level 2 agents build the separate &lt;strong&gt;Parts&lt;/strong&gt; inside a static pipeline, Level 3 apps &lt;strong&gt;Assemble&lt;/strong&gt; unstructured runtime inputs into structured flows, and Level 4 scripts mechanically &lt;strong&gt;Polish&lt;/strong&gt;, test, and deploy the result.&lt;/p&gt;

&lt;p&gt;Second, &lt;strong&gt;individual workflows migrate down the pyramid over time&lt;/strong&gt; as I learn their edge cases (&lt;strong&gt;start smart, then make it dumber&lt;/strong&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Explore at Level 1 or Level 2:&lt;/strong&gt; When a task is new and unpredictable, I use high-level agents to discover what real inputs look like and where the edge cases hide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tighten the pipeline at Level 2:&lt;/strong&gt; Where agents still need to reason and use tools, I lock their outer workflow into a static state machine with narrow tasks and isolated contexts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compile into Level 3 and Level 4:&lt;/strong&gt; Where intelligence is only needed to turn unstructured data into a schema, I replace the agent with a single small-model parse inside a Level 3 script. Where the input is already structured, I lock the logic into a pure Level 4 script.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This also answers how a system keeps its context when tasks move down to smaller models or scripts. Persistent memory does not have to stay in a raw chat history reloaded on every turn. In my setup, &lt;strong&gt;each lower level of the pyramid is the compiled context from the level above&lt;/strong&gt;, materialized as static pipelines, fixed database categories, and deterministic scripts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F06xqshnviy0pi4gmp1gf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F06xqshnviy0pi4gmp1gf.png" alt="Takeaway: Intelligence is a budget. Spend it where decisions happen." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Spend reasoning tokens where real decisions happen, and lock repeatable patterns into rules and scripts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each level of the pyramid does only what it is best at, and the smarter the level, the fewer tasks it handles. Whenever a workflow becomes predictable, I dial down the open-ended intelligence and dial up the rules. Spend the intelligence budget where real decisions happen, and let deterministic code handle the rest.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I am Mykola (Nick) Skalenko, a Senior Backend Engineer and AI Solutions Architect building distributed backend systems (PHP, Go, Python) and multi-agent engineering workflows. More of my architecture notes are on &lt;a href="https://www.linkedin.com/in/mykola-skalenko-2915a3249/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://x.com/NikolaySkalenko" rel="noopener noreferrer"&gt;X (@NikolaySkalenko)&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>From ~9 Commits a Month to ~700: How I Moved from Writing Code to Directing an AI Engineering Department</title>
      <dc:creator>Mykola (Nick) Skalenko</dc:creator>
      <pubDate>Tue, 27 Oct 2026 10:46:33 +0000</pubDate>
      <link>https://dev.to/nikolayskalenko/from-9-commits-a-month-to-700-how-i-moved-from-writing-code-to-directing-an-ai-engineering-2jmm</link>
      <guid>https://dev.to/nikolayskalenko/from-9-commits-a-month-to-700-how-i-moved-from-writing-code-to-directing-an-ai-engineering-2jmm</guid>
      <description>&lt;p&gt;&lt;em&gt;What changed after 7+ years of backend engineering in PHP, Go, and Python when I stopped typing every line by hand and built a role-based pipeline of AI agents.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0qpcdjnpvvc2jsa8lqpq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0qpcdjnpvvc2jsa8lqpq.png" alt="THEN 2019: I wrote every line by hand. NOW 2026: I lead a team of AI agents." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;2019 vs. 2026: Moving from writing every line by hand to running a role-based pipeline of AI agents.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In 2019 and 2020, my personal GitHub account averaged &lt;strong&gt;~9 commits a month&lt;/strong&gt;. Back then, I wrote every line by hand, spent evenings tracking down missing characters in my IDE, and handled every part of a feature myself, from database schema design to deployment.&lt;/p&gt;

&lt;p&gt;Over the last 30 days in 2026, that same personal GitHub account logged &lt;strong&gt;~700 commits&lt;/strong&gt; (roughly &lt;strong&gt;75x my 2019-2020 pace&lt;/strong&gt;) and &lt;strong&gt;328 merged pull requests across 14 repositories&lt;/strong&gt;. Every commit came from a small, focused pull request with automated tests, and I typed almost none of the application code by hand.&lt;/p&gt;

&lt;p&gt;After more than seven years of backend engineering in PHP, Go, and Python, my day-to-day work at a private marketing company in Thailand shifted from writing code myself to writing system specs, setting service boundaries, and running a role-based pipeline of AI agents. Below is how that pipeline works in practice, where agents break things when a spec is vague, and the CI and deployment checks I put in place to keep those repositories stable.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Writing Specs Instead of Hunting Typos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyr2p8muyzncifcztqvs3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyr2p8muyzncifcztqvs3.png" alt="THEN 2019: Hunting a missing character. NOW 2026: Hunting the right word." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Why coding agents shift the effort from fixing syntax errors to writing unambiguous technical specifications.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When I first started using coding agents on backend services, I tried giving them short, two-sentence prompts and letting the model figure out the details. On a real codebase, that fell apart within a week. Coding agents rarely make syntax typos, so I no longer lose hours to a missing semicolon or an off-by-one loop counter. Instead, things break when a task description leaves an edge case open to interpretation.&lt;/p&gt;

&lt;p&gt;A concrete example came up in my internal server fleet service, where I needed an endpoint to "probe the machine connection" and verify whether a remote host was reachable. Because my initial brief did not specify what should happen when a host is down, the agent had to guess: should the endpoint return HTTP &lt;code&gt;200&lt;/code&gt; with an &lt;code&gt;"unreachable"&lt;/code&gt; status saved in the database, or fail closed with HTTP &lt;code&gt;409&lt;/code&gt;? When five agents work on related tickets across parallel branches and the spec does not spell that out, each agent invents its own retry loop and status convention. At merge time, nothing fits together.&lt;/p&gt;

&lt;p&gt;Because of that, I now review technical specs with the same care I used to put into code reviews:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which state transitions are valid, and which ones must be rejected?&lt;/li&gt;
&lt;li&gt;Which database fields are read-only metadata, and which ones represent server configuration that triggers an update when changed?&lt;/li&gt;
&lt;li&gt;What is the exact HTTP status code, error payload, and timeout for every failure path?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I define those rules up front, the agents write clean, predictable code. If I leave a gap in the spec, five parallel agents will write five incompatible workarounds inside half an hour.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Why Backend Experience Still Drives the Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6istuj1l6uf1fk5t2elo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6istuj1l6uf1fk5t2elo.png" alt="THEN 2019: I knew syntax. NOW 2026: I know systems. PHP, Go, Python, JavaScript to architecture." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Seven years of PHP, Go, and Python backend work now go into system boundaries, database performance, and failure recovery.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before I built this workflow, I spent over seven years working on backend systems under production load. Over those years, I built order-lifecycle state machines handling thousands of orders a day, company-wide authorization and 2FA services handling thousands of requests per minute, and distributed VoIP telephony services covering contacts, billing, and call routing. A lot of that work meant profiling PHP and SQL queries down to the millisecond, tuning Elasticsearch indices for large-scale analytics reports, and splitting the heaviest domains out of monolithic Yii2 and CodeIgniter codebases into Symfony services and compiled, concurrent Go microservices.&lt;/p&gt;

&lt;p&gt;I still rely on that exact same backend experience every day. Any decent model can generate a FastAPI endpoint, a Go binary, or an Alembic migration in ten seconds. What the model will not notice on its own is that a new query filters on an unindexed column that will lock a production table at peak traffic, or that an error handler might dump raw SSH keys or tokens into an application log.&lt;/p&gt;

&lt;p&gt;The model handles the boilerplate and language syntax. Deciding where service boundaries sit, how state machines recover from partial failures, and how data moves between queues and databases is still on me.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Why One Long Chat Fails, and How My 5-Role Pipeline Works
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F457db44l6ae7t3ltbidl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F457db44l6ae7t3ltbidl.png" alt="THEN 2019: I did everything alone. NOW 2026: I run an engineering department." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How work is split across five distinct roles so no single agent gets lost in a long chat thread.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Early on, I tried doing everything inside a single long chat session: brainstorming the architecture, editing ten files, pasting stack traces, and debugging deployment scripts in the same thread. By turn twenty, the context window was full of abandoned ideas and contradictory instructions, and the model started undoing its own earlier fixes.&lt;/p&gt;

&lt;p&gt;To keep each agent's context small and focused, I split the workflow into five separate roles, much like a regular engineering team:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Architect (Me):&lt;/strong&gt; I define the system architecture, service boundaries, data contracts, and security rules, and I do the final review before anything merges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech Lead Agent:&lt;/strong&gt; Reads my initial task brief, inspects the target repository, and writes a detailed technical specification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team Lead Agent:&lt;/strong&gt; Breaks that approved spec down into small, self-contained GitHub issues with explicit acceptance criteria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2 to 5 Developer Agents:&lt;/strong&gt; Pick up individual issues on isolated Git branches, write the code and tests, and open pull requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review Agent and Automated CI:&lt;/strong&gt; Check the pull request diff against the issue requirements and run the full test and migration suite before the PR reaches me for squash-merge.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv9msqaxvxf2b3lt0tbbw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv9msqaxvxf2b3lt0tbbw.png" alt="THEN 2019: Hours for one line of code. NOW 2026: One voice message, a whole service." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;From a voice note in a messenger to a reviewed, squash-merged pull request.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each role only sees the artifact it needs: a spec, a single GitHub issue, or a pull request diff. No agent has to read through fifty messages of back-and-forth debugging history.&lt;/p&gt;

&lt;p&gt;Most days, I start a task by sending a voice note in a messenger while away from my desk. An orchestrator service transcribes the audio into a draft brief, I review and approve the resulting spec, and the pipeline picks up the implementation. A full feature goes from voice note to merged PR in &lt;strong&gt;under 2 hours&lt;/strong&gt;, and for small, well-defined changes, the whole loop finishes in &lt;strong&gt;5 to 7 minutes&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Production Guardrails: What Changed After a Credential Rotation Froze a Deploy
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffa49m1v7zoc419fm7oxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffa49m1v7zoc419fm7oxr.png" alt="THEN 2019: ~9 commits a month. NOW 2026: ~700 commits a month (75x more commits)." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Shipping ~700 commits and 328 pull requests in a month requires strict automated checks before anything reaches production.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When 328 pull requests land across 14 repositories in a single month, writing the code is no longer the slow part. The real work is making sure five parallel branches do not conflict on database migrations, expose internal ports, or leave a server half-deployed.&lt;/p&gt;

&lt;p&gt;I learned this the hard way early on, when rotating a database and API credential froze a production deployment for hours because the deploy script relied on cached environment variables that had been set manually on the host months earlier. When one developer ships nine commits a month, manual server tweaks and &lt;code&gt;"works on my machine"&lt;/code&gt; rarely hurt right away. When five developer agents push pull requests all day, any hidden state on a server will eventually break a release.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F57qluzt34w5zvhlmsbqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F57qluzt34w5zvhlmsbqo.png" alt="THEN 2019: Tests were optional. NOW 2026: Tests are mandatory. " width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Every pull request runs against a clean Postgres container and port policy checks in CI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Today, every repository in my stack runs four automated checks before code can reach production.&lt;/p&gt;

&lt;p&gt;First, every pull request runs against a clean Postgres database in CI. The runner boots a fresh container, runs every schema migration from scratch (&lt;code&gt;alembic upgrade head&lt;/code&gt;), and executes the test suite. If a migration fails on an empty database or conflicts with another branch, the PR is blocked automatically.&lt;/p&gt;

&lt;p&gt;Second, CI renders the full Docker Compose configuration and checks port policies to make sure internal services never publish unintended ports on the host interface.&lt;/p&gt;

&lt;p&gt;Third, agents never SSH into servers or run manual deploy commands. All deployments go through a deterministic, manifest-driven deployer that writes scoped secrets at runtime with &lt;code&gt;0600&lt;/code&gt; permissions and checks &lt;code&gt;/health/live&lt;/code&gt; endpoints before marking a release healthy.&lt;/p&gt;

&lt;p&gt;Finally, no agent has permission to merge to &lt;code&gt;main&lt;/code&gt;. Every squash-merge requires a green CI run and my sign-off on the diff.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Same Engineering Fundamentals, Different Layer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuv4c52399rn2kujoce7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuv4c52399rn2kujoce7v.png" alt="THEN 2019: I wrote code. NOW 2026: I design systems." width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The daily work moved from typing syntax to defining architecture, specifications, and deployment checks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Seven years of writing PHP, Go, and Python taught me how backend systems fail when traffic spikes, migrations lock tables, or network calls time out. Stopping hand-coding did not change any of those failure modes. It just moved my job up one layer: writing clear specs before any code is generated, keeping each agent in a narrow role, and letting automated CI and deterministic deployers catch mistakes before they hit production.&lt;/p&gt;




&lt;h3&gt;
  
  
  About the Author
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Mykola (Nick) Skalenko&lt;/strong&gt; is a Senior Backend Engineer and AI Solutions Architect with 7+ years of experience building distributed systems in PHP, Go, and Python. He currently designs and directs multi-agent engineering and automation systems for a private marketing company in Thailand.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/mykola-skalenko-2915a3249/" rel="noopener noreferrer"&gt;Mykola Skalenko&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X (Twitter):&lt;/strong&gt; &lt;a href="https://x.com/NikolaySkalenko" rel="noopener noreferrer"&gt;@NikolaySkalenko&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>devops</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
