<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>How Spec-Driven Development Brings Structure to AI-Assisted Engineering</title>
        <link>https://paragraph.com/@spec-driven-development</link>
        <description>undefined</description>
        <lastBuildDate>Wed, 10 Jun 2026 11:17:51 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Spec Kit on a Real Project: Implementation Experience in Large Legacy Code]]></title>
            <link>https://paragraph.com/@spec-driven-development/spec-kit-on-a-real-project-implementation-experience-in-large-legacy-code</link>
            <guid>SBdwrTYYeJVS5SszdxxN</guid>
            <pubDate>Thu, 28 May 2026 09:57:22 GMT</pubDate>
            <description><![CDATA[Bringing new AI-powered development tools into a large, established legacy project is rarely straightforward. While conversations around tools like GitHub’s Spec Kit mostly focus on greenfield projects and startups, our team decided to test something different. Our experiment was to handle a real, week-long task from our backlog using Spec Kit, integrated with AI agents. The results were both promising and revealing. This article shares what worked, what didn’t, and the lessons we learned abo...]]></description>
            <content:encoded><![CDATA[<p>Bringing new AI-powered development tools into a large, established legacy project is rarely straightforward. While conversations around tools like GitHub’s Spec Kit mostly focus on greenfield projects and startups, our team decided to test something different.</p><p>Our experiment was to handle a real, week-long task from our backlog using Spec Kit, integrated with AI agents. The results were both promising and revealing. This article shares what worked, what didn’t, and the lessons we learned about using Spec-Driven Development in a mature codebase with years of history.</p><h2 id="h-the-challenge-why-large-legacy-tasks-are-hard-to-execute" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Challenge: Why Large Legacy Tasks Are Hard to Execute</h2><p>Our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/app-modernization-service/">legacy project</a> is anything but small. With four years of development behind it, the codebase has grown into a complex ecosystem of established patterns, legacy components, and deeply embedded business logic.</p><p>The task we selected for the experiment wasn’t algorithmically groundbreaking, but still substantial. It involved creating new components, styling, and API integration. This is the kind of “routine” work that eats up time and represents exactly the type of task where even skilled developers struggle to remember all the nuances.</p><h2 id="h-the-process-how-spec-kit-turned-a-jira-ticket-into-working-code" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Process: How Spec Kit Turned a Jira Ticket into Working Code</h2><br><figure float="none" data-type="figure" class="img-center"><img src="https://storage.googleapis.com/papyrus_images/d7e313887cbb571ae7f9980e49018b9604c05ed4acf03adc3c0f3f30b47e0ddd.png" alt="" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAATCAIAAAB+9pigAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFKklEQVR4nH1VW2wUVRg+j74YHvDJxPhA4oORkBhJkEQ0qJHEgFEffCHRqIlaIl4ggAYrUi5CCRBpCLRKkWutgcVt2e6y2+12u9PdnWFmb93dupfudm9z5szMmTkzO9sFacfsTluaICZ/JnO+c873n/8/5/t/wEN52SpVBBGGCNdqIg9lASkCUkSJtH/wklmg+jhDSEFLCwSkAAEpPJTbY0JIHUIZIiwSA7WnIZRLZShKqiyrGBNrD/o/arwSWXRQLFcPHOnuPHjk2Jmznks3nHtPur4/zV4fcnedneju77949eDxk7+c6zv484lMtkBI3fKNMWm7bHltnUDVZlP5Kcd4OTNbypRqpZoV62IEDBcfdrhtQ86ZdP7OuWuBy7eSfiYdik756FQ663B7vX7q6uDNbL5UqUIeShiTQrFWqcJKlReWTi1AuZyZbeWgbYsO+HYS+n6/cn3Q9kPX0Z7e/gsDf+76qeur/Z079uy7dsP25Z59h4+fvHht4KPPOvb92PXNvv0d3+45cOTYuV/7Ow8d/XTHzsMnTlnZEyVVWkrjkmEgIMxDOcxEw0yU5RIMEyuXIc1EQ0wkzESmMzPReJIKMn9n81Op6TATiSenaTY27PQk01majVEhNhJPrUz68kN4GAEPZVkmRJ/TjSaWNYQUlRiKUq/X54huYFkjpGFlvNG8pxsNjDVdbyEqMeaa/2i6AdvPxGLHWBMldfkRAghlJBGs1Ruq1iS6phsi1gSEVaNhqLqhthDUjl3TDYmXsajqRqNNRHS9rsg6IfXWLklVVNI6E2k0Gk2V6IsORKxlYpn0GM3H0olBl5ArpvxsPlvO3k37Lzvd520z8VwumU9wmdzUTC6eT4VSkUCikK9M+GKwJvedsidjhdBEcnYWjrijokh6L4xXKtg9miiVBQhlIKr1aXrqQ7CmyqVM09wNXrZ39iS4zKtgLUGKodXfAutpV3Cwd/j1J7eaplnJVl8AG6vF2nc7e7ds2GWa5oQ7uuqJbc3m3OatR9/f3mOa5vk+L1jTYQUBIMSSZuwCm94AYAsAb4NVGS4pqvXN4KV14Kl1YPUrYC2EUma6+Bx48Vmw5mnwzJur32nca457owCsB2AjAM9v3bTXNOf7L/kAeA2AdwHY8PEXvXXDqFTF1iULCGsPHjgO9/a99zWuG7KqybLamJ/v232mp6N7bn4eYyKrmj7X7Prk+G+HrtxfWBCQoumGLJPPt3cPXPQsmAs8lJvNZnYGbvvg9JCDWzAfWMwtoSGkjoyM2r0+L8fdsjsQUiLR5MCgzUvTExF24I+bLJfQ9LlCseIO+P3hEA9ljEmlimz222OU3377NhVkjcb9YJi7YbOzkbu3hobcoxMYEx7KLR0ICLNcgqKYSYqmmSgPpVJbChRF0zRHBelSGeZnyqEwFwqyAYpmuXiligrFGkUxwSVEQMpUMjMZZCaD3GSQjUSTlSpadCBKJBTm/rI7nS6v1xvgocRD2eHwDDvuOF3ekRFPpYpESaUo2u32DQ+7QmEOY5LNFZ2uUYfDY7MNj/uDokQKxYrTNeZweBwOTyqdtdRgRaCwXGLcHwxQdCAQ4qEkIJzNFWgmGqDo/EzJqjahMDfmC4x6/bF4WpRIqQwng8yYjxrzURYSi6e93sC4PzjmoyaDrCXh1h20RdgqGNbXEj3Gi20AL9UZAeFUOpfNFVb0idb69saWjJcZ2q1FfFhN/7OBLIMrZ636vLLUrKxrjyKtCB5leZw9hnfRltviyqGAlH8B89LXFS5RYE0AAAAASUVORK5CYII=" nextheight="598" nextwidth="1024" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Our developer followed a deliberately minimal intervention approach. The goal was to see how much the AI tool could handle autonomously, and where human judgment would still be required.</p><h3 id="h-step-1-minimal-context" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Step 1: Minimal Context</h3><p>We gave the agent with integrated <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/github/spec-kit">Spec Kit</a> the Jira ticket number. Because we had the JIRA MCP (Model Context Protocol) connected, the AI agent could autonomously read and analyze the task details. No hand-holding, no additional explanations.</p><h3 id="h-step-2-autonomous-analysis" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Step 2: Autonomous Analysis&nbsp;</h3><p>The AI tool read the ticket, explored the existing codebase, identified relevant components, and recognized established patterns. It helped map the task to the real project codebase.</p><h3 id="h-step-3-planning" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Step 3: Planning</h3><p>Spec Kit generated a detailed specification and implementation plan. This phase delivered an unexpected benefit: the AI surfaced inconsistencies and ambiguities between the ticket requirements and the existing implementation. These issues would have likely been discovered much later, during development or even testing. Here, the AI tool acted as a technical analyst, refining the task before writing the code.</p><h3 id="h-step-4-implementation" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Step 4: Implementation</h3><p>Following its own plan, the AI agent began generating code. It produced the bulk of the boilerplate code (components, styles, types) strictly adhering to the patterns it had identified in the project.</p><h3 id="h-step-5-review-and-polish" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Step 5: Review and Polish</h3><p>Our developer shifted into reviewer mode. He inspected the generated code, fixed integration issues with the backend (which proved to be the AI’s weak spot), and performed light refactoring. Notably, the core business logic generated by the AI agent required no modification.</p><h2 id="h-the-results-faster-delivery-with-maintained-code-quality" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Results: Faster Delivery with Maintained Code Quality</h2><p>From the developer’s perspective, the week-long task was completed in <strong>roughly half the time it would have taken manually</strong>. The time savings came primarily from automating the repetitive, high-volume coding work that’s necessary but doesn’t require deep architectural thinking.</p><p>The generated code <strong>passed linters and TypeScript checks</strong> without issues. More importantly, the AI correctly reused existing components and utilities from the project, rather than reinventing them.</p><p>Perhaps the most surprising outcome was the <strong>improvement in requirements quality</strong>. By surfacing ambiguities and contradictions early, Spec Kit played the role of an analyst, asking clarifying questions at the very beginning of the process, before development began.</p><h2 id="h-key-spec-kit-limitations-in-practice" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Key Spec Kit Limitations in Practice</h2><p>No tool is perfect, and our experiment revealed important constraints that shaped how we think about Spec Kit’s role:</p><ul><li><p><strong>Spec Kit is overkill for tasks estimated at two days or less.</strong> The overhead of going through the specification and planning phases exceeded the time savings from automation. For smaller tasks, working directly with an AI agent makes more sense;</p></li><li><p><strong>Integration remains the weak link, especially with external APIs and complex edge cases.</strong> Code involving external APIs and complex integration logic often required manual adjustment. The AI excelled at generating code within the boundaries of the existing system, but struggled with connections to the outside world;</p></li><li><p><strong>Better input produces better output.</strong> The quality of results correlated directly with the quality of the input. Tasks like <em>“make it look like the screenshot”</em> were doomed from the start. We learned that detailed text descriptions, clear acceptance criteria, components used, and links to related Jira tickets provide Spec Kit with the necessary context to understand the task;</p></li><li><p><strong>The reviewer’s expertise matters most.</strong> Spec Kit acts as a multiplier that amplifies the capabilities of the person using it. In the hands of a well-versed developer who understands architecture, patterns, and the project’s context, it removes friction and accelerates delivery. However, it also multiplies the errors of junior developers, who wouldn't notice problems in the generated code. A thorough code review by a human becomes just as, if not more, important.</p></li></ul><h2 id="h-when-and-how-to-use-spec-kit-effectively" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">When and How to Use Spec Kit Effectively</h2><p>Looking back at the experiment, several lessons stand out that could benefit other teams considering similar tools.</p><p><strong>Spec Kit works best for large, well-described tasks</strong>. The ideal use case is substantial work with significant boilerplate. For instance, new modules, complex features, or anything that would normally require days of writing code and follows established patterns. Here, the speed gains and planning improvements are maximized.</p><p><strong>Invest in ticket quality.</strong> A critical precondition was the quality of the task description. Over time, we’ve been moving toward making our tickets self-sufficient, meaning they’re detailed enough that any team member, even someone new to the project, can understand exactly <em>what needs to be done</em>. The initial planning phase incurs a higher cost, but the resulting savings during implementation, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/qa-software-testing/">software testing</a>, and reduced reliance on analysts and QA team <em>significantly outweigh the upfront expense</em>.</p><p><strong>The triad for success.</strong> Effective use of Spec Kit<em> requires three elements working together</em>: a skilled business analyst who writes detailed requirements, an <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/web-app-dev/custom-web-application-development/">experienced developer</a> who sets up the task and performs thorough reviews, and the AI tool itself to automate the routine work. Missing any of these compromises the results.</p><p><strong>Maintain human oversight</strong>. The AI is not a replacement for an experienced developer, and code review becomes more critical. The main purpose of intelligent coding tools is not to remove developers from the process but to free up their time for higher-value activities.</p><h2 id="h-conclusion-spec-driven-development-works-great-in-legacy-projects-with-conditions" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Conclusion: Spec-Driven Development Works Great in Legacy Projects (with Conditions)</h2><p>Spec Kit and SDD are most effective in large legacy projects when the specification is clear, the architecture is understood, and human review stays in the loop. AI is not a replacement for developer expertise. It’s a new tool in the engineering toolkit, like version control, linters, or debuggers before it. In the hands of an experienced engineer who understands the architecture, the patterns, and the context, it removes friction and enables faster delivery. For those who don’t yet have that foundation, it can help create messy code faster.</p><p>XB Software’s next step is to formalize these learnings into practical guidelines for the team: how to write AI-friendly tickets, when to reach for Spec Kit versus direct agent interaction, and how to maintain quality standards while moving faster. The technology will continue to evolve, but the fundamental principles of clear specifications, thoughtful architecture, and human judgment remain as important as ever.</p>]]></content:encoded>
            <author>spec-driven-development@newsletter.paragraph.com (How Spec-Driven Development Brings Structure to AI-Assisted Engineering)</author>
            <category>ai</category>
            <category>legacy_modernization</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/dfc7d03191b1e6468fff122b7334ff05694fcaffd93e6db7290b38f4865e012e.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[The Gap Between AI Prototypes and Production Software: 10 Risks You Can’t Afford]]></title>
            <link>https://paragraph.com/@spec-driven-development/the-gap-between-ai-prototypes-and-production-software-10-risks-you-cant-afford</link>
            <guid>IQl3rSUg2Bjx8rLT2e0f</guid>
            <pubDate>Thu, 28 May 2026 09:54:32 GMT</pubDate>
            <description><![CDATA[We often meet founders who come to us with a familiar story. They have a compelling concept, a functional application running on their machine, and the sense that AI-assisted software development has brought them to the verge of a breakthrough. "We used AI to accelerate our progress," they explain. "The core logic is solid. We're hoping you can just do a final polish before we launch." Then we review the codebase they have. And we take a deep breath. It’s not the idea that frustrates us. Ofte...]]></description>
            <content:encoded><![CDATA[<p>We often meet founders who come to us with a familiar story. They have a compelling concept, a functional application running on their machine, and the sense that <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/ai-assisted-software-development/">AI-assisted software development</a> has brought them to the verge of a breakthrough. "We used AI to accelerate our progress," they explain. "The core logic is solid. We're hoping you can just do a final polish before we launch."</p><p>Then we review the codebase they have. And we take a deep breath.</p><p>It’s not the idea that frustrates us. Often, it's market-ready. It's not even the core functionality, which typically performs exactly as demonstrated. Our reaction comes from recognizing what we're about to encounter: hardcoded secrets, database queries that will buckle under load, and a complete absence of error monitoring. It's a pattern that slowly turns into growing regularity.</p><p>These founders show us a prototype created through AI-assisted coding that has a domain name and expect it to function as a product. But a compelling demo and a robust product aren't just different stages of the same journey. They represent fundamentally different philosophies of building.</p><p><em>A demo</em> is optimized for a singular moment. It only has to function correctly once, in a controlled environment. <em>A product</em> is engineered for the long haul. Therefore, it must operate reliably tens of thousands of times, without supervision, under unpredictable conditions. This core distinction is the <strong>source of nearly every challenge</strong> we encounter in such projects.</p><p>In this article, we'll walk through the most common issues we discovered when reviewing AI-assisted codebases. More importantly, we’ll consider the real business implications for founders who underestimate the gap between demo and product. So, let's take a look at the risks that threaten your business when you completely entrust your work to AI.</p><br><figure float="none" data-type="figure" class="img-center"><img src="https://storage.googleapis.com/papyrus_images/365ae1451917ee9bae1d1c6dee58eedd0934f7352e263e9176aa0e5e6bd9ddfa.png" alt="" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAIAAABl4DQWAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHvUlEQVR4nI1W3W/b1hUn1pf9AftK34b9Aeuwh2LY2x6GdkPRtUODFmvWLl2HoVsesmxdiw7LmiUNmqVJ4LnYMnRbECep66LJ4hRtHMdK5Ei1I1uyJdOUTFGiJFLU5ce9l5cfl5RImgNJx4lTYMvBwcW5514eHt7zOz9exoCmAU1dR9mo60hT0b3TbMMDKkQEmRZyvERNi9n2JguOh6lHRiNkuci0TD/A1NN1/CBxdR2RUTC5e//p7zxfu5wrnbkornJJdF3Hs0feu3ni3KVX3v5w76GpXxzJnZi49OtjUy8fnh+7gIirauj/vkPXEXK81amrc4fGQV+TNkTQ15LoyLRaC9V6oVK9nF84c2XjSqFf4dvzVe5inptZUDXD8wPLdh8gfYypZ/pBcgwk2c8gbPUk5S8nxw8dPfaHQ2/99o2Dvz94eP+rb+w78Norv3n19T8dHvvr6ef3/PztY6cgchQAgYb/hyqK0Ze1AYDZ+5LcB8BYWFyuVlme36iUy6XS7VKpVCwWC4X5tbXa+vr6/K15dp0NwtFw5D+IUp/ejW5A07ZcqaefHL9+7MTM8bHZ42Oz74zPnRibO3Zi5ug7n/79vVtnzy+8eeTSn49e/rweOvKfe6cHD1989x9zA4C2oms6Hm1u5gp1hnmSYZ5JdTfzpZ8l49b0x8wXn2OYZ5mHnmO+kBrMs8yX9zJffYnZ9TKz65eJP3MmxlPMV/ZyDdkkFoNMq9/uH2Yeu/z6+LVic3p6efrj8rZeml668nEld3Pjkyvl98/nJi7MTZy7fn4yd+5CbuqjQv4WP/3hZ2fPXjs/mXt/Kn9h8saFyRszs+zNfGMrd0y95hL3OMO8++hLNIp6Yk+WB5qmK8oAAE1RAIQojuPA89erlWp1ybYRpYQQZNskjmMLofLywvLyZ+vrNUot28ZRKhCSJDpERB0Y/3zywOLEp14UmdhyHEqI4zjUsl3Ldh2HOg5Fhgl1jLGFEAZAk+UBhMilFCWtALtdSVEAAJquQ0p9QuytqmLqbSzUHmeYk9/YjYKgtFBl2ebSElsur3OcsLpaF8V+HMc+cWqVSqFYyOfzxWKx2+1ijOM4NuRBPp8XRbGbiqZpcRzvyF1T0bk9f1z6aG60uRkEwXAUZONwlFjDUeD5Q0o93UCKMpDlgappQRD4/tDzh5btqJru+0OXUjc5Gicz7s197QcM87dH95phuF7l26LMca1msyeKcqMhtlpSHMeujtcqK/O3buVTKZVuR1EUx/FAaM/MzBSLRUEQuFQISeqxFR0iAvrayUf23Bz/gEaRpkKELQCMhDewZUAEIcrS1A2j2+0NgCpJkiz3KfVSv6+kAAjCMNHkW0eUelvRkeO1VzeeYh6a+NHvdM+7vbDKca1MWy2p0RBZtkm9oasjrsbeLpWq1WpTEBqpDEcjVehWU2FZNnPy/AbGJsKWlkS3XKnZ28c8Mn3glOZ6hfllXU+SdSml1Ms0qYE/7Ha7KyurGzyfZedSGgSB47i1tbVqtWYSMkzKQ23bvid34kpN6TXmu5+8Pu5FEcEEYwtCkqqFsIWxRb0hUSHP1bl6nePqjcZGtVrLMKM0OxzH8XyT55uNRkPT9ARg/vCek6nyTzDMv3+43wlDbr3ZaLRFsZ+dTGaomrEZRXWuXq6UV1ZWFEXJEo/jGEO0srKCMaaUOglevCiKgiDYUdWxb784P/7BnW5yCbGz0bKTtgrCwDaJoRsIId0wAFAHAHS7PVXTLJTAVNN0AFRV0zw/kbsns91NY9/cY4Zho95utaRWKwEl3xD5htgRlTiOKSTsanV2drZYLEqpCIKAEILy4OrVqzzPAwAURclgen83nX/xzcqlnBMEho4BMABAiqJDmPy1s+a2TVtNU4YQYWzCFKmW7WADAaBtewDQDB06Dr0/91Nff0bQUe76YrPZybAoy6ooyqIobya5m+Wl5Rs3bszNzS0uLoqi2Gg0CCFKU5yZmVlcXGRZVkgFAHBf7vD09/ctnLlCfF/XYdYXm3HCClmJMvyZhEAIBwBYtp2wZkoGjuMCoGYdF4Sh7w+Ho5HjuHdz52+zTzDMv773KysM+Xq72eyIYp9lhbQAEgBGHMeOCtcqK7lcrlQqZUTm+34cx6rQyefzhUKh0WiwLJvBNAjDO4g0LaUzeOvhp+eOT9AoQhBnUEEp0glJCDkIQ8/3AQA8z3e7PUFoCYLgUhpFkeO4giCIoph9SsKA6eY70S23U2/vYXZNvXDQCcNeR5FlVVF0Uez3eoNeb9AWZeJSR0edlthqt3meb7XbnU6ntramG4bWlmrVKs83EwKr1zMysGw75ag0usi1f8I8PPnTg24UDRQ1w4wsJ4Ysq62WRIgdhOEGzxNiJQSRkgQhVkYY5XJFFEXfH6ZY97Oe2nkyX3s6d/ys6ftCs9tqSbKs9nogM8IgKTLRoNzpiaIoy31BaIliR5KkpOPlQUICyeF0epLU7XYppXeZIKvqYwwz/q0XJMuZu1bM5RY5rqXrWFFUXUdZg4xcb71WKxQKiqJoqRh6Qima1C8UCpkHQqilP5Yo2rx7n4GICLWm3AMmsU1ik3TcNnZcbrGVLrmpJkupJ/n9Zo9s799xW8IuTYCv48/rfZdFVUOZZktaqtlU07Gq7biR/xdmcdXuEGS35gAAAABJRU5ErkJggg==" nextheight="1053" nextwidth="1024" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-1-no-insight-into-production-health" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1. No Insight Into Production Health</h2><p>We ask a client: "Can you walk us through your monitoring and alerting strategy, we do not see them?" The response is often a pause, followed by, "We'll know if something breaks, we don’t need them for now."</p><p>Relying on user complaints as your primary alert system looks more like a gamble than a solid business strategy. In a demo environment, you are the sole user and observer. In production, entire features can degrade silently, driving users away without a single notification reaching you.</p><h3 id="h-the-business-impact" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Business Impact</h3><p>Imagine a critical payment integration fails silently. The AI generated code contains an empty catch block, effectively swallowing the error. For weeks, users attempting to check out encounter a frozen screen and simply abandon their carts. The founder, seeing no alerts, is puzzled by a gradual decline in revenue. They only discover the issue when a frustrated customer finally emails to complain. By then, the damage to revenue and user trust is significant, and the root cause remains a mystery. <em>Without proper monitoring, you're flying blind, and your first sign of trouble is often a symptom of a problem that has already cost you dearly.</em></p><h2 id="h-2-the-missing-staging-environment" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">2. The Missing Staging Environment</h2><p>This is a common finding: development, staging, and production are all the same server. Every code push, every experimental fix, is deployed directly into the live environment.</p><h3 id="h-the-business-impact" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Business Impact</h3><p>A developer needs to add a simple column to a database table. They connect to what they believe is a test server and run a quick migration script. However, due to a simple typo in the connection details or script itself, the command executes on the production database, dropping a critical table instead of altering it. Months of customer data, transactions, and user records could be erased in milliseconds. While backups might exist, restoring them means significant downtime and potential data loss from the past few hours or days. The trust of users, who suddenly find their accounts or history missing, is incredibly difficult to rebuild. <em>A single deployment mistake can create a business catastrophe.</em></p><h2 id="h-3-exposed-credentials-in-plain-sight" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">3. Exposed Credentials in Plain Sight</h2><p>AI-powered software development tools, optimized for speed and convenience, often embed API keys and secrets directly into the frontend code or client-side requests. This is perfectly acceptable for a local test but catastrophic for a public application.</p><h3 id="h-the-business-impact" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Business Impact</h3><p>Shortly after launch, a curious user or, more likely, an automated bot scanning for vulnerabilities opens the browser's developer tools on the new site. There, in the network traffic, they find a valid API key for a paid service like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://openai.com/">OpenAI</a> or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://aws.amazon.com/">AWS</a>. Within hours, that key could be sold or used to run thousands of expensive requests. The founders might only realize something is wrong when they receive their next cloud bill, which has ballooned into the tens of thousands of dollars due to unauthorized usage. <em>The frantic scramble to revoke the compromised key, block fraudulent IPs, and secure the application distracts from every other business priority and creates a significant, unexpected financial hit.</em></p><h2 id="h-4-unprotected-endpoints-and-no-rate-limiting" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">4. Unprotected Endpoints and No Rate Limiting</h2><p>APIs are built to be consumed, but without safeguards, they can be consumed maliciously or accidentally to the point of self-destruction. In web apps built with AI, public endpoints without rate limiting are an open invitation for abuse.</p><h3 id="h-the-business-impact" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Business Impact</h3><p>A startup finally gets its big break, a mention in a major industry newsletter. Excited business owners watch their traffic spike. But within an hour, their website starts loading slowly, then becomes completely unresponsive. Their database, overwhelmed by the sudden influx of requests, has crashed. To make matters worse, their usage-based API bills begin to skyrocket. It turns out one enthusiastic new user wrote a simple script to scrape all the site's data, inadvertently creating a denial-of-service attack. <em>The moment of success becomes a public failure, as potential customers are met with error pages instead of the promised product.</em></p><h2 id="h-5-the-untested-stupid-user-scenarios" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">5. The Untested "Stupid User" Scenarios</h2><p>Models used in AI-driven software development are typically trained on ideal paths. They excel at generating code for a user who fills forms perfectly, clicks once, and has a flawless internet connection. They do not account for edge cases: empty submissions, special characters in file names, or double-clicks.</p><h3 id="h-the-business-impact" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Business Impact</h3><p>A new platform for sharing creative work goes live. Everything works perfectly in testing. Then, a user uploads a file with a name containing an emoji. The file-processing library, chosen by the AI for its speed and simplicity, has no Unicode handling and throws an unhandled exception. The application crashes not just for that single user, but globally because the error isn't isolated. One slightly unconventional filename takes the entire site offline until a developer can manually fix the issue. <em>This scenario illustrates how a single, unexpected user action can create a major incident, turning a "one-in-a-million" edge case into a very real and immediate business disruption.</em></p><h2 id="h-6-environment-configuration-sprawl" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">6. Environment Configuration Sprawl</h2><p>A single <em>.env</em> file, a shared database connection string, and the same S3 bucket for development and production. The AI configures for functionality, not for safety.</p><h3 id="h-the-business-impact" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Business Impact</h3><p>A developer is running local tests to optimize a slow query. As part of their test, they run a script that truncates a table to reset its data to a known state. Because the application's configuration is shared and points to production, the <em>truncate</em> command doesn't hit the local copy and executes on the live user table instead. In a fraction of a second, critical business data, such as user profiles, orders, settings, can be permanently deleted. This isn't bad coding skills but a failure of structural separation. <em>One wrong command, and the business is facing an operational nightmare with no quick fix.</em></p><h2 id="h-7-silent-failures-hidden-in-trycatch-blocks" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">7. Silent Failures Hidden in Try/Catch Blocks</h2><p>We see countless <em>try/catch</em> blocks where the <em>catch</em> only logs an error to the console or worse, does nothing at all. The error is caught, the system doesn't crash, but the operation fails silently. The user sees a spinner that never resolves and eventually leaves.</p><h3 id="h-the-business-impact" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Business Impact</h3><p>A founder is perplexed by poor user engagement and low conversion rates. They've invested in marketing, but users seem to bounce from a specific page. What they don't know is that on that page, an API call that fetches critical user data is failing silently for 30% of visitors due to a subtle, unhandled error. The code generated by AI catches the exception, does nothing with it, and returns <em>null</em>. The user sees a blank section or a loading spinner that never stops. They assume the site is broken and leave. Because the error is silent, the founder spends weeks optimizing marketing funnels while the real problem is a technical leak in the product that remains hidden <em>leading to the company continuing to lose potential revenue.</em></p><h2 id="h-8-no-real-time-visibility-into-costs" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">8. No Real-Time Visibility into Costs</h2><p>The cloud bill arrives, and it's an unwelcome surprise. During early AI-assisted app development, an API may only be called a dozen times. In production, that same API call on every keystroke in a search field scales to thousands of requests per user.</p><h3 id="h-the-business-impact" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Business Impact</h3><p>Using AI coding tools, a founder built a useful search feature for their SaaS product. It works well. However, the AI-generated code fires a database query on every single keystroke, performing an expensive, unindexed full-table scan each time. As the user base grows, so does the database load. The cloud provider's bill, which was a manageable few hundred dollars, suddenly jumps to several thousand. The founder, focused on feature development, never set up cost alerts. They only discover the problem when they see the invoice, realizing that a single, poorly optimized feature is silently destroying their unit economics and profit margins. <em>They are now forced to make an emergency fix while facing the unexpected cost.</em></p><h2 id="h-9-the-load-test-that-never-happened" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">9. The Load Test That Never Happened</h2><p>A <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/rapid-software-prototyping/">prototype built through AI-assisted engineering</a> may handle one user flawlessly. It has never been asked to simulate 50, 100, or 500 concurrent users. The AI did not design for connection pool exhaustion, memory limits, or API throttling.</p><h3 id="h-the-business-impact" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Business Impact</h3><p>A startup has a successful launch day. The press is positive, and users are flooding in. Then, 20 minutes in, the site slows to a crawl and finally stops responding. The database, not configured for a high number of concurrent connections, has reached its limit and is refusing new requests. The server runs out of memory. Users, excited to try the new product, are met with "503 Service Unavailable" errors. The social media mentions quickly turn from praise to frustration. The marketing budget spent on acquiring these users is completely wasted, and worse, the first impression for hundreds of potential loyal customers is one of an unreliable, broken service. <em>The company may never get a second chance with them.</em></p><h2 id="h-10-the-absence-of-a-backup-and-recovery-plan" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">10. The Absence of a Backup and Recovery Plan</h2><p>There is data on a server, which feels secure until the server is compromised or fails. There are no automated snapshots, no point-in-time recovery configured, and no off-site backups.</p><h3 id="h-the-business-impact" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Business Impact</h3><p>A founder wakes up one morning to find their server has been compromised. A ransomware attack has encrypted their entire database, and a message demands payment for the decryption key. They turn to their team and ask for the latest backup. The answer is worrying: “There is no backup.” The last one was a manual SQL dump taken months ago, stored on a developer's laptop that has since been replaced. All customer data, transaction histories, years of work, everything is gone. The business cannot serve its customers, cannot restore their accounts, and faces operational collapse and potential legal liability for losing sensitive user data. <em>This is an existential threat that could end the company.</em></p><h2 id="h-what-a-successful-transition-looks-like" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What a Successful Transition Looks Like</h2><p>These issues are not unique. We encounter them in most projects built with AI we're asked to review. The pattern is persistent because the root cause is consistent. AI-assisted software development tools were used to build a demonstration, while the business needs a solid product.</p><p>The good news is that these issues are solvable. It requires a deliberate investment in the foundational layer that turns a functioning prototype into a resilient, scalable, and secure business asset. The founders who succeed are those who recognize that an AI-generated codebase is an excellent starting point for a conversation about architecture, not the final architectural blueprint itself. They invest in that foundation before opening the doors to their users.</p>]]></content:encoded>
            <author>spec-driven-development@newsletter.paragraph.com (How Spec-Driven Development Brings Structure to AI-Assisted Engineering)</author>
            <category>ai</category>
            <category>web_development</category>
            <category>prototyping</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/cf029e0f0861aa2aea0c940f426d271dfbfba50d9c3b273a2565f532bddf04e6.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[How to Build a Local LLM Agent to Automate Work List Generation from Monthly Reports (With Jira Integration)]]></title>
            <link>https://paragraph.com/@spec-driven-development/how-to-build-a-local-llm-agent-to-automate-work-list-generation</link>
            <guid>Nu7RbXU41kjVWPRmkh7k</guid>
            <pubDate>Fri, 22 May 2026 11:40:50 GMT</pubDate>
            <description><![CDATA[Our management team spent hours manually extracting work items (“bug fix”, “released version 1”, etc.) from dozens of developer reports. The task was repetitive, error‑prone, and a security risk when using cloud‑based AI tools, since it means exposing internal activity to external servers. To solve this, we built a local LLM‑powered agent that runs entirely on our own servers, normalizes chaotic report data, filters out useless noise, enriches descriptions from Jira, and generates a clean lis...]]></description>
            <content:encoded><![CDATA[<p>Our management team spent hours manually extracting work items (“bug fix”, “released version 1”, etc.) from dozens of developer reports. The task was repetitive, error‑prone, and a security risk when using cloud‑based AI tools, since it means exposing internal activity to external servers.</p><p>To solve this, we built a local LLM‑powered agent that runs entirely on our own servers, normalizes chaotic report data, filters out useless noise, enriches descriptions from Jira, and generates a clean list of actual accomplishments. In this article, we break down the architecture and explain why a CPU‑only, on‑premise approach is practical for enterprise clients who prioritize data privacy.</p><h2 id="h-the-problem-manual-work-list-generation-is-slow-inconsistent-and-insecure" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Problem: Manual Work List Generation Is Slow, Inconsistent, and Insecure</h2><p>Usually, our managers followed the same routine: collect a month’s worth of developer reports, manually scan through hundreds of entries, and pick out the items that actually represented completed work. This process was straightforward but flawed.</p><p>The first issue was <strong>data quality</strong>. Developers write reports in wildly different formats. Some include detailed Jira ticket IDs and descriptions, others are cryptic one‑liners like “fixed issue”. When a manager who wasn’t deeply involved in the project later reviews these reports, the meaning is often lost. What does “adjusted header” refer to? Which feature did “refactored code” touch? What we really needed was an AI-powered task management approach that could process this unstructured data automatically.</p><p>The second issue was <strong>duplicate work</strong>. Managers would occasionally include tasks that had already been declared in previous months, creating overlaps. Another example is a task that spans several days. In this case, the same activity could be logged repeatedly, producing many near-identical entries. There was no automated way to compare new reports against historical data.</p><p>The third issue was <strong>security</strong>. Initially, we experimented with feeding entire monthly reports into ChatGPT, asking it to clean up the data and suggest a final list. It worked reasonably well, but we were handing over a full month of internal project activity to a cloud service. For many <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/enterprise-application-software/">enterprise businesses</a>, especially those in finance or healthcare, that level of exposure is unacceptable.</p><h2 id="h-the-solution-a-secure-onpremise-ai-agent-for-task-extraction-from-reports" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Solution: A Secure, On‑Premise AI Agent for Task Extraction from Reports</h2><p>Our approach was to implement a console‑based application that converts reports into tasks automatically. It runs on our internal server, triggered by a cron job (or an optional API call) at the end of each monthly reporting cycle. The AI agent processes raw reports for each active project, applies a series of transformations, and outputs a polished list of work items.</p><p>The entire pipeline runs on a CPU‑only server using&nbsp;<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ollama.com/">Ollama</a> to serve a local instance of the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://deepmind.google/models/gemma/gemma-4/">Gemma 4 E2B</a> model. For embedding generation (used in duplicate detection), we use the tiny <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.nomic.ai/atlas/embeddings-and-retrieval/text-embedding">nomic‑embed‑text</a> model, which is only a few megabytes in size. Here’s a high‑level view of the process flow:</p><br><figure float="none" data-type="figure" class="img-center"><img src="https://storage.googleapis.com/papyrus_images/ed38eb4355868c23f79544d0abaa123c7c6f603382f9ebf92056f221befc1396.png" alt="Local LLM agent workflow for automated work list generation with Jira and duplicate detection." blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAIAAACKIl8oAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFSElEQVR4nLWWXWzTVhTH/TBgL0DeyNTRt04aD5NGeFgk0MKQ0MSEur0gjY1oKyhDGuukTe2KoC0bSRhdaQeFwiaqQAuNalgtAkuThlWpaYA4SxQ7Nk4dN2kT2/mq77rBAmyJPCWXhtDyVQZHR9b19c0vx/9z7j1GqBBLhdikDKakVJiLhrkonPn/joS56PDQ5TVVrx02tZ07i9pt9ueGnpJSP7SakJKtqapZV/PG8wocoUJsJBa39vbbsEvUjXEvEYDu95PQyzNeIrBgNOELJoQkADOSlJak9K2/c6IoUTfGI7E4y/GSlM5Oyzdv3YonhAXRi+iJiXhtba1Op9NqtTqdrqamZvuO7YPoYKexvfWbls2bN+t0Oo1GU19fv3BB+Fh9ff1HWz/W6/Xbtuk3vLOhsbERQ7Gutq7v9x0wGHbq9fra2vfN5gM+3wKjDpJMQkhOywAKAsBMPCGwHA8FmZbByR+7Y9HJhJAkfMGFoakQW5kr72zGWI4nfMHJhPhV3ecYikVi8Qgfo0LsU5bQPfRD3Yb9OmR3Wa0D5v0mFD1vsfRaLKecTteQ3fXs6DAXtWGX6mo/7LWcXrtuLYIgOt3bWu1bixa9VPdpXed3bYf2t0Vi8WdEnzuLdh08nJSBsaE5zIbjCUEUJVGUboTHR37DD7aYIrG4308+FdpLBIIkA4UOc9EL5y+0tZqnpNQX+s+G7C74aBS/FiSZgb6B3bsaQmyknFXCF6z0+2ifL0DTjCSleT4KiySVyVw4hx0xtacB+Lax+aqHYDk+EKS4CJ/KZD2jnuPtXalMlqRoWGDjXITnozwfTQhJmmYe2DIYhiEVtmfvnkk+autH84XC7l1fe8aKwU7LYP369QiCrFy5UqVSrVixwmDYeeLQsS8/2WnYvqPq1SqVSoUgiMFgSAhJLxEoohkmHArROI6HQjSGYTiOJ9OpCMNWomEgTuew0zk84nbDgdPpuuohhuwuz9i1i7aL1jNWu92O4/gDWvP8xJYtW3Q6nV6v37hx45njPcdMbVecl8toluPn7ACoPpwMkox7BDc27YvE4uXJ+2iz+UBLS4vZbN7b3DyE2ZhA8O6dO3PQJEXDZCSEJBfhSYr2+QI+X4CkaPcIvntXA8vxc9EAAEVRJvkoEyDzhUIul8sXCrPohqseAupGEERlSnAcVxSltDgvJYRTR7rzhYIgCDC999CiKOULBcofZAIkXA3t7r//GJtay1GLomSxWLq7uy0Wi9U6IIqSMmuZVLr/RI+iKLIs348aplGr1arV6qXLliIIolKpNBrN66tWObCLW9/9oHzgiaIE3w/+PQBAluXHoeFvCIKAeXc4HK7hYbxkU7HJcnnAZTw/UY5UluVy4A9HkxQtilIud7ukwe3ZQXEsyzIUDu4sAIDD4Viy5GW1+hW1Wt3R0eF1X+loMV1xXr7551+nu356SNTzD1XvvJboJQKKomi12spMiqIkJYTzlr5Houd4kGTKB0K5//r9ZCqZBgDAN4JC5wsFKSH0n+iZ+WPm5KGjT0Bf9/pomuEiPE0zxQOh1H+hZ7LZVDItipJcMgBAsa5+D6A9vQCA7oOdUP1Hot2jY2s0GgRBVq9+c9N7m4xNrcamfZ3G9k5ju+XozyVcXlOyxYsXq9Xq6urqZcuXV1dXUxSlKArPTzwSTVL0iNv9C4Y5ncP2IccgOoj2oRiKoX0oMXZdluVcLkeUzFGy0dFReE1KyVyu9KHxGHQgSJVvWY6H34JhLhpPCNAz2Wx2uihIdlouD+Ajno8+uTdS87yyWmCS5xfSA63gBfkLRP8HrnWSMBrpWWoAAAAASUVORK5CYII=" nextheight="1077" nextwidth="1024" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Let’s walk through each stage in detail.</p><h3 id="h-1-normalization-making-chaos-readable" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1. Normalization: Making Chaos Readable</h3><p>A single project might receive 80+ individual reports per month with varying levels of detail. The first task for our AI agent was to <strong>normalize</strong> these disparate inputs into a consistent, machine‑readable format. This step alone turns a jumble of free‑form text into structured data that the rest of the pipeline can reliably process.</p><h3 id="h-2-chunking-working-within-token-limits" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2. Chunking: Working Within Token Limits</h3><p>This is where we hit our first major technical constraint. Running on CPU via Ollama, our Gemma 4 model is limited to a <strong>context window of 4,096 tokens</strong>. That’s not a lot. A single month of reports from a busy project can easily exceed that.</p><p>We solved this by <strong>chunking</strong>. The AI system calculates the approximate token count of the combined report text and splits it into batches of about 20 reports each. This ensures that the LLM never runs out of context space and that each chunk receives full attention.</p><p>Within each chunk, we also further split entries that contain multiple tasks in a single line (e.g., “Did A, did B, did C”). After this splitting, 22 raw reports became 94 individual work items in one of our test runs.</p><h3 id="h-3-jira-enrichment-adding-missing-context" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3. Jira Enrichment: Adding Missing Context</h3><p>One of the most valuable features of our AI agent is its ability to <strong>automatically fetch additional context from Jira</strong>. When the system detects a Jira ticket ID in a report, it calls the Jira API to retrieve the ticket description.</p><p>Developers often write terse reports assuming the ticket ID is enough. But when that report later appears as “AAA‑123 – done”, it tells nothing. By pulling the full, manager‑written description from Jira, our AI agent replaces the vague entry with a clear, professional summary of what was actually accomplished.</p><h3 id="h-4-filtering-out-the-noise" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">4. Filtering Out the Noise</h3><p>Not every report entry is worth including. Generic statements like “working on…” or “following up” don’t convey meaningful work. We built a <strong>bad‑word filter</strong>, one of key components of our intelligent document processing (IDP) pipeline. It flags entries containing these vague phrases.</p><p>The LLM processes each chunk and identifies data that match our exclusion list. In our test, this filter removed <strong>69.1% of entries</strong> and only 29 items out of 94 survived the cut. What remained were concrete, specific descriptions of completed tasks.</p><h3 id="h-5-selecting-the-best-candidates" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">5. Selecting the Best Candidates</h3><p>Once we have a clean set of candidates, we need to choose the top N entries to present. The number N varies by project and is stored in our internal reporting database. To account for further filtering in the next step, we typically select a larger pool, say, 80 items.</p><h3 id="h-6-vector-duplicate-detection-ensuring-we-never-repeat-ourselves" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">6. Vector Duplicate Detection: Ensuring We Never Repeat Ourselves</h3><p>This is the secret sauce that prevents duplicate entries. Before finalizing the list, the AI agent compares each candidate against a <strong>historical database</strong> of all work items we’ve ever submitted for that project. Here’s how it works:</p><ol><li><p><strong>Embedding Generation.</strong> Each work item is converted into a vector (a list of numbers) using the nomic‑embed‑text model. This vector captures the semantic meaning of the text;</p></li><li><p><strong>Similarity Calculation.</strong> The system compares the new candidate’s vector against the vectors of all previously stored data for that project;</p></li><li><p><strong>Threshold Decision.</strong> If the similarity score exceeds 0.85 (85%), the candidate is flagged as a duplicate and removed. This threshold catches not just exact matches but also near‑duplicates where the phrasing or word order has changed while the underlying idea remains the same.</p></li></ol><p>The historical data is stored in a lightweight <strong>PostgreSQL</strong> table with just a few fields: <em>project_id</em>, <em>text</em> (the final description), <em>embedding</em> (the vector), and <em>created_at</em> (date of creation).</p><p>After duplicate removal, we’re left with a set of truly unique, high‑quality work items. These are then formatted for final delivery to the project manager.</p><blockquote><p>Read Also <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/blog/ai-in-construction/">Using AI to Generate a List of Works in Construction</a></p></blockquote><h3 id="h-realworld-performance-what-test-run-tells-us" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Real‑World Performance: What Test Run Tells Us</h3><p>Let’s walk through an actual test run to see the numbers in action. These test run results demonstrate how an AI report analysis tool can summarize reports into tasks even with noisy, inconsistent input.</p><table><colgroup><col><col><col><col></colgroup><tbody><tr><td colspan="1" rowspan="1"><p>Stage</p></td><td colspan="1" rowspan="1"><p>Items In</p></td><td colspan="1" rowspan="1"><p>Items Out</p></td><td colspan="1" rowspan="1"><p>Reduction</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Raw reports</strong></p></td><td colspan="1" rowspan="1"><p>22</p></td><td colspan="1" rowspan="1"><p>—</p></td><td colspan="1" rowspan="1"><p>—</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>After line splitting</strong></p></td><td colspan="1" rowspan="1"><p>—</p></td><td colspan="1" rowspan="1"><p>94</p></td><td colspan="1" rowspan="1"><p>—</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Bad‑word filter</strong></p></td><td colspan="1" rowspan="1"><p>94</p></td><td colspan="1" rowspan="1"><p>29</p></td><td colspan="1" rowspan="1"><p>69.1% removed</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Duplicate detection</strong></p></td><td colspan="1" rowspan="1"><p>29</p></td><td colspan="1" rowspan="1"><p>16</p></td><td colspan="1" rowspan="1"><p>44.8% removed</p></td></tr></tbody></table><h2 id="h-technical-deep-dive-why-cpuonly-deployment-works" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Technical Deep Dive: Why CPU‑Only Deployment Works</h2><p>One of the most common objections to running local LLMs is the perceived need for expensive GPU hardware. We deliberately chose a <strong>CPU‑only</strong> deployment to keep costs manageable and to prove that on‑premise AI doesn’t require significant infrastructure investments.</p><h3 id="h-model-selection-gemma-4-e2b" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Model Selection: Gemma 4 E2B</h3><p>We evaluated several local models and settled on <strong>Gemma 4 E2B</strong>. Here’s why:</p><ul><li><p><strong>Size</strong>. At 5 billion parameters, it fits comfortably in RAM without needing a GPU. Our server has extra memory allocated specifically for the model;</p></li><li><p><strong>Performance</strong>. It’s fast enough for batch processing;</p></li><li><p><strong>Quality</strong>. The model handles JSON output reliably, and follows detailed prompts with minimal hallucination.</p></li></ul><p><strong>NOTE</strong>: If you work with a multilingual team, make sure that the model you use understands target languages natively.</p><h3 id="h-proper-model-settings-and-prompt-engineering-for-consistency" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Proper Model Settings and Prompt Engineering for Consistency</h3><p>Each pipeline stage has its own carefully crafted prompt that includes:</p><ul><li><p>A clear <strong>role definition</strong> (e.g., “You are a specialized Data Parsing Engine”);</p></li><li><p><strong>Good examples</strong> and <strong>bad examples</strong> of expected output;</p></li><li><p>Explicit <strong>formatting rules</strong> (JSON structure, field names);</p></li><li><p>Instructions to <strong>avoid creativity</strong> (temperature set to 0).</p></li></ul><p>For the bad‑word filter, we provide a list of prohibited terms and their synonyms: “working on,” “following up,” “in progress,” “discussed,” etc. The LLM simply acts as a pattern matcher with semantic understanding. It can recognize that “still working on the header” is conceptually similar to “in progress” and flag it accordingly.</p><p>Also, for data‑processing tasks like this, we always <strong>disable “thinking” or “chain‑of‑thought” modes</strong>. Those are useful for complex reasoning but introduce unnecessary variability and output length in structured extraction tasks.</p><h3 id="h-extra-challenges-we-overcame" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Extra Challenges We Overcame</h3><p><strong>Challenge 1: LLM Unpredictability</strong>. Even with temperature set to 0, LLMs can occasionally produce unexpected output. We added timeout limits to prevent the model from getting stuck in a loop, and we structured our prompts to request strictly formatted JSON that is easy to validate programmatically.</p><p><strong>Challenge 2:</strong> <strong>CPU Processing Speed</strong>. Processing 94 items across multiple LLM calls takes time. We solved this by running the AI agent as an overnight cron job, so speed is never a bottleneck. The manager arrives in the morning to a ready‑to‑review list.</p><h2 id="h-why-this-approach-matters-for-enterprise-clients" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why This Approach Matters for Enterprise Clients</h2><h3 id="h-1-complete-data-sovereignty" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1. Complete Data Sovereignty</h3><p>When you use on-premise <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/ai-software-development/">Artificial Intelligence solutions</a>, no data ever leaves your infrastructure. The LLM runs locally, the embedding model runs locally, and the historical database resides on your own PostgreSQL server.</p><h3 id="h-2-no-vendor-lockin" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2. No Vendor Lock‑In</h3><p>Cloud AI services change their pricing, deprecate models, or alter their APIs without notice. By using local AI agents and Ollama, you retain full control over the entire stack. Need to switch to a different model tomorrow? Just pull a new one and update the configuration.</p><h3 id="h-3-predictable-costs" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3. Predictable Costs</h3><p>The only ongoing cost is the electricity to run the server. There are no per‑token API fees, no monthly subscriptions, and no surprise bills after a particularly busy month of processing. For organizations that process thousands of reports annually, the savings are substantial.</p><h3 id="h-4-customizable-to-your-workflow" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">4. Customizable to Your Workflow</h3><p>Because we own the code, we can adapt the pipeline to fit your specific reporting format, integrate with your existing PM tools, and fine‑tune the prompts to match your industry’s terminology. This enables using AI for business process automation across diverse sectors, from construction to healthcare.</p><h2 id="h-from-manual-chore-to-automated-precision" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">From Manual Chore to Automated Precision</h2><p>Before, turning chaotic developer notes into clean reports meant choosing between tedious manual work or exposing sensitive data to cloud AI. Our private AI agent for document analysis offers a third way. Namely, secure, on‑premise automation.</p><p>By combining Gemma 4 on standard CPU hardware with vector‑based duplicate detection and direct Jira enrichment, we’ve turned hours of monthly review into a hands‑off process. The system normalizes vague entries, filters out noise, and guarantees you never repeat a task description.</p>]]></content:encoded>
            <author>spec-driven-development@newsletter.paragraph.com (How Spec-Driven Development Brings Structure to AI-Assisted Engineering)</author>
            <category>ai</category>
            <category>automation</category>
            <category>llm</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/667279d988f58b0f4340798dbc6d87b8191cbd0bf9d60ae749f8c0f51eba4325.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Migrating from Cordova to Capacitor: A Practical Upgrade Path for Hybrid Mobile Apps]]></title>
            <link>https://paragraph.com/@spec-driven-development/migrating-from-cordova-to-capacitor</link>
            <guid>bWTmwDplezolJMNs5hcr</guid>
            <pubDate>Tue, 28 Apr 2026 14:44:06 GMT</pubDate>
            <description><![CDATA[Apache Cordova has been the backbone of countless hybrid mobile applications for over a decade. It empowered developers to package their web app code into mobile apps. For many businesses, Cordova was the perfect bridge, allowing them to enter the mobile market quickly and cost-effectively. However, Cordova, while still functional, is increasingly showing its age. Its architecture, plugin ecosystem, and development workflow are struggling to keep pace, leading to rising maintenance costs and ...]]></description>
            <content:encoded><![CDATA[<p>Apache Cordova has been the backbone of countless hybrid mobile applications for over a decade. It empowered developers to package their web app code into mobile apps. For many businesses, Cordova was the perfect bridge, allowing them to enter the mobile market quickly and cost-effectively. However, Cordova, while still functional, is increasingly showing its age. Its architecture, plugin ecosystem, and development workflow are struggling to keep pace, leading to rising maintenance costs and slower delivery cycles.</p><p>The answer to these issues is <strong>Capacitor</strong>. Created as a modern, “spiritual successor” to Cordova, Capacitor offers a practical and low-risk migration path. This article will walk you through why Cordova-to-Capacitor migrations make sense, how Capacitor differs from its predecessor, and how to navigate the transition smoothly.</p><h2 id="h-why-teams-are-moving-away-from-cordova" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why Teams Are Moving Away from Cordova</h2><p>The decision to move away from a familiar tool like Cordova is rarely about chasing trends. It allows solving concrete business and technical pain points. For development teams with apps in production, these frustrations become daily obstacles to delivering value:</p><ul><li><p><strong>An Outdated and Stagnant Plugin Ecosystem</strong>. Cordova’s historical strength is its vast plugin library. However, it has become its biggest weakness. Many plugins are 5 to 7 years old, unmaintained, and break with new OS releases. Finding a modern, secure plugin for basic tasks can be a challenge, and when issues arise, the community support is often minimal;</p></li><li><p><strong>Slower Development Cycles</strong>. The combination of outdated tooling and a clunky build process directly impacts delivery speed. What should be a quick fix or a new feature can turn into a multi-day investigation into why a plugin isn’t working with the latest iOS version;</p></li><li><p><strong>Signs of a Fading Platform</strong>. Major industry moves, like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://devblogs.microsoft.com/appcenter/announcing-apache-cordova-retirement/">Microsoft App Center deprecating Cordova support in 2022</a>, signal a clear trend. While the project isn’t dead, outdated plugins and waning corporate investment make it a risky bet for long-term projects.</p></li></ul><h2 id="h-capacitor-as-a-natural-evolution" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Capacitor as a Natural Evolution</h2><p>Capacitor shares the same core philosophy as Cordova. It enables <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/mobile-application-development/">building mobile apps</a> with web technologies, but executes it with a modern architectural approach.</p><h3 id="h-web-first-not-web-wrapped" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Web-First, Not Web-Wrapped</h3><p>Your web app is the core of your project. It’s simply copied into the native project as an asset. Although, you should expect to make UI/UX adjustments to optimize for mobile interaction patterns and screen sizes.</p><h3 id="h-direct-native-access" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Direct Native Access</h3><p>Capacitor gives you the flexibility to step outside the web view when your requirements demand it. For instance, if your app needs to render complex 3D graphics with Metal, you can open the project in Xcode or Android Studio and write Swift or Kotlin code directly. This eliminates Cordova’s “black box” feeling and gives you the same level of control as a fully native app. However, for most standard features (camera, geolocation, biometric authentication, or file storage), Capacitor’s official plugins provide everything you need.</p><h3 id="h-backward-compatibility" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Backward Compatibility</h3><p>Capacitor provides a compatibility layer that allows a vast majority of existing Cordova plugins to work out of the box. This is the linchpin of a low-risk migration strategy. You can move the entire app over and then gradually replace plugins. There’s even this VS Code extension that helps developers detect what Cordova plugins can be replaced with Capacitor analogs.</p><h3 id="h-technology-longevity-and-ecosystem-stability" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Technology Longevity &amp; Ecosystem Stability</h3><p>For business decision-makers, the stability and future of a platform are paramount. Unlike Cordova, Capacitor has active support, evidenced by the release of version 8 in December 2025 and the continued development. Backed by Ionic, a company with a long-standing commitment to the open-source community, this corporate investment guarantees a level of stability and active development that the Cordova project currently lacks.</p><p>The ecosystem around Capacitor is vibrant and growing. It boasts a set of well-maintained official plugins, a thriving community creating their own, and strong integration with modern build tools. Capacitor’s ecosystem feels alive and ready for the future.</p><figure float="none" data-type="figure" class="img-center"><img src="https://storage.googleapis.com/papyrus_images/df25226b2894a7ae09368add8c7f4c913fc5173f6562a0432953d8e574633d26.png" alt="" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAIAAAD4YuoOAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEoklEQVR4nFVTT2zbVBj3BU7jgDhUm4Q0MXZBaLBN3TQJxLQzV4Q04AACaYeKoR04DtYhNPXIDQYcxp+uKU7SNLPimTpOYseJk6Zx6qaWndie46Su5zoKjh3HrhPkvK7apJ+evve+3/s+f7+fH3RjYfm1d27PX1s6f3Vp7t3vbt6KXfvwp1MX75y5fBfg7ffvnb+6dPbKD8cnb8wv3voWnr+29Pr8Ee3NS4vnPrh34erSW+/9ePrS4pnLd89eufvKudsL36xAcxe+h6CPoZNfQ3MLEHT91MU70ImvIOg6BH06w2fQqzei7EufH21niG69/MULtLkF6ORN6MSXEPTJM9pHpy8tQjjeWomxK7H6KtxYibE4LqwjzcQal5whscbFkxycaMAJNp7k4skogBNsNt9Kp3eSL9JWYTaebIA4scbBMJvPtyDHGedy2/W6RNPN7W1lOp1qWjdLFHJ5skBS+dlKEKSqak/Ujr5vTKfTMAyn06kgtgokVS5Xs0SBokoUVer19rq9PUFstSVZFCVZeeL7PqTrw0SSgWGKosVudzgYjEWxE4ORRwgeTzxOp/FMppBKYUiGyGQKKEp2Ok9t23fdoM4KiTUU26AfY+R6egNBiDSCF8gaXWIJgsnlmDorOE4ADQZjw3B13TFN1zRd2/b3jX5ta5fjWmxDYBsCz8s8LzcawubmTrMp2bbvOIHnHWraU56Xm02J52WOa/G8zDYEwxg4TmDbPoDrBtDxfjAYDwZjcHk6nQbBJAwjBMHE98MgiAIQe96h5x36fgiyzwNkxzOC60alINN00+lqmZEsa2QY0QSKoqdSGEGU4gkktvqoQFbrrLDNiYKgbm7ubG3xvd5BGEyYSmMllkIyWRynE0m0QFY5rrW1xQuCutOUOE5UlP2jBjBMxeM0itUNw3WcoN3W/oGRVArDNsjHWARsg4qAUcVinSrWBEENw8lOs51IotksjWQIFM2tp//N56soWsjlGBTNATEjifp9z7JGljUyTRdM0OsdZLMlHKez2RLPSzN9o7XXOwCDO07g+6EgqihaKJVZqlgjiHI+XyWIci7PNHclXlBEUXWcIGowGIxN0z3uYdt+v+9Ick+SuoKo9vtD3w+BmqA0gOcdmuZAFFVF0RVFl+W9dltrt7VOxwAOAXLUwLZ9w4j+H10fWtYIzAXgeYeOM7bt8bM1OA6OSriB6/iOE5089xFjexhdATTIMJzl5TxF8ShW3+UjW3heun//rz//Xlt+mPz194cMw5JkjSSrpVJkQL2+a5r/heGEYdiff/ljZXU9ov22jON0ucLhOF2pbJfKLMOwlcrOkckPHuAoVuf5fSBRt3eA43SxWCPJGk3XcnlmJjGD4zSGUYKgqp39IJiIoprN0gWyQhVrVLFWKrM4ThNEuUBWkUx2m4t+vEgiyxqVGYmixVpNMQx3aPvtdjeTIahi7RGCYxukKKqyoktyT5b3Wm2NFxRZ3guCSaMhIBkC24iK8rysKHq7rcnyntrZ5wXFtsdA58gD8Dht27es0SwYGUbfMPqaZhiGBUwDLwsAxFZ/qGmGrlu63nec8fEDBFlgsucd/g960bD2ZxoGIQAAAABJRU5ErkJggg==" nextheight="429" nextwidth="848" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-why-not-just-using-good-old-react-native-instead" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why Not Just Using Good Old React Native Instead?</h2><p>While Capacitor is the most logical upgrade path for existing Cordova apps, it’s not the only <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/app-modernization-service/">modernization strategy</a> available. Depending on your business model, user expectations, and reliance on native device features, you might also consider React Native or even reevaluate whether you need a store-distributed mobile app at all.</p><h3 id="h-complete-ui-rewrite-but-thats-not-the-hardest-part" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Complete UI Rewrite (But That’s Not the Hardest Part)</h3><p>Yes, React Native requires replacing HTML elements with native components and converting CSS to JavaScript objects. While this is a tedious task, AI tools can now handle much of the monotonous conversion work with the right prompting.</p><h3 id="h-legacy-code-complexity" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Legacy Code Complexity</h3><p>A full rewrite forces you to confront not just UI conversion, but also refactoring messy code, addressing known bugs, and deciding whether to incorporate business logic or design changes that have accumulated over time. If your team lacks the bandwidth for this level of simultaneous cleanup, a React Native migration becomes a high-risk endeavor.</p><h3 id="h-higher-cost-and-longer-timeline" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Higher Cost and Longer Timeline</h3><p>A full rewrite means months of development, extensive testing, and a massive upfront investment. For an app that already works and serves its users well, this is often an unjustifiable business expense.</p><h3 id="h-skillset-shift" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Skillset Shift</h3><p>React Native development requires specialists who understand its unique paradigm. While Capacitor also involves bridging to native modules, the learning curve is gentler for developers with a pure web background. The core development tools remain the same, and they primarily need to learn the build, deployment, and plugin workflows, with plenty of guidance available through tools like the VS Code extension.</p><h2 id="h-choosing-between-capacitor-react-native-and-pwa" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Choosing Between Capacitor, React Native, and PWA</h2><p>For some businesses, especially those primarily delivering content or lightweight transactional services, moving from Cordova to a PWA can eliminate native maintenance overhead entirely. However, if your app depends heavily on device APIs, background processes, or advanced native SDK integrations, Capacitor offers a more future-proof path while keeping your web investment intact.</p><figure float="none" data-type="figure" class="img-center"><img src="https://storage.googleapis.com/papyrus_images/df04fc115e656ccb9404b23d912287074d10df1e8394a056fba83c3d9620006b.png" alt="" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAIAAABj86gYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEuElEQVR4nH1UT4jcVBh/B8GDIAUPinr17kFFpBcru1QsXQqCqEUPKlgPSg+Kniz2pG47Hd1FEL1IQRaRxYMebOdPx2SSyW6ySWYyEzOZZLfZyWRn0vf2NU3mTZLZlczbptvS+vgxvHnve/y+3/f78oEvz/354vyl46d+eGn+0tlPf//s89UXXrl47MTSy68tHTuxNL+wPHcy21McffW7C4XS62/9fPR4MT+cO7k0t7A8t7A8v7BMH9K3zx278NX5v8CRZ8+BRz4AT50Fj34InjwLnvkCgDcBeAeA0+Dh98ETn4AjZ2Z/KU4fxIO37xweOQMe+yiLfPxj8NB72cPs/F0A3nj6+fPg8uW1xUKluMR8s1j68af6L5eFxUK5uFQrFCuF4jWKxUJ5sVCi+HVFnN1eK35/LY+5VKzNYsoXCiWKi4Xy199eXflNAkmStlqbktQbDOD+bEEIt7e3h9kaue7A8zwSx/uHVhLHw+HI83Y8b2cW4zqOM51O9++3gO+PW61Bu+1ZFhqNojCIJbFTra3VOaVcbjCMdLXcEISWqprr6+2u6UZR4vUhw25UayLDSLPNGsOICI0xnhwGQiQIYkB3CBEIM0xI2mp1S1We4+VKla9zkqwYDUHleUVWDIwJISkcBbKiC4IqrGscL/O8YtluEMS7KAqCGKEoRxQlACGysxONRhkoQc90JVlvCKok6xCGGBOMCUIRxiQME0LSXRiWKvVKlWdZsSGosqw3m11JaiuKYZrbatOQpLbaNNRm9w6B749HowghEkVJGCZRdIAwvIP86laYtHVbUYyObmNMotltEEyCIKaRt2YIgjgjoKcYTyAkGE8ISQlJ43gax1O6JzOMb1MSkkZRkiR76XQvSfZoWJ7QPSAkzUxeWflHVbepDROStrWeIKhUcrvdU5RMsmFsUQXjKNmFoazoatOQZb2lmbbtxvE0575HdEawutrg+a7vj3OCKyW207EGA+g4w74LBwPoeWg4xBCGM5Mxy4pMZoBSq60xrMjzCsdt1GqCZfXzQh0QYDzx/TH1gBIY+qbazHLXtAwtrdfRbcPYUptda5Ys9AOGFf++wlSrAsOKLc2UlawpRKmjKIZlu9FhAoTIaHS3yQ8o6Hgmn5D0ZjDR9U3D2MpUeuhwXxyuzwHBrHPJLp6g2ybn1XyQb1GU0C7IG+H/TIaQ/LHKdxQnN/nfzibHbciyntkrZ1ZbVl+S2hiP6Rvo35JlXVjXJFkXpY4gqMMhznXcqyD/DnKTNa3HsKLjjPr9G9Thft/Pfl2Yf8mi1GFYkeNlYV1jWdG2vZvBBKEQoQjCMAgmuYi7PICQJPFUUQw6JDqdXte87jhDXbe7pqNpPQjDCUlv7GBJbjcEhecVhhXVplHnlGotM7zOSVfLXJ2TaE73IYjjqap2qzVB03qOM7Rst2s6Hd3e3BrYtotQREiKYEjTL5e5SpWv1gSO2+iajm27punQVFqa2TW3MwIID2YRLRQhqaIYNJ1Kldf1TctyDeO6bXu27UGYza8giG3bc5zhdWfY7/uW7Y58TEh6eMaMbzsPwjBBKOsfjCdhmLXHLo52cRgEBOMs3yTJRgIFnSL5LKGgA+O+XRTH0/8AEPk+y43VgqIAAAAASUVORK5CYII=" nextheight="527" nextwidth="848" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><em>*A Progressive Web App is essentially a website that behaves like a mobile app. It can be installed on a device, work offline, and send push notifications, but it runs in a browser and is distributed via the web rather than app stores.</em></p><h2 id="h-business-benefits-of-migrating-from-cordova-to-capacitor" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Business Benefits of Migrating from Cordova to Capacitor</h2><p>The technical advantages of Capacitor translate directly into tangible business outcomes.</p><ul><li><p><strong>Faster Feature Delivery</strong>. With a clean native layer, live reload, and a modern plugin ecosystem, developers can ship new features and updates much faster. Plus, Capacitor’s OTA (over-the-air) update capability, similar to React Native, lets push JS updates directly to users, which translates to faster Time-to-Market for new features and a quicker response to customer needs.;</p></li><li><p><strong>Reduced Maintenance Overhead</strong>. No more frantic Googling for unmaintained plugins or debugging obscure build errors. Capacitor’s predictable structure and well-documented upgrade paths lower your app’s technical debt. This means reduced operational expenses (OPEX) and more development budget allocated to building new features rather than fighting legacy issues.;</p></li><li><p><strong>Easier and Cheaper Hiring</strong>. You can hire from the vast pool of React, Vue, or Angular web developers. You are not locked into a niche market of Cordova or React Native specialists, which can significantly reduce team costs;</p></li><li><p><strong>Risk-Controlled Modernization</strong>. The migration can be done incrementally, without stopping development. You can move the app to Capacitor, and then slowly replace Cordova plugins with native Capacitor ones, ensuring stability at every step. This approach also serves as a stepping stone if you’re considering React Native down the road. If the app initially didn’t use React, developers can gradually move the codebase to React while on Capacitor, making a future transition to React Native significantly smoother and faster if business needs eventually require it.</p></li></ul><p>The ability to move incrementally, documenting, rewriting, and testing features one by one, ensures that your day-to-day business operations and development cycles never skip a beat. It reduces business risk and accelerates your time-to-market with a stable, future-proof application.</p><h2 id="h-how-to-mitigate-common-migration-issues" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How to Mitigate Common Migration Issues</h2><p>Migrating from Cordova to Capacitor is designed to be a low-risk process, but it’s wise to be aware of common hurdles. XB Software’s experience guiding clients through complex app modernization projects shows that a smooth transition relies on anticipating a few key hurdles.</p><p>Your existing Cordova app likely relies on a set of plugins for native functionality. A common concern is that you’ll need to find or build a new plugin for every single feature, a process that could balloon project costs.</p><p><strong>Solution: A Phased, Low-Risk Investment.</strong> Capacitor was built with backward compatibility in mind. Your team can first migrate the entire app while <em>still using your existing Cordova plugins</em>. Replacing old plugins with Capacitor equivalents becomes a separate, planned task. It can be done in various ways, such as searching for community Capacitor plugins, checking if functionality is available via web APIs, writing a custom Capacitor plugin, etc.</p><p>Even when a Capacitor equivalent for a Cordova plugin exists, the way your code talks to it might be different. If a developer has to refactor every screen that uses the camera or file system, a simple migration can quickly turn into a major timeline risk.</p><p><strong>Solution: An “Adapter” Strategy to Protect Timelines.</strong> Development teams can build a simple “adapter” layer. This is a small piece of code that acts as a translator, allowing your existing application code to keep using its old commands while the adapter converts them into the new Capacitor plugin’s language. This decouples the migration of your business logic from the migration of your native features, keeping the project moving forward on schedule and allowing for thorough, risk-free testing of each new plugin integration.</p><h2 id="h-conclusion-modernization-without-breaking-what-works" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Conclusion: Modernization Without Breaking What Works</h2><p>Migrating from Cordova to Capacitor is a pragmatic, low-risk strategy that honors your investment in your web codebase while shedding the technical debt of an aging native layer.&nbsp;By choosing Capacitor, you’re opting for faster delivery, lower costs, and a development experience that your team will actually enjoy. You’re building a foundation that can adapt to the next five years of mobile innovation as smoothly as it handles today’s. And most importantly, you’re doing it without breaking what already works for your users.</p>]]></content:encoded>
            <author>spec-driven-development@newsletter.paragraph.com (How Spec-Driven Development Brings Structure to AI-Assisted Engineering)</author>
            <category>mobile_development</category>
            <category>cordova</category>
            <category>capacitor</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/b3599edad0f669a0f8c4342899ba92b62d967d471d2d5130d33e36880e6b6153.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[How Spec-Driven Development Brings Structure to AI-Assisted Engineering]]></title>
            <link>https://paragraph.com/@spec-driven-development/how-spec-driven-development-brings-structure-to-ai-assisted-engineering</link>
            <guid>OpAK7urAYOFYX4rD21j6</guid>
            <pubDate>Mon, 30 Mar 2026 13:09:10 GMT</pubDate>
            <description><![CDATA[AI coding assistants have made developers incredibly fast since the start of the AI boom, but this new speed often comes at a hidden cost. The IT industry is realizing that generating code is the easy part. The real challenge is building systems that are coherent, maintainable, and actually do what they were supposed to do. This is where Spec-Driven Development (SDD) comes in. This methodology shifts the focus from vibe coding to following the general intent, using specifications as the new s...]]></description>
            <content:encoded><![CDATA[<p>AI coding assistants have made developers incredibly fast since the start of the AI boom, but this new speed often comes at a hidden cost. The IT industry is realizing that generating code is the easy part. The real challenge is building systems that are coherent, maintainable, and actually do what they were supposed to do.</p><p>This is where <strong>Spec-Driven Development (SDD)</strong> comes in. This methodology shifts the focus from vibe coding to following the general intent, using specifications as the new source of truth for AI-assisted engineering.</p><h2 id="h-why-vibe-coding-isnt-built-to-last" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why Vibe Coding Isn't Built to Last</h2><p>The term "vibe coding" perfectly captures the current experimental phase of AI-assisted development. You describe what you want, get a block of code back, and if it looks right and seems to work, you move on. This approach is undeniably powerful for <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/rapid-software-prototyping/">prototypes</a> and small scripts, allowing for unprecedented velocity. However, when applied to serious, mission-critical applications, the cracks begin to show:</p><ul><li><p>The code might compile and even function, but the underlying architecture becomes an afterthought;</p></li><li><p>New features create unexpected conflicts;</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/blog/documentation-for-product-development/">Documentation</a> is sparse or non-existent;</p></li><li><p>The codebase transforms into a collection of disjointed components that are hard to maintain, debug, and evolve.</p></li></ul><p>The problem isn't the AI's coding ability. It's rather the workflow where developers treat AI like a search engine when they should be treating it like a literal-minded, but exceptionally talented, pair programmer who needs unambiguous instructions.</p><blockquote><p>Read Also <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/blog/custom-scheduling-app-with-ai-and-dhtmlx/">How to Build a Custom Scheduling App Faster with Lovable AI and DHTMLX Scheduler</a></p></blockquote><h2 id="h-what-is-spec-driven-development" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What Is Spec-Driven Development</h2><p>Spec-Driven Development is the practice of writing clear, structured, and testable specifications <em>before</em> a single line of code is generated. In the context of AI-assisted development, SDD provides the blueprint that guides AI agents to generate code that is consistent, architecturally sound, and perfectly aligned with business goals.</p><p>Unlike traditional <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/blog/software-development-life-cycle-waterfall-model/">waterfall requirements</a> that gather dust, an SDD spec is a living, executable artifact. It becomes the shared source of truth for both humans and AI, driving development, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/qa-software-testing/">software testing</a>, validation, and even documentation. By moving architectural decisions, constraints, and clarity upstream, SDD directly addresses the shortcomings of vibe coding. It replaces guesswork with a clear contract for how your app should behave.</p><h3 id="h-how-spec-driven-development-works-a-step-by-step-guide" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">How Spec-Driven Development Works: A Step-by-Step Guide</h3><p>The SDD process is structured into distinct, sequential phases. Each phase produces a key artifact that feeds into the next, ensuring a clear, traceable path from a high-level idea to production-ready code.</p><br><figure float="none" data-type="figure" class="img-center"><img src="https://storage.googleapis.com/papyrus_images/8f3bd56cc5694705b14ac08720ff81ad5c044248a053ac36f250dd1e4006f776.png" alt="" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAATCAIAAAB+9pigAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFCklEQVR4nI1Va2gcVRS+CiqUav0vKghSQXxhfaGCBYtYFH/0R0u1iJaU2pemaFMR6wMjtSioaRWbtDFN89gm6zbZdbfbfTSNm26STbabR5O0m80+5pF53Llz570z+4jM7rYm1ELhYzjnzOV855zvzhkgYlXEKkLyCgjSclesnLldSP8lFLEKqlGsm1g3Jc2owrbz5o0gQsrtZ7cPS6qUtzOIUoUAIXn6hGu0sXn8p7ar/RfmegLRL47GfmhNHOsa/vq3pDeC8xaEWKhUVH3eDIQUrBhclml/cFP086aU/1LSfRGyqNKBpF7r8qd6g0nHeSIwmvFEJpu6Ur3Ba53emRZXzj9klcu6buiGiWXNKpQ03RJu1ZOkznb5FkKjkOaZFImQDLCs8RC39PSeOefv9QeOd3a3OV3OYLDV5epwe1zB0Mme3qY/WnrOer787nDzn+3tDmdkZFy3Of63FU22ivZsFXvUNQ0EJHsD4T6P/69+71m372R7ly8QOuv29bg8Q8Oxwciws98bHIg4XP0Dkaiz3zt2earSxK1mteJe1ETWdcOyiqVSuVAo5s2iWhlI3izKiq7rlmUVq66q6lbBfisgBcva7che6wAhcZFhLk9MxhOJTCaHkMjbqmKEEIQCD6FgGxBCdD0uQihgLFUNhHCldjuOsVQFQqKAZJuAh7ZDEERnt8NxxpmYmJRlma/lEkQkTpwbWZiYwxKukEkcBzVVTc4nT53umJyaMgyD4yAPsSwro7HY6c6uPre7z+1hGEZAuEqABYRIkhwbSwxevJRKpZGIeIg4ThBFlM5kRodiI0OjHMdBCFlOhBBlMrnBwajXFwiFB2Zn5yrEdvkzs3Oev/3BUDgcHiQI8gaBxDAsTdOxWDw2nkhncrydSGA5gWMhSVIZksjmcizHMQzLQ8wwPEXTqdQCSZILC2mCIBiG5yFeZFhmkSEIgiRIgiBpepHlYE1kmuJIgqEXaDKZoymWyC4KSBaQTBAMRXGZFElkaYK0bRGrDIMIgqVoPjVPUxRPUdwiI4hYJSmepNgcwc6naIrmcwTLcmKNQM6baqmUHZ2ZcQ6opZJaKImSimVNt4r5cnkqnEhPp61yWTEse68omlUuGqZ5vj+OsVpcKiuaLiBF1fSlpVKGQP7gbLFUsAoWlrXalzw/EJ9s98d+7R050jHZ7rvivCjw9h2YCMVjnuiFVn+kIxTzRGeGZ2RFz2a5geB0wJPoafvnvDsePjeRvEarmj41TfkCV/o8U6e7x7y+6dDAVYoRgaQZbIZtAGs+A+AgWHMQ3NsA7tkPQPwXR9Q9/DJ4eAN4ciNY9xZ4/jWwdgN4Wtf1+g9aAFgPwBYANt8JtgHw+juvfGuYJnj0EADvg1V7wP31YPU+AN795nu/TUAlif0AfGoTrGoAdzUAsA+A6KHjgVOh58B968Fjb4Cn3gTPvAQeegE8oMryext/BOBZADYDsAmArQC8uO6R/Yqmg9V77eDde2yOOz4C4O1d9c7KNhVV/44jp9Z+2P7EDhuP13W/+gl1JU2kmeadPx/d2nhs2+GjWxubtjQ6vmrTDGMwOH2g7mTDjtYqDtSd6OuOmgXr9+bI9t1dOz/u2b67u26vY1d973g8e13kQkEplWx5S6WqgRUNy1q+XF4OvVhEoqob+aWlcnkZDNMUsVoomEtLpWUoqJpeIxB4EbIrUF1YkBdXAErV1cJDaTlu/Cpuiiv/Am0Mylpec2lfAAAAAElFTkSuQmCC" nextheight="597" nextwidth="1024" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><ol><li><p><strong>Specify (The "What" and "Why")</strong>. You start with a high-level description of what you're building and why. The AI then generates a detailed functional specification. This phase is purely about business intent: user journeys, success criteria, and edge cases. It explicitly excludes technical details, forcing clarity on the problem before jumping to a solution;</p></li><li><p><strong>Plan (The "How")</strong>. With the functional spec locked in, you provide the AI with your desired stack, architecture, and constraints. The <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/ai-software-development/">AI</a> generates a comprehensive technical plan, including technology choices, system design, integration patterns, and security considerations. This ensures the new code feels native to your project and aligns with your technical strategy;</p></li><li><p><strong>Tasks (The Breakdown)</strong>. The AI takes the spec and plan and breaks them down into small, reviewable, and actionable tasks. Each task is specific enough to be implemented and tested in isolation, like "create a user registration endpoint that validates email format." This decomposition prevents the "big bang" coding approach that overwhelms both AI and reviewers;</p></li><li><p><strong>Implement (The Execution). </strong>Finally, the AI tackles the tasks one by one. Instead of reviewing thousand-line code dumps, developers review focused changes that solve specific problems, verifying that the implementation matches the specification.</p></li></ol><blockquote><p>Read Also <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/blog/ai-assisted-saas-development-estimation-guide/">AI as a Co-Pilot, Not an Autopilot: Guidance on Risk Management and Realistic Performance</a></p></blockquote><h3 id="h-a-quick-look-at-the-tools-enabling-sdd" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">A Quick Look at the Tools Enabling SDD</h3><p>The SDD ecosystem is maturing rapidly. While <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/github/spec-kit">GitHub's Spec Kit</a> is a powerful open-source example, other platforms offer different interpretations of the model:</p><h4 id="h-spec-kit" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Spec Kit</h4><p>An open-source CLI and template-based toolkit that integrates with your existing AI assistants like Copilot, Claude Code, and Gemini CLI. It introduces the concept of a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://constitution.md"><em>constitution.md</em></a>, a file that encodes your project's immutable principles, such as stack versions, naming conventions, and architectural patterns.</p><h4 id="h-kiro" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Kiro</h4><p>An agentic AI with an IDE and CLI that add structure to an existing editor. Kiro has SDD built directly into its core. When starting a new feature, its agents automatically generate requirements, design documents, and create task lists, guiding the developer through an opinionated workflow. It's designed for developers who want a deeply integrated, automated, and context-aware environment for moving from concept to code.</p><h4 id="h-bmad-method" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">BMAD Method</h4><p>An open-source framework that simulates an entire agile team using specialized AI agents. With over 12 distinct agent personas, including a Product Manager, Architect, Scrum Master, etc., it manages the entire project lifecycle.</p><h2 id="h-xb-softwares-experience-putting-spec-kit-to-the-test" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">XB Software’s Experience: Putting Spec Kit to the Test</h2><p>Theory is one thing, but practice is where the real lessons are learned. Our team recently dove into GitHub’s Spec Kit to understand its practical applications and limitations. Here’s what we found trying to recreate the app shown below. It’s a small <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/fleet-management-software/">fleet management dashboard</a> with a scheduler, a map, and vehicle tables:</p><br><figure float="none" data-type="figure" class="img-center"><img src="https://storage.googleapis.com/papyrus_images/5cde1bca462f208c07245e1723882f5e5b8a5f51c132dce4b16a7eaab30a91b0.png" alt="" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAIAAABj86gYAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEp0lEQVR4nJVVXWxURRQeHnzAGPUNEtA++qaJPMqL8QVj0Cdf/ElRE2O0kEArv/1DEEqLKUhT0KKNKQkGHwxVIE2FroVGQsVgbUvtgja0dHfvvTv3Z3fn3jvnzBwz927LBnjAzZfJycye+8355jszjK1cu6u9k4giKUEpUBqUQqW00lprpbRWZkyRTlbHpaB2FZSSSimlUdHU5OT05A3Gnqzb0XaIiDBGQkqBoKIIogjiGM0oUYKSQGEE9yGKAGKMYhVLHcWgUGskGWMcQdEqWgWHsSfqdrZ2hkTHFrPfWHMDzkKPdfsXr4BAAsARIkR0PT9fsBbzBYnmC0uFatRaKJwXgRDCcV0pobfw74G7s4uhyMeiIKNYImMr1+5s7fCJ6mfHG2Z+3zH7x7s3r/Zbc6Q0aA2kFZEoC245QZHrGBQgSSQAkkCAYRTPey6URYX7FMOZwp3+xdtlIVwhLFEOI2CMPb151z4iUpUoLHpB3o54QKhjiZlMZuDU6ZELw0fHRusmR9f8OVJ3Y+SpG5fYH8NVXPu5485NKWH99NhzU6Ps+lDGtX91bXZ9qHshS4p4OWRs5TNNLR1E5AVliUoTgVKRBEDVd7K//oMPP9n0/sb+42z4JBvsYUMn2NDXZrxw3ATnut+cvQpKseFv2bmv2OCRAXuuZzHLfujYNPMbEXFfMPb4s9vbjIssyzJ1KG3ZRWHOTk1MTIxfG796eWzo7+lO63ZXLtuVz3blsofy2Z672WO5W+0LM0NeQWs6tjD75fzsgYWZW2F5Wvgtc39d8W0icoOQscfWNLUaFxUsK/UhGpsZicYnpn66ODo+MZXL50BriWhciAiIUWJlgeBCrLWWZt4Ak/l0FZXySyFjbNW2PQeIKAiCWEqtiYg0ESLuaWl54eVX1294rW/gO+NjxMT1Zhup66XCACQlLWGy0uSlQCmdEKxY3ZgQOE7Rtp17/9B06tRAY9OOzR83nBseSRJUsmSQ/kDrEkK6obTzagm01hUh7xFw7gZBuZpKFEvknl8RkYjAL1e453Ov5PoB90rc9bnncc93XG+ec+56QkSaTF2pyCYwoWk9xlasamw+SES5XN51veWNCCG27Gp9e9veDfUNG+s/2nmwZ0vb4cb9R7bu697cdrihpauh1WBL+xfvNe09f+mKKQjRlEKU0pjrx/TBilXbEgLP98MoBkApQQJqTU2fbn/+pVfeemfT7pb2tiN9zZ29zZ29LYd7d9egufvE1s+6L42NJ4dkNEzFSXeZVMCqBK7rLetjjCGRc+65LmkVRnHO4RZ3Le4WHF5wPItzm7uLDv/HKRYcXhYiPaTqHZjefcsSpQS2bfu+X65U/CAIo0gTZS5n+k7/eP7i95nRM0n+gy5SqYtqddcPnMHqKoHDC3bRsouWUyyVK0T0+f62detefP2NjX19R2tclFrGiA1alVA+1EU1Ei0RVISIJcQxSIlgWoZms7fOnj07OHjedtxa8/1vgtSmiLh8BkSU0GCaad6fJKpNTvrgUQhYlWDZZCkkGL6k4wyBBMMHiBIwvS0AUACU4JElKlfi2qdKCBBLcUWAXw4fioq4/4277yP/ASYqc+tNaoOGAAAAAElFTkSuQmCC" nextheight="631" nextwidth="1024" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/fleet-management-system-demo/"><em>Fleet Management System Demo</em></a></p><br><p><strong>How Spec Kit Works</strong></p><ul><li><p><strong>/constitution:</strong></p><ul><li><p><em>When to use</em>: At the very beginning of a project.</p></li><li><p><em>Purpose:</em> Establishes your project's foundational rules, defining the tech stack, architectural patterns, and coding conventions that AI-generated code must follow.</p></li></ul></li></ul><ul><li><p><strong>/specify:</strong></p><ul><li><p><em>When to use:</em> After the constitution is set.</p></li><li><p><em>Purpose:</em> Takes your high-level, plain-language description of a feature (the "what" and "why") and expands it into a detailed functional specification.</p></li></ul></li></ul><ul><li><p><strong>/plan:</strong></p><ul><li><p><em>When to use:</em> After the specification is reviewed and approved.</p></li><li><p><em>Purpose:</em> Generates a technical implementation plan based on the spec and the project's constitution, defines frameworks, libraries, etc.</p></li></ul></li></ul><ul><li><p><strong>/tasks:</strong></p><ul><li><p><em>When to use:</em> After the plan is finalized.</p></li><li><p><em>Purpose:</em> Breaks down the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/blog/software-requirements-specification-document/">specification</a> and plan into a list of small, concrete, and actionable tasks. Each task is designed to be implemented and tested independently.</p></li></ul></li></ul><ul><li><p><strong>/implement:</strong></p><ul><li><p><em>When to use:</em> After the tasks are defined.</p></li><li><p><em>Purpose:</em> Instructs the AI agent to start writing the actual code, working through the generated task list one by one.</p></li></ul></li></ul><p>Our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/web-app-dev/custom-web-application-development/">web development team</a> started by testing the limits of the process. The first attempt was to generate a complete demo application, in one go. The high-level description was fed into the <em>/specify </em>command, and the results quickly revealed the AI's contextual limitations. The application generated by Spec Kit was a mess:&nbsp; the scheduler rendered strangely, filters didn't work, and the statistics pulled random data not connected to the users or vehicles:</p><br><figure float="none" data-type="figure" class="img-center"><img src="https://storage.googleapis.com/papyrus_images/0e4f08c550734c2956e6fd93dd7a1df8a7f6a2315105a0a5947e500831ec620d.png" alt="" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAANCAIAAABHKvtLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACxklEQVR4nJ2R7UtTURjAD/SpDxb9ByP9IEFEftOG+IZmIDaCrFDoSwzfhu/DWG1usCSahk6CNhhjIvvgfLmtcS8XZc1jd3Msrro5cZrWNcvcdHczdffO3T6cMDUx8eHH4TnPOZzfOecBFEVlZWVFo1vzwWA0upVK7UejW/8lHAmHI+ETlxiG+b62xjCMRCKpuF8BWlpbTCYTx3MJbo8giN5ePUEQgUCAJEnqUNDTtHdqyu+fRdNAIMAwDISQ/CfGx8bR2NXdnZubByQSCUVRgiBwPNfe/lQma1QolAqFEsPs2Aim1Xaazf1mc79W26nX9zU1NmMj2AcnfFDxUCQSzc0FT8Tt9qBEr+8DpaV3KIrieC6V2q+uqTUYTdLqmvyiYhek7A68vqHJNoq9eWuUVte81L1Oz8hw4ITX+6m45DYAgGEYjueOsbyyQhA4uvH0zAyoq6vz+2c5nhME4ZZY3P5MmSPOBQC4IOWCVH5RscFoUqk112/crG9oAgC8e+9wQUrX3fOosqpNLqenadSPcCTMsixy/Pi5joAQAqRCgpKS0g7Ni7K79wC4YBmwIoFKrdF192TniFVqDRLASU9l1eO0y1cGh0cXPy8f4JyANtsQSZIHFZwgweHX2WxDg7ZRy4DVOQHRF9kdOEosA1bLgNVgNNkdOD0TyM4Ri66m7yYSu4lEdHt7N5FYW1+/mHYpr6BwZta/82sH4fF4/wpYliVJEh16Oi5INbfKDUZjLBZfXf2GCAZDmZnX2uRyPplElcjmptvtOfKCswuUHeq8gkKnyxVaWjpgfWNj5cvXwxVibPycgidSKQCgViYLLsxvxWPHiGxuxmJxQRB8NH1OwStdV1l5+XOV6vC5O3u7CJZlkQBOfjxPD+wO3EfTC4uhYCiELhuLxTmeOxCgCp9MLiyGjghwghzGHGfBOQF9n3ynAOGfDb8BIc+jYzzEa0gAAAAASUVORK5CYII=" nextheight="400" nextwidth="1024" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>This shows that feeding too much information at once simply overwhelms the model. It gets confused and starts losing track of early requirements halfway through implementation.</p><p>The failure illustrated a core principle of SDD: <strong>decomposition is not optional</strong>. The AI's context window, while large, has finite capacity. Handling a complex, multi-page application in one go leads to forgotten requirements and inconsistent results.</p><p>A better strategy is to build the project feature by feature. On the second attempt, our team started with the core layout (the header and collapsible menu) with a highly detailed spec that included exact styles and components:</p><br><figure float="none" data-type="figure" class="img-center"><img src="https://storage.googleapis.com/papyrus_images/c5e79826f82bf7f85fc66e48262589a01c8521ab95af121d44c2b3b1f5f33226.png" alt="" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAANCAIAAABHKvtLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABXElEQVR4nL2UT0sCQRiHB1lT81/aYXfRLdwsXTU3qluXTkEfpavioYvSITL6ctXHqNggdXZnZ3be2BmUNQWRMnh4+c3LMA8vzAxKG81cpV08sFFMvb0bAsDneER8EvCABVO4IGARZJMxTkMCKpoyhJkDvL07z68vKGm0M+ZZ1jxHW0Zv8AgAX2OMiU8oI5QTn3k+c2UOaxTZocthbIK9D8dB+cOLgnWVql6i/HF38AQAPmMB8Dn4/HKRZRsAwCME5Sp20TzJlhsopnb7DwBAGF1xHKyGhhWwR1DBtHerp+lyEynaWgIaqYtLMRNgQlDKaGb2WttGC8XVzlRAxdZfEkiBotUV7UgItI0I4roV1+v/I1A7/eHfCxK6ldjoBEirIa2W3Jxg32g3Sq185BaJhwZrIm/nLIRwKbg27Judhl6ykKL2+vfiqxhNXIxD3Dk8wY+mwHU9wSxICMbeN1EqMLL/284wAAAAAElFTkSuQmCC" nextheight="406" nextwidth="1024" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Next came the "vehicles" page, specified down to the placement of inputs, instructing the AI to match the layout of a provided demo. While it wasn't perfect, and the AI still decided to paint a button a different color, it was a manageable, high-quality chunk of work that could be easily corrected with a follow-up prompt or a quick manual tweak.</p><p>The final step was a tiny, well-scoped feature: adding sorting to two columns in an existing table. The simple command <em>create client-sorting for type and year columns on Vehicle Stable</em> proved perfectly suited for the SDD workflow, demonstrating that the methodology's value extends to changes of any size, ensuring even small updates are implemented correctly and consistently:</p><br><figure float="none" data-type="figure" class="img-center"><img src="https://storage.googleapis.com/papyrus_images/2bc6f43f06961f334c7d8cc55b985bc6188d1cd8d4f0e4e93f35c7d45e102881.png" alt="" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAANCAIAAABHKvtLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACgUlEQVR4nI2Ty2oVQRCGB0lEk5goiB7FI3oMMSFqRLJx48rnES+4ULwgqAvBp/FJ4gu4CXhJzkzS011dXVU9JdWTExNvpPiZ6Zke+pv6/+5qdrh66urNhWtr1dT5p6/fqWrrQyLKWY4omejgWFXH43rj80Y1O7w1N1o/NVqvjg8fv3yvqnWzmxIxCzET/V1MwmwiErIrJ2Y6oET8vcYf23W1sHj3zMr9mcV71cLqk1cfhGVz82tKlJBFcrdX+n+p7o+7XJ5rzx8/0ZdvVM1fWTszuj0zXK2mzj96USxqwbcAHuxnEwvLBPMLtX9XVWYZj2si6TrN2d7krDlnTBkiV/Oj26cX75wY3qimB48LYNwApAypq1toA0HqymMG6hxQiAKpQ+pan0IUTB1zDh6SedTFmLa2auacrfkckauTw9W5yzetg+lBn8F27SIrsNYOtnZCYAXqTKy7QC0aKbI2HgMKkIpkQmNEIIzcNLtUEspSAFODpanBUg+YWNSaqaoxRoBQ/C2mqFKy6mcTooi5ZwASREbkhNy41rUe0bw1wPSF5ekLy5MO3qrqjmv73ADAe38IQNQnb3iMLFxesnOeEuesIgqAACjFpd8BfQfehz5DRGyapv/NvnjirqrNith+T4l2dloiCSE650U0AqZkmzBGOQR4+NwARNQvJyL7K/5Z2cpIKZEPUUSd884BkXgPiHuZHwI8KAARnnjSTez5d6m1FQGZOoshFRclM2cRxYlFKzO2TS/2ADZPytpHU85d2gVJe4ejHAJTZzlxdfLc5ZnBaOHS9erY2UfP3li2oU7RYWwRAoKDGBB8kYvgYxlHgAgBosmmoiMwlQ8ClMIIHsJPY9Umbo58fG8AAAAASUVORK5CYII=" nextheight="406" nextwidth="1024" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Our experiments with Spec Kit revealed that successful AI-assisted development hinges on proper decomposition. Attempting to generate an entire application in one pass overwhelmed the model and produced unusable results, while breaking the project into small, well-scoped features consistently delivered high-quality, reviewable code. The key insight: specifications must match the size of the task, ensuring AI can maintain focus and consistency throughout implementation.</p><h2 id="h-when-sdd-makes-the-most-sense" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">When SDD Makes the Most Sense</h2><p>It is not a silver bullet for every coding task, but it provides immense value in specific scenarios:</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/enterprise-resource-planning-software/"><strong>Enterprise</strong></a><strong> &amp; Production Systems</strong>. For long-lived applications where maintainability, stability, and compliance are critical;</p></li><li><p><strong>Complex Architectures</strong>. For projects with multiple services, APIs, and integration points where a lack of clarity can lead to catastrophic failure;</p></li><li><p><strong>Team Development. </strong>When multiple developers (and AI agents) need to collaborate on a shared codebase, a central source of truth is invaluable;</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xbsoftware.com/app-modernization-service/"><strong>Legacy Modernization</strong></a><strong>.</strong> When rebuilding an old system, you can use SDD to capture the essential business logic in a modern spec before letting AI regenerate a clean, new implementation.</p></li></ul><h2 id="h-conclusion-from-code-centric-to-spec-centric-thinking" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Conclusion: From Code-Centric to Spec-Centric Thinking</h2><p>We are moving from an era where "code is the source of truth" to one where "intent is the source of truth." AI is making specifications executable, turning our documented intent directly into working software. Spec-Driven Development allows small teams to build robust systems and large organizations to move with coherence and speed.</p>]]></content:encoded>
            <author>spec-driven-development@newsletter.paragraph.com (How Spec-Driven Development Brings Structure to AI-Assisted Engineering)</author>
            <category>ai</category>
            <category>web</category>
            <category>development</category>
            <category>sdd</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/d7e89ed25728ceac6eea6a58172131c720912f388a9f9f727b19a0c2bfb223b8.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>