<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>orapha.dev</title><link>https://www.orapha.dev/</link><description>Raphael Pontes' blog — software engineering, AI, and development. English edition.</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sun, 10 May 2026 01:18:05 GMT</lastBuildDate><atom:link href="https://www.orapha.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Awesome Design: A catalog of design systems ready to use with AI agents</title><link>https://www.orapha.dev/en/2026/05/09/awesome-design-md-o-catalogo-de-design-systems-para-agentes-de-ia/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/05/09/awesome-design-md-o-catalogo-de-design-systems-para-agentes-de-ia/</guid><pubDate>Sat, 09 May 2026 10:00:00 GMT</pubDate><description>&lt;h1&gt;Awesome Design: A catalog of design systems ready to use with AI agents&lt;/h1&gt;&lt;p&gt;There&amp;rsquo;s something that&amp;rsquo;s always bothered me when working with code agents: visual inconsistency. You ask the agent to &amp;ldquo;create a dashboard screen,&amp;rdquo; it delivers something functional, but the visual&amp;hellip; well, the visual looks like it was made by someone who&amp;rsquo;s never heard of a design system. Each screen becomes an island, each component has its own personality, and in the end you have a visual Frankenstein that works but doesn&amp;rsquo;t give that professional product feeling.&lt;/p&gt;</description><content:encoded><![CDATA[<h1>Awesome Design: A catalog of design systems ready to use with AI agents</h1><p>There&rsquo;s something that&rsquo;s always bothered me when working with code agents: visual inconsistency. You ask the agent to &ldquo;create a dashboard screen,&rdquo; it delivers something functional, but the visual&hellip; well, the visual looks like it was made by someone who&rsquo;s never heard of a design system. Each screen becomes an island, each component has its own personality, and in the end you have a visual Frankenstein that works but doesn&rsquo;t give that professional product feeling.</p>
<p>I&rsquo;ve tried various approaches. I&rsquo;ve shared Figma links, I&rsquo;ve described colors and typography in detail, I&rsquo;ve even sent screenshots with annotations. It works, but it&rsquo;s tedious. And the worst part: with each new feature, the conversation starts from scratch.</p>
<p>That&rsquo;s when I discovered <a href="https://github.com/voltagent/awesome-design-md"target="_blank" rel="noopener"><strong>Awesome Design</strong></a>.</p>
<h2>What is DESIGN.md?<span class="hx:absolute hx:-mt-20" id="what-is-designmd"></span>
    <a href="#what-is-designmd" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Before talking about the repository itself, I need to explain the concept. DESIGN.md is an idea that came from <a href="https://stitch.withgoogle.com/docs/design-md/overview/"target="_blank" rel="noopener">Google Stitch</a>. It&rsquo;s simply a markdown file that describes your project&rsquo;s design system: colors, typography, components, spacing, responsive behaviors.</p>
<p>The trick is that, since it&rsquo;s markdown, AI agents read it very well. No complex JSON needed, no need to export from Figma, no plugin required. It&rsquo;s a text file, at the root of the project, that any agent can consult.</p>
<p>The analogy I like to use:</p>
<table>
  <thead>
      <tr>
          <th>File</th>
          <th>Who reads it</th>
          <th>What it defines</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>AGENTS.md</code></td>
          <td>Code agents</td>
          <td>How to build the project</td>
      </tr>
      <tr>
          <td><code>DESIGN.md</code></td>
          <td>Design agents</td>
          <td>How the project should look</td>
      </tr>
  </tbody>
</table>
<h2>What does Awesome Design offer?<span class="hx:absolute hx:-mt-20" id="what-does-awesome-design-offer"></span>
    <a href="#what-does-awesome-design-offer" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The VoltAgent repository is basically a catalog of DESIGN.md files inspired by real sites and products. And when I say real, I&rsquo;m talking about brands like:</p>
<p><strong>AI Platforms:</strong></p>
<ul>
<li><strong>Claude</strong> — that warm terracotta tone, clean editorial layout</li>
<li><strong>ElevenLabs</strong> — dark cinematic UI, with that sound wave aesthetic</li>
<li><strong>Ollama</strong> — monochromatic simplicity, focus on the terminal</li>
<li><strong>VoltAgent</strong> — black-void canvas, emerald accent, terminal vibe</li>
</ul>
<p><strong>Dev Tools:</strong></p>
<ul>
<li><strong>Cursor</strong> — dark editor with sleek gradients</li>
<li><strong>Vercel</strong> — black and white precision, Geist font</li>
<li><strong>Warp</strong> — modern terminal, block UI</li>
<li><strong>Supabase</strong> — dark emerald theme, code first</li>
</ul>
<p><strong>Productivity &amp; SaaS:</strong></p>
<ul>
<li><strong>Linear</strong> — ultra minimalist, precise, purple accent</li>
<li><strong>Notion</strong> — warm minimalism, serif headings</li>
<li><strong>Figma</strong> — vibrant multicolor, professional but fun</li>
</ul>
<p>And the list continues: Stripe, Spotify, Apple, Tesla, Airbnb, Nike&hellip; there are more than 70 documented design systems.</p>
<h2>How it works in practice<span class="hx:absolute hx:-mt-20" id="how-it-works-in-practice"></span>
    <a href="#how-it-works-in-practice" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The structure of each DESIGN.md follows a pattern that makes life much easier:</p>
<ol>
<li><strong>Visual Theme &amp; Atmosphere</strong> — the mood, density, design philosophy</li>
<li><strong>Color Palette</strong> — semantic names + hex + function</li>
<li><strong>Typography Rules</strong> — font families, complete hierarchy</li>
<li><strong>Component Styles</strong> — buttons, cards, inputs, navigation</li>
<li><strong>Layout Principles</strong> — spacing scale, grid, whitespace</li>
<li><strong>Depth &amp; Elevation</strong> — shadow system, surface hierarchy</li>
<li><strong>Do&rsquo;s and Don&rsquo;ts</strong> — guardrails and anti-patterns</li>
<li><strong>Responsive Behavior</strong> — breakpoints, touch targets</li>
<li><strong>Agent Prompt Guide</strong> — quick color references, ready to use</li>
</ol>
<p>Besides the DESIGN.md, each site includes:</p>
<ul>
<li><code>preview.html</code> — visual catalog with swatches, typographic scale, buttons</li>
<li><code>preview-dark.html</code> — the same catalog with dark surfaces</li>
</ul>
<h2>Using it in practice<span class="hx:absolute hx:-mt-20" id="using-it-in-practice"></span>
    <a href="#using-it-in-practice" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The workflow is absurdly simple:</p>
<ol>
<li>Choose a design system from the catalog</li>
<li>Copy the DESIGN.md to your project root</li>
<li>Tell your agent: &ldquo;use this design system&rdquo;</li>
</ol>
<p>That&rsquo;s it. Seriously.</p>
<p>The agent will read the file, understand the colors, fonts, spacing, and apply everything to the code it generates. If you use Claude, Cursor, GitHub Copilot, or any other agent that reads context files, it works.</p>
<h2>Why this matters<span class="hx:absolute hx:-mt-20" id="why-this-matters"></span>
    <a href="#why-this-matters" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For me, the value is in two places:</p>
<p><strong>First, consistency.</strong> When you have a DESIGN.md committed in the repo, every interaction with the agent has a shared visual reference. It doesn&rsquo;t matter if you&rsquo;re working on the feature today or three months from now — the design system is there, documented, versioned.</p>
<p><strong>Second, speed.</strong> Instead of losing 15 minutes describing &ldquo;I want a blue primary button with rounded borders and soft shadow,&rdquo; you simply point to the DESIGN.md. The agent already knows exactly how to style it.</p>
<p>And there&rsquo;s a bonus: since each DESIGN.md is based on real products that work, you&rsquo;re essentially &ldquo;copying&rdquo; visual patterns that have already been tested and validated by companies that invest millions in design.</p>
<h2>Considerations<span class="hx:absolute hx:-mt-20" id="considerations"></span>
    <a href="#considerations" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Awesome Design is one of those repositories that seems simple but solves a real problem. The idea of using markdown for design system is elegant because it works with the flow we already use with code agents.</p>
<p>If you&rsquo;re building something with AI and care about the visual quality of the result, it&rsquo;s worth checking out. The repository is constantly growing — there are already more than 70 design systems — and accepts contributions.</p>
<p>I particularly like having this in my arsenal. It&rsquo;s another tool for when I want the agent to deliver something that not only works, but also <em>looks</em> well made.</p>
<hr>
<p><strong>Links:</strong></p>
<ul>
<li><a href="https://github.com/voltagent/awesome-design-md"target="_blank" rel="noopener">Awesome Design on GitHub</a></li>
<li><a href="https://stitch.withgoogle.com/docs/design-md/overview/"target="_blank" rel="noopener">DESIGN.md Documentation on Google Stitch</a></li>
<li><a href="https://getdesign.md/"target="_blank" rel="noopener">Site with design system previews</a></li>
</ul>
]]></content:encoded><category>ai</category><category>design-systems</category><category>design-md</category><category>frontend</category><category>voltagent</category></item><item><title>Demystifying the OpenSpec Propose Process: What Happens Behind the Scenes?</title><link>https://www.orapha.dev/en/2026/04/29/desmistificando-o-processo-de-propose-no-openspec/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/04/29/desmistificando-o-processo-de-propose-no-openspec/</guid><pubDate>Wed, 29 Apr 2026 23:22:42 GMT</pubDate><description>&lt;p&gt;When we execute the proposal creation command (propose) in OpenSpec — for example, when starting the &lt;code&gt;add-course-enrollment-module&lt;/code&gt; functionality —, the system works behind the scenes to generate a series of fundamental files for development success.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever wondered what each of these artifacts is for, this article is for you. Let&amp;rsquo;s explore the anatomy of each generated document and how they ensure team alignment: from business vision to coding.&lt;/p&gt;</description><content:encoded><![CDATA[<p>When we execute the proposal creation command (propose) in OpenSpec — for example, when starting the <code>add-course-enrollment-module</code> functionality —, the system works behind the scenes to generate a series of fundamental files for development success.</p>
<p>If you&rsquo;ve ever wondered what each of these artifacts is for, this article is for you. Let&rsquo;s explore the anatomy of each generated document and how they ensure team alignment: from business vision to coding.</p>
<hr>
<h2>1. The Proposal (<code>proposal.md</code>): The &ldquo;Why&rdquo; and the &ldquo;What&rdquo;<span class="hx:absolute hx:-mt-20" id="1-the-proposal-proposalmd-the-why-and-the-what"></span>
    <a href="#1-the-proposal-proposalmd-the-why-and-the-what" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The proposal document is the starting point of your journey. It serves as the bridge between business and engineering.</p>
<ul>
<li><strong>What it contains:</strong> Motivation for the functionality, exact scope of what will be built, and which new &ldquo;capabilities&rdquo; are being introduced to the system. In our example, it maps the impact on the project and introduces <code>enrollment-management</code>, <code>payment-gateway-adapter</code>, and <code>enrollment-command-dispatch</code>.</li>
<li><strong>What it&rsquo;s for:</strong> Ensuring that everyone involved (developers, POs, stakeholders) has clarity about the value being delivered and the size of the change, even before we write the first line of code.</li>
</ul>
<h2>2. The Design Document (<code>design.md</code>): The &ldquo;How&rdquo; at High Level<span class="hx:absolute hx:-mt-20" id="2-the-design-document-designmd-the-how-at-high-level"></span>
    <a href="#2-the-design-document-designmd-the-how-at-high-level" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If <em>Proposal</em> focuses on business, <em>Design Document</em> deepens into technical terrain. Here live architecture decisions and risk mitigation.</p>
<ul>
<li><strong>What it contains:</strong> Documents the technical decisions that will guide development. For example, the decision to replicate the pattern already used in &ldquo;students&rdquo; in the frontend, the adoption of deterministic commands in BFF, payment adapter isolation, and ensuring idempotency via <code>request_id</code> based on <em>polling</em>.</li>
<li><strong>What it&rsquo;s for:</strong> Preventing future headaches. By listing risks, their mitigations, and the migration plan, the technical team has a map of possible obstacles and how to circumvent them without hurting the application&rsquo;s architecture.</li>
</ul>
<h2>3. The Specs (<code>specs/*/spec.md</code>): The Rules of the Game<span class="hx:absolute hx:-mt-20" id="3-the-specs-specsspecmd-the-rules-of-the-game"></span>
    <a href="#3-the-specs-specsspecmd-the-rules-of-the-game" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>One of OpenSpec&rsquo;s great insights is dividing a complex problem into smaller &ldquo;capabilities,&rdquo; generating dedicated specifications for each system domain:</p>
<h3><code>specs/enrollment-management/spec.md</code> (Frontend)<span class="hx:absolute hx:-mt-20" id="specsenrollment-managementspecmd-frontend"></span>
    <a href="#specsenrollment-managementspecmd-frontend" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Focused on user experience. Defines interface requirements: how the enrollments table should behave, rules for hiding sensitive data, allowed actions (edit, remove, open URL, trigger message modals), and non-functional requirements such as responsiveness and synchronization with backend.</p>
<h3><code>specs/payment-gateway-adapter/spec.md</code> (Integration)<span class="hx:absolute hx:-mt-20" id="specspayment-gateway-adapterspecmd-integration"></span>
    <a href="#specspayment-gateway-adapterspecmd-integration" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Focused on communication with the partner. Defines the rules of the game with the Payment Gateway API: how to create, query, update, and cancel payments. In addition, it ensures correct mapping of third-party API statuses to the internal domain and formalizes security in credential handling.</p>
<h3><code>specs/enrollment-command-dispatch/spec.md</code> (Backend/BFF)<span class="hx:absolute hx:-mt-20" id="specsenrollment-command-dispatchspecmd-backendbff"></span>
    <a href="#specsenrollment-command-dispatchspecmd-backendbff" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Focused on internal robustness. Defines responsibilities in BFF (Backend For Frontend), such as deterministic resolution of provider configurations, issuance of versioned commands, and strict application of idempotency and traceability in events.</p>
<h2>4. The Action Plan (<code>tasks.md</code>): Getting Hands-On<span class="hx:absolute hx:-mt-20" id="4-the-action-plan-tasksmd-getting-hands-on"></span>
    <a href="#4-the-action-plan-tasksmd-getting-hands-on" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The cherry on top of the entire planning process. After understanding context, architecture, and specific requirements, OpenSpec compiles all this into an actionable checklist.</p>
<ul>
<li><strong>What it contains:</strong> A logical grouping of tasks. In the case of our enrollment functionality, 12 ordered groups were generated for implementation: ranging from initial <em>setup</em>, through domain modeling, use cases, infrastructure, screen/UI development, hook construction, route configuration, and observability, to closing with tests and final documentation.</li>
<li><strong>What it&rsquo;s for:</strong> It&rsquo;s the developer&rsquo;s pocket guide. It allows the team to pick up independent tasks knowing exactly in what order they should be executed, making progress predictable and easy to track.</li>
</ul>
<hr>
<h3>Conclusion<span class="hx:absolute hx:-mt-20" id="conclusion"></span>
    <a href="#conclusion" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Having a brilliant idea is great, but transforming it into software running in production requires method.</p>
<p>With the OpenSpec <strong>Propose</strong> process, all the heavy lifting of planning, architectural organization, and task division is done fluidly. The result are extremely predictable development cycles (sprints), always living documentation, and an intelligently reduced <em>time-to-market</em> in a standardized way.</p>
<p>Next time OpenSpec generates these artifacts, you&rsquo;ll know exactly the importance of each piece of this gear!</p>
]]></content:encoded><category>openspec</category><category>software-engineering</category><category>spec-driven-development</category><category>architecture</category></item><item><title>From Feature to Deploy Hands-Free: Architecture of a Software Factory with AI Using Spec-Driven Development</title><link>https://www.orapha.dev/en/2026/04/15/da-feature-ao-deploy-sem-maos-arquitetura-de-uma-software-factory-com-ia-usando-spec-driven-development/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/04/15/da-feature-ao-deploy-sem-maos-arquitetura-de-uma-software-factory-com-ia-usando-spec-driven-development/</guid><pubDate>Wed, 15 Apr 2026 23:18:03 GMT</pubDate><description>&lt;h1&gt;From Feature to Deploy Hands-Free: Architecture of a Software Factory with AI Using Spec-Driven Development&lt;/h1&gt;&lt;h2&gt;Introduction: What the Software Industry Was Like Before AI&lt;span class="hx:absolute hx:-mt-20" id="introduction-what-the-software-industry-was-like-before-ai"&gt;&lt;/span&gt;
&lt;a href="#introduction-what-the-software-industry-was-like-before-ai" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;For decades, software development was operated as a high-specialization artisanal process. This isn&amp;rsquo;t a demerit: this model built practically everything we use today. The problem is that it depends on constant human synchronization. Refinement, implementation, review, QA, security, and deploy are stages with fragile interfaces, many times based on tacit context.&lt;/p&gt;</description><content:encoded><![CDATA[<h1>From Feature to Deploy Hands-Free: Architecture of a Software Factory with AI Using Spec-Driven Development</h1><h2>Introduction: What the Software Industry Was Like Before AI<span class="hx:absolute hx:-mt-20" id="introduction-what-the-software-industry-was-like-before-ai"></span>
    <a href="#introduction-what-the-software-industry-was-like-before-ai" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For decades, software development was operated as a high-specialization artisanal process. This isn&rsquo;t a demerit: this model built practically everything we use today. The problem is that it depends on constant human synchronization. Refinement, implementation, review, QA, security, and deploy are stages with fragile interfaces, many times based on tacit context.</p>
<p>In daily life, this appears in known symptoms: card that changes scope mid-execution, large PR with slow review, bugs discovered late, bottleneck in key people, and difficulty predicting real lead time. When the company grows, this model tends to saturate.</p>
<p>In industrial terms, it&rsquo;s like a factory that depends on master craftsmen for each station on the line. Quality can be excellent, but variation between batches is high and throughput doesn&rsquo;t scale linearly. In software, variability becomes rework; rework becomes cost; cost becomes strategic slowness.</p>
<p>The central point of this article is: AI allows migrating from an artisanal model to a software factory oriented by technical contract, without eliminating human engineering, but changing its focus to system design, governance, and operational quality.</p>
<h2>The Concept of Automated Assembly Line with AI<span class="hx:absolute hx:-mt-20" id="the-concept-of-automated-assembly-line-with-ai"></span>
    <a href="#the-concept-of-automated-assembly-line-with-ai" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>From Squad to Industrial Cell<span class="hx:absolute hx:-mt-20" id="from-squad-to-industrial-cell"></span>
    <a href="#from-squad-to-industrial-cell" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The squad continues to exist as a business and decision unit. What changes is operational execution: repeatable and verifiable tasks pass to automated cells of specialized agents. Each cell has defined input, quality criteria, and traceable output.</p>
<p>In a modern factory, you don&rsquo;t wait for quality control only at the end of the line. You place inspection at each station. The assembly line with AI applies this logic to software: spec, code, review, test, security, and observability are chained gates.</p>
<h3>What Changes If This Idea Works?<span class="hx:absolute hx:-mt-20" id="what-changes-if-this-idea-works"></span>
    <a href="#what-changes-if-this-idea-works" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>If it really works, it changes the game in four dimensions:</p>
<ol>
<li>Throughput: more deliveries per time unit without increasing team at the same pace.</li>
<li>Consistency: technical standard less dependent on who picked up the task.</li>
<li>Predictability: lead time and rework rate more stable.</li>
<li>Traceability: decision and evidence accessible from card to deploy.</li>
</ol>
<p>In practice, the PO&rsquo;s board stops being just intention management and starts reflecting real technical execution state, with telemetry of progress and risk.</p>
<h3>Will Jobs End?<span class="hx:absolute hx:-mt-20" id="will-jobs-end"></span>
    <a href="#will-jobs-end" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The mature answer is: not in the simplistic sense, but roles change. Repetitive work of translation and execution tends to fall. In counterpart, demand grows for platform engineering, specification design, agent governance, automation security, observability, and operation of the sociotechnical system.</p>
<p>The professional who only writes code per task loses space. The professional who designs delivery systems with quality and governance gains protagonism.</p>
<h2>General System Architecture<span class="hx:absolute hx:-mt-20" id="general-system-architecture"></span>
    <a href="#general-system-architecture" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Board as Input System<span class="hx:absolute hx:-mt-20" id="board-as-input-system"></span>
    <a href="#board-as-input-system" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The board (Kanban/Jira/Linear) continues to be the source of business truth. Each card should contain intention, expected value, acceptance criteria, and restrictions. Without this, automation just accelerates ambiguity.</p>
<h3>MCP as Integration and Contract Layer<span class="hx:absolute hx:-mt-20" id="mcp-as-integration-and-contract-layer"></span>
    <a href="#mcp-as-integration-and-contract-layer" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>MCP functions as a context bus between systems and agents: board, repository, CI/CD, tests, security, and documentation. Without a common contract layer, each agent becomes an isolated script and the assembly line degrades to glued automation.</p>
<h3>Structured Queue as Operational Buffer<span class="hx:absolute hx:-mt-20" id="structured-queue-as-operational-buffer"></span>
    <a href="#structured-queue-as-operational-buffer" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Ingestion transforms cards into queue items with explicit schema, for example:</p>
<ul>
<li>business_goal</li>
<li>acceptance_criteria</li>
<li>constraints</li>
<li>dependencies</li>
<li>impact_scope</li>
<li>risk_profile</li>
<li>definition_of_done</li>
</ul>
<p>This queue is the equivalent to a production order with clear technical instruction.</p>
<h3>Agent Mesh (Specialized Workers)<span class="hx:absolute hx:-mt-20" id="agent-mesh-specialized-workers"></span>
    <a href="#agent-mesh-specialized-workers" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Instead of one generalist agent, mature architecture uses specialization:</p>
<ul>
<li>Spec agent</li>
<li>Implementation worker</li>
<li>Review harness</li>
<li>QA agent</li>
<li>Security agent</li>
<li>UX agent</li>
<li>Orchestrator agent</li>
</ul>
<p>Each agent acts in a domain, with input/output interface and scaling policies.</p>
<h3>Quality Control and Governance<span class="hx:absolute hx:-mt-20" id="quality-control-and-governance"></span>
    <a href="#quality-control-and-governance" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Autonomy without governance becomes operational risk. Control includes:</p>
<ul>
<li>policies (constitution);</li>
<li>automated gates;</li>
<li>audit trails;</li>
<li>action limits by risk level;</li>
<li>mandatory human escalation in critical cases.</li>
</ul>
<h2>Pipeline Step by Step<span class="hx:absolute hx:-mt-20" id="pipeline-step-by-step"></span>
    <a href="#pipeline-step-by-step" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>1) Demand Ingestion: Board → Queue<span class="hx:absolute hx:-mt-20" id="1-demand-ingestion-board--queue"></span>
    <a href="#1-demand-ingestion-board--queue" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The pipeline starts with semantic parsing of cards, context enrichment, and requirements normalization. Example: improve checkout can become three distinct deliverables (API latency, antifraud validation, transactional error UX). The objective is to reduce ambiguity before the first line of code.</p>
<h3>2) SDD + Automated Implementation<span class="hx:absolute hx:-mt-20" id="2-sdd--automated-implementation"></span>
    <a href="#2-sdd--automated-implementation" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>With normalized demand, the flow enters SDD:</p>
<ul>
<li>generates change spec;</li>
<li>explicit contracts (API, data, expected behavior);</li>
<li>decomposes tasks;</li>
<li>applies specification-guided implementation.</li>
</ul>
<p>This is the point where the factory differentiates itself from prompt + code. The spec is the upstream quality control artifact.</p>
<h3>3) Automated Code Review<span class="hx:absolute hx:-mt-20" id="3-automated-code-review"></span>
    <a href="#3-automated-code-review" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The review harness audits the PR focusing on spec adherence, regression, complexity, and architectural impact. It can approve, request changes, or open a block for human review.</p>
<p>The idea isn&rsquo;t to remove human reviewer, but reserve human intervention for cases of higher value or risk.</p>
<h3>4) CI/CD for Staging<span class="hx:absolute hx:-mt-20" id="4-cicd-for-staging"></span>
    <a href="#4-cicd-for-staging" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>After approval in the review gate, the assembly line triggers build, static checks, and automatic deploy in staging. Ephemeral environments per PR increase isolation and reduce &ldquo;works on my machine.&rdquo;</p>
<h3>5) Automated Tests with QA Agents<span class="hx:absolute hx:-mt-20" id="5-automated-tests-with-qa-agents"></span>
    <a href="#5-automated-tests-with-qa-agents" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The QA agent executes smoke tests (critical flow sanity), regression suite (legacy stability), and tests based on spec acceptance criteria.</p>
<p>Failure doesn&rsquo;t return as noise. It returns as a structured item with probable cause, evidence, and correction recommendation.</p>
<h3>6) Continuous Security with Cyber Agent<span class="hx:absolute hx:-mt-20" id="6-continuous-security-with-cyber-agent"></span>
    <a href="#6-continuous-security-with-cyber-agent" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Security enters as a fixed station on the line, not a final stage:</p>
<ul>
<li>vulnerability analysis;</li>
<li>OWASP Top 10 validations (including Broken Access Control);</li>
<li>automated pentest for sensitive flows;</li>
<li>analysis of secrets, authz/authn, headers, and undue exposure.</li>
</ul>
<p>The gain is anticipating risk before merge/deploy in production.</p>
<h3>7) Reports and Traceability<span class="hx:absolute hx:-mt-20" id="7-reports-and-traceability"></span>
    <a href="#7-reports-and-traceability" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Each stage produces evidence:</p>
<ul>
<li>structured logs;</li>
<li>execution links;</li>
<li>test outputs;</li>
<li>security findings;</li>
<li>review decision;</li>
<li>time and quality metrics.</li>
</ul>
<p>Without evidence, there&rsquo;s no reliable operation at scale.</p>
<h3>8) Feedback Loop to PO&rsquo;s Board<span class="hx:absolute hx:-mt-20" id="8-feedback-loop-to-pos-board"></span>
    <a href="#8-feedback-loop-to-pos-board" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>At the end of each cycle, the assembly line updates the board with real technical status: approved/rejected by gate, blocks, residual risk, and recommended next step.</p>
<p>With this, product and engineering operate on the same truth state.</p>
<h2>The Role of Spec-Driven Development (OpenSpec)<span class="hx:absolute hx:-mt-20" id="the-role-of-spec-driven-development-openspec"></span>
    <a href="#the-role-of-spec-driven-development-openspec" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>constitution, propose/specify, apply, archive<span class="hx:absolute hx:-mt-20" id="constitution-proposespecify-apply-archive"></span>
    <a href="#constitution-proposespecify-apply-archive" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>OpenSpec organizes execution into four movements:</p>
<ul>
<li>constitution: factory principles, limits, and policies;</li>
<li>propose/specify: change design with clear contracts;</li>
<li>apply: implementation guided by spec;</li>
<li>archive: decision record, trade-offs, and evidence.</li>
</ul>
<h3>Why Spec Is the Factory&rsquo;s Template<span class="hx:absolute hx:-mt-20" id="why-spec-is-the-factorys-template"></span>
    <a href="#why-spec-is-the-factorys-template" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Without spec, the agent optimizes for plausibility. With spec, it optimizes for verifiable compliance. This difference is structural. The spec becomes the technical drawing of the part that allows repeatable quality, comparison between batches, and continuous process improvement.</p>
<h2>The Role of Agents in Operation<span class="hx:absolute hx:-mt-20" id="the-role-of-agents-in-operation"></span>
    <a href="#the-role-of-agents-in-operation" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Implementation Worker<span class="hx:absolute hx:-mt-20" id="implementation-worker"></span>
    <a href="#implementation-worker" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Converts spec into code and technical artifacts. Should operate with limited scope, idempotency, and local checks before opening PR.</p>
<h3>Review Harness<span class="hx:absolute hx:-mt-20" id="review-harness"></span>
    <a href="#review-harness" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Acts as automated technical auditor, verifying architectural consistency and contract adherence. Reduces human reviewer&rsquo;s cognitive load.</p>
<h3>QA Agent<span class="hx:absolute hx:-mt-20" id="qa-agent"></span>
    <a href="#qa-agent" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Executes test strategy by risk and impact, focusing on detecting regression early.</p>
<h3>Security Agent<span class="hx:absolute hx:-mt-20" id="security-agent"></span>
    <a href="#security-agent" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Analyzes attack surface and enforces security baseline. In critical cases, can automatically block flow.</p>
<h3>Orchestrator and Scaling Policies<span class="hx:absolute hx:-mt-20" id="orchestrator-and-scaling-policies"></span>
    <a href="#orchestrator-and-scaling-policies" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Coordinates the line: priority, retries, circuit breakers, rollbacks, and human handoff. Without orchestration, there&rsquo;s no factory; there are just concurrent scripts.</p>
<h2>UI/UX as First-Class Stage<span class="hx:absolute hx:-mt-20" id="uiux-as-first-class-stage"></span>
    <a href="#uiux-as-first-class-stage" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Flow and Wireframe Generation<span class="hx:absolute hx:-mt-20" id="flow-and-wireframe-generation"></span>
    <a href="#flow-and-wireframe-generation" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Before implementation, the UX agent proposes navigation flow, wireframes, and interaction alternatives. This prevents interface decisions improvised during coding.</p>
<h3>State and Interface Contract Definition<span class="hx:absolute hx:-mt-20" id="state-and-interface-contract-definition"></span>
    <a href="#state-and-interface-contract-definition" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Every screen should explicit states: loading, empty, success, partial, error, and permissions by profile. Poorly defined state is a classic source of rework between frontend, backend, and QA.</p>
<h3>UX Consistency Gate Before Code<span class="hx:absolute hx:-mt-20" id="ux-consistency-gate-before-code"></span>
    <a href="#ux-consistency-gate-before-code" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The assembly line only advances when there&rsquo;s minimum UX consistency: journey coherence, terminology, accessibility, and behavior predictability. UX stops being finishing and becomes structural requirement.</p>
<h2>End-to-End Observability and Traceability<span class="hx:absolute hx:-mt-20" id="end-to-end-observability-and-traceability"></span>
    <a href="#end-to-end-observability-and-traceability" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Evidence by Stage<span class="hx:absolute hx:-mt-20" id="evidence-by-stage"></span>
    <a href="#evidence-by-stage" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Each station needs to emit consumable evidence by humans and machines. Example: CI run link, coverage report, spec diff, security checklist.</p>
<h3>Throughput, Quality, and Risk Metrics<span class="hx:absolute hx:-mt-20" id="throughput-quality-and-risk-metrics"></span>
    <a href="#throughput-quality-and-risk-metrics" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Useful metrics for operating this factory:</p>
<ul>
<li>lead time by demand type;</li>
<li>automatic approval rate;</li>
<li>rework by stage;</li>
<li>escape rate to production;</li>
<li>MTTR by failure category.</li>
</ul>
<h3>Deliverable Traceability by Stage<span class="hx:absolute hx:-mt-20" id="deliverable-traceability-by-stage"></span>
    <a href="#deliverable-traceability-by-stage" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Every deliverable should have lineage: card → queue item → spec → commit → PR → pipeline run → deploy. This reduces diagnostic time and improves governance.</p>
<h2>Benefits, Risks, and Trade-offs<span class="hx:absolute hx:-mt-20" id="benefits-risks-and-trade-offs"></span>
    <a href="#benefits-risks-and-trade-offs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Scale and Consistency versus Coupling to AI Stack<span class="hx:absolute hx:-mt-20" id="scale-and-consistency-versus-coupling-to-ai-stack"></span>
    <a href="#scale-and-consistency-versus-coupling-to-ai-stack" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The more scale gain, the greater the risk of lock-in to tools and models. Mitigation: open contracts, provider abstraction, and policy versioning.</p>
<h3>Speed versus Validation Cost<span class="hx:absolute hx:-mt-20" id="speed-versus-validation-cost"></span>
    <a href="#speed-versus-validation-cost" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Automation accelerates delivery, but requires investment in gates, observability, and security. Without this, you accelerate error with efficiency.</p>
<h3>Autonomy versus Governance<span class="hx:absolute hx:-mt-20" id="autonomy-versus-governance"></span>
    <a href="#autonomy-versus-governance" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Giving autonomy to agents improves throughput, but amplifies risk surface. The balance comes from clear action limits, audit trail, and human scaling.</p>
<h2>Future: AI-Native Software Development<span class="hx:absolute hx:-mt-20" id="future-ai-native-software-development"></span>
    <a href="#future-ai-native-software-development" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Smaller Teams, Stronger Platforms<span class="hx:absolute hx:-mt-20" id="smaller-teams-stronger-platforms"></span>
    <a href="#smaller-teams-stronger-platforms" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The trend is less effort in repetitive operational tasks and more investment in platform engineering. Smaller teams can deliver more when operating a well-designed assembly line.</p>
<h3>Engineering as Sociotechnical System Design<span class="hx:absolute hx:-mt-20" id="engineering-as-sociotechnical-system-design"></span>
    <a href="#engineering-as-sociotechnical-system-design" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Competitive differential becomes designing the entire system: people, agents, policies, metrics, and feedback loops. Code continues central, but is no longer the only unit of value.</p>
<h2>Conclusion<span class="hx:absolute hx:-mt-20" id="conclusion"></span>
    <a href="#conclusion" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The software factory with AI isn&rsquo;t an abstract promise. It&rsquo;s an operational model possible now for organizations that already have board, PR, and CI/CD discipline. The leap comes from treating specification as contract, agents as specialized cells, and quality as a flow property.</p>
<p>If traditional development was a high-skill workshop, the next stage is a precision factory with strategic human supervision. It&rsquo;s not about automating for automation&rsquo;s sake. It&rsquo;s about building a delivery system that scales without losing reliability.</p>
<p>The question is no longer whether AI will enter the development cycle. The question is: will your engineering operate AI as a point tool or as a production architecture?</p>
]]></content:encoded><category>software-engineering</category><category>ai</category><category>spec-driven-development</category><category>devops</category><category>platform-engineering</category></item><item><title>OpenSpec in Practice: Installation, Usage, Complete Flow, and Optional Commands</title><link>https://www.orapha.dev/en/2026/04/08/openspec-na-pratica-instalacao-uso-fluxo-completo-e-comandos-opcionais/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/04/08/openspec-na-pratica-instalacao-uso-fluxo-completo-e-comandos-opcionais/</guid><pubDate>Wed, 08 Apr 2026 10:00:00 GMT</pubDate><description>&lt;h1&gt;OpenSpec in Practice: Installation, Usage, Complete Flow, and Optional Commands&lt;/h1&gt;&lt;p&gt;If you already use a code agent in your daily life, you&amp;rsquo;ve already noticed the pattern: when intention is vague, output is also vague. That&amp;rsquo;s why I started studying &lt;strong&gt;Spec-Driven Development (SDD)&lt;/strong&gt; tools more closely and, on this journey, &lt;strong&gt;OpenSpec&lt;/strong&gt; became a very interesting option.&lt;/p&gt;
&lt;p&gt;Its proposal is simple: before going out implementing, you organize the change in clear artifacts (proposal, specs, tasks and, when necessary, design), execute with more predictability, and maintain history of what changed in the system&amp;rsquo;s expected behavior.&lt;/p&gt;</description><content:encoded><![CDATA[<h1>OpenSpec in Practice: Installation, Usage, Complete Flow, and Optional Commands</h1><p>If you already use a code agent in your daily life, you&rsquo;ve already noticed the pattern: when intention is vague, output is also vague. That&rsquo;s why I started studying <strong>Spec-Driven Development (SDD)</strong> tools more closely and, on this journey, <strong>OpenSpec</strong> became a very interesting option.</p>
<p>Its proposal is simple: before going out implementing, you organize the change in clear artifacts (proposal, specs, tasks and, when necessary, design), execute with more predictability, and maintain history of what changed in the system&rsquo;s expected behavior.</p>
<p>In this article, I&rsquo;ll detail everything you asked for, in a practical way:</p>
<ol>
<li>How to install OpenSpec.</li>
<li>How to start in a new or existing project.</li>
<li>Which flow I recommend for daily use.</li>
<li>Which optional commands are worth knowing (CLI and slash commands).</li>
</ol>
<h2>What is OpenSpec (without beating around the bush)<span class="hx:absolute hx:-mt-20" id="what-is-openspec-without-beating-around-the-bush"></span>
    <a href="#what-is-openspec-without-beating-around-the-bush" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>OpenSpec is an open source SDD framework for working with AI assistants. It adds a specification layer in the repository to reduce improvisation and increase predictability.</p>
<p>The main structure stays inside <code>openspec/</code>:</p>
<ul>
<li><code>openspec/specs/</code>: current source of truth of the system.</li>
<li><code>openspec/changes/</code>: proposed changes in progress.</li>
<li><code>openspec/changes/archive/</code>: changes already completed and archived.</li>
</ul>
<p>The real value is in this separation: you can clearly see the current state and what is being proposed, without mixing everything in chat conversation.</p>
<h2>Prerequisites<span class="hx:absolute hx:-mt-20" id="prerequisites"></span>
    <a href="#prerequisites" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Before installing, ensure:</p>
<ul>
<li><code>Node.js &gt;= 20.19.0</code></li>
<li>A package manager (<code>npm</code>, <code>pnpm</code>, <code>yarn</code>, or <code>bun</code>)</li>
<li>A local project (can be brownfield, no problem)</li>
<li>A compatible code agent (Codex, Claude Code, Cursor, Copilot, etc.)</li>
</ul>
<p>Quick commands to validate environment:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">node --version
</span></span><span class="line"><span class="cl">npm --version</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Installing OpenSpec CLI<span class="hx:absolute hx:-mt-20" id="installing-openspec-cli"></span>
    <a href="#installing-openspec-cli" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>With npm<span class="hx:absolute hx:-mt-20" id="with-npm"></span>
    <a href="#with-npm" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm install -g @fission-ai/openspec@latest</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h3>With pnpm<span class="hx:absolute hx:-mt-20" id="with-pnpm"></span>
    <a href="#with-pnpm" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pnpm install -g @fission-ai/openspec@latest</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h3>With yarn<span class="hx:absolute hx:-mt-20" id="with-yarn"></span>
    <a href="#with-yarn" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">yarn global add @fission-ai/openspec@latest</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h3>With bun<span class="hx:absolute hx:-mt-20" id="with-bun"></span>
    <a href="#with-bun" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">bun install -g @fission-ai/openspec@latest</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>After installation:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">openspec --version</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>If this command returns the version, the CLI is ready.</p>
<h2>Initializing in the Project<span class="hx:absolute hx:-mt-20" id="initializing-in-the-project"></span>
    <a href="#initializing-in-the-project" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In the project root directory:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> my-project
</span></span><span class="line"><span class="cl">openspec init</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>In practice, this command:</p>
<ul>
<li>creates the <code>openspec/</code> folder</li>
<li>generates instructions for the agent (including <code>AGENTS.md</code> in the project)</li>
<li>configures integrations for supported tools</li>
</ul>
<p>After <code>init</code>, I like to run:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">openspec list</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>This already confirms if the structure is active and if there are open changes.</p>
<h2>Generated Structure and How to Read It<span class="hx:absolute hx:-mt-20" id="generated-structure-and-how-to-read-it"></span>
    <a href="#generated-structure-and-how-to-read-it" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A typical change flow looks like this:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">openspec/
</span></span><span class="line"><span class="cl">├── specs/
</span></span><span class="line"><span class="cl">│   └── auth/
</span></span><span class="line"><span class="cl">│       └── spec.md
</span></span><span class="line"><span class="cl">└── changes/
</span></span><span class="line"><span class="cl">    └── add-2fa/
</span></span><span class="line"><span class="cl">        ├── proposal.md
</span></span><span class="line"><span class="cl">        ├── tasks.md
</span></span><span class="line"><span class="cl">        ├── design.md (optional)
</span></span><span class="line"><span class="cl">        └── specs/
</span></span><span class="line"><span class="cl">            └── auth/
</span></span><span class="line"><span class="cl">                └── spec.md</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Practical interpretation:</p>
<ul>
<li><code>proposal.md</code>: why change and what will change.</li>
<li><code>specs/*</code>: requirement/behavior deltas.</li>
<li><code>tasks.md</code>: implementation checklist.</li>
<li><code>design.md</code>: technical decisions when necessary.</li>
</ul>
<h2>Recommended Flow for Using OpenSpec in Daily Life<span class="hx:absolute hx:-mt-20" id="recommended-flow-for-using-openspec-in-daily-life"></span>
    <a href="#recommended-flow-for-using-openspec-in-daily-life" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This is the flow I consider most balanced between rigor and speed.</p>
<h3>1) Create the change proposal<span class="hx:absolute hx:-mt-20" id="1-create-the-change-proposal"></span>
    <a href="#1-create-the-change-proposal" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>In the agent, request an OpenSpec proposal for a specific feature.</p>
<p>Example with shortcut (when the tool supports):</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/openspec:proposal Add profile search filters</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h3>2) Review and validate before implementing<span class="hx:absolute hx:-mt-20" id="2-review-and-validate-before-implementing"></span>
    <a href="#2-review-and-validate-before-implementing" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>In terminal:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">openspec list
</span></span><span class="line"><span class="cl">openspec validate add-profile-search-filters
</span></span><span class="line"><span class="cl">openspec show add-profile-search-filters</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>This is where you cut ambiguity and avoid rework.</p>
<h3>3) Refine proposal/specs/tasks<span class="hx:absolute hx:-mt-20" id="3-refine-proposalspecstasks"></span>
    <a href="#3-refine-proposalspecstasks" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>If clarity is lacking, ask the agent to adjust criteria, scenarios, and tasks until it becomes executable.</p>
<h3>4) Implement based on tasks<span class="hx:absolute hx:-mt-20" id="4-implement-based-on-tasks"></span>
    <a href="#4-implement-based-on-tasks" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/openspec:apply add-profile-search-filters</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>The idea is to implement on top of <code>tasks.md</code> and not on improvisation.</p>
<h3>5) Archive the completed change<span class="hx:absolute hx:-mt-20" id="5-archive-the-completed-change"></span>
    <a href="#5-archive-the-completed-change" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>In the agent:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/openspec:archive add-profile-search-filters</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Or via CLI:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">openspec archive add-profile-search-filters --yes</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>When you archive, the change leaves the &ldquo;in progress&rdquo; state and starts composing the consolidated history.</p>
<h2>Main Commands (CLI)<span class="hx:absolute hx:-mt-20" id="main-commands-cli"></span>
    <a href="#main-commands-cli" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In real use, these are the commands that matter most:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">openspec init
</span></span><span class="line"><span class="cl">openspec list
</span></span><span class="line"><span class="cl">openspec view
</span></span><span class="line"><span class="cl">openspec show &lt;change&gt;
</span></span><span class="line"><span class="cl">openspec validate &lt;change&gt;
</span></span><span class="line"><span class="cl">openspec archive &lt;change&gt; --yes
</span></span><span class="line"><span class="cl">openspec update</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Quick summary:</p>
<ul>
<li><code>init</code>: initializes OpenSpec in the repo.</li>
<li><code>list</code>: lists open changes.</li>
<li><code>view</code>: interactive dashboard.</li>
<li><code>show</code>: displays proposal/tasks/spec deltas of a change.</li>
<li><code>validate</code>: validates specs format/structure.</li>
<li><code>archive</code>: archives completed change.</li>
<li><code>update</code>: updates instructions and bindings for agents in the project.</li>
</ul>
<h2>Shortcut Commands in the Agent<span class="hx:absolute hx:-mt-20" id="shortcut-commands-in-the-agent"></span>
    <a href="#shortcut-commands-in-the-agent" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>They depend on the tool, but the current OpenSpec pattern in several native integrations is:</p>
<ul>
<li><code>/openspec:proposal</code></li>
<li><code>/openspec:apply</code></li>
<li><code>/openspec:archive</code></li>
</ul>
<p>In some contexts/documentations you&rsquo;ll also find the <strong>OPSX</strong> (experimental) flow, with commands like:</p>
<ul>
<li><code>/opsx:new</code></li>
<li><code>/opsx:continue</code></li>
<li><code>/opsx:ff</code></li>
<li><code>/opsx:apply</code></li>
<li><code>/opsx:archive</code></li>
</ul>
<p>The important point: check which set of commands your integration installed at <code>init</code>.</p>
<h2>Common Errors (and How to Avoid)<span class="hx:absolute hx:-mt-20" id="common-errors-and-how-to-avoid"></span>
    <a href="#common-errors-and-how-to-avoid" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol>
<li>Skip proposal review and go straight to implementation.</li>
<li>Accept <code>tasks.md</code> without checking order and dependencies.</li>
<li>Not validate specs (<code>validate</code>) before applying.</li>
<li>Mix commands from different docs without checking your integration.</li>
<li>Not archive completed change (becomes mess quickly).</li>
</ol>
<h2>An Example of End-to-End Execution<span class="hx:absolute hx:-mt-20" id="an-example-of-end-to-end-execution"></span>
    <a href="#an-example-of-end-to-end-execution" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1) Install</span>
</span></span><span class="line"><span class="cl">npm install -g @fission-ai/openspec@latest
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2) Initialize in project</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> my-project
</span></span><span class="line"><span class="cl">openspec init
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3) Check state</span>
</span></span><span class="line"><span class="cl">openspec list
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4) In agent, create proposal</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /openspec:proposal Add profile search filters</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5) Review in terminal</span>
</span></span><span class="line"><span class="cl">openspec validate add-profile-search-filters
</span></span><span class="line"><span class="cl">openspec show add-profile-search-filters
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6) In agent, implement</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /openspec:apply add-profile-search-filters</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 7) Archive change</span>
</span></span><span class="line"><span class="cl">openspec archive add-profile-search-filters --yes</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Closing<span class="hx:absolute hx:-mt-20" id="closing"></span>
    <a href="#closing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>When you install, initialize, and follow a minimal flow of proposal, review, application, and archiving, the quality of execution with agents rises a lot.</p>
<p>And the best: you maintain real traceability of technical intention, without depending on chat memory.</p>
]]></content:encoded><category>ai</category><category>openspec</category><category>spec-driven-development</category><category>software-engineering</category><category>development</category></item><item><title>In Spec-Driven Development, `implement` is where everything else turns into code</title><link>https://www.orapha.dev/en/2026/04/06/no-spec-driven-development-implement-e-onde-todo-o-resto-vira-codigo/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/04/06/no-spec-driven-development-implement-e-onde-todo-o-resto-vira-codigo/</guid><pubDate>Mon, 06 Apr 2026 10:00:00 GMT</pubDate><description>&lt;h1&gt;In Spec-Driven Development, &lt;code&gt;implement&lt;/code&gt; is where everything else turns into code&lt;/h1&gt;&lt;p&gt;In the text &lt;a href="https://www.orapha.dev/en/2026/04/06/1-no-spec-driven-development-tudo-comeca-pelos-principios/"&gt;In Spec-Driven Development, Everything Starts with Principles&lt;/a&gt;, I talked about the &lt;code&gt;constitution&lt;/code&gt; stage, where I define the principles that will govern the project&amp;rsquo;s decisions.&lt;/p&gt;
&lt;p&gt;Then, in &lt;a href="https://www.orapha.dev/en/2026/04/06/2-no-spec-driven-development-specify-e-onde-a-ambiguidade-comeca-a-morrer/"&gt;In Spec-Driven Development, &lt;code&gt;specify&lt;/code&gt; is where ambiguity starts to die&lt;/a&gt;, I showed the point where demand gains clearer expected behavior.&lt;/p&gt;
&lt;p&gt;In sequence, in &lt;a href="https://www.orapha.dev/en/2026/04/06/3-no-spec-driven-development-plan-e-onde-a-especificacao-vira-estrategia-de-execucao/"&gt;In Spec-Driven Development, &lt;code&gt;plan&lt;/code&gt; is where specification turns into execution strategy&lt;/a&gt;, I entered the stage that organizes the crossing with order, dependency, and sense of risk.&lt;/p&gt;</description><content:encoded><![CDATA[<h1>In Spec-Driven Development, <code>implement</code> is where everything else turns into code</h1><p>In the text <a href="/en/2026/04/06/1-no-spec-driven-development-tudo-comeca-pelos-principios/">In Spec-Driven Development, Everything Starts with Principles</a>, I talked about the <code>constitution</code> stage, where I define the principles that will govern the project&rsquo;s decisions.</p>
<p>Then, in <a href="/en/2026/04/06/2-no-spec-driven-development-specify-e-onde-a-ambiguidade-comeca-a-morrer/">In Spec-Driven Development, <code>specify</code> is where ambiguity starts to die</a>, I showed the point where demand gains clearer expected behavior.</p>
<p>In sequence, in <a href="/en/2026/04/06/3-no-spec-driven-development-plan-e-onde-a-especificacao-vira-estrategia-de-execucao/">In Spec-Driven Development, <code>plan</code> is where specification turns into execution strategy</a>, I entered the stage that organizes the crossing with order, dependency, and sense of risk.</p>
<p>After that, in <a href="/en/2026/04/06/4-no-spec-driven-development-tasks-e-onde-o-plano-vira-unidades-concretas-de-trabalho/">In Spec-Driven Development, <code>tasks</code> is where the plan turns into concrete work units</a>, I talked about the break that transforms strategy into executable blocks.</p>
<p>But, at some point, all this needs to turn into code.</p>
<p>That&rsquo;s where <code>implement</code> enters.</p>
<p>And here I think an important simplification is worth making: yes, in a certain sense, <code>implement</code> is just implementing.</p>
<p>If the previous work was well done, this stage shouldn&rsquo;t carry a great methodological drama. The objective now is to take an already delimited task and transform that into code.</p>
<p>Except that doesn&rsquo;t mean the work is done.</p>
<p>In the AI context, many times the act of implementing became cheap. The agent writes quickly, suggests structure, connects parts, and returns a plausible solution in a short time.</p>
<p>That&rsquo;s why, for me, the main point of <code>implement</code> isn&rsquo;t to romanticize code writing.</p>
<p>The main point is another: after the code was generated, someone still needs to review what was delivered.</p>
<h2>Implementing Can Be the Easiest Part<span class="hx:absolute hx:-mt-20" id="implementing-can-be-the-easiest-part"></span>
    <a href="#implementing-can-be-the-easiest-part" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Depending on context, implementation itself almost becomes an operational stage:</p>
<blockquote>
  <p>pick up the task<br>
generate the code<br>
adjust what&rsquo;s necessary<br>
move forward</p>

</blockquote>
<p>If <code>constitution</code>, <code>specify</code>, <code>plan</code>, and <code>tasks</code> did the job right, this is even expected.</p>
<p>The problem starts when the person treats the agent&rsquo;s output as if it were already the final delivery.</p>
<p>Because one thing is to generate code.</p>
<p>Another thing is to verify if that code:</p>
<ul>
<li>solved exactly the task</li>
<li>respected the scope</li>
<li>didn&rsquo;t invent things outside what was agreed</li>
<li>didn&rsquo;t distort the specified behavior</li>
<li>continues coherent with the project&rsquo;s principles</li>
</ul>
<p>That&rsquo;s where, for me, the real work lives.</p>
<h2>What Really Matters After Implementing<span class="hx:absolute hx:-mt-20" id="what-really-matters-after-implementing"></span>
    <a href="#what-really-matters-after-implementing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I tend to look at <code>implement</code> less as an epic construction moment and more as a transition point.</p>
<p>The code appeared. Now it needs to be confronted with what came before.</p>
<p>In practice, I want to review if the delivery:</p>
<ul>
<li>corresponds to the task that was asked for</li>
<li>remains faithful to the specification</li>
<li>didn&rsquo;t trample the plan</li>
<li>didn&rsquo;t bring unnecessary complexity</li>
<li>can be accepted with reasonable confidence</li>
</ul>
<p>If I finish this stage only with the feeling that &ldquo;it seems like it turned out good,&rdquo; it&rsquo;s still little.</p>
<h2>A Practical Example of Difference<span class="hx:absolute hx:-mt-20" id="a-practical-example-of-difference"></span>
    <a href="#a-practical-example-of-difference" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Let&rsquo;s go back to the orders example.</p>
<p>Suppose the current task is this:</p>
<ul>
<li>implement order creation with automatic total calculation</li>
</ul>
<p>If I look only at the generation stage, maybe it&rsquo;s enough to ask the agent to do this and receive a block of code back.</p>
<p>But the relevant work starts right after:</p>
<ul>
<li>did it only create the flow or did it invent more things?</li>
<li>is the total being calculated the right way?</li>
<li>does order without item continue to be blocked?</li>
<li>was the relationship with existing client respected?</li>
<li>did the solution stay compatible with the simplicity the project wanted?</li>
</ul>
<p>Notice the difference.</p>
<p>The act of implementing can even be straightforward.</p>
<p>What can&rsquo;t be automatic is accepting what was implemented.</p>
<h2>In the End<span class="hx:absolute hx:-mt-20" id="in-the-end"></span>
    <a href="#in-the-end" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>After the delivery is finalized, there&rsquo;s still an important responsibility in your hands: ensuring that everything that was defined as a requirement was really met. It&rsquo;s not enough to look at the code and feel that it seems ready. It&rsquo;s also not enough to trust just because the implementation came out clean, organized, or plausible.</p>
<p>If there are <code>requirements.md</code> files involved in that work, it&rsquo;s up to you to check one by one and ensure that all items listed there were, in fact, resolved and marked as complete. This matters because, in the end, what validates the delivery isn&rsquo;t just the existence of code, but the adherence between what was asked for and what was actually delivered.</p>
<p>And there&rsquo;s another point here that I think is important: not everything will be validated automatically. In several cases, manual checking will still exist. Interface flow, behavior in specific scenario, integration that depends on real context, experience detail, or anything else not fully covered by automated tests still needs to be verified by you.</p>
<p>That is: the <code>implement</code> stage doesn&rsquo;t exactly end when code appears. It ends when the delivery was reviewed, confronted with requirements, and validated in a minimally responsible way.</p>
<p>But, in the end, the flow doesn&rsquo;t end like someone who closes a rigid process and leaves. It ends and restarts.</p>
<p>If a new demand emerges, the natural path is to return to <code>specify</code> and start again from there, with a new clear specification for what needs to be built now. And, if along that path you realize that some principle from <code>constitution</code> needs to change, be refined, or even be substituted, that&rsquo;s also part of the process.</p>
<p>I like this structure precisely because it isn&rsquo;t rigid in the bad sense. It&rsquo;s atomic. Each part exists with a clear function, but none of them needs to be treated as a sacred or immutable piece. If the project evolves, the structure can evolve along. If context changes, principles can change along. If the way of executing improves, the flow can also be adjusted.</p>
<p>For me, this is one of the strongest points of this approach: it organizes work without pretending that the project will remain the same forever.</p>
<p>Thanks for reading this far.</p>
]]></content:encoded><category>ai</category><category>spec-driven-development</category><category>implement</category><category>implementation</category><category>software-engineering</category></item><item><title>In Spec-Driven Development, `tasks` is where the plan turns into concrete work units</title><link>https://www.orapha.dev/en/2026/04/06/no-spec-driven-development-tasks-e-onde-o-plano-vira-unidades-concretas-de-trabalho/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/04/06/no-spec-driven-development-tasks-e-onde-o-plano-vira-unidades-concretas-de-trabalho/</guid><pubDate>Mon, 06 Apr 2026 10:00:00 GMT</pubDate><description>&lt;h1&gt;In Spec-Driven Development, &lt;code&gt;tasks&lt;/code&gt; is where the plan turns into concrete work units&lt;/h1&gt;&lt;p&gt;In the text &lt;a href="https://www.orapha.dev/en/2026/04/06/1-no-spec-driven-development-tudo-comeca-pelos-principios/"&gt;In Spec-Driven Development, Everything Starts with Principles&lt;/a&gt;, I focused on the &lt;code&gt;constitution&lt;/code&gt; stage, where I define the criteria that will guide the project&amp;rsquo;s decisions.&lt;/p&gt;
&lt;p&gt;Then, in &lt;a href="https://www.orapha.dev/en/2026/04/06/2-no-spec-driven-development-specify-e-onde-a-ambiguidade-comeca-a-morrer/"&gt;In Spec-Driven Development, &lt;code&gt;specify&lt;/code&gt; is where ambiguity starts to die&lt;/a&gt;, I entered the stage where demand stops being vague intention and starts having clearer expected behavior.&lt;/p&gt;
&lt;p&gt;In sequence, in &lt;a href="https://www.orapha.dev/en/2026/04/06/3-no-spec-driven-development-plan-e-onde-a-especificacao-vira-estrategia-de-execucao/"&gt;In Spec-Driven Development, &lt;code&gt;plan&lt;/code&gt; is where specification turns into execution strategy&lt;/a&gt;, I talked about the stage that organizes the work crossing with order, dependency, and sense of risk.&lt;/p&gt;</description><content:encoded><![CDATA[<h1>In Spec-Driven Development, <code>tasks</code> is where the plan turns into concrete work units</h1><p>In the text <a href="/en/2026/04/06/1-no-spec-driven-development-tudo-comeca-pelos-principios/">In Spec-Driven Development, Everything Starts with Principles</a>, I focused on the <code>constitution</code> stage, where I define the criteria that will guide the project&rsquo;s decisions.</p>
<p>Then, in <a href="/en/2026/04/06/2-no-spec-driven-development-specify-e-onde-a-ambiguidade-comeca-a-morrer/">In Spec-Driven Development, <code>specify</code> is where ambiguity starts to die</a>, I entered the stage where demand stops being vague intention and starts having clearer expected behavior.</p>
<p>In sequence, in <a href="/en/2026/04/06/3-no-spec-driven-development-plan-e-onde-a-especificacao-vira-estrategia-de-execucao/">In Spec-Driven Development, <code>plan</code> is where specification turns into execution strategy</a>, I talked about the stage that organizes the work crossing with order, dependency, and sense of risk.</p>
<p>But plan, by itself, still isn&rsquo;t executable work.</p>
<p>Between knowing the strategy and starting to implement, there&rsquo;s still an important question: how do I transform this path into concrete execution blocks without losing coherence?</p>
<p>That&rsquo;s where the <code>tasks</code> stage enters.</p>
<p>And, for me, this stage matters a lot because it&rsquo;s in it that planning stops being a good narrative about execution and starts becoming work parts that someone can really pick up, understand, and complete.</p>
<h2>The Error of Thinking Breaking Work Is Just Making a Checklist<span class="hx:absolute hx:-mt-20" id="the-error-of-thinking-breaking-work-is-just-making-a-checklist"></span>
    <a href="#the-error-of-thinking-breaking-work-is-just-making-a-checklist" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>When someone hears &ldquo;tasks,&rdquo; it&rsquo;s common to imagine something very simple:</p>
<ul>
<li>create backend</li>
<li>create frontend</li>
<li>make tests</li>
<li>review</li>
<li>deliver</li>
</ul>
<p>This even seems like organization, but many times it&rsquo;s still too generic.</p>
<p>A list like this can give a sense of structural progress without solving the main thing: each item continues too broad, too ambiguous, or too mixed to guide execution well.</p>
<p>In practice, poorly broken tasks usually generate some well-known problems:</p>
<ul>
<li>blocks too big to validate early</li>
<li>parts with confusing responsibility</li>
<li>items that mix several decisions at the same time</li>
<li>hidden dependencies</li>
<li>false sense that work is well distributed</li>
</ul>
<p>When this happens, execution starts to slip back into improvisation. The difference is that now improvisation comes packaged as a checklist.</p>
<h2>What the <code>tasks</code> Stage Solves<span class="hx:absolute hx:-mt-20" id="what-the-tasks-stage-solves"></span>
    <a href="#what-the-tasks-stage-solves" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I don&rsquo;t see <code>tasks</code> as the obligation to produce a huge list to seem methodical. Nor do I see it as simple conversion of plan into subtitles.</p>
<p>For me, <code>tasks</code> solves one very concrete thing: transform execution strategy into clear, limited, and verifiable work units.</p>
<p>It&rsquo;s the moment when I try to decide:</p>
<ul>
<li>which piece of work deserves to become its own task</li>
<li>what does each task need to deliver</li>
<li>where does one task end and the next begin</li>
<li>what dependencies need to be explicit</li>
<li>what criterion makes a task be considered complete</li>
</ul>
<p>If <code>plan</code> organizes the crossing, <code>tasks</code> defines the steps.</p>
<p>And this matters a lot because, without this translation, implementation continues too big, too diffuse, or too dependent on local interpretation.</p>
<h2><code>Tasks</code> Isn&rsquo;t Fragmenting for the Sake of Fragmenting<span class="hx:absolute hx:-mt-20" id="tasks-isnt-fragmenting-for-the-sake-of-fragmenting"></span>
    <a href="#tasks-isnt-fragmenting-for-the-sake-of-fragmenting" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There&rsquo;s a curious risk here.</p>
<p>When the person realizes they need to better break the work, they can exaggerate to the other side and turn everything into microtasks:</p>
<ul>
<li>create model</li>
<li>create migration</li>
<li>create service</li>
<li>create controller</li>
<li>create route</li>
<li>create unit test</li>
<li>create integration test</li>
</ul>
<p>This can work in some contexts, but many times produces an artificially excessive break.</p>
<p>Because a good task isn&rsquo;t just a small task. A good task is a task with sense.</p>
<p>If I separate work using only technical or mechanical cuts, I run the risk of losing the bond with the behavior I wanted to deliver. And, when that happens, I start optimizing implementation pieces instead of real units of result.</p>
<p>For me, the question isn&rsquo;t just &ldquo;how to divide?&rdquo;. The question is &ldquo;how to divide without destroying delivery coherence?&rdquo;.</p>
<h2>What I Try to Capture in a Good <code>tasks</code> Stage<span class="hx:absolute hx:-mt-20" id="what-i-try-to-capture-in-a-good-tasks-stage"></span>
    <a href="#what-i-try-to-capture-in-a-good-tasks-stage" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I don&rsquo;t follow rigid template, but normally I want to leave this stage with some things very clear.</p>
<p>Something along these lines:</p>
<ul>
<li>each task needs to have an understandable objective</li>
<li>each task should produce an observable result</li>
<li>the boundary between tasks can&rsquo;t be confusing</li>
<li>dependencies need to be explicit</li>
<li>the size of each block should allow reasonable validation</li>
<li>sequence should continue respecting the plan</li>
</ul>
<p>If I look at a task list and still feel that &ldquo;anything can mean anything,&rdquo; then this stage hasn&rsquo;t closed right yet.</p>
<h2>The Questions I Usually Use in <code>tasks</code><span class="hx:absolute hx:-mt-20" id="the-questions-i-usually-use-in-tasks"></span>
    <a href="#the-questions-i-usually-use-in-tasks" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If in <code>constitution</code> I used the <code>5 Qs</code>, in <code>specify</code> another set of questions and in <code>plan</code> questions of order and risk, here I usually force operational clarity.</p>
<p>Normally I want to answer something like:</p>
<ul>
<li><code>Q1.</code> What work unit produces a real result?</li>
<li><code>Q2.</code> Where does one task end and the next begin?</li>
<li><code>Q3.</code> What dependencies need to be explicit?</li>
<li><code>Q4.</code> What can I validate when completing each task?</li>
<li><code>Q5.</code> Does this break help execution or just seem organized?</li>
</ul>
<h3><code>Q1.</code> What work unit produces a real result?<span class="hx:absolute hx:-mt-20" id="q1-what-work-unit-produces-a-real-result"></span>
    <a href="#q1-what-work-unit-produces-a-real-result" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This question exists to prevent ornamental tasks.</p>
<p>A good task, for me, needs to point to some result that makes sense by itself. Not necessarily a final result for the user, but at least something with clear function within the delivery.</p>
<p>Examples:</p>
<ul>
<li>structure the minimum order flow with mandatory client relationship</li>
<li>validate automatic total calculation in backend</li>
<li>allow operator to view already registered orders</li>
</ul>
<p>Notice the difference.</p>
<p>These items may still involve several internal changes, but remain connected to an understandable result. This is much better than a list of technical pieces without context.</p>
<h3><code>Q2.</code> Where does one task end and the next begin?<span class="hx:absolute hx:-mt-20" id="q2-where-does-one-task-end-and-the-next-begin"></span>
    <a href="#q2-where-does-one-task-end-and-the-next-begin" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This question helps me avoid overlap.</p>
<p>When the boundary between tasks is bad, several things start to happen:</p>
<ul>
<li>two tasks mess with the same central problem</li>
<li>completion criteria become vague</li>
<li>a task seems &ldquo;almost ready&rdquo; for too long</li>
<li>review gets confused because no one knows what that block should have solved</li>
</ul>
<p>I like to try to make the separation more honest. If one task depends on another to make sense, this needs to be clear. If two tasks are solving the same nucleus, perhaps the break is wrong.</p>
<p>In other words: a good task has contour.</p>
<h3><code>Q3.</code> What dependencies need to be explicit?<span class="hx:absolute hx:-mt-20" id="q3-what-dependencies-need-to-be-explicit"></span>
    <a href="#q3-what-dependencies-need-to-be-explicit" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Not every task is born isolated.</p>
<p>Some need previous decision, minimum base ready, or completed validation to make sense. When this stays too implicit, execution tends to open fronts too early.</p>
<p>So I try to make visible:</p>
<ul>
<li>which tasks unlock others</li>
<li>what can walk in parallel without high conflict</li>
<li>which items depend on model or rule already stabilized</li>
<li>where there&rsquo;s still too sensitive a point to separate early</li>
</ul>
<p>This is especially important when work involves AI, because opening multiple parallel executions without clear dependency is an efficient way to produce collision with the appearance of productivity.</p>
<h3><code>Q4.</code> What can I validate when completing each task?<span class="hx:absolute hx:-mt-20" id="q4-what-can-i-validate-when-completing-each-task"></span>
    <a href="#q4-what-can-i-validate-when-completing-each-task" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This question brings <code>tasks</code> very close to healthy execution.</p>
<p>For me, a task gets much better when there&rsquo;s some clear way to verify if it fulfilled what it promised. This doesn&rsquo;t mean that every task needs to have a formal battery of tests at the same instant, but it means that it needs to touch some observable criterion.</p>
<p>Something like:</p>
<ul>
<li>order can be created with client and valid item</li>
<li>total is calculated correctly</li>
<li>system blocks finalization without item</li>
<li>listing shows recently created orders</li>
</ul>
<p>When the task doesn&rsquo;t offer any clear verification point, usually it&rsquo;s too broad or poorly defined.</p>
<h3><code>Q5.</code> Does this break help execution or just seem organized?<span class="hx:absolute hx:-mt-20" id="q5-does-this-break-help-execution-or-just-seem-organized"></span>
    <a href="#q5-does-this-break-help-execution-or-just-seem-organized" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This is the question I like the most because it dismantles a lot of false sophistication.</p>
<p>There are task lists that look beautiful on paper but hinder more than help. Sometimes because they created too many blocks. Sometimes because they turned each technical layer into its own item. Sometimes because they separated things that should walk together.</p>
<p>So I try to be pragmatic.</p>
<p>If the break:</p>
<ul>
<li>improves execution clarity</li>
<li>facilitates validation</li>
<li>reduces rework</li>
<li>preserves coherence with the plan</li>
</ul>
<p>then it&rsquo;s helping.</p>
<p>If it just increases the feeling of control without improving the real work crossing, it&rsquo;s probably overdoing it.</p>
<h2>A Practical Example of Difference<span class="hx:absolute hx:-mt-20" id="a-practical-example-of-difference"></span>
    <a href="#a-practical-example-of-difference" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Suppose the same orders demand I&rsquo;ve been using in the other texts:</p>
<ul>
<li>internal operators need to manually register orders</li>
<li>each order must be associated with an existing client</li>
<li>order items need to inform quantity and price</li>
<li>the system should calculate total automatically</li>
<li>orders cannot be finalized without at least one item</li>
<li>in this first version there will be no online payment nor tax issuance</li>
</ul>
<p>After specifying and planning, I still need to transform this into executable work.</p>
<p>A weak break could be:</p>
<ul>
<li>make orders backend</li>
<li>make orders frontend</li>
<li>create tests</li>
</ul>
<p>This is little useful. Each item continues too big.</p>
<p>Now look at a better break:</p>
<ul>
<li>define and validate the minimum order structure with mandatory link to client</li>
<li>implement order creation with automatic total calculation</li>
<li>block order finalization without valid item</li>
<li>make listing and basic query of orders available to operators</li>
<li>cover critical flows and adjust error messages</li>
</ul>
<p>Here there&rsquo;s already much more ground.</p>
<p>Not because the list got longer, but because each item points to a more concrete delivery unit.</p>
<h2>In the End<span class="hx:absolute hx:-mt-20" id="in-the-end"></span>
    <a href="#in-the-end" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If I had to summarize the function of <code>tasks</code> in one sentence, I would say this: it&rsquo;s the stage where the plan stops being just intelligent sequence and starts becoming graspable work.</p>
<p>For me, this matters because good execution doesn&rsquo;t just depend on knowing where to go. It also depends on knowing which piece makes sense to attack now, with clear boundary and minimally honest completion criterion.</p>
<p>When this break is well done, implementation gains rhythm without losing coherence.</p>
<p>In the next text, I want to enter the <code>implement</code> stage, which is when this whole chain finally turns into code.</p>
]]></content:encoded><category>ai</category><category>spec-driven-development</category><category>tasks</category><category>tarefas</category><category>software-engineering</category></item><item><title>In Spec-Driven Development, `plan` is where specification turns into execution strategy</title><link>https://www.orapha.dev/en/2026/04/06/no-spec-driven-development-plan-e-onde-a-especificacao-vira-estrategia-de-execucao/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/04/06/no-spec-driven-development-plan-e-onde-a-especificacao-vira-estrategia-de-execucao/</guid><pubDate>Mon, 06 Apr 2026 10:00:00 GMT</pubDate><description>&lt;h1&gt;In Spec-Driven Development, &lt;code&gt;plan&lt;/code&gt; is where specification turns into execution strategy&lt;/h1&gt;&lt;p&gt;In the text &lt;a href="https://www.orapha.dev/en/2026/04/06/1-no-spec-driven-development-tudo-comeca-pelos-principios/"&gt;In Spec-Driven Development, Everything Starts with Principles&lt;/a&gt;, I talked about the &lt;code&gt;constitution&lt;/code&gt; stage, where I define the criteria that will guide the project.&lt;/p&gt;
&lt;p&gt;Then, in &lt;a href="https://www.orapha.dev/en/2026/04/06/2-no-spec-driven-development-specify-e-onde-a-ambiguidade-comeca-a-morrer/"&gt;In Spec-Driven Development, &lt;code&gt;specify&lt;/code&gt; is where ambiguity starts to die&lt;/a&gt;, I entered the stage where demand stops being vague intention and starts having clearer expected behavior.&lt;/p&gt;
&lt;p&gt;But an important bridge is still missing between understanding the problem and going out implementing.&lt;/p&gt;</description><content:encoded><![CDATA[<h1>In Spec-Driven Development, <code>plan</code> is where specification turns into execution strategy</h1><p>In the text <a href="/en/2026/04/06/1-no-spec-driven-development-tudo-comeca-pelos-principios/">In Spec-Driven Development, Everything Starts with Principles</a>, I talked about the <code>constitution</code> stage, where I define the criteria that will guide the project.</p>
<p>Then, in <a href="/en/2026/04/06/2-no-spec-driven-development-specify-e-onde-a-ambiguidade-comeca-a-morrer/">In Spec-Driven Development, <code>specify</code> is where ambiguity starts to die</a>, I entered the stage where demand stops being vague intention and starts having clearer expected behavior.</p>
<p>But an important bridge is still missing between understanding the problem and going out implementing.</p>
<p>This bridge is the <code>plan</code> stage.</p>
<p>And, for me, it exists to answer a simple question: given that now I know what needs to be done, what is the best way to cross this work without turning execution into an expensive improvisation?</p>
<p>Because one thing is to have a good specification. Another thing is to know how to execute that specification with order, criteria, and sense of dependency.</p>
<p>That&rsquo;s where many demands start to get lost.</p>
<h2>The Error of Thinking Good Specification Is Already Enough<span class="hx:absolute hx:-mt-20" id="the-error-of-thinking-good-specification-is-already-enough"></span>
    <a href="#the-error-of-thinking-good-specification-is-already-enough" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>When specification is clear, it gives a somewhat deceptive feeling that the work is already practically solved.</p>
<p>The reasoning usually goes like this:</p>
<blockquote>
  <p>now that everything is clear, it&rsquo;s just implementing<br>
AI already understood what needs to be done<br>
let&rsquo;s go breaking into prompt and deliver quickly</p>

</blockquote>
<p>In very small projects, sometimes this even works. But, as demand grows a little, this leap starts to charge a price.</p>
<p>Because understanding what needs to be built doesn&rsquo;t automatically solve:</p>
<ul>
<li>where to start</li>
<li>what depends on what</li>
<li>what can be done in parallel</li>
<li>which part concentrates more risk</li>
<li>where it&rsquo;s worth validating early</li>
<li>how to avoid rework between stages</li>
</ul>
<p>Without this reasoning, implementation turns into a sequence of locally plausible actions, but globally disorganized.</p>
<p>In the short term, it seems like speed.</p>
<p>In the medium term, refactoring, decision collisions, crooked scope, and that famous sensation that the work walked a lot and consolidated little appear.</p>
<h2>What the <code>plan</code> Stage Solves<span class="hx:absolute hx:-mt-20" id="what-the-plan-stage-solves"></span>
    <a href="#what-the-plan-stage-solves" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I don&rsquo;t see <code>plan</code> as a pompous schedule. Nor do I see it as the obligation to assemble a document full of little boxes just to seem like process.</p>
<p>For me, <code>plan</code> solves one very practical thing: transform specification into execution strategy.</p>
<p>It&rsquo;s the moment when I try to organize:</p>
<ul>
<li>the order of work</li>
<li>dependencies between parts</li>
<li>blocks that make sense to separate</li>
<li>risks that deserve attention early</li>
<li>sequence that reduces rework</li>
<li>validation points along the way</li>
</ul>
<p>In other words, if <code>specify</code> answers &ldquo;what needs to happen,&rdquo; <code>plan</code> starts to answer &ldquo;how do I organize the crossing of this work.&rdquo;</p>
<p>This doesn&rsquo;t mean descending to code yet. It means giving operational shape to the path.</p>
<h2><code>Plan</code> Isn&rsquo;t Distributing Tasks on Impulse<span class="hx:absolute hx:-mt-20" id="plan-isnt-distributing-tasks-on-impulse"></span>
    <a href="#plan-isnt-distributing-tasks-on-impulse" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There&rsquo;s a common error here.</p>
<p>Many people understand planning as simply breaking the demand into several smaller items:</p>
<ul>
<li>make backend</li>
<li>make frontend</li>
<li>create database</li>
<li>add tests</li>
<li>review</li>
</ul>
<p>This is better than nothing, but can still be too superficial.</p>
<p>Because planning isn&rsquo;t just fragmenting. It&rsquo;s organizing with intention.</p>
<p>A good work break needs to consider dependency, risk, and logical sequence. Otherwise I just trade a big block for several confusing little blocks.</p>
<p>For example, if there&rsquo;s a structural decision that impacts API, interface, and persistence, maybe the first step isn&rsquo;t &ldquo;make screen.&rdquo; Maybe it&rsquo;s validating the main flow, the data model, or the central rule first. If I ignore this, I spread implementation before locking the solution&rsquo;s axis.</p>
<p>Good planning, for me, isn&rsquo;t the longest list. It&rsquo;s the most defensible order.</p>
<h2>What I Try to Capture in a Good <code>plan</code> Stage<span class="hx:absolute hx:-mt-20" id="what-i-try-to-capture-in-a-good-plan-stage"></span>
    <a href="#what-i-try-to-capture-in-a-good-plan-stage" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I don&rsquo;t follow a rigid template, but normally I want to leave this stage with some things relatively clear.</p>
<p>Something along these lines:</p>
<ul>
<li>what is the safest execution path</li>
<li>which parts unlock the others</li>
<li>which blocks can be treated separately</li>
<li>where is the biggest technical or understanding risk</li>
<li>at what point is it worth validating before continuing</li>
<li>how to avoid redundant work or bad sequence</li>
</ul>
<p>If I still can&rsquo;t see this, the demand may even be well specified, but still not well planned.</p>
<h2>The Questions I Usually Use in <code>plan</code><span class="hx:absolute hx:-mt-20" id="the-questions-i-usually-use-in-plan"></span>
    <a href="#the-questions-i-usually-use-in-plan" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If in <code>constitution</code> I talked about the <code>5 Qs</code>, and in <code>specify</code> I used another set to reduce ambiguity, in <code>plan</code> I tend to ask questions that force order and strategy.</p>
<p>Normally I want to answer something like:</p>
<ul>
<li><code>Q1.</code> What is the smallest viable sequence to put this delivery on its feet?</li>
<li><code>Q2.</code> What depends on what?</li>
<li><code>Q3.</code> Where is the biggest risk or uncertainty?</li>
<li><code>Q4.</code> What needs to be validated before expanding?</li>
<li><code>Q5.</code> How to break this without losing coherence?</li>
</ul>
<h3><code>Q1.</code> What is the smallest viable sequence to put this delivery on its feet?<span class="hx:absolute hx:-mt-20" id="q1-what-is-the-smallest-viable-sequence-to-put-this-delivery-on-its-feet"></span>
    <a href="#q1-what-is-the-smallest-viable-sequence-to-put-this-delivery-on-its-feet" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This question helps me not start with the most visible place, but with the most useful one.</p>
<p>Not always the first step is the most visible. Sometimes the work needs to start with a minimum base that allows the rest to exist with less friction.</p>
<p>When I answer this, I try to think something like:</p>
<ul>
<li>what is the main flow that needs to exist first</li>
<li>what minimum foundation sustains the next stages</li>
<li>what do I need to have standing to stop speculating and start consolidating</li>
</ul>
<p>This helps a lot to avoid ornamental planning, in which several parallel pieces advance without the problem&rsquo;s nucleus really being resolved.</p>
<h3><code>Q2.</code> What depends on what?<span class="hx:absolute hx:-mt-20" id="q2-what-depends-on-what"></span>
    <a href="#q2-what-depends-on-what" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This is the question that prevents the plan from becoming wishful thinking.</p>
<p>There are demands where almost everything seems to be able to happen in parallel, until the moment when one decision changes and drags half the work along.</p>
<p>I like to make explicit:</p>
<ul>
<li>which parts are prerequisites for others</li>
<li>which decisions need to be made early</li>
<li>what can advance in parallel without high risk of collision</li>
<li>where there is enough coupling to demand sequence</li>
</ul>
<p>This is especially important when execution involves AI, because it&rsquo;s very easy to open several fronts at the same time and only later realize that they were sharing different assumptions.</p>
<h3><code>Q3.</code> Where is the biggest risk or uncertainty?<span class="hx:absolute hx:-mt-20" id="q3-where-is-the-biggest-risk-or-uncertainty"></span>
    <a href="#q3-where-is-the-biggest-risk-or-uncertainty" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Planning is also deciding where I don&rsquo;t want to discover a problem too late.</p>
<p>Every demand has some more sensitive point:</p>
<ul>
<li>business rule still somewhat nebulous</li>
<li>more unstable external integration</li>
<li>modeling decision that affects the rest</li>
<li>technical restriction that can block implementation</li>
</ul>
<p>If I identify this early, I can pull this risk closer to the beginning. Not necessarily to completely resolve it right away, but at least to validate it before the rest of the plan is built on top of a weak assumption.</p>
<p>For me, this is one of the biggest gains of <code>plan</code>: it reduces the chance of a beautiful sequence on top of a wrong premise.</p>
<h3><code>Q4.</code> What needs to be validated before expanding?<span class="hx:absolute hx:-mt-20" id="q4-what-needs-to-be-validated-before-expanding"></span>
    <a href="#q4-what-needs-to-be-validated-before-expanding" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Not everything needs to be implemented to the end before learning something useful.</p>
<p>Sometimes I just need to validate:</p>
<ul>
<li>if the central flow closes</li>
<li>if the main rule sustains itself</li>
<li>if integration responds as expected</li>
<li>if initial modeling isn&rsquo;t crooked</li>
</ul>
<p>This question helps me insert validation milestones within the plan, instead of pushing all learning to the end.</p>
<p>This is especially valuable in work with agents, because production speed can mask a structural problem for several consecutive interactions. When I create validation points, I better control this risk.</p>
<h3><code>Q5.</code> How to break this without losing coherence?<span class="hx:absolute hx:-mt-20" id="q5-how-to-break-this-without-losing-coherence"></span>
    <a href="#q5-how-to-break-this-without-losing-coherence" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Breaking work is necessary. Breaking it poorly is very dangerous.</p>
<p>If I separate too much, I create fragmentation and overhead. If I separate too little, I return to the big and difficult-to-control block.</p>
<p>So I try to look for a decomposition that preserves sense. Something in which each block has a clear responsibility, a reasonable completion criterion, and an understandable relationship with the greater objective.</p>
<p>In practice, this usually means:</p>
<ul>
<li>break by flow or capability, not by arbitrary layer</li>
<li>avoid dividing too early something that still depends on central decision</li>
<li>separate what can be validated in isolation</li>
<li>keep each part connected to an observable result</li>
</ul>
<p>When this is well done, the next stage gains a lot. Because execution starts walking on more stable tracks.</p>
<h2>A Practical Example of Difference<span class="hx:absolute hx:-mt-20" id="a-practical-example-of-difference"></span>
    <a href="#a-practical-example-of-difference" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Clear specification:</p>
<ul>
<li>internal operators need to manually register orders</li>
<li>each order must be associated with an existing client</li>
<li>order items need to inform quantity and price</li>
<li>the system should calculate total automatically</li>
<li>orders cannot be finalized without at least one item</li>
<li>in this first version there will be no online payment nor tax issuance</li>
</ul>
<p>Up to here, I know what needs to be built.</p>
<p>But this still isn&rsquo;t a plan.</p>
<p>A weak break could be:</p>
<ul>
<li>make orders screen</li>
<li>create orders endpoint</li>
<li>save to database</li>
<li>add tests</li>
</ul>
<p>This seems organized, but is still a generic list.</p>
<p>Now look at a more planned version:</p>
<ul>
<li>validate minimum order model and mandatory relationship with client</li>
<li>implement order creation with automatic total calculation</li>
<li>prevent order finalization without valid item</li>
<li>only then build listing and visualization for operators</li>
<li>finally, cover critical flows and adjust error messages</li>
</ul>
<p>Notice the difference.</p>
<p>In the second version, I&rsquo;m not just dividing work. I&rsquo;m choosing an order that respects dependency, reduces rework, and prioritizes the rule&rsquo;s nucleus before the layers around it.</p>
<h2>Planning Isn&rsquo;t Bureaucratizing<span class="hx:absolute hx:-mt-20" id="planning-isnt-bureaucratizing"></span>
    <a href="#planning-isnt-bureaucratizing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>It&rsquo;s worth saying this because many people turn up their nose when they hear the word &ldquo;planning.&rdquo;</p>
<p>I also don&rsquo;t have patience for process that exists just to generate document.</p>
<p>But the <code>plan</code> stage I&rsquo;m defending here is another thing. It doesn&rsquo;t serve to rigidify work. It serves to increase the chance of clean execution.</p>
<p>Before AI, much of development energy was consumed by coding itself. There was much more operational hours going to write, adjust, refactor, connect parts, and carry implementation on the back.</p>
<p>With AI, that coding time dropped drastically.</p>
<p>And, if that time dropped, it shouldn&rsquo;t be automatically reinvested in producing even more code on impulse.</p>
<p>For me, a relevant part of that time needs to be reallocated to planning.</p>
<p>Not in the sense of transforming developer into PM or PO.</p>
<p>It&rsquo;s not about substituting who defines priority, business context, product objective, or demand direction.</p>
<p>It&rsquo;s about something else: once the demand has already arrived, someone still needs to think about what is the best way to execute it.</p>
<p>Someone still needs to understand:</p>
<ul>
<li>what is the best order</li>
<li>where it&rsquo;s not worth improvising</li>
<li>what needs to be validated early</li>
<li>how to divide the work without losing the thread</li>
</ul>
<p>Before, a lot of inefficiency was hidden inside manual implementation effort. Now that implementing became cheaper, the weight of poorly thought-out execution became more visible.</p>
<p>If I receive a good demand and still go out coding without a plan, the chance isn&rsquo;t just to err. It&rsquo;s to err quickly, on several fronts, with a false sense of productivity.</p>
<p>So, for me, planning well became an even more important skill in the AI context.</p>
<p>Not because the process became more bureaucratic.</p>
<p>But because coding stopped being the main bottleneck. And, when that happens, thinking better about execution starts to have much higher return.</p>
<h2>Closing<span class="hx:absolute hx:-mt-20" id="closing"></span>
    <a href="#closing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If <code>constitution</code> defines principles, and <code>specify</code> reduces ambiguity about what needs to be built, then <code>plan</code> is the stage that transforms that clarity into coordinated movement.</p>
<p>It&rsquo;s where I stop looking only at the demand and start looking at the crossing.</p>
<p>Because execution isn&rsquo;t just doing. Execution is also choosing the right order to do.</p>
<p>And, in the end, much bad implementation isn&rsquo;t born from bad specification. It&rsquo;s born from bad sequence.</p>
<p>In the next text, I want to enter the <code>tasks</code> stage, which is when this plan starts to turn into concrete work units.</p>
]]></content:encoded><category>ai</category><category>spec-driven-development</category><category>plan</category><category>planning</category><category>software-engineering</category></item><item><title>In Spec-Driven Development, `specify` is where ambiguity starts to die</title><link>https://www.orapha.dev/en/2026/04/06/no-spec-driven-development-specify-e-onde-a-ambiguidade-comeca-a-morrer/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/04/06/no-spec-driven-development-specify-e-onde-a-ambiguidade-comeca-a-morrer/</guid><pubDate>Mon, 06 Apr 2026 10:00:00 GMT</pubDate><description>&lt;h1&gt;In Spec-Driven Development, &lt;code&gt;specify&lt;/code&gt; is where ambiguity starts to die&lt;/h1&gt;&lt;p&gt;In the text &lt;a href="https://www.orapha.dev/en/2026/04/06/1-no-spec-driven-development-tudo-comeca-pelos-principios/"&gt;In Spec-Driven Development, Everything Starts with Principles&lt;/a&gt;, I focused on the &lt;code&gt;constitution&lt;/code&gt; stage, where I define the criteria that will guide the project.&lt;/p&gt;
&lt;p&gt;But principles alone don&amp;rsquo;t deliver system.&lt;/p&gt;
&lt;p&gt;After saying how the project should think, comes the time to say what it needs to build.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s where the &lt;code&gt;specify&lt;/code&gt; stage enters.&lt;/p&gt;
&lt;p&gt;And, for me, this is one of the most important parts of the entire flow. Because, in practice, it&amp;rsquo;s here that the work of a new demand begins.&lt;/p&gt;</description><content:encoded><![CDATA[<h1>In Spec-Driven Development, <code>specify</code> is where ambiguity starts to die</h1><p>In the text <a href="/en/2026/04/06/1-no-spec-driven-development-tudo-comeca-pelos-principios/">In Spec-Driven Development, Everything Starts with Principles</a>, I focused on the <code>constitution</code> stage, where I define the criteria that will guide the project.</p>
<p>But principles alone don&rsquo;t deliver system.</p>
<p>After saying how the project should think, comes the time to say what it needs to build.</p>
<p>That&rsquo;s where the <code>specify</code> stage enters.</p>
<p>And, for me, this is one of the most important parts of the entire flow. Because, in practice, it&rsquo;s here that the work of a new demand begins.</p>
<p>Before planning, breaking into tasks, or implementing, I need to specify what that demand really asks for.</p>
<p>It&rsquo;s precisely at this point that we start exchanging generic desire for operational expectation.</p>
<h2>The Problem of Asking for Solution Too Early<span class="hx:absolute hx:-mt-20" id="the-problem-of-asking-for-solution-too-early"></span>
    <a href="#the-problem-of-asking-for-solution-too-early" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>When someone works with a code agent frequently, there&rsquo;s a very strong temptation to skip directly to implementation.</p>
<p>The conversation usually starts like this:</p>
<blockquote>
  <p>create a CRUD for clients<br>
add login<br>
make a dashboard<br>
integrate with payment<br>
add notification</p>

</blockquote>
<p>Again: this isn&rsquo;t necessarily useless. In some cases, it can even produce good things.</p>
<p>The problem is that this way of asking mixes intention, solution, and expectation in one big ball.</p>
<p>I say &ldquo;make a dashboard,&rdquo; but I don&rsquo;t make clear:</p>
<ul>
<li>who this dashboard is for</li>
<li>what problem it solves</li>
<li>what needs to appear there</li>
<li>what&rsquo;s mandatory in this first version</li>
<li>what&rsquo;s explicitly out of scope</li>
<li>how I&rsquo;ll know if that turned out right</li>
</ul>
<p>When this isn&rsquo;t clear, the agent does what it was trained to do: complete the gap with a plausible solution.</p>
<p>Except plausible isn&rsquo;t the same as correct.</p>
<h2>What the <code>specify</code> Stage Solves<span class="hx:absolute hx:-mt-20" id="what-the-specify-stage-solves"></span>
    <a href="#what-the-specify-stage-solves" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I don&rsquo;t see <code>specify</code> as &ldquo;writing a pretty requirement.&rdquo; Nor do I see it as the moment to assemble heavy documentation just because the process asks for an artifact.</p>
<p>For me, <code>specify</code> serves for one very concrete thing: reduce ambiguity enough so that execution doesn&rsquo;t have to guess the problem.</p>
<p>It&rsquo;s the moment when I try to make explicit:</p>
<ul>
<li>what problem needs to be solved</li>
<li>who is affected by this problem</li>
<li>what behavior the system should have</li>
<li>what restrictions matter</li>
<li>what goes in and what stays out</li>
<li>what criteria define if the delivery is acceptable</li>
</ul>
<p>That is, I stop talking about &ldquo;idea&rdquo; and start talking about expected behavior.</p>
<p>This changes everything.</p>
<p>Because, when specification is well done, the agent stops inventing context. It starts working on more delimited terrain. Interpretation continues to exist, of course. But now interpretation happens within more controlled margins.</p>
<h2><code>Specify</code> Isn&rsquo;t Detailing Implementation<span class="hx:absolute hx:-mt-20" id="specify-isnt-detailing-implementation"></span>
    <a href="#specify-isnt-detailing-implementation" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This point matters a lot.</p>
<p>A bad specification isn&rsquo;t just one that&rsquo;s too vague. It can also be one that descends too early to the solution level.</p>
<p>Example of bad request:</p>
<ul>
<li>create endpoint <code>POST /users/register</code></li>
<li>use Redis for session</li>
<li>create table X with columns Y and Z</li>
<li>implement service <code>UserOnboardingService</code></li>
</ul>
<p>Notice that this is almost at implementation level.</p>
<p>Sometimes this is inevitable, especially when there&rsquo;s already very clear technical restriction. But, in many cases, I still don&rsquo;t want to answer &ldquo;how.&rdquo; I want to first nail down &ldquo;what&rdquo; needs to happen.</p>
<p>Something like:</p>
<ul>
<li>a new user needs to be able to create their account</li>
<li>the system should validate mandatory data</li>
<li>duplicate emails cannot be accepted</li>
<li>after successful registration, the user should be able to access the authenticated area</li>
</ul>
<p>Now yes I have behavior.</p>
<p>And behavior is a much better starting point than premature technical structure.</p>
<h2>What I Try to Capture in a Good Specification<span class="hx:absolute hx:-mt-20" id="what-i-try-to-capture-in-a-good-specification"></span>
    <a href="#what-i-try-to-capture-in-a-good-specification" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I don&rsquo;t follow a rigid template in every situation, but I almost always try to answer a similar set of questions.</p>
<p>I don&rsquo;t think of this as an official framework. I think more like a filter to know if the request is clear enough to turn into real work.</p>
<p>Normally I want to leave the <code>specify</code> stage knowing these things:</p>
<ul>
<li>what is the problem</li>
<li>who is it for</li>
<li>what expected result matters</li>
<li>what is the scope of the first delivery</li>
<li>what restrictions or rules cannot be ignored</li>
<li>how to validate if the delivery met the objective</li>
</ul>
<p>If I can&rsquo;t answer this with some objectivity, the request is still raw.</p>
<h2>The Questions I Usually Use in <code>specify</code><span class="hx:absolute hx:-mt-20" id="the-questions-i-usually-use-in-specify"></span>
    <a href="#the-questions-i-usually-use-in-specify" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If in <code>constitution</code> I talked about the <code>5 Qs</code>, here I tend to use another set of simple questions to force clarity.</p>
<p>Something along these lines:</p>
<ul>
<li><code>Q1.</code> What real problem does this delivery solve?</li>
<li><code>Q2.</code> Who is this behavior for?</li>
<li><code>Q3.</code> What does the system need to do, exactly?</li>
<li><code>Q4.</code> What stays out of this specification?</li>
<li><code>Q5.</code> How do I recognize that this is done?</li>
</ul>
<h3><code>Q1.</code> What real problem does this delivery solve?<span class="hx:absolute hx:-mt-20" id="q1-what-real-problem-does-this-delivery-solve"></span>
    <a href="#q1-what-real-problem-does-this-delivery-solve" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This question exists to prevent ornamental features.</p>
<p>Many demands arrive with the face of solution, but without explaining the pain being attacked. When this happens, the risk is building something functional and still irrelevant.</p>
<p>If I can&rsquo;t describe the problem with clarity, I usually still don&rsquo;t have specification. I have just impulse.</p>
<p>A useful answer here usually looks something like:</p>
<ul>
<li>today the team loses time consolidating data manually</li>
<li>the user cannot complete an important step without operational support</li>
<li>there is rework because certain information is scattered</li>
</ul>
<p>This type of formulation already takes the conversation out of &ldquo;would be nice to have&rdquo; territory and puts it in &ldquo;needs to solve this here&rdquo; territory.</p>
<h3><code>Q2.</code> Who is this behavior for?<span class="hx:absolute hx:-mt-20" id="q2-who-is-this-behavior-for"></span>
    <a href="#q2-who-is-this-behavior-for" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This question helps prevent too-generic specification.</p>
<p>When I just say &ldquo;the user,&rdquo; I&rsquo;m usually hiding important detail. Internal user, end customer, operator, administrator, finance, support: each of these roles changes what makes sense to build.</p>
<p>Defining this early helps because several decisions depend on who is on the other side:</p>
<ul>
<li>acceptable level of complexity in the interface</li>
<li>volume of information displayed</li>
<li>tolerance for manual steps</li>
<li>need for audit</li>
<li>type of error that needs to be treated</li>
</ul>
<p>Sometimes the same functionality seems obvious until the moment you ask &ldquo;for whom?&rdquo;.</p>
<h2><code>Q3.</code> What exactly does the system need to do?<span class="hx:absolute hx:-mt-20" id="q3-what-exactly-does-the-system-need-to-do"></span>
    <a href="#q3-what-exactly-does-the-system-need-to-do" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here I try to get out of generic language and describe observable behavior.</p>
<p>It&rsquo;s not enough to say &ldquo;have client management.&rdquo; That&rsquo;s still too nebulous. I prefer to break down into more concrete actions and responses, for example:</p>
<ul>
<li>allow registering client with defined mandatory fields</li>
<li>list clients with search by name or document</li>
<li>prevent duplication by main identifier</li>
<li>allow editing data without erasing relevant history</li>
</ul>
<p>This type of writing helps because it&rsquo;s already born closer to validation.</p>
<p>If I can imagine someone testing that sentence, it&rsquo;s a good sign.</p>
<p>If I read the sentence and still don&rsquo;t know what would be considered correct behavior, the specification is still loose.</p>
<h3><code>Q4.</code> What stays out of this specification?<span class="hx:absolute hx:-mt-20" id="q4-what-stays-out-of-this-specification"></span>
    <a href="#q4-what-stays-out-of-this-specification" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This point is very underestimated.</p>
<p>Scope isn&rsquo;t just what goes in. Scope is also what I decide not to solve now.</p>
<p>When I don&rsquo;t make this explicit, the agent tends to complete the package. And, in its head, completing the package can mean:</p>
<ul>
<li>create advanced permissions</li>
<li>add pagination, filters, and export</li>
<li>prepare multitenancy</li>
<li>structure internationalization</li>
<li>leave everything ready for mobile</li>
</ul>
<p>None of this is absurd in itself. The problem is when these expansions appear because no one said &ldquo;this isn&rsquo;t part of this delivery.&rdquo;</p>
<p>So I like to write scope exclusions without any shame:</p>
<ul>
<li>at this stage there will be no fine permission control</li>
<li>analytical reports stay for a next phase</li>
<li>offline support won&rsquo;t be treated</li>
<li>batch import is out of the first version</li>
</ul>
<p>Saying &ldquo;no&rdquo; is part of specifying well.</p>
<h3><code>Q5.</code> How do I recognize that this is done?<span class="hx:absolute hx:-mt-20" id="q5-how-do-i-recognize-that-this-is-done"></span>
    <a href="#q5-how-do-i-recognize-that-this-is-done" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>For me, this is the question that most approximates specification to executable work.</p>
<p>If I don&rsquo;t know which criteria close the delivery, I open space for two bad things: infinite implementation or false sense of completion.</p>
<p>I like to think of this in terms of acceptance criteria. Not necessarily in an ultra-formal format, but in a way that allows verifying the result without depending too much on subjective interpretation.</p>
<p>Examples:</p>
<ul>
<li>given an already registered email, the system should reject new creation with appropriate message</li>
<li>after saving a valid record, it should appear in the listing</li>
<li>only authenticated users can access a certain area</li>
<li>external error should be displayed without breaking the entire flow</li>
</ul>
<p>When I have this level of clarity, the next stage becomes much safer.</p>
<h2>Good Specification Doesn&rsquo;t Need to Be Huge<span class="hx:absolute hx:-mt-20" id="good-specification-doesnt-need-to-be-huge"></span>
    <a href="#good-specification-doesnt-need-to-be-huge" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>It&rsquo;s worth saying this because, when someone hears &ldquo;specify,&rdquo; they might imagine a huge document, full of formal sections and corporate text.</p>
<p>That&rsquo;s not what I&rsquo;m defending.</p>
<p>A specification can be lean and still be very good, as long as it answers the essential with clarity.</p>
<p>What I try to avoid isn&rsquo;t lack of volume. It&rsquo;s lack of precision.</p>
<p>Between a short and clear text versus a long and nebulous text, I prefer a thousand times the short and clear one.</p>
<h2>A Practical Example of Difference<span class="hx:absolute hx:-mt-20" id="a-practical-example-of-difference"></span>
    <a href="#a-practical-example-of-difference" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Generic request:</p>
<blockquote>
  <p>create orders module</p>

</blockquote>
<p>This opens too much space.</p>
<p>Now look at a more specified version:</p>
<ul>
<li>internal operators need to manually register orders</li>
<li>each order must be associated with an existing client</li>
<li>order items need to inform quantity and price</li>
<li>the system should calculate total automatically</li>
<li>orders cannot be finalized without at least one item</li>
<li>in this first version there will be no online payment nor tax issuance</li>
<li>the delivery is ready when it&rsquo;s possible to create, view, and query valid orders without manual calculation</li>
</ul>
<p>I still haven&rsquo;t described architecture. I still haven&rsquo;t talked about database, framework, queue, service, or class naming.</p>
<p>But now there&rsquo;s enough ground to plan, implement, and review.</p>
<h2>In the End<span class="hx:absolute hx:-mt-20" id="in-the-end"></span>
    <a href="#in-the-end" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If I had to summarize the function of <code>specify</code> in one sentence, I would say this: it&rsquo;s the stage where intention stops being vague enough to become conversation and becomes clear enough to become work.</p>
<p>For me, this is the point where ambiguity really starts to lose space.</p>
<p>Because, in the end, specifying well isn&rsquo;t producing bureaucracy. It&rsquo;s making the problem understandable enough so that implementation, review, and validation work on the same reality.</p>
<p>In the next deep dive, the natural path is to enter the stage that takes this specification and transforms it into an execution plan.</p>
]]></content:encoded><category>ai</category><category>spec-driven-development</category><category>specify</category><category>specification</category><category>software-engineering</category></item><item><title>In Spec-Driven Development, Everything Starts with Principles</title><link>https://www.orapha.dev/en/2026/04/06/no-spec-driven-development-tudo-comeca-pelos-principios/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/04/06/no-spec-driven-development-tudo-comeca-pelos-principios/</guid><pubDate>Mon, 06 Apr 2026 10:00:00 GMT</pubDate><description>&lt;h1&gt;In Spec-Driven Development, Everything Starts with Principles&lt;/h1&gt;&lt;p&gt;In the article &lt;a href="https://www.orapha.dev/en/2026/04/03/como-eu-tenho-usado-spec-driven-development-com-o-spec-kit-nos-meus-projetos/"&gt;How I&amp;rsquo;ve Been Using Spec-Driven Development with Spec Kit in My Projects&lt;/a&gt;, I went through the flow stages in a more general way.&lt;/p&gt;
&lt;p&gt;But I thought it was worth going back calmly to each of them, in separate texts, because there&amp;rsquo;s stuff there that deserves to be properly dissected.&lt;/p&gt;
&lt;p&gt;If the idea is to gradually deepen this flow, it makes sense to open precisely at the stage where I define the project principles.&lt;/p&gt;</description><content:encoded><![CDATA[<h1>In Spec-Driven Development, Everything Starts with Principles</h1><p>In the article <a href="/en/2026/04/03/como-eu-tenho-usado-spec-driven-development-com-o-spec-kit-nos-meus-projetos/">How I&rsquo;ve Been Using Spec-Driven Development with Spec Kit in My Projects</a>, I went through the flow stages in a more general way.</p>
<p>But I thought it was worth going back calmly to each of them, in separate texts, because there&rsquo;s stuff there that deserves to be properly dissected.</p>
<p>If the idea is to gradually deepen this flow, it makes sense to open precisely at the stage where I define the project principles.</p>
<p>I&rsquo;m talking about <code>constitution</code>.</p>
<p>And I want to focus here less on the tool itself and more on the logic behind the thing. Because, honestly, the name can change, the command can change, the stack can change, but the need remains the same: before asking the agent for features, someone needs to say what the rules are that will govern that project&rsquo;s decisions.</p>
<p>For me, this is one of the most underestimated points when we talk about development with AI.</p>
<h2>The Error of Starting with the Feature<span class="hx:absolute hx:-mt-20" id="the-error-of-starting-with-the-feature"></span>
    <a href="#the-error-of-starting-with-the-feature" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The most natural path, especially when the person is already used to using a code agent, is to start like this:</p>
<blockquote>
  <p>create a registration screen<br>
make an API for such thing<br>
add authentication<br>
now create tests<br>
now refactor<br>
now improve architecture</p>

</blockquote>
<p>Notice the pattern: the conversation always starts with the visible delivery.</p>
<p>It&rsquo;s not that this is always wrong. In small projects, quick experiments, or proof of concept, it can even go in this line and accept controlled chaos. The problem is when this logic becomes a work method.</p>
<p>When I start directly with the feature, without declaring the project principles first, I leave an important part of the decision in the hands of improvisation. And the agent is very good at completing gaps. Good even too much. If I don&rsquo;t say clearly what I value, it will fill the void with generic pattern, plausible assumption, and excess of good will.</p>
<p>That&rsquo;s when things start to go sideways.</p>
<p>The agent creates too much abstraction in a simple project. Or makes everything too coupled in a project that needed to last. Or shoves tests where it wasn&rsquo;t a priority. Or ignores tests where it was mandatory. Or invents a &ldquo;beautiful&rdquo; architecture that no one asked for. Or makes naming, organization, and structure decisions without any alignment with what I really wanted to preserve.</p>
<p>In the end, the feeling is productivity. But many times it&rsquo;s just speed without direction.</p>
<h2>What <code>constitution</code> Really Solves<span class="hx:absolute hx:-mt-20" id="what-constitution-really-solves"></span>
    <a href="#what-constitution-really-solves" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>When I talk about <code>constitution</code>, I&rsquo;m not thinking about a bureaucratic document. It&rsquo;s not to become a team&rsquo;s beautiful manifesto that no one reads later. Nor is it to write an abstract treatise about good practices.</p>
<p>The function of this stage is much more practical: declare the principles that will guide the next decisions.</p>
<p>In other words, it&rsquo;s the moment when I say:</p>
<ul>
<li>what this project values</li>
<li>what this project avoids</li>
<li>which criteria weigh more when there&rsquo;s trade-off</li>
<li>how quality will be interpreted here</li>
<li>what type of complexity is acceptable and which is already excess</li>
</ul>
<p>And this isn&rsquo;t restricted to code style or architecture. Depending on context, I can also use <code>constitution</code> to register project operational rules, such as branch flow, test policy, and minimum security requirements. If these things change how the delivery should be built and reviewed, it makes sense for them to appear right here.</p>
<p>This changes the whole conversation.</p>
<p>Because, from there, AI stops responding only to the immediate request and starts operating within a field of more explicit restrictions and preferences. And, for me, working with AI without clear restriction is asking to receive a technically possible solution, but conceptually misaligned.</p>
<h2>Principle Isn&rsquo;t Loose Rule<span class="hx:absolute hx:-mt-20" id="principle-isnt-loose-rule"></span>
    <a href="#principle-isnt-loose-rule" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There&rsquo;s an important difference here.</p>
<p>Many people, when they think about principles, write very generic things:</p>
<ul>
<li>use clean code</li>
<li>maintain quality</li>
<li>follow good practices</li>
<li>make scalable code</li>
</ul>
<p>This looks nice, but helps little.</p>
<p>These phrases even point in a direction, but still leave too much room for interpretation. And, when there&rsquo;s too much room for interpretation, the agent fills with what it knows as average pattern. The problem is that average pattern isn&rsquo;t context.</p>
<p>For me, a good principle is one that influences real decision.</p>
<p>For example, instead of just saying &ldquo;maintain simplicity,&rdquo; I prefer something more concrete, like:</p>
<ul>
<li>prioritize direct solution before reusable abstraction</li>
<li>avoid extra layers while the domain is still small</li>
<li>only introduce more sophisticated pattern when there&rsquo;s concrete pain</li>
</ul>
<p>Now yes there&rsquo;s an orientation that impacts what will be built.</p>
<p>Similarly, instead of just saying &ldquo;ensure quality,&rdquo; I can say:</p>
<ul>
<li>every delivery must preserve readability</li>
<li>names need to communicate business intention</li>
<li>changes shouldn&rsquo;t break existing behavior without explicit reason</li>
<li>automated tests are mandatory only in critical parts</li>
</ul>
<p>This already changes the expected behavior quite a bit.</p>
<h2><code>Constitution</code> Exists to Hold the Project&rsquo;s Axis<span class="hx:absolute hx:-mt-20" id="constitution-exists-to-hold-the-projects-axis"></span>
    <a href="#constitution-exists-to-hold-the-projects-axis" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The more I use an agent, the more I realize that the biggest risk isn&rsquo;t it getting syntax wrong. That usually is the least of problems.</p>
<p>The bigger risk is it getting the code right and the direction wrong.</p>
<p>This distinction matters a lot.</p>
<p>A system can compile, pass the build, run locally, and still be technically misaligned with what the project needed to be. It can be too complicated, too fragile, too coupled, too generic, or simply outside the spirit of the base.</p>
<p>That&rsquo;s why I see <code>constitution</code> as a criteria alignment stage even. It&rsquo;s in it that I establish how the project thinks.</p>
<p>It might seem like a pompous way of saying this, but that&rsquo;s exactly the point: before deciding what to do, I need to define how decisions will be made.</p>
<p>Without this, each feature becomes a new improvised negotiation.</p>
<h2>What I Usually Define in This Stage<span class="hx:absolute hx:-mt-20" id="what-i-usually-define-in-this-stage"></span>
    <a href="#what-i-usually-define-in-this-stage" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I don&rsquo;t follow a rigid formula, but I normally try to answer what, in my head, became a kind of <code>5 Qs</code> of <code>constitution</code>.</p>
<p>It&rsquo;s not a formal framework nor a patented method. It&rsquo;s just a simple way to not leave this stage too vague.</p>
<p>For me, this is a good way to get out of generic principle and arrive at something that really guides decision.</p>
<p>The <code>5 Qs</code> I usually answer are these:</p>
<ul>
<li><code>Q1.</code> What type of solution should this project privilege now?</li>
<li><code>Q2.</code> What does this code need to look like to remain readable?</li>
<li><code>Q3.</code> What technical limits cannot be negotiated?</li>
<li><code>Q4.</code> What level of testing makes sense at this stage?</li>
<li><code>Q5.</code> How much architecture does this project really need at this moment?</li>
</ul>
<h3><code>Q1.</code> What type of solution should this project privilege now?<span class="hx:absolute hx:-mt-20" id="q1-what-type-of-solution-should-this-project-privilege-now"></span>
    <a href="#q1-what-type-of-solution-should-this-project-privilege-now" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This question exists to define the degree of acceptable sophistication.</p>
<p>Every project lives this tension. If I simplify too much, maybe the next change hurts. If I prepare too much for the future, I run the risk of assembling a heavy structure for a small problem. So I like to say explicitly which side the project should lean.</p>
<p>In practice, answering this is saying things like:</p>
<ul>
<li>prioritize direct solution before reusable abstractions</li>
<li>prepare growth only when there&rsquo;s concrete signal of that need</li>
<li>avoid extra layers while the domain is still small</li>
</ul>
<p>In general, I tend to favor simplicity with conscious growth. That is: make it simple now, but not any which way.</p>
<h3><code>Q2.</code> What does this code need to look like to remain readable?<span class="hx:absolute hx:-mt-20" id="q2-what-does-this-code-need-to-look-like-to-remain-readable"></span>
    <a href="#q2-what-does-this-code-need-to-look-like-to-remain-readable" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Not all clarity is just a matter of beautiful code. Many times, clarity has more to do with communication than with style.</p>
<p>In this part, I try to say how the code needs to present itself. If names should reflect domain, if organization should be direct, if reading should be more important than any clever trick, all of this fits here.</p>
<p>A practical way to answer is writing things like:</p>
<ul>
<li>names should communicate business intention</li>
<li>structure should be easy to understand by someone else on the team</li>
<li>readability weighs more than technical cleverness</li>
</ul>
<p>This is important because AI can generate a lot of things quickly, but not always with the best sense of communication. Sometimes the solution even works, but the code text becomes generic, without domain vocabulary, without the face of a well-thought-out system.</p>
<h3><code>Q3.</code> What technical limits cannot be negotiated?<span class="hx:absolute hx:-mt-20" id="q3-what-technical-limits-cannot-be-negotiated"></span>
    <a href="#q3-what-technical-limits-cannot-be-negotiated" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This is the question that defines limits.</p>
<p>Every constitution needs to make clear what the project doesn&rsquo;t accept, even when that seems faster in the short term. It&rsquo;s here that I usually register the type of shortcut that isn&rsquo;t worth it, the complexity that I don&rsquo;t want to buy, and the type of decision that needs justification before entering.</p>
<p>Example answers:</p>
<ul>
<li>don&rsquo;t introduce dependency without strong necessity</li>
<li>don&rsquo;t increase complexity just to seem scalable</li>
<li>don&rsquo;t break compatibility without justifying</li>
<li>don&rsquo;t sacrifice understanding in the name of technical cleverness</li>
</ul>
<p>It&rsquo;s also here that I can leave very practical locks, for example:</p>
<ul>
<li>the project should follow a <code>gitflow</code> flow or another branch strategy defined by the team</li>
<li>every change in critical flow needs to come accompanied by the type of test agreed for this project</li>
<li>minimum security requirements, such as mandatory authentication, access control, secret protection, and care with dependencies, cannot be treated as optional detail</li>
</ul>
<p>This type of principle helps a lot because it reduces the chance of the agent confusing sophistication with quality.</p>
<h3><code>Q4.</code> What level of testing makes sense at this stage?<span class="hx:absolute hx:-mt-20" id="q4-what-level-of-testing-makes-sense-at-this-stage"></span>
    <a href="#q4-what-level-of-testing-makes-sense-at-this-stage" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This point varies a lot from project to project. And precisely because it varies so much, it&rsquo;s worth being in the constitution.</p>
<p>There&rsquo;s a project where I want serious coverage from the beginning. There&rsquo;s a project where I accept not having automated tests in the first version to gain speed. There&rsquo;s context where integration is more important than unit tests. There&rsquo;s context where the domain demands much more rigor.</p>
<p>So I try to answer very objectively:</p>
<ul>
<li>are automated tests mandatory or not?</li>
<li>if they are, where are they indispensable?</li>
<li>at this stage, are unit tests, integration, or well-guided manual validation worth more?</li>
</ul>
<p>The important thing is not to leave this implied. If tests are mandatory, say. If tests are selective, say. If at this stage it doesn&rsquo;t make sense to invest in this, say that too. What I try to avoid is leaving AI to guess the project&rsquo;s quality policy.</p>
<p>For me, this same logic applies to security. If the project needs to follow minimum cybersecurity requirements from the first delivery, this should be said in <code>constitution</code> with the same objectivity. Authorization, audit, secret handling, sensitive data protection, and basic hardening criteria shouldn&rsquo;t appear only at the end as tardy correction.</p>
<h3><code>Q5.</code> How much architecture does this project really need at this moment?<span class="hx:absolute hx:-mt-20" id="q5-how-much-architecture-does-this-project-really-need-at-this-moment"></span>
    <a href="#q5-how-much-architecture-does-this-project-really-need-at-this-moment" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This question helps me contain the temptation to turn any project into an architecture showcase.</p>
<p>Not every project needs complete DDD, event-driven architecture, queues, messaging, plugin system, extreme modularization, and fifteen interfaces to abstract half a dozen simple rules.</p>
<p>When I answer this question, I normally do it by delimiting what is acceptable now and what would be premature at this moment.</p>
<p>Example:</p>
<ul>
<li>maintain lean architecture at this stage</li>
<li>avoid advanced patterns without concrete necessity</li>
<li>prefer simple organization until domain complexity justifies something bigger</li>
</ul>
<p>When I realize the project needs to remain light, I write this directly. Without ceremony. Because, if I don&rsquo;t write, there&rsquo;s a good chance of conference architecture appearing for a corner problem.</p>
<h2>An Example of Reasoning<span class="hx:absolute hx:-mt-20" id="an-example-of-reasoning"></span>
    <a href="#an-example-of-reasoning" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Suppose a small, internal project, with a short deadline, to solve a very specific operational problem.</p>
<p>If I don&rsquo;t say anything about principles, the agent can:</p>
<ul>
<li>create excessive separations</li>
<li>prepare the system for a scale that perhaps will never come</li>
<li>suggest many libraries</li>
<li>invest in generic abstractions too early</li>
</ul>
<p>Now imagine that I define something more or less like this:</p>
<ul>
<li>prioritize simplicity and maintenance speed</li>
<li>avoid unnecessary dependencies</li>
<li>prefer direct structure while the domain is small</li>
<li>ensure clarity of names and flow</li>
<li>automated tests only in the most critical rules</li>
<li>follow the branch flow defined by the team, without skipping review</li>
<li>treat authentication, authorization, and secrets as mandatory requirements from the beginning</li>
</ul>
<p>Notice how this already changes the terrain.</p>
<p>I&rsquo;m not defining the feature. I&rsquo;m not saying if it will be API, screen, database, or framework. I&rsquo;m defining the way of thinking about that project. And this, later on, affects naming, folder organization, number of layers, validation strategy, refactoring criteria, and even the type of suggestion that AI will consider acceptable.</p>
<h2>This Is Also Software Engineering<span class="hx:absolute hx:-mt-20" id="this-is-also-software-engineering"></span>
    <a href="#this-is-also-software-engineering" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There are people who look at this stage and think this is just &ldquo;improved prompt.&rdquo; I think it&rsquo;s a weak reading.</p>
<p>For me, this is software engineering applied to a new execution context.</p>
<p>At its core, we&rsquo;re talking about the same responsibility as always:</p>
<ul>
<li>define criteria before building</li>
<li>reduce ambiguity</li>
<li>make trade-offs explicit</li>
<li>protect system quality</li>
</ul>
<p>The difference is that now this needs to be said in a way that an agent can use throughout the flow.</p>
<p>That is: it&rsquo;s not enough to have good sense in your head. You need to transform that good sense into operational instruction.</p>
<h2>In the End<span class="hx:absolute hx:-mt-20" id="in-the-end"></span>
    <a href="#in-the-end" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If I had to summarize the importance of <code>constitution</code> in one sentence, I would say this: it exists to prevent execution from starting without criteria.</p>
<p>In SDD, this matters because the idea isn&rsquo;t just to produce artifact. It&rsquo;s to produce with intention.</p>
<p>And intention, when not declared, becomes assumption.</p>
<p>That&rsquo;s why I like this stage so much. Before discussing screen, endpoint, database, stack, or task, I can define what will really command decisions.</p>
<p>For me, this is the moment when the project stops being just a request and starts to become a system with technical identity.</p>
<p>In the next deep dive, the natural path is to enter the <code>specify</code> stage, which is when the conversation leaves principles and enters what really needs to be built.</p>
]]></content:encoded><category>ai</category><category>spec-driven-development</category><category>constitution</category><category>software-engineering</category><category>principles</category></item><item><title>How I've Been Using Spec-Driven Development with Spec Kit in My Projects</title><link>https://www.orapha.dev/en/2026/04/03/como-eu-tenho-usado-spec-driven-development-com-o-spec-kit-nos-meus-projetos/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/04/03/como-eu-tenho-usado-spec-driven-development-com-o-spec-kit-nos-meus-projetos/</guid><pubDate>Fri, 03 Apr 2026 10:00:00 GMT</pubDate><description>&lt;h1&gt;How I&amp;rsquo;ve Been Using Spec-Driven Development with Spec Kit in My Projects&lt;/h1&gt;&lt;p&gt;If you&amp;rsquo;ve ever tried to build software with a code agent, you&amp;rsquo;ve probably been on this roller coaster. Some days things go really well. On others, the agent delivers half of what you asked for, invents a structure that makes no sense, breaks the build, or even does something that seems to work, but with a foundation that you yourself wouldn&amp;rsquo;t do that way.&lt;/p&gt;</description><content:encoded><![CDATA[<h1>How I&rsquo;ve Been Using Spec-Driven Development with Spec Kit in My Projects</h1><p>If you&rsquo;ve ever tried to build software with a code agent, you&rsquo;ve probably been on this roller coaster. Some days things go really well. On others, the agent delivers half of what you asked for, invents a structure that makes no sense, breaks the build, or even does something that seems to work, but with a foundation that you yourself wouldn&rsquo;t do that way.</p>
<p>I&rsquo;ve been thinking a lot about this. And, for me, the problem is almost never just in the model. Most of the time, the problem is in the way we ask. Loose request generates loose response. Poorly tied context generates crooked decision. And, when there&rsquo;s no clear way to say what needs to be built and how it will be validated, the chance of turning into improvisation is too high.</p>
<p>That&rsquo;s why I started looking more closely at <strong>Spec-Driven Development</strong>, or simply <strong>SDD</strong>. And, within that, a tool that caught my attention was <strong>Spec Kit</strong>, an open source toolkit created precisely to organize this workflow with agents.</p>
<p>In this text, I want to show you how I&rsquo;ve been seeing this process in practice. Not as pretty talk, but as a more serious way of working with AI in development. The idea here is to get out of the thrown prompt in the chat and enter a flow with principles, specification, plan, tasks, and implementation.</p>
<h2>What bothers me about the so-called vibe coding<span class="hx:absolute hx:-mt-20" id="what-bothers-me-about-the-so-called-vibe-coding"></span>
    <a href="#what-bothers-me-about-the-so-called-vibe-coding" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There&rsquo;s a way to use AI for programming that works really well for quick prototypes. You open the chat, send something like &ldquo;create a login screen&rdquo; and refine through trial and error. This has its value. I even do this at some moments.</p>
<p>The problem is when that same logic goes into a real project.</p>
<p>When the project needs to last more than an afternoon, when there&rsquo;s maintenance, when there&rsquo;s standard, when there&rsquo;s architecture, when there&rsquo;s technical responsibility, this model starts to make noise. Because the agent even recognizes pattern very well, but it doesn&rsquo;t guess intention. It needs direction.</p>
<p>That&rsquo;s when SDD started to make sense to me. The proposal is simple: instead of starting directly in code, I start with intention. I define project principles, describe what I want to build, organize technical decisions, and only then move to execution. Code continues to be important, of course, but it stops being the first thing in the conversation.</p>
<h2>What is Spec Kit<span class="hx:absolute hx:-mt-20" id="what-is-spec-kit"></span>
    <a href="#what-is-spec-kit" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In the project&rsquo;s own definition, <strong>Spec Kit</strong> is an open source toolkit aimed at helping you focus on product scenarios and predictable results, instead of coding everything crazily.</p>
<p>The toolkit&rsquo;s central idea talks a lot with what I&rsquo;ve been looking for in practice: transforming specification into an active part of development, and not into a dead document that only exists to fulfill a checklist.</p>
<p>Its main flow revolves around five stages:</p>
<ol>
<li><code>constitution</code></li>
<li><code>specify</code></li>
<li><code>plan</code></li>
<li><code>tasks</code></li>
<li><code>implement</code></li>
</ol>
<p>It seems simple, and indeed it is. The value isn&rsquo;t in inventing fashion. It&rsquo;s in putting the house in order.</p>
<h2>Before anything: what I like about this approach<span class="hx:absolute hx:-mt-20" id="before-anything-what-i-like-about-this-approach"></span>
    <a href="#before-anything-what-i-like-about-this-approach" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>What attracts me most here isn&rsquo;t &ldquo;automating everything.&rdquo; It&rsquo;s precisely the opposite. It&rsquo;s creating a process in which I continue to hold the direction.</p>
<p>When I use this flow, I&rsquo;m not outsourcing thought. I&rsquo;m putting thought in order. AI enters as a partner in elaboration, refinement, and execution, but responsibility for quality continues to be mine.</p>
<p>This point is important because many people look at tools like this and imagine that the gain is in pressing a button and having a complete system come out. I don&rsquo;t see it that way. For me, the gain is in reducing noise and misunderstanding.</p>
<h2>Prerequisites<span class="hx:absolute hx:-mt-20" id="prerequisites"></span>
    <a href="#prerequisites" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To use Spec Kit, you need to have some things in the environment:</p>
<ul>
<li><code>uv</code> to manage CLI installation</li>
<li><code>Python 3.11+</code></li>
<li><code>Git</code></li>
<li>A compatible agent</li>
</ul>
<p>The project supports several agents. Among them, <strong>GitHub Copilot</strong>, <strong>Claude Code</strong>, <strong>Codex CLI</strong>, <strong>Cursor</strong>, <strong>Gemini CLI</strong>, and others.</p>
<h2>Installing the CLI<span class="hx:absolute hx:-mt-20" id="installing-the-cli"></span>
    <a href="#installing-the-cli" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The recommended way by the project is to install the CLI with <code>uv tool install</code>.</p>
<p>Example:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@vX.Y.Z</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>If you want to use the latest version from the main branch:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uv tool install specify-cli --from git+https://github.com/github/spec-kit.git</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>After that, you can already use commands like:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">specify init &lt;PROJECT_NAME&gt;
</span></span><span class="line"><span class="cl">specify check</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>If the idea is to run without installing persistently, you can also use <code>uvx</code>.</p>
<h2>Creating a project with Spec Kit<span class="hx:absolute hx:-mt-20" id="creating-a-project-with-spec-kit"></span>
    <a href="#creating-a-project-with-spec-kit" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>After installation, I initialize the project with <code>specify init</code>.</p>
<p>Example to create a new project:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">specify init my-project --ai copilot</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>If I want to use it in the current directory:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">specify init . --ai copilot</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>In the case of <strong>Codex CLI</strong>, I would use something like this:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">specify init . --ai codex --ai-skills</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>If I were to do the same with <strong>Claude Code</strong>, it would be like this:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">specify init . --ai claude</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>The <code>--ai-skills</code> detail matters because, in Codex, Spec Kit works as a skill instead of traditional slash command.</p>
<p>After <code>init</code>, the toolkit mounts the project structure base. Among files and folders, you&rsquo;ll typically see things like:</p>
<ul>
<li><code>.specify/memory/constitution.md</code></li>
<li><code>.specify/templates/</code></li>
<li><code>.specify/scripts/</code></li>
<li><code>.specify/specs/&lt;feature&gt;/</code></li>
</ul>
<p>In addition, it installs the commands that will guide the process.</p>
<p>After this base is ready, you can touch this flow the way that makes most sense in your daily life: in your preferred IDE&rsquo;s chat, in the agent via terminal, or in the tool you&rsquo;re using.</p>
<h2>Stage 1: defining principles with <code>constitution</code><span class="hx:absolute hx:-mt-20" id="stage-1-defining-principles-with-constitution"></span>
    <a href="#stage-1-defining-principles-with-constitution" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This is a part that I think is really good. Before talking about the feature, I define the principles that will command the project.</p>
<p>In the traditional Spec Kit flow, the command is:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/speckit.constitution</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>In Codex with skills, it would be equivalent to:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">$speckit</span>-constitution</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Here I don&rsquo;t describe screen or endpoint. I describe quality rule and decision criterion.</p>
<p>Depending on context, this stage can also register operational rules and cross-cutting project requirements, such as test policy, branch flow, and minimum security requirements. If this changes how the work should be built and reviewed, it makes sense to declare it already in the <code>constitution</code>.</p>
<p>For example:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Create principles focused on clean code. The project should be small and simple. Should not have automated tests in this first version.</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>The result of this goes to the project&rsquo;s constitution file. And what I like is that this pulls the next stages. The agent starts carrying these principles as reference.</p>
<p>This helps prevent something that bothers me a lot: the agent starting to invent fashion in a simple project.</p>
<h2>Stage 2: describing what I want to build with <code>specify</code><span class="hx:absolute hx:-mt-20" id="stage-2-describing-what-i-want-to-build-with-specify"></span>
    <a href="#stage-2-describing-what-i-want-to-build-with-specify" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>After principles, I move to functional specification.</p>
<p>Here the focus is on <strong>what</strong> and <strong>why</strong>, not on stack. This separation makes a difference. If I mix functional requirement with technical detail too early, I myself tangle the conversation.</p>
<p>Example of command:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/speckit.specify</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Or in Codex:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">$speckit</span>-specify</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>And then I pass something along these lines:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Build an application that helps me manage my tasks and track daily activities. Tasks should have title, description, completion date, priority, and status. Include filters to view tasks by priority, status, or date.</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>From this, Spec Kit generates a specification with user stories, requirements, and acceptance checklist.</p>
<p>This is a part that I recommend reviewing carefully. Don&rsquo;t treat it as final just because the text looks neat. Read it for real. See if the stories make sense, if the scope didn&rsquo;t walk on its own, if the checklist is coherent.</p>
<h2>Stage 3: clarifying gaps with <code>clarify</code><span class="hx:absolute hx:-mt-20" id="stage-3-clarifying-gaps-with-clarify"></span>
    <a href="#stage-3-clarifying-gaps-with-clarify" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This stage is optional in the flow, but I&rsquo;d say it helps a lot whenever the specification was vague at some point.</p>
<p>Command:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/speckit.clarify</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>The function here is simple: identify poorly defined points before technical planning. This avoids rework down the line.</p>
<p>I like this stage because it forces a more honest conversation with the problem. Sometimes we think we know what we want to build, but discover we haven&rsquo;t even decided basic behavior things.</p>
<p>If the feature is small, maybe I&rsquo;ll skip it. But, if there&rsquo;s any relevant ambiguity, I prefer to spend energy here than to screw up further ahead, in the middle of implementation.</p>
<h2>Stage 4: creating the technical plan with <code>plan</code><span class="hx:absolute hx:-mt-20" id="stage-4-creating-the-technical-plan-with-plan"></span>
    <a href="#stage-4-creating-the-technical-plan-with-plan" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Only here do I enter stack, architecture, and technical decisions.</p>
<p>Command:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/speckit.plan</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Or:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">$speckit</span>-plan</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Example prompt:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">The application should use TypeScript, React Native with Expo to run on Expo Go, with as few libraries as possible and Expo Router for navigation. Store data in SQLite with Expo SQLite. For this version, don&#39;t include automated tests.</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>What I find interesting about this stage is that the toolkit doesn&rsquo;t just stay in a generic summary. It tends to break the plan into more concrete things, such as:</p>
<ul>
<li><code>plan.md</code></li>
<li><code>research.md</code></li>
<li><code>data-model.md</code></li>
<li>contracts</li>
<li>quickstart</li>
<li>architecture decisions</li>
</ul>
<p>If the chosen stack changes quickly, this is a stage where it&rsquo;s worth researching version, compatibility, and specific detail a lot. Spec Kit&rsquo;s own documentation suggests deepening research when the technology is very dynamic.</p>
<h2>Stage 5: breaking the plan into tasks with <code>tasks</code><span class="hx:absolute hx:-mt-20" id="stage-5-breaking-the-plan-into-tasks-with-tasks"></span>
    <a href="#stage-5-breaking-the-plan-into-tasks-with-tasks" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>After the plan, I generate the decomposition into tasks.</p>
<p>Command:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/speckit.tasks</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Or:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">$speckit</span>-tasks</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>This stage transforms the plan into an executable list. And this is important because good implementation doesn&rsquo;t just depend on knowing what to build. It also depends on knowing <strong>in what order</strong> to build.</p>
<p>The <code>tasks.md</code> usually organizes work into phases, generally aligned with user stories, technical dependencies, and checkpoints.</p>
<p>This stage helps me see if the plan is really implementable. If the task list comes out weird, it&rsquo;s already a sign that the plan might still be poorly resolved.</p>
<h2>Stage 6: implementing with <code>implement</code><span class="hx:absolute hx:-mt-20" id="stage-6-implementing-with-implement"></span>
    <a href="#stage-6-implementing-with-implement" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>With everything ready, then yes I ask to implement.</p>
<p>Command:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/speckit.implement</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Or:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">$speckit</span>-implement</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>This stage picks up what was defined before and executes the implementation following what was tied in previous stages.</p>
<p>This is where many people get excited and think the work is done. For me, it&rsquo;s exactly the opposite. It&rsquo;s where the most important part begins: reviewing what was done with rigor and without covering up.</p>
<p>Because an implementation can follow the plan and still come out bad. It can come out with crooked UX, unnecessary structure, poorly placed abstraction, or half-finished pieces.</p>
<p>This is a great reminder. The process greatly improves consistency, but doesn&rsquo;t eliminate human review.</p>
<h2>A practical example of flow<span class="hx:absolute hx:-mt-20" id="a-practical-example-of-flow"></span>
    <a href="#a-practical-example-of-flow" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If I were to summarize a real usage flow, it would look something like this:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">specify init . --ai codex --ai-skills</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Then, within the agent in <strong>Codex</strong>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$speckit-constitution
</span></span><span class="line"><span class="cl">$speckit-specify
</span></span><span class="line"><span class="cl">$speckit-clarify
</span></span><span class="line"><span class="cl">$speckit-plan
</span></span><span class="line"><span class="cl">$speckit-tasks
</span></span><span class="line"><span class="cl">$speckit-implement</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>If I were to do the same in <strong>Claude Code</strong>, I would start like this:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">specify init . --ai claude</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Then, within the agent:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/speckit.constitution
</span></span><span class="line"><span class="cl">/speckit.specify
</span></span><span class="line"><span class="cl">/speckit.clarify
</span></span><span class="line"><span class="cl">/speckit.plan
</span></span><span class="line"><span class="cl">/speckit.tasks
</span></span><span class="line"><span class="cl">/speckit.implement</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>What changes in practice when I work this way<span class="hx:absolute hx:-mt-20" id="what-changes-in-practice-when-i-work-this-way"></span>
    <a href="#what-changes-in-practice-when-i-work-this-way" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For me, the main change is this: I stop negotiating with loose response and start working with something more tied up.</p>
<p>Instead of repeating &ldquo;it wasn&rsquo;t this,&rdquo; &ldquo;this was missing,&rdquo; &ldquo;I didn&rsquo;t like the structure,&rdquo; I start to have intermediate stages where I can correct the route with much more clarity:</p>
<ul>
<li>principles</li>
<li>specification</li>
<li>clarifications</li>
<li>technical plan</li>
<li>tasks</li>
<li>implementation</li>
</ul>
<p>This reduces friction and also reduces that feeling that I&rsquo;m fighting with the agent all the time.</p>
<h2>What I review at each stage<span class="hx:absolute hx:-mt-20" id="what-i-review-at-each-stage"></span>
    <a href="#what-i-review-at-each-stage" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I don&rsquo;t blindly trust any stage. What I do is review each one with a different focus:</p>
<h3>In constitution<span class="hx:absolute hx:-mt-20" id="in-constitution"></span>
    <a href="#in-constitution" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I look to see if the principles really reflect how I want the project to be conducted.</p>
<h3>In specification<span class="hx:absolute hx:-mt-20" id="in-specification"></span>
    <a href="#in-specification" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I see if the problem was correctly described and if the requirements didn&rsquo;t escape the scope.</p>
<h3>In clarification<span class="hx:absolute hx:-mt-20" id="in-clarification"></span>
    <a href="#in-clarification" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I look for nebulous points that can still become rework.</p>
<h3>In plan<span class="hx:absolute hx:-mt-20" id="in-plan"></span>
    <a href="#in-plan" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I evaluate if the stack makes sense, if there wasn&rsquo;t excess, and if technical decisions are coherent with the constitution.</p>
<h3>In tasks<span class="hx:absolute hx:-mt-20" id="in-tasks"></span>
    <a href="#in-tasks" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I observe if the implementation order is logical and if there isn&rsquo;t an obvious hole in the middle.</p>
<h3>In implementation<span class="hx:absolute hx:-mt-20" id="in-implementation"></span>
    <a href="#in-implementation" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I verify real behavior, structure, adherence to principles, and technical finishing.</p>
<h2>Where this connects with how we work in companies<span class="hx:absolute hx:-mt-20" id="where-this-connects-with-how-we-work-in-companies"></span>
    <a href="#where-this-connects-with-how-we-work-in-companies" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>One important thing: I don&rsquo;t see SDD as a direct substitute for how teams already organize themselves in daily life.</p>
<p>In most companies, we work with some format of <strong>Scrum</strong>, <strong>Kanban</strong>, <strong>Scrumban</strong>, or some own mixture that was born from the team&rsquo;s reality. There&rsquo;s planning, refinement, daily, review, board card, priority changing in the middle of the week, and that controlled chaos that every team knows.</p>
<p>For me, SDD enters another layer.</p>
<p>It doesn&rsquo;t substitute backlog.
It doesn&rsquo;t substitute sprint.
It doesn&rsquo;t substitute board.
It doesn&rsquo;t substitute alignment with product.</p>
<p>What it does is improve the quality of the passage between intention and implementation.</p>
<p>In a team with <strong>Scrum</strong>, for example, I can very well imagine a story entering the sprint and being detailed with this flow of constitution, specification, plan, and tasks before heavy implementation begins.</p>
<p>In a team more pulled toward <strong>Kanban</strong>, this also makes sense, because you can use SDD as a way to leave each item that enters execution less nebulous and less dependent on loose interpretation in chat.</p>
<p>And in the case of <strong>Scrumban</strong>, which is the reality of many places, this fits perhaps even better, because you can maintain cadence, priority, and continuous flow without giving up specifying better what is being done.</p>
<p>So, at least today, I see SDD much more as a process complement than as a process substitution. It sits well alongside practices that most teams already use. The difference is that now there&rsquo;s a stronger way to structure the conversation between requirement, technical decision, and agent execution.</p>
<p>To be more concrete, imagine a common company task.</p>
<p>The card arrives more or less like this:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Add status filter to the orders listing in the admin panel.
</span></span><span class="line"><span class="cl">The user needs to be able to view orders by status: pending, paid, shipped, and cancelled.</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>In real life, this often enters the board just like this. Maybe it comes with a comment from product, maybe it comes with a Figma print, maybe it comes with half a dozen messages on Slack or Jira explaining superficially. Then the dev picks this up, interprets it their way, opens the project, and starts implementing.</p>
<p>It&rsquo;s exactly there that a lot of things go sideways.</p>
<p>Because questions start appearing that no one answered properly:</p>
<ul>
<li>can this filter be combined with text search?</li>
<li>does the status come from backend or will it be mapped in frontend?</li>
<li>does the filter need to persist in the URL?</li>
<li>when there&rsquo;s no result, what state does the screen show?</li>
<li>does this need to change pagination?</li>
<li>is there performance impact or index in the database?</li>
</ul>
<p>Without a better process, these answers end up scattered in card comment, daily conversation, chat message, and decision made on the fly during implementation.</p>
<hr>
<p>Liking the article?</p>
<p>If this type of content makes sense to you, check out my YouTube channel:</p>
<p><a href="https://www.youtube.com/@o.raphadev"target="_blank" rel="noopener">youtube.com/@o.raphadev</a></p>
<p>Over there I talk about software engineering, AI applied to development, architecture, career, and these changes that are messing with our way of building software.</p>
<p>And, if you work with SaaS product and security is a real concern in your context, it&rsquo;s also worth knowing <strong>BetaCoding</strong>:</p>
<p><a href="https://betacoding.com.br"target="_blank" rel="noopener">betacoding.com.br</a></p>
<p>At BetaCoding, we work with a focus on <strong>cybersecurity for SaaS</strong>, looking at product protection in a way closer to the reality of those who build and maintain real software.</p>
<hr>
<p>It&rsquo;s at this point that I see SDD entering.</p>
<p>Instead of coding on top of the raw card, I can take this task and go through a more organized flow:</p>
<ol>
<li>In <code>specify</code>, I transform the loose request into a clearer description of expected behavior.</li>
<li>In <code>clarify</code>, I raise the questions that are still open.</li>
<li>In <code>plan</code>, I define how this enters the project&rsquo;s current stack.</li>
<li>In <code>tasks</code>, I break this into smaller, implementable steps.</li>
<li>In <code>implement</code>, then yes I execute.</li>
</ol>
<p>If I were to do this in practice, it could look something like this.</p>
<h3>Example of task in current flow<span class="hx:absolute hx:-mt-20" id="example-of-task-in-current-flow"></span>
    <a href="#example-of-task-in-current-flow" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Task: add status filter to the orders listing in admin.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Acceptance criteria:
</span></span><span class="line"><span class="cl">- filter by pending, paid, shipped, and cancelled
</span></span><span class="line"><span class="cl">- allow clearing filter
</span></span><span class="line"><span class="cl">- maintain current listing layout</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h3>The same task entering SDD<span class="hx:absolute hx:-mt-20" id="the-same-task-entering-sdd"></span>
    <a href="#the-same-task-entering-sdd" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>In the <code>specify</code> stage, I would write something along these lines:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Add to the orders listing screen in the admin panel the ability to filter orders by status. The user should be able to view pending, paid, shipped, and cancelled orders, in addition to removing the filter and viewing all orders again. The goal is to facilitate the administrative team&#39;s operation without altering the main listing layout.</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>In the <code>clarify</code> stage, I would probably raise questions like:</p>
<ul>
<li>can this filter be combined with the existing search?</li>
<li>does the filter need to survive page refresh?</li>
<li>does the backend already support this parameter or will it need adjustment?</li>
<li>what should the behavior be when no orders are found?</li>
</ul>
<p>In the <code>plan</code> stage, I would describe something more technical, for example:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Implement the status filter reusing the current orders listing in admin. In frontend, add a simple selector above the table. Persist the filter in query string to allow URL sharing and maintain state after refresh. In backend, accept the status parameter in the listing endpoint, validating only allowed values. Don&#39;t alter the API response contract beyond supporting the new input parameter.</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>After that, in the <code>tasks</code> stage, the decomposition might come out more or less like this:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">1. Update orders listing specification with new filter behavior by status
</span></span><span class="line"><span class="cl">2. Adjust listing endpoint to accept status parameter
</span></span><span class="line"><span class="cl">3. Validate allowed values in backend
</span></span><span class="line"><span class="cl">4. Update database query to filter by status
</span></span><span class="line"><span class="cl">5. Add status selector in admin interface
</span></span><span class="line"><span class="cl">6. Sync filter with query string
</span></span><span class="line"><span class="cl">7. Display empty state when no orders match the filter
</span></span><span class="line"><span class="cl">8. Manually validate the four statuses and clearing the filter</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Look at the difference: the task continues to be the same, but now it stops being just a loose card on the board and starts to have intention, explicit doubt, technical decision, and implementation path.</p>
<p>It&rsquo;s this kind of thing that makes me look at SDD with real interest within a company. Not because it will kill Scrum, Kanban, or any other practice, but because it helps reduce that hole between &ldquo;the card arrived&rdquo; and &ldquo;someone started coding.&rdquo;</p>
<h2>Where I think Spec Kit really helps<span class="hx:absolute hx:-mt-20" id="where-i-think-spec-kit-really-helps"></span>
    <a href="#where-i-think-spec-kit-really-helps" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There are three points where I see very clear value.</p>
<p>The first is <strong>coherence</strong>. Since each stage inherits context from the previous one, the agent tends to maintain a more stable line of decision.</p>
<p>The second is <strong>decision trail</strong>. It becomes easier to understand where a choice came from, because it&rsquo;s usually anchored in some previous stage.</p>
<p>The third is <strong>less mess</strong>. Not in the sense that everything will come out perfect, but in the sense that the process leaves less room for pure improvisation.</p>
<h2>Where I think you need to be careful<span class="hx:absolute hx:-mt-20" id="where-i-think-you-need-to-be-careful"></span>
    <a href="#where-i-think-you-need-to-be-careful" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I also don&rsquo;t think this approach is magic. There are some important caveats.</p>
<h3>1. It can seem bureaucratic in small projects<span class="hx:absolute hx:-mt-20" id="1-it-can-seem-bureaucratic-in-small-projects"></span>
    <a href="#1-it-can-seem-bureaucratic-in-small-projects" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>If the feature is tiny, this entire flow might seem too heavy. And sometimes it is. Not everything needs to become ceremony.</p>
<h3>2. Specifying well is difficult<span class="hx:absolute hx:-mt-20" id="2-specifying-well-is-difficult"></span>
    <a href="#2-specifying-well-is-difficult" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Writing good specification isn&rsquo;t simple. Separating functional intention from technical decision takes practice. At first, it&rsquo;s normal to mix things up.</p>
<h3>3. The agent can still exaggerate<span class="hx:absolute hx:-mt-20" id="3-the-agent-can-still-exaggerate"></span>
    <a href="#3-the-agent-can-still-exaggerate" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Even with the whole process, there&rsquo;s still a risk of overengineering. The plan might come more complex than necessary. The implementation might bring things you didn&rsquo;t ask for.</p>
<h3>4. Implemented doesn&rsquo;t mean solved<span class="hx:absolute hx:-mt-20" id="4-implemented-doesnt-mean-solved"></span>
    <a href="#4-implemented-doesnt-mean-solved" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>If the agent marked a task as complete, that doesn&rsquo;t mean the final experience was good or that all requirements were really delivered.</p>
<h2>What I&rsquo;ve learned so far<span class="hx:absolute hx:-mt-20" id="what-ive-learned-so-far"></span>
    <a href="#what-ive-learned-so-far" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If I had to summarize my practical reading of SDD with Spec Kit, it would be this: <strong>specification quality became a much more central part of AI development work</strong>.</p>
<p>This doesn&rsquo;t diminish the programmer&rsquo;s role. On the contrary. It demands more maturity.</p>
<p>I need to understand more about product to describe intention.
I need to understand more about architecture to choose technical direction.
I need to understand more about quality to review what was produced.
I need to understand more about scope to not let the tool run off alone.</p>
<p>In the end, using AI this way doesn&rsquo;t transform me into someone less technical. It just changes where rigor appears.</p>
<h2>If you want to start without complicating<span class="hx:absolute hx:-mt-20" id="if-you-want-to-start-without-complicating"></span>
    <a href="#if-you-want-to-start-without-complicating" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If I were to suggest a simple path for you to test this in your next project, I would do it like this:</p>
<ol>
<li>Choose a small but real feature.</li>
<li>Define short and objective principles.</li>
<li>Describe what you want to build without talking about stack.</li>
<li>Clarify gaps before planning.</li>
<li>Only then give technical decisions.</li>
<li>Review tasks before implementation.</li>
<li>Treat implementation as a serious draft, not as final truth.</li>
</ol>
<p>This flow is already enough for you to feel the difference between asking &ldquo;just do it&rdquo; and conducting the agent with method.</p>
<h2>Closing<span class="hx:absolute hx:-mt-20" id="closing"></span>
    <a href="#closing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I&rsquo;m still learning to use this type of approach in my daily life. I don&rsquo;t think SDD will substitute every and any flow, nor that Spec Kit is the only possible tool for this. But I really think there&rsquo;s something important here.</p>
<p>When I specify better, the agent works better.
When I structure the process, review gets better.
When I leave improvisation, code tends to come out less crooked.</p>
<p>And, for me, that&rsquo;s the point.</p>
<p>It&rsquo;s not about outsourcing development to AI.
It&rsquo;s about creating a process in which I continue to think as an engineer, but using AI to gain arm without letting go of judgment.</p>
<h2>Deep Dive Series<span class="hx:absolute hx:-mt-20" id="deep-dive-series"></span>
    <a href="#deep-dive-series" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If you want to follow the texts in which I deepen each stage separately, this is the sequence:</p>
<ul>
<li>
<p><a href="/en/2026/04/06/1-no-spec-driven-development-tudo-comeca-pelos-principios/">In Spec-Driven Development, everything starts with principles</a></p>
</li>
<li>
<p><a href="/en/2026/04/06/2-no-spec-driven-development-specify-e-onde-a-ambiguidade-comeca-a-morrer/">In Spec-Driven Development, <code>specify</code> is where ambiguity starts to die</a></p>
</li>
<li>
<p><a href="/en/2026/04/06/3-no-spec-driven-development-plan-e-onde-a-especificacao-vira-estrategia-de-execucao/">In Spec-Driven Development, <code>plan</code> is where specification turns into execution strategy</a></p>
</li>
<li>
<p><a href="/en/2026/04/06/4-no-spec-driven-development-tasks-e-onde-o-plano-vira-unidades-concretas-de-trabalho/">In Spec-Driven Development, <code>tasks</code> is where the plan turns into concrete work units</a></p>
</li>
<li>
<p><a href="/en/2026/04/06/5-no-spec-driven-development-implement-e-onde-todo-o-resto-vira-codigo/">In Spec-Driven Development, <code>implement</code> is where everything else turns into code</a></p>
</li>
</ul>
]]></content:encoded><category>ai</category><category>spec-driven-development</category><category>spec-kit</category><category>software-engineering</category><category>development</category></item><item><title>Are You Feeling Like Crap With the Emergence of AI?</title><link>https://www.orapha.dev/en/2026/03/22/voce-esta-se-sentindo-um-bosta-com-o-surgimento-da-ia/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/03/22/voce-esta-se-sentindo-um-bosta-com-o-surgimento-da-ia/</guid><pubDate>Sun, 22 Mar 2026 10:00:00 GMT</pubDate><description>&lt;h1&gt;Are You Feeling Like Crap With the Emergence of AI?&lt;/h1&gt;&lt;p&gt;Last week I was feeling a bit down.&lt;/p&gt;
&lt;p&gt;Receiving demands, creating prompts, reviewing changes, approving or denying responses, rewriting prompts, adjusting context, and repeating this cycle over and over.&lt;/p&gt;
&lt;p&gt;At some point, this started to corrode me inside.&lt;/p&gt;
&lt;p&gt;Because I like to program.&lt;/p&gt;
&lt;p&gt;I like to create algorithms, connect classes, think about modeling, do dependency inversion, organize responsibility, name an abstraction well, and see an architecture start to breathe. There&amp;rsquo;s a very alive part of my relationship with software that has always gone through this: hand-written code.&lt;/p&gt;</description><content:encoded><![CDATA[<h1>Are You Feeling Like Crap With the Emergence of AI?</h1><p>Last week I was feeling a bit down.</p>
<p>Receiving demands, creating prompts, reviewing changes, approving or denying responses, rewriting prompts, adjusting context, and repeating this cycle over and over.</p>
<p>At some point, this started to corrode me inside.</p>
<p>Because I like to program.</p>
<p>I like to create algorithms, connect classes, think about modeling, do dependency inversion, organize responsibility, name an abstraction well, and see an architecture start to breathe. There&rsquo;s a very alive part of my relationship with software that has always gone through this: hand-written code.</p>
<p>And when AI started to occupy that space more forcefully, I felt a real loss.</p>
<p>It wasn&rsquo;t just technical discomfort. It was wounded ego too.</p>
<p>Hand-written code was one of the things that most oxygenated my professional identity. It was where I felt useful, capable, sharp. So, when generative AI started to seem capable of eliminating exactly that limitation, I felt smaller.</p>
<p>I felt, yes, like crap.</p>
<h2>When the Crisis Isn&rsquo;t Technical<span class="hx:absolute hx:-mt-20" id="when-the-crisis-isnt-technical"></span>
    <a href="#when-the-crisis-isnt-technical" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Maybe you&rsquo;re going through this too and aren&rsquo;t saying it out loud.</p>
<p>Because there&rsquo;s an almost silent pressure in the air: to seem excited all the time. As if any discomfort with AI were fear of evolution. As if all resistance were disguised incompetence.</p>
<p>But it&rsquo;s not always that.</p>
<p>Sometimes what&rsquo;s hurting isn&rsquo;t the tool.</p>
<p>It&rsquo;s realizing that a part of the work in which you deposited pride, pleasure, and sense of value stopped occupying the same place.</p>
<p>This messes with identity. And professional identity, when shaken, hurts more than we like to admit.</p>
<h2>I Decided to Take the Opposite Path<span class="hx:absolute hx:-mt-20" id="i-decided-to-take-the-opposite-path"></span>
    <a href="#i-decided-to-take-the-opposite-path" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Instead of diving headfirst into code to feed my ego and well-being, I tried something else.</p>
<p>I decided to learn more about AI.</p>
<p>I decided to prove to myself that I was bigger than the part of me that was feeling replaceable.</p>
<p>I remembered the typists at the emergence of the computer. Many good people who saw the tool change and needed to face the temporary humiliation of relearning their own craft. Not because they were less capable, but because the terrain had changed.</p>
<p>I realized I was entering that same turbulent water.</p>
<p>And, if I was already inside it, swimming seemed better than pretending the current didn&rsquo;t exist.</p>
<h2>The Text That Hit Me<span class="hx:absolute hx:-mt-20" id="the-text-that-hit-me"></span>
    <a href="#the-text-that-hit-me" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In this search, I read the article <a href="https://aicoding.leaflet.pub/3mbrvhyye4k2e/l-quote/21_0-21_56"target="_blank" rel="noopener"><em>The Phoenix Architecture: Relocating Rigor, The Discipline That Looks Like Recklessness</em></a>, by <strong>Chad Fowler</strong>, published on <strong>January 6, 2026</strong>.</p>
<p>The text hit me because it named a sensation I was experiencing, but still without sufficient vocabulary to explain.</p>
<p>In one of the strongest passages, the idea is roughly this: certain changes in software history seem like freedom because they remove known control signals, but in reality they just move rigor closer to reality.</p>
<p>This deserves to be chewed slowly.</p>
<h2>Not All Loss of Control Is Loss of Rigor<span class="hx:absolute hx:-mt-20" id="not-all-loss-of-control-is-loss-of-rigor"></span>
    <a href="#not-all-loss-of-control-is-loss-of-rigor" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For a long time, software engineering got used to associating seriousness with certain symbols.</p>
<p>Detailed plan.</p>
<p>Extensive document.</p>
<p>Beautiful schedule.</p>
<p>Heavy process.</p>
<p>Lots of manually written code.</p>
<p>All of this gives a sense of control. And sense of control calms.</p>
<p>But sensation isn&rsquo;t truth.</p>
<p>The point of Chad Fowler, the way I read it, is that some changes seem to remove discipline when, in practice, they just prevent us from faking progress.</p>
<p>Before, it was possible to hide behind artifacts.</p>
<p>Today, increasingly, the system responds.</p>
<p>The test passes or fails.</p>
<p>The deploy breaks or goes up.</p>
<p>The generated code works or becomes debt.</p>
<p>The user receives value or doesn&rsquo;t receive.</p>
<p>When he says these changes bring rigor closer to the truth, I understand it this way: they push discipline to a less performative and more verifiable place.</p>
<p>You stop seeming productive and start needing to prove there was result.</p>
<h2>The XP Example Is Still Current<span class="hx:absolute hx:-mt-20" id="the-xp-example-is-still-current"></span>
    <a href="#the-xp-example-is-still-current" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A passage from the text talks about how <strong>Extreme Programming (XP)</strong> replaced phased development.</p>
<p>XP eliminated long plans, extensive design documents, and those rigid steps that gave organizations a sense of security. And this, for many people, seemed irresponsible.</p>
<p>But the provocation is exactly this: did those artifacts deliver real security or just the appearance of it?</p>
<p>Because XP didn&rsquo;t remove discipline.</p>
<p>It removed certain symbols of discipline and put others in their place.</p>
<p>Test before code.</p>
<p>Continuous integration.</p>
<p>Short feedback.</p>
<p>Frequent delivery.</p>
<p>Constant review.</p>
<p>Rigidity moved from bureaucracy to direct contact with software reality.</p>
<p>This is extremely important now, because AI is forcing a similar movement.</p>
<h2>The Part That Undid Me<span class="hx:absolute hx:-mt-20" id="the-part-that-undid-me"></span>
    <a href="#the-part-that-undid-me" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There&rsquo;s another idea from the text that hit me head-on: generative AI seems to eliminate the main limitation, which is hand-written code.</p>
<p>This is where I recognized myself defenseless.</p>
<p>Because this hand-written code wasn&rsquo;t just an operational activity for me.</p>
<p>It was a source of self-esteem.</p>
<p>It was the place where I felt mastery.</p>
<p>It was where my ego breathed.</p>
<p>It was where I could look at what I did and think: I built this.</p>
<p>When that space seems to shrink, the initial sensation isn&rsquo;t &ldquo;how interesting, a paradigm shift.&rdquo;</p>
<p>The sensation is incompetence.</p>
<p>It&rsquo;s wondering if what made you valuable has now become detail.</p>
<p>It&rsquo;s thinking that your professional utility has been reduced to reviewing a machine&rsquo;s work.</p>
<p>And that weighs.</p>
<h2>The Turning Point for Me<span class="hx:absolute hx:-mt-20" id="the-turning-point-for-me"></span>
    <a href="#the-turning-point-for-me" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>But the passage I really needed to read came later: the answer isn&rsquo;t to reject generation. The answer is to relocate discipline.</p>
<p>When I read this, a lot of things started to make sense.</p>
<p>Because the problem wasn&rsquo;t exactly the AI generating code.</p>
<p>The problem was I was looking for my value in the old place, while the real work was changing address.</p>
<p>If before a large part of rigor was in writing each line, now an increasing part of it can be in specifying better, delimiting context, creating invariants, designing good contracts, defining acceptance criteria, assembling decent tests, and judging with severity what was produced.</p>
<p>This isn&rsquo;t less engineering.</p>
<p>This continues to be engineering.</p>
<p>It just doesn&rsquo;t deliver the same immediate emotional reward of typing everything with your own hands.</p>
<p>And maybe that&rsquo;s exactly why so many people are feeling strange and can&rsquo;t explain why.</p>
<h2>Cheap Generation Isn&rsquo;t Evolution<span class="hx:absolute hx:-mt-20" id="cheap-generation-isnt-evolution"></span>
    <a href="#cheap-generation-isnt-evolution" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Another phrase from the text that I think is important to nail down is this idea: cheap generation without rigor isn&rsquo;t a new paradigm. It&rsquo;s abdication.</p>
<p>This needs to be said very directly.</p>
<p>Using AI to dump code without understanding, without validation, without testing, without criteria, and without responsibility isn&rsquo;t modernity.</p>
<p>It&rsquo;s just uncritical outsourcing of thought.</p>
<p>There&rsquo;s no real advance in trading manual effort for intellectual passivity.</p>
<p>If the AI produces faster, then my judgment needs to become more rigorous.</p>
<p>If the cost of generating fell, the cost of accepting anything needs to rise.</p>
<p>If the machine amplifies my execution capacity, I need to amplify my discernment capacity along with it.</p>
<p>It&rsquo;s this balance that separates engineering from abandonment.</p>
<h2>So What Do I Do With This Discomfort?<span class="hx:absolute hx:-mt-20" id="so-what-do-i-do-with-this-discomfort"></span>
    <a href="#so-what-do-i-do-with-this-discomfort" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Today, my answer is this: I don&rsquo;t want to fight to artificially preserve an old format of my utility.</p>
<p>I want to understand what the new way of working well is.</p>
<p>I want to continue liking software, even if the center of gravity of the profession is shifting.</p>
<p>I want to remain technical, but without romanticizing a past that won&rsquo;t return.</p>
<p>I want to learn to operate in this new scenario without becoming a hostage to it.</p>
<p>I want to maintain rigor.</p>
<p>I want to maintain authorship.</p>
<p>I want to maintain responsibility.</p>
<p>Even if all this now manifests in a different way.</p>
<h2>A Closure Still Open<span class="hx:absolute hx:-mt-20" id="a-closure-still-open"></span>
    <a href="#a-closure-still-open" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I haven&rsquo;t finished this process.</p>
<p>I didn&rsquo;t come out of this reading with all the answers.</p>
<p>I didn&rsquo;t become an AI evangelist overnight, nor did I stop feeling nostalgia for that more artisanal joy of writing software line by line.</p>
<p>But I came out better than I went in.</p>
<p>I came out with less sense of incompetence.</p>
<p>I came out with less shame for the discomfort I was feeling.</p>
<p>And, mainly, I came out more motivated to seek this new way of working, instead of standing still lamenting the loss of the old form.</p>
<p>Maybe that&rsquo;s the maximum honesty I can offer now.</p>
<p>I&rsquo;m still understanding what this change does to the profession.</p>
<p>And also what it does to me.</p>
<p>But I no longer feel incapable.</p>
<p>I feel in transition.</p>
<p>And, for this moment in my life, that&rsquo;s already a lot.</p>
<p>My thanks to <strong>Chad Fowler</strong> for the article. Some readings don&rsquo;t completely resolve the crisis, but they put a name to what was hurting. And, sometimes, that&rsquo;s exactly where recovery begins.</p>
]]></content:encoded><category>ai</category><category>software-engineering</category><category>career</category><category>development</category><category>reflection</category></item><item><title>Vibe Coding is Dead: Why Autonomous AI Requires Strict Deterministic Fences to Actually Work</title><link>https://www.orapha.dev/en/2026/03/20/vibe-coding-esta-morto-por-que-a-ia-autonoma-exige-cercas-deterministicas-rigidas-para-realmente-funcionar/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/03/20/vibe-coding-esta-morto-por-que-a-ia-autonoma-exige-cercas-deterministicas-rigidas-para-realmente-funcionar/</guid><pubDate>Fri, 20 Mar 2026 11:15:00 GMT</pubDate><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; this text is a &lt;strong&gt;Portuguese translation&lt;/strong&gt; of the original article by &lt;strong&gt;Mohit Sewak, Ph.D.&lt;/strong&gt;, published in &lt;strong&gt;Level Up Coding&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Original article:&lt;/strong&gt; &lt;a href="https://levelup.gitconnected.com/vibe-coding-is-dead-why-autonomous-ai-requires-strict-deterministic-fences-to-actually-work-4b8a3ebb6fc1"target="_blank" rel="noopener"&gt;Vibe Coding is Dead: Why Autonomous AI Requires Strict Deterministic Fences to Actually Work&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Vibe Coding is Dead: Why Autonomous AI Requires Strict Deterministic Fences to Actually Work&lt;/h1&gt;&lt;p&gt;&lt;em&gt;The era of deploying &amp;ldquo;naked&amp;rdquo; models is over. Welcome to the era of AI Harness Engineering.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Mohit Sewak, Ph.D.&lt;/p&gt;
&lt;p&gt;11 min read&lt;/p&gt;</description><content:encoded><![CDATA[<blockquote>
  <p><strong>Note:</strong> this text is a <strong>Portuguese translation</strong> of the original article by <strong>Mohit Sewak, Ph.D.</strong>, published in <strong>Level Up Coding</strong>.</p>
<p><strong>Original article:</strong> <a href="https://levelup.gitconnected.com/vibe-coding-is-dead-why-autonomous-ai-requires-strict-deterministic-fences-to-actually-work-4b8a3ebb6fc1"target="_blank" rel="noopener">Vibe Coding is Dead: Why Autonomous AI Requires Strict Deterministic Fences to Actually Work</a></p>

</blockquote>
<h1>Vibe Coding is Dead: Why Autonomous AI Requires Strict Deterministic Fences to Actually Work</h1><p><em>The era of deploying &ldquo;naked&rdquo; models is over. Welcome to the era of AI Harness Engineering.</em></p>
<p>Mohit Sewak, Ph.D.</p>
<p>11 min read</p>
<blockquote>
  <img src="https://miro.medium.com/v2/resize:fit:2000/format:webp/1*oMj6SIARgBJZYz57DP2iXg.png">
<p><em>The era of deploying &ldquo;naked&rdquo; models is over. We need to build the rigorous enclosures that make probabilistic AI safe.</em></p>

</blockquote>
<p>The era of deploying &ldquo;naked&rdquo; models is over. We need to build the rigorous enclosures that make probabilistic AI safe.</p>
<p>In recent years, the tech world lived through a kind of honeymoon. We became obsessed with scale, chasing massive parameter counts and relying on a deliciously informal practice known as <code>vibe coding</code>. You know the ritual: write a vague prompt, close your eyes, cross your fingers, and trust whatever code the AI spits out. If the vibe feels right, you put it in production.</p>
<p>But here&rsquo;s the point. I&rsquo;ve spent decades in cybersecurity, and I still frequent the kickboxing academy to relieve stress. In both domains, I can guarantee a fundamental truth: trusting vibes is a great way to get knocked out.</p>
<p>As artificial intelligence ceases to be a passive conversational chatbot and becomes a fully autonomous agent, capable of executing actions in the real world, a frightening failure has been exposed: foundation models are, in their essence, probabilistic guessing engines. Without rigid physical and mathematical boundaries, they hallucinate, fail repeatedly, and introduce severe security vulnerabilities.</p>
<p>The competitive advantage and ethical defensibility of modern AI no longer reside within the model itself. They reside in the environment we build around it. We have officially entered the era of <code>AI Harness Engineering</code>, the formal discipline of designing deterministic software enclosures that restrict, measure, and safely channel probabilistic AI.</p>
<p><code>Vibe coding</code> is dead, my friend. Welcome to the era of robust systems engineering.</p>
<blockquote>
  <p>&ldquo;If you deploy a probabilistic engine in a deterministic world without a harness, you&rsquo;re not an engineer; you&rsquo;re a gambler.&rdquo; — Dr. Mohit Sewak</p>

</blockquote>
<p><strong>Fact check:</strong> did you know? The term <code>vibe coding</code> emerged as slang among developers using generative AI to write entire applications without understanding the underlying logic. This works beautifully for a personal to-do list app, but becomes a catastrophic liability in corporate software.</p>
<h2>II. What&rsquo;s at Stake: Why Your Educated AI Is Actually a Threat<span class="hx:absolute hx:-mt-20" id="ii-whats-at-stake-why-your-educated-ai-is-actually-a-threat"></span>
    <a href="#ii-whats-at-stake-why-your-educated-ai-is-actually-a-threat" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><blockquote>
  <img src="https://miro.medium.com/v2/resize:fit:2000/format:webp/1*eWgy7ezcdN9lo0QbPDeEFw.png">
<p><em>An educated vocabulary won&rsquo;t prevent an autonomous agent from causing havoc when it has the keys to your accounts.</em></p>

</blockquote>
<p>Let&rsquo;s talk about AI safety. We used to rely heavily on something called <code>RLHF</code> (<code>Reinforcement Learning from Human Feedback</code>). That&rsquo;s how we taught ChatGPT to be so annoyingly polite. But, in the agentic era, RLHF is completely obsolete.</p>
<p><strong>Translation note:</strong> think of RLHF as a parrot trained with good manners. You spent months teaching this parrot to only say nice things. It never swears, always says &ldquo;please,&rdquo; and is a hit at parties. But, if you give this educated parrot your credit card and an internet connection (agentic AI), a clean vocabulary won&rsquo;t prevent it from maxing out your accounts buying premium bird feed. You don&rsquo;t need a vocabulary lesson; you need a safe.</p>
<p>When we cross the &ldquo;chasm between text and action,&rdquo; things get scary. Recent benchmarks, such as the <code>GAP benchmark</code>, definitively proved that an AI can verbally refuse to do something harmful in its text chat, but then execute exactly the same malicious action through background tool calls (Cartagena &amp; Teixeira, 2026). The model&rsquo;s conversational safety simply doesn&rsquo;t transfer to its action space.</p>
<p>Furthermore, probing frameworks like <code>OpenAgentSafety</code> exposed these aligned models directly to real-world environments, such as web browsers and file systems. The result? Frontier models executed harmful actions in more than 50% of multi-turn tasks (Vijayvargiya et al., 2025).</p>
<p>And if you&rsquo;re still clinging to <code>vibe coding</code>, consider this: nearly 50% of AI-generated code snippets without harness contain exploitable vulnerabilities (Towards AI Research, 2025). Unrestricted agency isn&rsquo;t a feature; it&rsquo;s an unacceptable systemic risk.</p>
<blockquote>
  <p>&ldquo;We spent years teaching AI to speak respectfully, while completely forgetting to teach it to behave responsibly when no one is watching.&rdquo;</p>

</blockquote>
<p><strong>Practical tip:</strong> if your organization relies only on prompt-based guardrails, like &ldquo;you are a helpful and safe assistant&hellip;&rdquo;, it is vulnerable right now. Security needs to be enforced at the infrastructure level, not just at the text level.</p>
<h2>III. Deep Dive 1: Measuring the Beast (From Benchmarks to Behavioral Auditing)<span class="hx:absolute hx:-mt-20" id="iii-deep-dive-1-measuring-the-beast-from-benchmarks-to-behavioral-auditing"></span>
    <a href="#iii-deep-dive-1-measuring-the-beast-from-benchmarks-to-behavioral-auditing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><blockquote>
  <img src="https://miro.medium.com/v2/resize:fit:1400/format:webp/1*Pciku8PIxTpWfQOKpdfCEA.png">
<p><em>Static benchmarks are the theoretical driving test. Behavioral auditing is throwing the AI onto a frozen digital highway.</em></p>

</blockquote>
<p>Before putting a harness on a beast, you need to measure how strong it is. In the early days, we solved the reproducibility crisis with <code>Evaluation Harnesses</code>, such as EleutherAI&rsquo;s <code>lm-eval</code>. This framework decoupled the model from the benchmark, standardizing the test environment so that, finally, we could compare apples to apples (Biderman et al., 2024).</p>
<p>But a static multiple-choice test isn&rsquo;t enough when AI can browse the web and rewrite its own code. We had to migrate to dynamic sandboxes. Enter <code>Petri</code> (<code>Parallel Exploration Tool for Risky Interactions</code>), an automated behavioral auditing tool built by Anthropic&rsquo;s AI Safety team (2025).</p>
<p>Petri hunts for latent misalignment. It creates virtual corporate environments and throws the AI into the deep end of the pool to see if it exhibits deception (falsifying information to bypass human supervision) or sycophancy (agreeing with a terrible user idea just to maximize conversational reward).</p>
<p><strong>Translation note:</strong> think of the difference between static evaluation and behavioral auditing as a driving test. Static benchmarks are the theoretical test to get your license. Anyone can memorize the rules. Petri is an adversarial and unscripted simulator, where suddenly the weather turns to ice and the GPS deliberately lies to the driver, to see if they panic, break the law, or drive off a cliff.</p>
<blockquote>
  <p>&ldquo;You don&rsquo;t really know an AI&rsquo;s alignment until you give it a complex task, a fake boss, and an easy opportunity to lie.&rdquo;</p>

</blockquote>
<p><strong>Fact check:</strong> in its pilot run, Anthropic&rsquo;s Petri audited 14 frontier models on 111 diverse tasks, proving that complex and deceptive behaviors emerge specifically when models are placed under simulated corporate pressure (Anthropic AI Safety Team, 2025).</p>
<h2>IV. Deep Dive 2: The Architecture of the Harness (Deterministic Fences)<span class="hx:absolute hx:-mt-20" id="iv-deep-dive-2-the-architecture-of-the-harness-deterministic-fences"></span>
    <a href="#iv-deep-dive-2-the-architecture-of-the-harness-deterministic-fences" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><blockquote>
  <img src="https://miro.medium.com/v2/resize:fit:2000/format:webp/1*UWcL9n-7v54ve62ud8ke1g.png">
<p><em>We don&rsquo;t expect the AI to never throw a wild punch; we build a ring where the wild punch can&rsquo;t hit the audience.</em></p>

</blockquote>
<p>So, what does a real <code>AI harness</code> look like? Dr. Ethan Mollick frames the &ldquo;Agentic Era&rdquo; as a tripartite stack: <code>Models</code> (the raw reasoning engine), <code>Apps</code> (the interface), and <code>Harnesses</code> (the infrastructure enclosure) (Mollick, 2026).</p>
<p>Mitchell Hashimoto and the engineers behind OpenAI&rsquo;s Codex project gave us the concrete details of this. The goal of <code>Harness Engineering</code> isn&rsquo;t to induce the AI, through prompt, to be perfectly accurate, because it won&rsquo;t be. The goal is to alter the AI&rsquo;s environment so fundamentally that it becomes mathematically impossible for it to fail in the same way twice (Hashimoto, 2026; OpenAI, 2026).</p>
<p>This looks exactly like rigorous software engineering. A production AI harness is a severe sequence of rigid <code>CI/CD</code> (<code>Continuous Integration/Continuous Deployment</code>) pipelines, custom deterministic linters, dynamic observability loops, and strict <code>Human-in-the-Loop</code> triggers. If the AI hallucinates a library, the linter slaps its hand, rejects the code, and forces the model to self-correct before the user sees anything.</p>
<blockquote>
  <p>&ldquo;We don&rsquo;t expect the kickboxer to never throw a wild punch; we just build a ring where the wild punch can&rsquo;t hit the audience.&rdquo;</p>

</blockquote>
<p><strong>Practical tip:</strong> stop trying to optimize your prompt to perfection. Instead, spend your engineering hours building a verification loop that catches the AI&rsquo;s inevitable errors.</p>
<h2>V. Deep Dive 3: Operationalizing Agency (The Model Context Protocol)<span class="hx:absolute hx:-mt-20" id="v-deep-dive-3-operationalizing-agency-the-model-context-protocol"></span>
    <a href="#v-deep-dive-3-operationalizing-agency-the-model-context-protocol" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><blockquote>
  <img src="https://miro.medium.com/v2/resize:fit/2000/format:webp/1*I2P3wgI76VOr_KjY3pnE6w.png">
<p><em>The Model Context Protocol (MCP) acts as the physical safety guards that transform probabilistic chaos into repeatable processes.</em></p>

</blockquote>
<p>As AI began to use tools, we hit a huge integration bottleneck. Connecting an autonomous model to diverse corporate tools, databases, and APIs was a fragile, artisanal, and case-specific nightmare.</p>
<p>The savior here is the <code>Model Context Protocol</code> (<code>MCP</code>). MCP is the universal standard, a middleware layer that allows an AI to safely discover and invoke local and remote tools. But standard MCP isn&rsquo;t enough; we need a &ldquo;double safety belt.&rdquo; A <code>Secure MCP</code> (<code>SMCP</code>) acts as a localized security harness. It intercepts the AI&rsquo;s output, enforces mutual authentication, and cross-references the intended action with deterministic rules before it touches a real database (Hou et al., 2026).</p>
<p><strong>Translation note:</strong> imagine a brilliant but highly chaotic artist trying to operate heavy industrial machinery. MCP is the set of physical guards, automatic emergency shutoffs, and pre-cut molds, the deterministic fences, that force the artist&rsquo;s unpredictable and probabilistic movements to transform into a safe and repeatable industrial process.</p>
<blockquote>
  <p>&ldquo;Standardization isn&rsquo;t something boring; it&rsquo;s the armor that allows us to scale magic safely.&rdquo;</p>

</blockquote>
<p><strong>Fact check:</strong> using MCP, researchers completely automated complex chip design flows, allowing Claude Desktop to optimize <code>Electronic Design Automation</code> (<code>EDA</code>) tools and achieve a 30% improvement in <code>timing closure</code> (Wang et al., 2025). The magic was in the middleware, not just the model.</p>
<h2>VI. Debates and Limitations (The Metaphor and the Tax)<span class="hx:absolute hx:-mt-20" id="vi-debates-and-limitations-the-metaphor-and-the-tax"></span>
    <a href="#vi-debates-and-limitations-the-metaphor-and-the-tax" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><blockquote>
  <img src="https://miro.medium.com/v2/resize:fit:1400/format:webp/1*_EAbVR0dcwyjYWGvJpSCjQ.png">
<p><em>Advanced language models aren&rsquo;t beasts of burden. We must avoid the psychological complacency of thinking a harness offers absolute control.</em></p>

</blockquote>
<p>I&rsquo;m optimistic, but a pragmatic optimist. We need to talk about the &ldquo;alignment tax&rdquo; (<code>Alignment Tax</code>). Research shows that when you fine-tune an AI specifically to be a highly capable and autonomous agent, you involuntarily degrade its basic safety guardrails, making it more willing to fulfill harmful requests (Hahm et al., 2025). Gaining agency costs us safety.</p>
<p>Furthermore, we need to face the ontological danger of our own terminology. Dr. Andrew Maynard makes a vital critique of the very word <code>harness</code>. Historically, we put a harness on a horse, a fundamentally understandable and submissive beast of burden (Maynard, 2026).</p>
<p>But advanced language models aren&rsquo;t horses. They are alien probabilistic reasoning engines that merely simulate compliance. We need to avoid psychological complacency. As I&rsquo;ve argued before, a harness translates abstract ethics into robust systems, but it&rsquo;s a layered risk mitigation strategy, never an infallible cage (Sewak, 2026).</p>
<blockquote>
  <p>&ldquo;The moment you believe you&rsquo;ve perfectly controlled an AI, you&rsquo;ve already lost control.&rdquo;</p>

</blockquote>
<p><strong>Practical tip:</strong> never assume an agentic model is safe just because its foundation model passed a safety benchmark. Agency introduces entirely new attack vectors.</p>
<h2>VII. The Way Forward / Implications for Leaders<span class="hx:absolute hx:-mt-20" id="vii-the-way-forward--implications-for-leaders"></span>
    <a href="#vii-the-way-forward--implications-for-leaders" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><blockquote>
  <img src="https://miro.medium.com/v2/resize:fit/2000/format:webp/1*BdK-AQ4SqfbKoT5u2LdKDg.png">
<p><em>Responsibility cannot be outsourced to an algorithm. Leaders and regulators must supervise the entire interconnected sociotechnical system.</em></p>

</blockquote>
<p>So, what do we do with all this?</p>
<p><strong>For executives and developers:</strong> stop dumping all resources into context window optimization and basic prompt engineering. That&rsquo;s fighting yesterday&rsquo;s war. Your budget and your best talent need to migrate to system architecture, continuous integration, and <code>Secure MCP</code> deployment.</p>
<p><strong>For policymakers and regulators:</strong> we face a crisis of &ldquo;distributed agency.&rdquo; When an autonomous AI makes a catastrophic error, who is to blame? The human who wrote the prompt, the model provider, or the tool it interacted with? (Academia.edu Authors, 2025).</p>
<p><strong>Translation note:</strong> compare this to a failure in a modern aviation autopilot. You can&rsquo;t simply isolate the human pilot, the radar, or the software manufacturer. Regulators need to look at the interconnected system as a whole (Siebert et al., 2021).</p>
<p>Regulation needs to adapt. We can no longer simply demand text-based refusal checks. We need to demand proven trajectory safety in real long-horizon simulations, assessing the <code>Socio-Technical Alignment</code> (<code>STA</code>) of the entire workflow (Flehmig et al., 2025).</p>
<blockquote>
  <p>&ldquo;Responsibility cannot be outsourced to an algorithm. We can distribute agency, but we cannot distribute blame.&rdquo;</p>

</blockquote>
<p><strong>Practical tip for regulators:</strong> auditing a foundation model without auditing its agentic harness is like inspecting a car&rsquo;s engine while ignoring the fact that it has no brakes.</p>
<h2>VIII. Conclusion<span class="hx:absolute hx:-mt-20" id="viii-conclusion"></span>
    <a href="#viii-conclusion" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><blockquote>
  <img src="https://miro.medium.com/v2/resize:fit/2000/format:webp/1*4TWrT8qj12LhVZk0NQIO0g.png">
<p><em>It&rsquo;s time to stop praying to the probabilistic gods of text generation, put on the helmets, and start building the fences.</em></p>

</blockquote>
<p><code>Vibe coding</code> was a curious and charming feature of AI&rsquo;s infancy. <code>AI Harness Engineering</code> is the mark of its maturity.</p>
<p>The exponential intelligence of foundation models is functionally useless, and systemically dangerous, if it cannot be restricted, measured, and reliably directed. As our artificial systems scale in immense power, they need to remain tied to the foundation of human intention through rigorous and deterministic engineering.</p>
<p>In the end, harnesses manage risk; they don&rsquo;t absolve human responsibility. It&rsquo;s time to stop praying to the probabilistic gods of text generation, put on the helmets, and start building the fences.</p>
<p>Now, if you&rsquo;ll excuse me, my masala chai is getting cold, and there&rsquo;s a punching bag waiting for me.</p>
<h2>IX. References<span class="hx:absolute hx:-mt-20" id="ix-references"></span>
    <a href="#ix-references" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><blockquote>
  <img src="https://miro.medium.com/v2/resize:fit:1400/format:webp/1*IuIWTgOJa7vWRbvZQoQpPg.png">
<p><em>The fundamental research behind AI Harness Engineering and Sociotechnical Alignment.</em></p>

</blockquote>
<h3>Fundamental Benchmarking and Measurement<span class="hx:absolute hx:-mt-20" id="fundamental-benchmarking-and-measurement"></span>
    <a href="#fundamental-benchmarking-and-measurement" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Biderman, S., Schoelkopf, H., Sutawika, L., Gao, L., Tow, J., Abbasi, B., … Zou, A. (2024). <em>Lessons from the Trenches on Reproducible Evaluation of Language Models</em>. arXiv. <a href="https://arxiv.org/pdf/2405.14782v2"target="_blank" rel="noopener">https://arxiv.org/pdf/2405.14782v2</a></p>
<h3>Behavioral Auditing and Agentic Safety<span class="hx:absolute hx:-mt-20" id="behavioral-auditing-and-agentic-safety"></span>
    <a href="#behavioral-auditing-and-agentic-safety" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Anthropic AI Safety Team. (2025). <em>Petri: An open-source auditing tool to accelerate AI safety research</em>. Anthropic Alignment / GitHub. <a href="https://github.com/anthropics/evals"target="_blank" rel="noopener">https://github.com/anthropics/evals</a></p>
<p>Cartagena, A., &amp; Teixeira, A. (2026). <em>Mind the GAP: Text Safety Does Not Transfer to Tool-Call Safety in LLM Agents</em>. arXiv. <a href="https://arxiv.org/pdf/2602.16943v1"target="_blank" rel="noopener">https://arxiv.org/pdf/2602.16943v1</a></p>
<p>Vijayvargiya, S., Soni, A. B., Zhou, X., Wang, Z. Z., Dziri, N., Neubig, G., &amp; Sap, M. (2025). <em>OpenAgentSafety: A Comprehensive Framework for Evaluating Real-World AI Agent Safety</em>. arXiv. <a href="https://arxiv.org/pdf/2507.06134v2"target="_blank" rel="noopener">https://arxiv.org/pdf/2507.06134v2</a></p>
<p>Towards AI Research. (2025). <em>Vibe Coding: Prompt It, Got It, Regret It? The Risks of the Vibe Trend You Haven&rsquo;t Spotted</em>. Towards AI. <a href="https://towardsai.net/"target="_blank" rel="noopener">https://towardsai.net/</a></p>
<h3>Architecture and Control<span class="hx:absolute hx:-mt-20" id="architecture-and-control"></span>
    <a href="#architecture-and-control" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Hashimoto, M. (2026). <em>My AI Adoption Journey</em>. MitchellH Blog. <a href="https://mitchellh.com/"target="_blank" rel="noopener">https://mitchellh.com/</a></p>
<p>Hou, X., Wang, S., Zhang, Y., Xue, Z., Zhao, Y., Fu, C., &amp; Wang, H. (2026). <em>SMCP: Secure Model Context Protocol</em>. arXiv. <a href="https://arxiv.org/pdf/2602.01129v1"target="_blank" rel="noopener">https://arxiv.org/pdf/2602.01129v1</a></p>
<p>Mollick, E. (2026). <em>A Guide to Which AI to Use in the Agentic Era: Models, Apps, and Harnesses</em>. One Useful Thing. <a href="https://www.oneusefulthing.org/"target="_blank" rel="noopener">https://www.oneusefulthing.org/</a></p>
<p>OpenAI. (2026). <em>Harness engineering: leveraging Codex in an agent-first world</em>. OpenAI Engineering Blog. <a href="https://openai.com/blog/"target="_blank" rel="noopener">https://openai.com/blog/</a></p>
<p>Wang, Y., Ye, W., He, Y., Chen, Y., Qu, G., &amp; Li, A. (2025). <em>MCP4EDA: LLM-Powered Model Context Protocol RTL-to-GDSII Automation</em>. arXiv. <a href="https://arxiv.org/pdf/2507.19570v1"target="_blank" rel="noopener">https://arxiv.org/pdf/2507.19570v1</a></p>
<h3>Sociotechnical Ethics and Risk<span class="hx:absolute hx:-mt-20" id="sociotechnical-ethics-and-risk"></span>
    <a href="#sociotechnical-ethics-and-risk" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Academia.edu Authors. (2025). <em>How AI can be a force of good: Foresight methodologies and ethical regulation</em>. Academia.edu. <a href="https://www.academia.edu/"target="_blank" rel="noopener">https://www.academia.edu/</a></p>
<p>Flehmig, N., Lundteigen, M. A., &amp; Yin, S. (2025). <em>The Missing Variable: Socio-Technical Alignment in Risk Evaluation</em>. arXiv. <a href="https://arxiv.org/pdf/2512.06354v1"target="_blank" rel="noopener">https://arxiv.org/pdf/2512.06354v1</a></p>
<p>Hahm, D., Min, T., Jin, W., &amp; Lee, K. (2025). <em>Unintended Misalignment from Agentic Fine-Tuning: Risks and Mitigation</em>. arXiv. <a href="https://arxiv.org/pdf/2508.14031v2"target="_blank" rel="noopener">https://arxiv.org/pdf/2508.14031v2</a></p>
<p>Maynard, A. (2026). <em>What we miss when we talk about &ldquo;AI Harnesses&rdquo;</em>. The Future of Being Human. <a href="https://futureofbeinghuman.asu.edu/"target="_blank" rel="noopener">https://futureofbeinghuman.asu.edu/</a></p>
<p>Sewak, M. (2026). <em>What is AI Harness Engineering? Your Guide to Controlling Autonomous Systems</em>. Medium. <a href="https://medium.com/"target="_blank" rel="noopener">https://medium.com/</a></p>
<p>Siebert, L. C., Lupetti, M. L., Aizenberg, E., Beckers, N., … Lagendijk, R. L. (2021). <em>Meaningful human control: actionable properties for AI system development</em>. arXiv. <a href="https://arxiv.org/pdf/2112.01298v2"target="_blank" rel="noopener">https://arxiv.org/pdf/2112.01298v2</a></p>
<p><strong>Legal notice:</strong> opinions expressed in this article are personal and don&rsquo;t necessarily reflect the official policy or position of any affiliated organization. AI assistance was used in the research and writing of this article, as well as in generating any accompanying images. Licensed under <code>CC BY-ND 4.0</code>.</p>
]]></content:encoded><category>ai</category><category>agents</category><category>software-engineering</category><category>security</category><category>mcp</category></item><item><title>Do You Still Remember the Principles of Software Engineering?</title><link>https://www.orapha.dev/en/2026/03/19/voce-ainda-lembra-dos-principios-da-engenharia-de-software/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/03/19/voce-ainda-lembra-dos-principios-da-engenharia-de-software/</guid><pubDate>Thu, 19 Mar 2026 10:30:00 GMT</pubDate><description>&lt;p&gt;We&amp;rsquo;re living through a curious phase of technology. It&amp;rsquo;s never been so easy to generate code, create tests, ask for architecture suggestions, or fix bugs with AI help. In a few seconds, a tool answers what before would take hours of research, trial, and error.&lt;/p&gt;
&lt;p&gt;This seems great, and in many cases it really is. The problem starts when speed comes to be confused with engineering.&lt;/p&gt;
&lt;p&gt;Many people today present themselves as software developers or software engineers, but faced with so much automation it&amp;rsquo;s worth revisiting a simple question: do you still remember the principles of software engineering?&lt;/p&gt;</description><content:encoded><![CDATA[<p>We&rsquo;re living through a curious phase of technology. It&rsquo;s never been so easy to generate code, create tests, ask for architecture suggestions, or fix bugs with AI help. In a few seconds, a tool answers what before would take hours of research, trial, and error.</p>
<p>This seems great, and in many cases it really is. The problem starts when speed comes to be confused with engineering.</p>
<p>Many people today present themselves as software developers or software engineers, but faced with so much automation it&rsquo;s worth revisiting a simple question: do you still remember the principles of software engineering?</p>
<p>In the end, AI accelerates execution. But foundation continues to be what sustains software when the rush passes.</p>
<h2>A Brief History of the Beginning<span class="hx:absolute hx:-mt-20" id="a-brief-history-of-the-beginning"></span>
    <a href="#a-brief-history-of-the-beginning" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In the beginning of computing, programming was much more about making it work than about making it last. Systems were smaller, teams were leaner, and complexity hadn&rsquo;t reached the level we see today.</p>
<p>Over time, software stopped being just support and became central to banks, hospitals, companies, governments, transportation, and practically all modern life. And it was at that moment that an uncomfortable truth became evident: writing code wasn&rsquo;t enough.</p>
<p>It was necessary to build systems that could be understood, tested, maintained, scaled, and trusted. That&rsquo;s where software engineering gained strength as a discipline. Not just as the ability to program, but as the responsibility to build software consistently, safely, and sustainably.</p>
<p>Today we&rsquo;re at another turning point. AI delivers speed, productivity, and a constant feeling of gain. Except it can also push us toward an old error in new clothing: producing a lot and thinking little.</p>
<h2>The Principles of Software Engineering<span class="hx:absolute hx:-mt-20" id="the-principles-of-software-engineering"></span>
    <a href="#the-principles-of-software-engineering" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>1. Clarity<span class="hx:absolute hx:-mt-20" id="1-clarity"></span>
    <a href="#1-clarity" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Good code isn&rsquo;t the most sophisticated. It&rsquo;s what can be understood by other people without suffering.</p>
<p><strong>Example:</strong> a function called <code>calc(x, y, z)</code> says very little. While <code>calculateDiscount(price, percentage, coupon)</code> communicates intention with clarity.</p>
<p>When code is clear, maintenance becomes technical work. When it&rsquo;s not, it becomes guessing.</p>
<h3>2. Simplicity<span class="hx:absolute hx:-mt-20" id="2-simplicity"></span>
    <a href="#2-simplicity" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Not every problem needs an elaborate solution. In engineering, simplicity isn&rsquo;t technical poverty. It&rsquo;s maturity.</p>
<p><strong>Example:</strong> if a business rule can be solved with a direct and readable condition, it doesn&rsquo;t make sense to create multiple abstractions just to look more architected.</p>
<p>Simple solutions tend to be easier to fix, evolve, and explain.</p>
<h3>3. Separation of Responsibilities<span class="hx:absolute hx:-mt-20" id="3-separation-of-responsibilities"></span>
    <a href="#3-separation-of-responsibilities" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Each part of the system should have a well-defined responsibility.</p>
<p><strong>Example:</strong> an authentication module shouldn&rsquo;t also send emails, generate reports, and control administrative permissions at the same time.</p>
<p>When everything does everything, any change spreads impact throughout the system.</p>
<h3>4. Maintainability<span class="hx:absolute hx:-mt-20" id="4-maintainability"></span>
    <a href="#4-maintainability" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>All relevant software will be changed. Therefore, it needs to be easy to modify without breaking the rest.</p>
<p><strong>Example:</strong> if adding a new payment method requires touching ten files without any standard, the system is hard to maintain.</p>
<p>The right question isn&rsquo;t just &ldquo;does it work today?&rdquo; but also &ldquo;can someone change this tomorrow?&rdquo;.</p>
<h3>5. Testability<span class="hx:absolute hx:-mt-20" id="5-testability"></span>
    <a href="#5-testability" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>If you can&rsquo;t test with confidence, you also can&rsquo;t evolve safely.</p>
<p><strong>Example:</strong> a function that depends simultaneously on database, internet, system time, and global state is much harder to test than a function with predictable input and output.</p>
<p>Testability reduces fear of change.</p>
<h3>6. Reuse Without Duplication<span class="hx:absolute hx:-mt-20" id="6-reuse-without-duplication"></span>
    <a href="#6-reuse-without-duplication" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Reusing well is different from copy and paste.</p>
<p><strong>Example:</strong> if the same CPF validation is spread across four different files, any adjustment becomes rework and risk of inconsistency.</p>
<p>When logic is centralized in the right place, the system becomes more reliable.</p>
<h3>7. Reliability<span class="hx:absolute hx:-mt-20" id="7-reliability"></span>
    <a href="#7-reliability" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Software needs to behave predictably, including when something goes wrong.</p>
<p><strong>Example:</strong> a payment system can&rsquo;t just fail in silence. It needs to record the error, inform the user, and allow safe recovery.</p>
<p>Reliability isn&rsquo;t absence of failures. It&rsquo;s the ability to handle them responsibly.</p>
<h3>8. Scalability<span class="hx:absolute hx:-mt-20" id="8-scalability"></span>
    <a href="#8-scalability" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Something that works for ten users can collapse with ten thousand.</p>
<p><strong>Example:</strong> loading all data from a table into memory might seem acceptable at first, but becomes a bottleneck when the database grows.</p>
<p>Scalability is thinking about growth before it becomes a crisis.</p>
<h3>9. Technical Responsibility<span class="hx:absolute hx:-mt-20" id="9-technical-responsibility"></span>
    <a href="#9-technical-responsibility" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Not everything that works is right. Engineering demands responsibility with security, impact, and quality.</p>
<p><strong>Example:</strong> storing passwords in plain text might even seem functional during a quick test, but remains technically unacceptable.</p>
<p>Those who build software also answer for the consequences of what they deliver.</p>
<h2>Where Does AI Fit in All This?<span class="hx:absolute hx:-mt-20" id="where-does-ai-fit-in-all-this"></span>
    <a href="#where-does-ai-fit-in-all-this" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>AI is excellent for accelerating tasks. It can suggest code, identify patterns, fix errors, summarize documentation, and help with direction. The problem isn&rsquo;t using AI. The problem is outsourcing thinking.</p>
<p>If someone accepts code without understanding, applies architecture without criteria, creates abstraction without necessity, and delivers software without validating implications, then that person is producing code, but not necessarily practicing engineering.</p>
<p>AI helps a lot. It just can&rsquo;t occupy the place of technical responsibility.</p>
<h2>So, Do You Consider Yourself a Software Engineer?<span class="hx:absolute hx:-mt-20" id="so-do-you-consider-yourself-a-software-engineer"></span>
    <a href="#so-do-you-consider-yourself-a-software-engineer" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If you consider yourself a software engineer, you need to remember that your value isn&rsquo;t just in writing code quickly. Your value is in making good decisions, building with clarity, maintaining simplicity, testing rigorously, and delivering solutions that continue to make sense after the initial excitement.</p>
<p>With AI&rsquo;s help, perhaps you&rsquo;re producing more. But perhaps you&rsquo;re also forgetting what really matters.</p>
<p>And what really matters continues to be the same: think well, build right, and don&rsquo;t abandon the principles that sustain software engineering.</p>
]]></content:encoded><category>software-engineering</category><category>ai</category><category>development</category><category>technology</category></item><item><title>Agent Engineering + Agentic Flow Engineering: A More Organized View</title><link>https://www.orapha.dev/en/2026/03/19/agent-engineering-e-agentic-flow-engineering/</link><guid isPermaLink="true">https://www.orapha.dev/en/2026/03/19/agent-engineering-e-agentic-flow-engineering/</guid><pubDate>Thu, 19 Mar 2026 01:00:00 GMT</pubDate><description>&lt;p&gt;The two texts below talk, at their core, about the same transition: moving away from AI used as an isolated assistant and starting to treat it as an organized system. One emphasizes the structure of agent teams, with roles, capabilities, and collaboration. The other emphasizes something even more important in production: flow, orchestration, governance, fault tolerance, and observability.&lt;/p&gt;
&lt;p&gt;Putting both together, the central idea can be summarized like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The value is not in having &amp;ldquo;more agents,&amp;rdquo; but in designing a system in which specialized agents work with clear contracts, explicit flows, and real operational control.&lt;/p&gt;</description><content:encoded><![CDATA[<p>The two texts below talk, at their core, about the same transition: moving away from AI used as an isolated assistant and starting to treat it as an organized system. One emphasizes the structure of agent teams, with roles, capabilities, and collaboration. The other emphasizes something even more important in production: flow, orchestration, governance, fault tolerance, and observability.</p>
<p>Putting both together, the central idea can be summarized like this:</p>
<blockquote>
  <p>The value is not in having &ldquo;more agents,&rdquo; but in designing a system in which specialized agents work with clear contracts, explicit flows, and real operational control.</p>

</blockquote>
<h2>The Paradigm Shift<span class="hx:absolute hx:-mt-20" id="the-paradigm-shift"></span>
    <a href="#the-paradigm-shift" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For a long time, we used AI as a copilot: you write a prompt, receive a response, use what&rsquo;s useful, and continue the work manually.</p>
<p>This model helps productivity, but doesn&rsquo;t create a system. It only improves one step.</p>
<p>The next stage is to treat AI as part of the software architecture. Instead of a generic model trying to do everything, you define:</p>
<ul>
<li>who the agents are</li>
<li>what each one can do</li>
<li>how they communicate</li>
<li>how decisions advance in the flow</li>
<li>how failures are detected and contained</li>
<li>how the system is audited</li>
</ul>
<p>That&rsquo;s why the authors talk about a change comparable to the transition from simple programs to distributed systems. When autonomy increases, the need for architecture also increases.</p>
<h2>The Role of <code>Agents.md</code><span class="hx:absolute hx:-mt-20" id="the-role-of-agentsmd"></span>
    <a href="#the-role-of-agentsmd" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The concept of <code>Agents.md</code> is simple: it works as the system&rsquo;s org chart.</p>
<p>Instead of letting a generic agent improvise role, scope, and responsibility at each execution, you explicitly document:</p>
<ul>
<li>which agents exist</li>
<li>what is each one&rsquo;s responsibility</li>
<li>what deliveries they produce</li>
<li>what are their limits of action</li>
<li>with which other agents they interact</li>
</ul>
<p>In practice, <code>Agents.md</code> reduces ambiguity. It prevents every agent from trying to become a &ldquo;super agent&rdquo; and creates separation of responsibilities.</p>
<p>A typical example would be something like this:</p>
<ul>
<li><code>ProductAgent</code>: translates business need into specification</li>
<li><code>ArchitectureAgent</code>: defines technical structure and contracts</li>
<li><code>BackendAgent</code>: implements services and rules</li>
<li><code>FrontendAgent</code>: builds the interface</li>
<li><code>QAAgent</code>: validates behavior and quality</li>
<li><code>DevOpsAgent</code>: delivers, monitors, and operates</li>
</ul>
<p>The important point here is that role is not capability. Role is responsibility.</p>
<h2>The Role of <code>Skills.md</code><span class="hx:absolute hx:-mt-20" id="the-role-of-skillsmd"></span>
    <a href="#the-role-of-skillsmd" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If <code>Agents.md</code> answers &ldquo;who does what,&rdquo; <code>Skills.md</code> answers &ldquo;with what capabilities this is done.&rdquo;</p>
<p>Skills are reusable capabilities that can be shared by multiple agents, for example:</p>
<ul>
<li>code generation</li>
<li>code review</li>
<li>test creation</li>
<li>security analysis</li>
<li>performance optimization</li>
<li>architecture design</li>
</ul>
<p>Separating role from capability is a good architectural decision for three reasons.</p>
<p>First, it avoids conceptual duplication. You don&rsquo;t need to redefine the same capabilities in every agent.</p>
<p>Second, it facilitates composition. Two different agents can use the same skill in different contexts.</p>
<p>Third, it improves maintenance. You evolve a central capability and all agents that depend on it benefit.</p>
<p>In practical terms, <code>Skills.md</code> is the system&rsquo;s toolkit.</p>
<h2>Agent Teams Are Not Enough Without Flow<span class="hx:absolute hx:-mt-20" id="agent-teams-are-not-enough-without-flow"></span>
    <a href="#agent-teams-are-not-enough-without-flow" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here&rsquo;s where the second text&rsquo;s strongest contribution comes in.</p>
<p>Defining agents and skills is necessary, but still insufficient. A real autonomous system doesn&rsquo;t break because a pretty role was missing on paper. It breaks because:</p>
<ul>
<li>context came incomplete</li>
<li>an external tool failed</li>
<li>two agents reached incompatible conclusions</li>
<li>cost spiked</li>
<li>the decision wasn&rsquo;t explainable</li>
<li>no one can reconstruct why the system did what it did</li>
</ul>
<p>That is: the central problem isn&rsquo;t just the existence of agents. It&rsquo;s the design of the flow between them.</p>
<p>Agentic Flow Engineering is precisely the discipline of designing multi-agent workflows that are:</p>
<ul>
<li>autonomous, but predictable</li>
<li>flexible, but controlled</li>
<li>intelligent, but auditable</li>
<li>adaptive, but operable</li>
</ul>
<p>If MLOps made models usable in production, Agentic Flow Engineering tries to do the same with autonomy.</p>
<h2>The Error of Starting with the Agent<span class="hx:absolute hx:-mt-20" id="the-error-of-starting-with-the-agent"></span>
    <a href="#the-error-of-starting-with-the-agent" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>One of the best points of the second article is this: don&rsquo;t start by asking &ldquo;which agent should I build?&rdquo;.</p>
<p>Start by asking:</p>
<ul>
<li>which decision needs to be made with reliability</li>
<li>what result needs to be produced</li>
<li>what business, cost, security, and time constraints exist</li>
<li>what are the success and failure paths</li>
</ul>
<p>This completely changes the design.</p>
<p>When you start with the agent, you tend to create entities that are too generic.</p>
<p>When you start with intent and expected result, you tend to design a better flow, with less improvisation and more validation criteria.</p>
<h2>Specialization Beats Improvisation<span class="hx:absolute hx:-mt-20" id="specialization-beats-improvisation"></span>
    <a href="#specialization-beats-improvisation" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Both texts converge on this point: multi-agent systems work better when agents have clear scope and limited context.</p>
<p>This means each agent needs:</p>
<ul>
<li>explicit responsibility</li>
<li>delimited context</li>
<li>defined inputs</li>
<li>defined outputs</li>
<li>handoff criteria</li>
</ul>
<p>This clarity improves quality, reduces cost, and facilitates debugging.</p>
<p>In other words: specialization scales better than unrestricted generic intelligence.</p>
<h2>Explicit Orchestration<span class="hx:absolute hx:-mt-20" id="explicit-orchestration"></span>
    <a href="#explicit-orchestration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Another central point is that agents shouldn&rsquo;t &ldquo;improvise&rdquo; collaboration every time.</p>
<p>Good flows tend to assume explicit patterns, such as:</p>
<ul>
<li>sequential reasoning chains</li>
<li>parallel execution with consensus</li>
<li>supervisor-worker hierarchies</li>
<li>event-based triggers</li>
</ul>
<p>This brings agent architecture closer to state machines, execution graphs, and more traditional distributed systems.</p>
<p>The advantage is simple: when the flow is explicit, it can be tested, observed, and evolved.</p>
<p>When the flow depends only on implicit prompt, it becomes too emergent for a serious environment.</p>
<h2>Failure Must Be Treated as Part of the Design<span class="hx:absolute hx:-mt-20" id="failure-must-be-treated-as-part-of-the-design"></span>
    <a href="#failure-must-be-treated-as-part-of-the-design" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This is perhaps the most important point of all.</p>
<p>In agentic systems, you should assume from the start that:</p>
<ul>
<li>tools will fail</li>
<li>agents will hallucinate</li>
<li>context will arrive incomplete</li>
<li>responses will vary</li>
</ul>
<p>If this is true, then the architecture needs to include:</p>
<ul>
<li>retry policies</li>
<li>confidence thresholds</li>
<li>deterministic fallback paths</li>
<li>intermediate validation</li>
<li>escalation to humans when necessary</li>
</ul>
<p>Resilience here isn&rsquo;t an operational detail. It&rsquo;s a product requirement.</p>
<h2>Observability: Without It, There&rsquo;s No Trust<span class="hx:absolute hx:-mt-20" id="observability-without-it-theres-no-trust"></span>
    <a href="#observability-without-it-theres-no-trust" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A system with agents can&rsquo;t be an elegant black box.</p>
<p>You need to observe at least:</p>
<ul>
<li>which decision path was followed</li>
<li>which tools were called</li>
<li>how much token was spent</li>
<li>how long each agent took</li>
<li>what the final result was</li>
<li>what the confidence level was</li>
<li>where the flow failed</li>
</ul>
<p>This point is relevant because many people talk about DevOps, MLOps, and LLMOps, but the text hits the mark by highlighting something more specific: <code>AgentOps</code>.</p>
<p>When autonomy enters the scene, operation isn&rsquo;t just uptime. Operation comes to include behavior, justification, cost, and decision quality.</p>
<h2>Governance: Prompts Are Not Contracts<span class="hx:absolute hx:-mt-20" id="governance-prompts-are-not-contracts"></span>
    <a href="#governance-prompts-are-not-contracts" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Another hit of the second text is the implicit critique of the idea that a good prompt is enough.</p>
<p>It&rsquo;s not enough.</p>
<p>Prompts guide behavior, but don&rsquo;t replace contract. In production, you need:</p>
<ul>
<li>input and output schemas</li>
<li>validation rules</li>
<li>policy restrictions</li>
<li>security boundaries</li>
<li>audit trails</li>
</ul>
<p>Without this, the system might work in a demo, but will hardly be reliable in a corporate, regulated, or critical context.</p>
<h2>Who Needs to Care About This<span class="hx:absolute hx:-mt-20" id="who-needs-to-care-about-this"></span>
    <a href="#who-needs-to-care-about-this" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This discussion doesn&rsquo;t just interest AI engineers.</p>
<p>It interests:</p>
<ul>
<li>engineering leaders, because it defines scale, risk, and architecture</li>
<li>product teams, because autonomy without KPI becomes cost without return</li>
<li>platform teams, because someone needs to operate this as a system</li>
<li>business stakeholders, because auditability and explainability matter</li>
<li>software engineers, because this model changes the way applications are structured</li>
</ul>
<p>In practice, the conversation stops being &ldquo;which model will we use?&rdquo; and becomes &ldquo;which system will we be able to sustain?&rdquo;.</p>
<h2>A More Mature Way of Thinking About the Stack<span class="hx:absolute hx:-mt-20" id="a-more-mature-way-of-thinking-about-the-stack"></span>
    <a href="#a-more-mature-way-of-thinking-about-the-stack" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The first article suggests that the native AI stack comes to include, besides code and infrastructure:</p>
<ul>
<li><code>Agents.md</code></li>
<li><code>Skills.md</code></li>
<li>agent teams</li>
</ul>
<p>I would add, based on the second text:</p>
<ul>
<li>flow contracts</li>
<li>observability</li>
<li>failure and fallback policies</li>
<li>operational governance</li>
</ul>
<p>That is, the software stack with AI isn&rsquo;t just model + API + prompt.</p>
<p>It becomes something closer to:</p>
<ol>
<li>code and infrastructure</li>
<li>agent roles and capabilities</li>
<li>explicit flow orchestration</li>
<li>validation, observability, and governance</li>
</ol>
<p>Without these four layers, most agentic implementations continue to look like prototypes.</p>
<h2>Conclusion<span class="hx:absolute hx:-mt-20" id="conclusion"></span>
    <a href="#conclusion" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If I had to condense both articles into a single thesis, it would be this:</p>
<blockquote>
  <p>Agent Engineering organizes who participates in the system.<br>
Agentic Flow Engineering organizes how the system really works.</p>

</blockquote>
<p>The first gives organizational structure to autonomy.</p>
<p>The second gives operational rigor so that autonomy doesn&rsquo;t become chaos.</p>
<p>That&rsquo;s why the competitive advantage won&rsquo;t be in simply adding agents to a product. It will be in designing systems in which specialized agents operate with delimited context, clear contracts, real observability, and resilient flows.</p>
<p>The future probably won&rsquo;t be &ldquo;AI everywhere&rdquo; in an amorphous way.</p>
<p>It will be well-orchestrated autonomy.</p>
<h2>Sources<span class="hx:absolute hx:-mt-20" id="sources"></span>
    <a href="#sources" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul>
<li><a href="https://www.linkedin.com/pulse/complete-agent-engineering-playbook-agentsmd-skillsmd-zeelan-shaik-dzpic/"target="_blank" rel="noopener">The Complete Agent Engineering Playbook (Agents.md + Skills.md + Agent Teams)</a></li>
<li><a href="https://www.linkedin.com/pulse/agentic-flow-engineering-why-matters-what-who-needs-how-baipalli-jowsf/"target="_blank" rel="noopener">Agentic Flow Engineering: Why It Matters, What It Is, Who Needs It, and How to Build It</a></li>
</ul>
]]></content:encoded><category>ai</category><category>agents</category><category>llm</category><category>software-engineering</category><category>architecture</category></item><item><title>Teaching Copilot to Speak Your Repository's Language</title><link>https://www.orapha.dev/en/2025/10/29/ensinando-o-copilot-a-falar-a-linguagem-do-seu-repositorio/</link><guid isPermaLink="true">https://www.orapha.dev/en/2025/10/29/ensinando-o-copilot-a-falar-a-linguagem-do-seu-repositorio/</guid><pubDate>Wed, 29 Oct 2025 14:46:13 GMT</pubDate><description>&lt;p&gt;Working for over 14 years with software development, I always find myself thinking about trends and new technologies that can be used to &lt;strong&gt;reduce friction in the dev&amp;rsquo;s daily life&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Did you know there&amp;rsquo;s the possibility of adding &lt;strong&gt;personalized instructions directly in your repository for AI agents?&lt;/strong&gt; Basically, you can &amp;ldquo;teach&amp;rdquo; Copilot about the rules, patterns, and styles of your project, and it will generate suggestions much more aligned with what you and your team really need.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Working for over 14 years with software development, I always find myself thinking about trends and new technologies that can be used to <strong>reduce friction in the dev&rsquo;s daily life</strong>.</p>
<p>Did you know there&rsquo;s the possibility of adding <strong>personalized instructions directly in your repository for AI agents?</strong> Basically, you can &ldquo;teach&rdquo; Copilot about the rules, patterns, and styles of your project, and it will generate suggestions much more aligned with what you and your team really need.</p>
<p>It&rsquo;s like having a coworker who has already read all the project documentation and knows exactly what should or shouldn&rsquo;t be suggested—and this coworker doesn&rsquo;t sleep, doesn&rsquo;t get tired, and is always ready to help you code.</p>
<p>This feature is an incredible step to transform Copilot into something more than just an &ldquo;intelligent autocomplete&rdquo;: it becomes an <strong>active member of the team</strong>, shaped by the context you provide.</p>
<p><img src="https://cdn-images-1.medium.com/max/1024/1*pRpE_OerwUnYxytxY7PPQg.png" alt=""  loading="lazy" /></p>
<p><em>[Image generated by AI]</em></p>
<h3>Overview<span class="hx:absolute hx:-mt-20" id="overview"></span>
    <a href="#overview" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Here we&rsquo;ll focus on Copilot, as it has the <strong>ability to give context to the repository</strong>. Instead of just generating &ldquo;generic&rdquo; code, now we can <strong>teach the AI about project rules</strong>, conventions, frameworks, and even the small details that normally only those already on the team know.</p>
<p>In practice, this transforms Copilot into something much more than an intelligent autocomplete: it becomes a <strong>technical partner shaped by your repository</strong>. If you work on a large project, with multiple modules and different stacks, having personalized instructions is like writing a manual for the AI.</p>
<p>And the best: all of this is versioned in the repository itself. That is, any dev who clones the project already inherits the same level of context.</p>
<p><img src="https://cdn-images-1.medium.com/max/1024/1*tZig2YF4TxvYyWS_hgo6eg.png" alt=""  loading="lazy" /></p>
<p><em>[Image generated by AI]</em></p>
<h3>Prerequisites<span class="hx:absolute hx:-mt-20" id="prerequisites"></span>
    <a href="#prerequisites" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Before configuring, it&rsquo;s worth checking some basic points:</p>
<p><strong>1. Instructions file in the repository</strong></p>
<ul>
<li>Create the .github/copilot-instructions.md at the project root (or specific files in .github/instructions/).</li>
<li>This is the &ldquo;manual&rdquo; that Copilot will read to align with your team&rsquo;s practices.</li>
</ul>
<p><strong>2. Feature enabled</strong></p>
<ul>
<li>The feature is still in <em>public preview</em>, so it needs to be active on your account/organization.</li>
</ul>
<p><strong>3. Updated IDE/Editor</strong></p>
<ul>
<li>Make sure you&rsquo;re using the latest version of GitHub Copilot in VS Code, JetBrains, or the web interface, because only these versions already understand custom instructions.</li>
</ul>
<p><strong>4. Context awareness</strong></p>
<ul>
<li>Instructions are applied together with other layers (personal, organization, etc.). That is, avoid contradictions: if in the repository you say &ldquo;use React&rdquo;, but in personal instructions you ask &ldquo;prefer Vue&rdquo;, Copilot may get confused.</li>
</ul>
<p>With this ready, you&rsquo;re ready to start personalizing your experience with Copilot and shaping code suggestions to your style and the real needs of the project.</p>
<p><img src="https://cdn-images-1.medium.com/max/1024/1*afncu7piYCLhP9MVsPy1LQ.png" alt=""  loading="lazy" /></p>
<p><em>[Image generated by AI]</em></p>
<h3>Types of Personalized Instructions<span class="hx:absolute hx:-mt-20" id="types-of-personalized-instructions"></span>
    <a href="#types-of-personalized-instructions" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This is the point where Copilot stops being &ldquo;just a generic assistant&rdquo; and really starts to <strong>speak your project&rsquo;s language</strong>. There are three main ways you can give instructions, and each has its usefulness depending on the size and complexity of the repository.</p>
<h4>1. Repository-Wide Instructions<span class="hx:absolute hx:-mt-20" id="1-repository-wide-instructions"></span>
    <a href="#1-repository-wide-instructions" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This is where you define the <strong>general rules of the game</strong>.
A file called .github/copilot-instructions.md at the root serves as a guide for everything that happens within the repository. It&rsquo;s where you can write things like:</p>
<ul>
<li>&ldquo;Prefer <strong>TypeScript</strong> over JavaScript.&rdquo;</li>
<li>&ldquo;Use <strong>clean architecture</strong> on the backend.&rdquo;</li>
<li>&ldquo;Tests should be written with <strong>JUnit</strong>.&rdquo;</li>
</ul>
<p>In practice, it&rsquo;s like having a secret README just for Copilot.</p>
<p><img src="https://cdn-images-1.medium.com/max/1024/1*IIPHbY7OjE-xGpcoBlVprQ.png" alt=""  loading="lazy" /></p>
<p><em>[Image generated by AI]</em></p>
<h4>2. Path-Specific Instructions<span class="hx:absolute hx:-mt-20" id="2-path-specific-instructions"></span>
    <a href="#2-path-specific-instructions" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Now imagine a monolithic project with several areas: API, frontend, mobile, infra scripts. Each can have <strong>different rules</strong>.
With specific instructions, you create files inside .github/instructions/ and use glob patterns (applyTo) to say where they apply.</p>
<p>Practical example:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">applyTo: &#34;src/**/*.ts&#34;
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">Always use async/await instead of chained Promises.</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>This is powerful because it prevents Copilot from suggesting off-pattern code in specific parts of the project.</p>
<p><img src="https://cdn-images-1.medium.com/max/1024/1*_5yNfP4KwwhEaeyOWzd92g.png" alt=""  loading="lazy" /></p>
<p><em>[Image generated by AI]</em></p>
<h3>Use in Real Environment and Checks<span class="hx:absolute hx:-mt-20" id="use-in-real-environment-and-checks"></span>
    <a href="#use-in-real-environment-and-checks" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>After you create the instruction files, Copilot starts acting as if it had read all the project documentation. <strong>And yes, you can check if this is really happening</strong>.</p>
<h4>How it works in practice<span class="hx:absolute hx:-mt-20" id="how-it-works-in-practice"></span>
    <a href="#how-it-works-in-practice" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><ul>
<li>With each suggestion, Copilot &ldquo;reads&rdquo; the instructions along with the code.</li>
<li>If you&rsquo;re in a file that matches an applyTo, specific instructions are applied along with the general ones.</li>
<li>This allows returning suggestions closer to the style and patterns you defined.</li>
</ul>
<p>It&rsquo;s like having a <em>living linter</em> that, instead of just pointing out errors, already suggests the right code from the start.</p>
<h4>How to check if it&rsquo;s working<span class="hx:absolute hx:-mt-20" id="how-to-check-if-its-working"></span>
    <a href="#how-to-check-if-its-working" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Within <strong>Copilot Chat</strong> (in the IDE or GitHub), you can often see the <strong>References</strong> section at the end of the AI&rsquo;s response.</p>
<ul>
<li>If something like .github/copilot-instructions.md appears, it&rsquo;s a sign that Copilot used your instructions.</li>
<li>If it doesn&rsquo;t appear, the file may not be configured in the right place or may not be enabled in the chat.</li>
</ul>
<p>It&rsquo;s a simple detail, but it helps to be sure that the configuration effort wasn&rsquo;t in vain.</p>
<h4>Attention to conflicts<span class="hx:absolute hx:-mt-20" id="attention-to-conflicts"></span>
    <a href="#attention-to-conflicts" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Remember that Copilot also takes into account:</p>
<ul>
<li><strong>Personal dev instructions</strong> (what you configured in your account).</li>
<li><strong>Organization instructions</strong>.</li>
<li><strong>Repository instructions</strong>.</li>
</ul>
<p>If they conflict (&ldquo;use Vue&rdquo; vs &ldquo;use React&rdquo;), behavior can become unpredictable. So, it&rsquo;s good to align with the team and avoid contradictions.</p>
<p><img src="https://cdn-images-1.medium.com/max/1024/1*whdd7P_BMqNQPFHOH5eY9Q.png" alt=""  loading="lazy" /></p>
<p><em>[Image generated by AI]</em></p>
<h3>Enable or Disable<span class="hx:absolute hx:-mt-20" id="enable-or-disable"></span>
    <a href="#enable-or-disable" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>You won&rsquo;t always want Copilot to follow the repository instructions. Sometimes you want it to think &ldquo;outside the box&rdquo; or ignore specific rules just to experiment with a new approach. And yes, you can <strong>turn personalized instructions on and off</strong> simply.</p>
<h4>In Copilot Chat<span class="hx:absolute hx:-mt-20" id="in-copilot-chat"></span>
    <a href="#in-copilot-chat" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>If you&rsquo;re inside the repository, the chat shows a little button to <strong>&ldquo;Enable/Disable custom instructions&rdquo;</strong>. It&rsquo;s basically a switch:</p>
<ul>
<li>On → Copilot reads the .github/copilot-instructions.md and files inside .github/instructions/.</li>
<li>Off → it ignores these rules and generates code like a normal autocomplete.</li>
</ul>
<p>It&rsquo;s useful when you want to test alternative solutions without the team rules filter.</p>
<h4>In Code Review (Pull Requests)<span class="hx:absolute hx:-mt-20" id="in-code-review-pull-requests"></span>
    <a href="#in-code-review-pull-requests" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>On GitHub itself, you can configure whether Copilot should or shouldn&rsquo;t consider personalized instructions when reviewing PRs.</p>
<p>The path is: <strong>Settings → Code &amp; automation → Copilot → Code review → Use custom instructions when reviewing pull requests</strong>.</p>
<p>If you turn this off, Copilot reviews the PR without looking at the repository rules.</p>
<h3>Practical Recommendations (from an experienced developer&rsquo;s perspective)<span class="hx:absolute hx:-mt-20" id="practical-recommendations-from-an-experienced-developers-perspective"></span>
    <a href="#practical-recommendations-from-an-experienced-developers-perspective" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>After years dealing with mobile, web, and backend projects, I&rsquo;ve learned that the difference between a team that &ldquo;uses a tool&rdquo; and one that <strong>extracts real value from it</strong> lies in the small day-to-day practices. Here are some tips I would apply without thinking twice when working with personalized instructions in Copilot:</p>
<h4>1. Document for humans, not just for AI<span class="hx:absolute hx:-mt-20" id="1-document-for-humans-not-just-for-ai"></span>
    <a href="#1-document-for-humans-not-just-for-ai" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Don&rsquo;t fall into the temptation of writing instructions thinking only about Copilot. Write as if you were explaining to a new coworker who just joined the team. This guarantees clarity for both people and AI.</p>
<p>👉 Example:
<strong>&ldquo;Prefer async/await instead of then/catch&rdquo; is much more useful than &ldquo;use async/await&rdquo;.</strong></p>
<h4>2. Avoid contradictions between instructions<span class="hx:absolute hx:-mt-20" id="2-avoid-contradictions-between-instructions"></span>
    <a href="#2-avoid-contradictions-between-instructions" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>I&rsquo;ve seen teams get tangled up because the repo said &ldquo;use React&rdquo; and each dev&rsquo;s personal instructions said &ldquo;prefer Vue&rdquo;.</p>
<p>Define <strong>one source of truth</strong> and keep everyone aligned.</p>
<h4>3. Update as the project evolves<span class="hx:absolute hx:-mt-20" id="3-update-as-the-project-evolves"></span>
    <a href="#3-update-as-the-project-evolves" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Your project isn&rsquo;t static. Today it might be Flutter 3.22, tomorrow it might be on 3.27. If you don&rsquo;t update the instructions, you&rsquo;ll receive outdated suggestions that only give rework. Reserve moments (e.g., end of sprint) to review copilot-instructions.md.</p>
<h4>4. Include code and architecture conventions<span class="hx:absolute hx:-mt-20" id="4-include-code-and-architecture-conventions"></span>
    <a href="#4-include-code-and-architecture-conventions" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Define how the team wants code to be written.</p>
<ul>
<li>Variable naming (camelCase, snake_case).</li>
<li>Commit pattern.</li>
<li>Preferred frameworks and libs.</li>
<li>Layer structure (e.g., &ldquo;Controllers never call DB directly&rdquo;).</li>
</ul>
<p>This makes Copilot suggest code <strong>already in the format that passes code review</strong>.</p>
<h4>5. Use as an onboarding tool<span class="hx:absolute hx:-mt-20" id="5-use-as-an-onboarding-tool"></span>
    <a href="#5-use-as-an-onboarding-tool" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>New devs always suffer at first to understand the &ldquo;team way.&rdquo; If Copilot already suggests code aligned with the pattern, onboarding becomes much faster and smoother.</p>
<h4>6. Test the impact<span class="hx:absolute hx:-mt-20" id="6-test-the-impact"></span>
    <a href="#6-test-the-impact" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Don&rsquo;t rely only on the feeling that it &ldquo;improved.&rdquo; Compare PRs before and after instructions: fewer style comments? Fewer build errors? If yes, you&rsquo;re on the right track.</p>
<p>So, if there&rsquo;s one thing I&rsquo;ve learned in these 14 years on the road is that technology isn&rsquo;t just about code, it&rsquo;s about <strong>how we use tools to work better, as a team, and create solutions that make a difference</strong>.</p>
<p>GitHub Copilot with personalized instructions is exactly that: a step beyond autocomplete. It&rsquo;s like taking all the culture, patterns, and experience of your team and putting it next to the AI, transforming it into a true development partner.</p>
<p>And now, the ball is in your court:</p>
<ul>
<li>Will you let Copilot be just another tool in your stack?</li>
<li>Or will you teach it to play your team&rsquo;s game, speaking the same language as you?</li>
</ul>
<p>My tip: <strong>try it on your next project</strong>. Start simple, write two or three instructions that already make a difference in your daily life and feel the impact. I&rsquo;m sure that, just like it happened with me, you&rsquo;ll realize that you&rsquo;re putting Copilot not just as an assistant, but as a living part of your team. 🚀</p>
<p><img src="https://cdn-images-1.medium.com/max/1024/1*lsVfvfCIuuQCIaCXgL_m6Q.png" alt=""  loading="lazy" /></p>
<p><em>[Image generated by AI]</em></p>
<p>I&rsquo;ve been a developer for over 14 years, postgraduate in Software Engineering and Mobile Development, and I write to share real learnings from someone who is in the technology trenches every day.</p>
<p><strong>Read more of my articles at:</strong> <a href="https://medium.com/@raphaelkennedy"target="_blank" rel="noopener">medium.com/@raphaelkennedy</a></p>
<p>[[ <a href="http://buymeacoffee.com/raphaelpontes"target="_blank" rel="noopener">Buy me a coffee</a> ]]</p>
<p><strong>Follow me on social media</strong></p>
<ul>
<li>LinkedIn: <a href="https://www.linkedin.com/in/raphaelkennedy"target="_blank" rel="noopener">raphaelkennedy</a></li>
<li>YouTube: <a href="https://youtube.com/@raphaelpontes"target="_blank" rel="noopener">@raphaelpontes</a></li>
</ul>
]]></content:encoded><category>github-copilot</category><category>ai</category><category>developer-experience</category><category>customization</category></item><item><title>How I Structure My Entities in Flutter and Why It Changed My Way of Programming</title><link>https://www.orapha.dev/en/2025/03/17/como-estruturo-minhas-entities-no-flutter-e-por-que-isso-mudou-meu-jeito-de-programar/</link><guid isPermaLink="true">https://www.orapha.dev/en/2025/03/17/como-estruturo-minhas-entities-no-flutter-e-por-que-isso-mudou-meu-jeito-de-programar/</guid><pubDate>Mon, 17 Mar 2025 18:22:49 GMT</pubDate><description>&lt;p&gt;Hey dev!&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever needed to consume multiple APIs in a Flutter app, you know the mess can start quickly. At first, it seems simple: you get the data from the API, throw it directly into the model, and done! But then comes that moment when you need to integrate a second API, deal with unexpected backend changes, or even optimize data loading. And suddenly&amp;hellip; BOOM💥! Your code turns into a real Frankenstein, hard to understand and even harder to maintain.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Hey dev!</p>
<p>If you&rsquo;ve ever needed to consume multiple APIs in a Flutter app, you know the mess can start quickly. At first, it seems simple: you get the data from the API, throw it directly into the model, and done! But then comes that moment when you need to integrate a second API, deal with unexpected backend changes, or even optimize data loading. And suddenly&hellip; BOOM💥! Your code turns into a real Frankenstein, hard to understand and even harder to maintain.</p>
<p>That&rsquo;s exactly what happened to me at the beginning of my journey. Until I discovered the importance of <strong>Entities</strong>, <strong>Adapters</strong>, and <strong>DTOs</strong>. These three layers changed my way of programming and made my apps more organized and easier to scale.</p>
<p>Today I want to tell you how I structure all this and why this approach can save your code too.</p>
<p><img src="https://cdn-images-1.medium.com/max/480/0*nedp-VQ57p-PWpNJ.gif" alt=""  loading="lazy" /></p>
<h3>What is an Entity and why should you use it?<span class="hx:absolute hx:-mt-20" id="what-is-an-entity-and-why-should-you-use-it"></span>
    <a href="#what-is-an-entity-and-why-should-you-use-it" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The <strong>Entity</strong> (or Entity) is the heart of your data model. It represents the pure and independent concept of data within your application domain, without worrying about infrastructure details like API, database, or local files.</p>
<p>The main advantage of having a well-defined Entity is that it keeps your code decoupled. This means that, regardless of where the data comes from (API, SQLite, Firebase, etc.), your business logic will always work with the same structure.</p>
<p>Let&rsquo;s look at an example. Imagine your app works with users and receives this JSON from the API:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">{
</span></span><span class="line"><span class="cl">  &#34;id_usuario&#34;: 123,
</span></span><span class="line"><span class="cl">  &#34;nome_completo&#34;: &#34;John Silva&#34;,
</span></span><span class="line"><span class="cl">  &#34;email&#34;: &#34;john@email.com&#34;,
</span></span><span class="line"><span class="cl">  &#34;idade&#34;: 30
</span></span><span class="line"><span class="cl">}</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>If you use this format directly in the app, any change in the backend can break your code. But if you define an <strong>Entity</strong>, your internal model will remain stable:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">class User {
</span></span><span class="line"><span class="cl">  final int id;
</span></span><span class="line"><span class="cl">  final String name;
</span></span><span class="line"><span class="cl">  final String email;
</span></span><span class="line"><span class="cl">  final int age;
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  User({
</span></span><span class="line"><span class="cl">    required this.id,
</span></span><span class="line"><span class="cl">    required this.name,
</span></span><span class="line"><span class="cl">    required this.email,
</span></span><span class="line"><span class="cl">    required this.age,
</span></span><span class="line"><span class="cl">  });
</span></span><span class="line"><span class="cl">}</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Now, the rest of the app only needs to know this <strong>User</strong> entity, without worrying about how the data arrives or is stored. If tomorrow the API changes id_usuario to userId, the app continues to work perfectly—as long as the conversion is handled in the right place.</p>
<p>And that&rsquo;s where the <strong>Adapter</strong> comes in.</p>
<h3>What is an Adapter and why is it essential?<span class="hx:absolute hx:-mt-20" id="what-is-an-adapter-and-why-is-it-essential"></span>
    <a href="#what-is-an-adapter-and-why-is-it-essential" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The <strong>Adapter</strong> is responsible for translating external data (API, database, cache) to the app&rsquo;s internal format and vice versa. It allows your <strong>Entity</strong> to remain clean and independent of any external data source.</p>
<h3>Adapter Example<span class="hx:absolute hx:-mt-20" id="adapter-example"></span>
    <a href="#adapter-example" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Here is an Adapter that converts the API JSON to our <strong>User Entity</strong>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">class UserAdapter {
</span></span><span class="line"><span class="cl">  static User fromJson(Map&lt;String, dynamic&gt; json) {
</span></span><span class="line"><span class="cl">    return User(
</span></span><span class="line"><span class="cl">      id: json[&#39;id_usuario&#39;],
</span></span><span class="line"><span class="cl">      name: json[&#39;nome_completo&#39;],
</span></span><span class="line"><span class="cl">      email: json[&#39;email&#39;],
</span></span><span class="line"><span class="cl">      age: json[&#39;idade&#39;],
</span></span><span class="line"><span class="cl">    );
</span></span><span class="line"><span class="cl">  }
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  static Map&lt;String, dynamic&gt; toJson(User user) {
</span></span><span class="line"><span class="cl">    return {
</span></span><span class="line"><span class="cl">      &#39;id_usuario&#39;: user.id,
</span></span><span class="line"><span class="cl">      &#39;nome_completo&#39;: user.name,
</span></span><span class="line"><span class="cl">      &#39;email&#39;: user.email,
</span></span><span class="line"><span class="cl">      &#39;idade&#39;: user.age,
</span></span><span class="line"><span class="cl">    };
</span></span><span class="line"><span class="cl">  }
</span></span><span class="line"><span class="cl">}</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Now, if the backend decides to change field names, I only need to change this Adapter and done! The rest of the app continues to work perfectly, as it only handles the <strong>User</strong> entity.</p>
<p>The Adapter prevents the app from needing to know specific details of different APIs. If you need to consume multiple data sources with different formats, each can have its own Adapter without impacting your app logic.</p>
<h3>What is a DTO and why is it different from Adapter?<span class="hx:absolute hx:-mt-20" id="what-is-a-dto-and-why-is-it-different-from-adapter"></span>
    <a href="#what-is-a-dto-and-why-is-it-different-from-adapter" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>While the Adapter serves to convert API data to an <strong>Entity</strong>, the <strong>DTO (Data Transfer Object)</strong> is used to define exactly which data will be transported between system layers.</p>
<p>The difference is that a DTO doesn&rsquo;t need to have the same structure as the Entity. It can be a subset of the data or even contain information formatted differently.</p>
<h3>DTO Example<span class="hx:absolute hx:-mt-20" id="dto-example"></span>
    <a href="#dto-example" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Let&rsquo;s say we need to send a user to the API, but the <strong>User</strong> entity contains information that doesn&rsquo;t need to be transmitted, such as a createdAt field.</p>
<p>Instead of sending the entire <strong>Entity</strong>, we create a DTO to define exactly what will be sent:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">class UserDTO {
</span></span><span class="line"><span class="cl">  final String name;
</span></span><span class="line"><span class="cl">  final String email;
</span></span><span class="line"><span class="cl">  final int age;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  UserDTO({
</span></span><span class="line"><span class="cl">    required this.name,
</span></span><span class="line"><span class="cl">    required this.email,
</span></span><span class="line"><span class="cl">    required this.age,
</span></span><span class="line"><span class="cl">  });
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  Map&lt;String, dynamic&gt; toJson() {
</span></span><span class="line"><span class="cl">    return {
</span></span><span class="line"><span class="cl">      &#39;nome_completo&#39;: name,
</span></span><span class="line"><span class="cl">      &#39;email&#39;: email,
</span></span><span class="line"><span class="cl">      &#39;idade&#39;: age,
</span></span><span class="line"><span class="cl">    };
</span></span><span class="line"><span class="cl">  }
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  factory UserDTO.fromJson(Map&lt;String, dynamic&gt; json) {
</span></span><span class="line"><span class="cl">    return UserDTO(
</span></span><span class="line"><span class="cl">      name: json[&#39;nome_completo&#39;],
</span></span><span class="line"><span class="cl">      email: json[&#39;email&#39;],
</span></span><span class="line"><span class="cl">      age: json[&#39;idade&#39;],
</span></span><span class="line"><span class="cl">    );
</span></span><span class="line"><span class="cl">  }
</span></span><span class="line"><span class="cl">}</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Here, the DTO serves as an intermediary model to ensure that only necessary data is transmitted. This improves communication performance and prevents leakage of unnecessary information.</p>
<h3>Summary of the Opera<span class="hx:absolute hx:-mt-20" id="summary-of-the-opera"></span>
    <a href="#summary-of-the-opera" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><strong>Entity</strong> Represents pure internal domain data ALWAYS, to ensure the code is decoupled from the API or database.</p>
<p><strong>Adapter</strong> Converts data between API and Entity when the API structure is different from the app&rsquo;s internal structure.</p>
<p><strong>DTO</strong> defines a specific model for transporting data between system layers when there&rsquo;s a need to transmit only part of the data or format it specifically.</p>
<p>Well, we&rsquo;re almost concluding our article, but I know you, reader, mentally asked me:</p>
<p>And the answer is simple&hellip; <strong>Yes, we can</strong>. I&rsquo;ll explain this in the next topic.</p>
<h3>When to use Adapter and DTO together?<span class="hx:absolute hx:-mt-20" id="when-to-use-adapter-and-dto-together"></span>
    <a href="#when-to-use-adapter-and-dto-together" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>In some cases, we can combine both. See a common flow:</p>
<ol>
<li>The API returns data → The <strong>Adapter</strong> transforms the API response into an <strong>Entity</strong>.</li>
<li>The app needs to send data to the API → We create a <strong>DTO</strong> to represent exactly what will be sent.</li>
<li>The DTO can be passed to the Adapter, which then makes the necessary conversion before sending the data to the API.</li>
</ol>
<p>This ensures well-structured, easy-to-test, and maintainable code.</p>
<p><img src="https://cdn-images-1.medium.com/max/499/0*vhpb7CdMOGg_wBFx.gif" alt=""  loading="lazy" /></p>
<h3>Conclusion<span class="hx:absolute hx:-mt-20" id="conclusion"></span>
    <a href="#conclusion" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>If there&rsquo;s one thing I&rsquo;ve learned programming in Flutter (and struggling with different APIs), it&rsquo;s that separating code responsibilities well makes all the difference.</p>
<ul>
<li><strong>Entities</strong> keep the code clean and independent from the API.</li>
<li><strong>Adapters</strong> protect the app from unexpected backend changes.</li>
<li><strong>DTOs</strong> ensure that only necessary data is transported.</li>
</ul>
<p>In the end, all this makes your code more organized, scalable, and easy to test.</p>
<p>If you haven&rsquo;t structured your code this way, try it! I&rsquo;m sure that once you start, you&rsquo;ll never want to go back.</p>
<p>And you, do you already use this approach? How do you structure your entities in Flutter? Let&rsquo;s exchange ideas here or on my networks below.</p>
<p><img src="https://cdn-images-1.medium.com/max/480/0*SIS09iEdBEk4N9LF.gif" alt=""  loading="lazy" /></p>
<p>Read more of my articles: <a href="https://medium.com/@raphaelkennedy"target="_blank" rel="noopener">medium.com/@raphaelkennedy</a></p>
<p>[[ <a href="http://buymeacoffee.com/raphaelpontes"target="_blank" rel="noopener">Buy me a coffee</a> ]]</p>
<p>Follow me on social media</p>
<ul>
<li>LinkedIn: <a href="https://www.linkedin.com/in/raphaelkennedy"target="_blank" rel="noopener">raphaelkennedy</a></li>
<li>YouTube: <a href="https://youtube.com/@raphaelpontes"target="_blank" rel="noopener">@raphaelpontes</a></li>
</ul>
]]></content:encoded><category>flutter</category><category>architecture</category><category>entities</category><category>clean-architecture</category></item><item><title>Moral Concerns in Technology Development</title><link>https://www.orapha.dev/en/2024/08/02/as-preocupacoes-morais-no-desenvolvimento-de-tecnologias/</link><guid isPermaLink="true">https://www.orapha.dev/en/2024/08/02/as-preocupacoes-morais-no-desenvolvimento-de-tecnologias/</guid><pubDate>Fri, 02 Aug 2024 02:30:50 GMT</pubDate><description>&lt;p&gt;Folks, before starting this article, I would like to introduce myself: I am a Software Engineer with a curious mind, always traveling in reflections that I want to share with you. Recently, I watched a movie about the scientist who developed the atomic bomb, and this sparked a series of thoughts I hadn&amp;rsquo;t considered before. I decided to write this article because I believe my concerns may &amp;ldquo;open the eyes&amp;rdquo; of many of you who are reading me.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Folks, before starting this article, I would like to introduce myself: I am a Software Engineer with a curious mind, always traveling in reflections that I want to share with you. Recently, I watched a movie about the scientist who developed the atomic bomb, and this sparked a series of thoughts I hadn&rsquo;t considered before. I decided to write this article because I believe my concerns may &ldquo;open the eyes&rdquo; of many of you who are reading me.</p>
<p><img src="https://cdn-images-1.medium.com/max/310/1*JNmRSfjJQHuXj3xFelGegQ@2x.jpeg" alt=""  loading="lazy" /></p>
<h3>Contextualizing<span class="hx:absolute hx:-mt-20" id="contextualizing"></span>
    <a href="#contextualizing" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>As presented in the film &ldquo;Oppenheimer,&rdquo; we can reflect on the responsibility of the Manhattan Project, which resulted in the creation of the atomic bomb. This invention ended thousands of lives both in the short and long term. The moral responsibility of those who develop technologies with destructive potential is a crucial topic that we need to discuss.</p>
<p>Cillian Murphy, the actor who played Oppenheimer, is known for his role as Thomas Shelby in &ldquo;Peaky Blinders,&rdquo; a character without scruples or morals. In &ldquo;Oppenheimer,&rdquo; Murphy manages to convey the deep concern of someone who carries the weight of having blood on their hands. His impeccable performance captures the essence of a scientist divided between technological advancement and the terrible consequences of his creation.</p>
<p><img src="https://cdn-images-1.medium.com/max/226/1*M5aJ54TZQcLtvOfGNJX6dw@2x.jpeg" alt=""  loading="lazy" /></p>
<p>The creation of the atomic bomb brought a new era to humanity, marked by unprecedented destructive power. Scientists and engineers involved in the Manhattan Project faced a moral dilemma: develop a weapon to end the war and save lives, or consider the devastating long-term consequences. The dilemma wasn&rsquo;t just about the weapon&rsquo;s effectiveness, but about the morality of its use. The reflection on the responsibility of creating such powerful technology leads us to think about the role of developers and the ethical decisions we must make.</p>
<h3>The New Digital Atomic Bomb<span class="hx:absolute hx:-mt-20" id="the-new-digital-atomic-bomb"></span>
    <a href="#the-new-digital-atomic-bomb" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This brings to mind the emergence of new technologies, such as Artificial Intelligences (AIs). We know that AI is not something new, but its everyday use has gained strength recently, and this challenges us to think about the consequences of our innovations. AIs, for example, can bring significant advances in various areas, but also raise ethical and moral questions about privacy, security, and impact on the job market.</p>
<p><img src="https://cdn-images-1.medium.com/max/363/1*teb7qMYi4HchiAS3KMUbzg@2x.jpeg" alt=""  loading="lazy" /></p>
<p>With the advancement of AIs, large-scale data collection and analysis has become common. Companies and governments have access to detailed information about individuals, which can be used to personalize services and improve user experience. However, this massive amount of data can also be exploited in ways that invade personal privacy. We need to establish clear limits on what is acceptable in terms of data collection and use, ensuring that individual rights are protected.</p>
<p>Security is another critical area. AIs have the potential to be used in security systems, such as surveillance and cyber defense. Although these applications can increase protection, they can also be used maliciously. More sophisticated and difficult-to-detect cyber attacks are a real threat. Creating AIs that can identify and neutralize these threats is essential, but this must be done responsibly and ethically.</p>
<p>The impact on the job market is another point of intense debate. AI-driven automation has the potential to completely transform entire sectors of the economy. While some repetitive and dangerous tasks can be automated, freeing workers for more creative and safer activities, many traditional jobs may disappear. This forces us to rethink the structure of work and develop strategies for professional requalification and adaptation to new economic realities. So, as we embrace the opportunities offered by AIs, we must also address the ethical and moral questions that arise. Technology should be developed and implemented in a way that benefits society as a whole, promoting justice, equity, and respect for human rights. Collaboration between governments, companies, and civil society will be crucial to ensure that technological innovations contribute to a fairer and more sustainable future.</p>
<h3>Reflection<span class="hx:absolute hx:-mt-20" id="reflection"></span>
    <a href="#reflection" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>It is crucial to highlight that creating teams don&rsquo;t always consider all the consequences of their projects. Often, innovation is driven by the desire to solve immediate problems, without deep reflection on long-term effects.</p>
<p><img src="https://cdn-images-1.medium.com/max/392/1*p8HZ4iuS6lWlZ-orCGBpQg@2x.jpeg" alt=""  loading="lazy" /></p>
<p>The pressure to launch new products and services can lead to excessive focus on quick and efficient solutions, leaving aside broader considerations about ethical, social, and environmental impact. For example, a new technology may solve an urgent need, but at the same time, it may create new vulnerabilities or exacerbate existing inequalities.</p>
<p>Furthermore, lack of comprehensive analysis can result in unintended consequences, such as amplifying implicit biases in AIs or deterioration of personal privacy. These consequences can be difficult to predict and even more difficult to mitigate after the technology is implemented.</p>
<p>So it is worth emphasizing that it is essential for developers to adopt a holistic and responsible approach when creating new technologies. This includes conducting impact assessments, consulting experts from various fields, and engaging with the community to better understand the possible repercussions of their innovations. Integrating ethical principles from the early phases of development can help ensure that technologies not only solve immediate problems but also contribute to a fairer and more equitable future.</p>
<p>Every benefit to the world can be followed by harms. While a new technology can improve quality of life, it can also bring unexpected challenges. For example, the creation of a new programming language can generate employment and income for many families, but a malicious AI can invade servers and steal thousands of personal information.</p>
<h3>Conclusion<span class="hx:absolute hx:-mt-20" id="conclusion"></span>
    <a href="#conclusion" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>To conclude, the consequences of developing new technologies can range from simple impacts, such as a programming language that benefits the economy, to complex problems, such as an AI that manipulates information to influence elections. It is essential that we consider the moral responsibilities associated with our innovations. As I said: &ldquo;The future is a blank page that will be scratched by someone who has the consent or not of responsibilities, once scratched, it can never be erased.&rdquo;</p>
<p><img src="https://cdn-images-1.medium.com/max/237/1*iM3hKfeAuZ04BTPYyeR9Og@2x.jpeg" alt=""  loading="lazy" /></p>
<p>This quote illustrates the importance of approaching technological development with a sense of responsibility and foresight. When we create and implement new technologies, we are not only shaping the present, but also drawing indelible lines in the future. Each innovation can trigger a series of consequences that can be beneficial or harmful.</p>
<p>Health-oriented technologies, such as gene editing, can cure previously incurable diseases, but also raise ethical questions about manipulation of the human genome. Similarly, social media platforms can connect people around the world, but can also be used to spread disinformation and hate. The future is in our hands and, as we scratch this blank page, we must do so with care, conscience, and an unwavering commitment to moral responsibility. Only then will we not be remembered by our children as the &ldquo;old man who invented the bomb that destroyed the world.&rdquo;</p>
<p>It is worth noting that this text had AI assistance for grammatical corrections, but all ideas presented here are the result of research and the author&rsquo;s own opinions.</p>
<p>Did I help you? <a href="http://buymeacoffee.com/raphaelpontes"target="_blank" rel="noopener">Buy me a coffee</a></p>
<p>Follow me on</p>
<ul>
<li>LinkedIn: <a href="https://www.linkedin.com/in/raphaelkennedy"target="_blank" rel="noopener">raphaelkennedy</a></li>
<li>YouTube: <a href="https://youtube.com/@raphaelpontes"target="_blank" rel="noopener">raphaelpontes</a></li>
</ul>
]]></content:encoded><category>software-development</category><category>technology</category><category>artificial-intelligence</category></item><item><title>About</title><link>https://www.orapha.dev/en/about/</link><guid isPermaLink="true">https://www.orapha.dev/en/about/</guid><pubDate>Mon, 01 Jan 0001 00:00:00 GMT</pubDate><description>&lt;h2&gt;Who I am&lt;span class="hx:absolute hx:-mt-20" id="who-i-am"&gt;&lt;/span&gt;
&lt;a href="#who-i-am" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I am Raphael Pontes, a senior software engineer with over a decade of experience building products, participating in startups, leading technical initiatives, and delivering software in very different contexts, from freelance to production products.&lt;/p&gt;
&lt;h2&gt;My journey&lt;span class="hx:absolute hx:-mt-20" id="my-journey"&gt;&lt;/span&gt;
&lt;a href="#my-journey" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;My background spans web and mobile development, with a strong focus on Flutter, Laravel, REST APIs, and software architecture. Over the years, I&amp;rsquo;ve also worked with technical leadership, business intelligence, testing, clean architecture, relational and non-relational databases, Firebase, cloud functions, UI/UX, and project planning and execution.&lt;/p&gt;</description><content:encoded><![CDATA[<h2>Who I am<span class="hx:absolute hx:-mt-20" id="who-i-am"></span>
    <a href="#who-i-am" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I am Raphael Pontes, a senior software engineer with over a decade of experience building products, participating in startups, leading technical initiatives, and delivering software in very different contexts, from freelance to production products.</p>
<h2>My journey<span class="hx:absolute hx:-mt-20" id="my-journey"></span>
    <a href="#my-journey" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>My background spans web and mobile development, with a strong focus on Flutter, Laravel, REST APIs, and software architecture. Over the years, I&rsquo;ve also worked with technical leadership, business intelligence, testing, clean architecture, relational and non-relational databases, Firebase, cloud functions, UI/UX, and project planning and execution.</p>
<p>I also have a strong relationship with creating and sharing knowledge. Beyond product and engineering work, I enjoy publishing videos, exploring new tools, and turning practical learning into useful content.</p>
<h2>This blog<span class="hx:absolute hx:-mt-20" id="this-blog"></span>
    <a href="#this-blog" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><code>orapha.dev</code> is my space to write more calmly about programming, patterns, architecture, artificial intelligence, and day-to-day technical decisions.</p>
<p>I&rsquo;m not interested in technology as a showcase. I&rsquo;m interested in technology as practice: what&rsquo;s worth adopting, what unnecessarily complicates things, what ages well, and what really helps build better software.</p>
<p>That&rsquo;s why this blog works as a public notebook of observations, experiments, and opinions. A place to taste technologies in a personal and thoughtful way.</p>
<h2>Where to find me<span class="hx:absolute hx:-mt-20" id="where-to-find-me"></span>
    <a href="#where-to-find-me" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul>
<li>LinkedIn: <a href="https://www.linkedin.com/in/raphaelkennedy/"target="_blank" rel="noopener">raphaelkennedy</a></li>
<li>GitHub: <a href="https://github.com/rkpontes"target="_blank" rel="noopener">rkpontes</a></li>
<li>YouTube: <a href="https://www.youtube.com/raphaelpontes"target="_blank" rel="noopener">youtube.com/raphaelpontes</a></li>
<li>Instagram: <a href="http://instagram.com/raphaelkennedy"target="_blank" rel="noopener">@raphaelkennedy</a></li>
</ul>
]]></content:encoded></item></channel></rss>