<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Krlz</title>
    <description>The latest articles on DEV Community by Krlz (@krlz).</description>
    <link>https://dev.to/krlz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F947301%2Fa9309253-8434-4599-9db3-27864ef23a92.jpg</url>
      <title>DEV Community: Krlz</title>
      <link>https://dev.to/krlz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/krlz"/>
    <language>en</language>
    <item>
      <title>Enterprise Software in 2026: From First Conversation to Production Ownership</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Thu, 22 Oct 2026 02:21:01 +0000</pubDate>
      <link>https://dev.to/krlz/enterprise-software-in-2026-from-first-conversation-to-production-ownership-3h23</link>
      <guid>https://dev.to/krlz/enterprise-software-in-2026-from-first-conversation-to-production-ownership-3h23</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Shipping code is an event. Owning software is a continuing obligation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A software project can pass every sprint demo and still fail its customer. Perhaps nobody defined what &lt;em&gt;available&lt;/em&gt; meant. Perhaps the vendor delivered source code but not infrastructure access. Perhaps AI generated features faster than the team could verify them. Perhaps an impressive dashboard measured deployments while customers waited hours for business-critical jobs.&lt;/p&gt;

&lt;p&gt;This article follows one &lt;strong&gt;fictional enterprise project&lt;/strong&gt; from initial discovery through procurement, negotiation, implementation, launch, incidents, and handover. Its example numbers, targets, and conversations are &lt;strong&gt;illustrative proposals&lt;/strong&gt;, not industry benchmarks or legal advice. Along the way, we'll connect the decisions to published guidance from DORA, NIST, OWASP, and Google SRE. &lt;strong&gt;No prior familiarity with enterprise-process jargon is assumed:&lt;/strong&gt; terms are explained when they first matter, with a concrete example of what a team actually does.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read this guide
&lt;/h2&gt;

&lt;p&gt;Each phase answers five practical questions: &lt;strong&gt;Why are we doing this? Who decides? What do we produce? How do we know it worked? Where can AI help without becoming the decision-maker?&lt;/strong&gt; The project is fictional, so its numerical targets are examples of negotiated choices, not universal best practices. If you are a developer, follow the engineering decisions; if you are a product or procurement lead, pay attention to who accepts risk and signs off on results.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;validation gate&lt;/strong&gt; is simply a checkpoint before the next costly or risky step. It is not necessarily a meeting or an approval committee: it can be a passing automated test, a customer confirming a prototype, or an operations engineer demonstrating a successful restore.&lt;/p&gt;

&lt;h2&gt;
  
  
  The case: a logistics platform with real consequences
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Northstar Logistics&lt;/strong&gt; operates 2,000 vehicles across several countries. Its operations staff coordinate shipments through spreadsheets, email, and a legacy application. The company hires &lt;strong&gt;Harbor Software&lt;/strong&gt;, an external development partner, to build a shipment visibility and exception-management platform.&lt;/p&gt;

&lt;p&gt;Stakeholders:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Accountable for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Executive sponsor&lt;/td&gt;
&lt;td&gt;Funding and business outcome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product owner (Northstar)&lt;/td&gt;
&lt;td&gt;Scope, priorities, acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Technical owner (Northstar)&lt;/td&gt;
&lt;td&gt;Architecture, access, continuity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery lead (Harbor)&lt;/td&gt;
&lt;td&gt;Delivery plan, staffing, risk communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security/data owners&lt;/td&gt;
&lt;td&gt;Security controls, privacy, retention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SRE/on-call owner&lt;/td&gt;
&lt;td&gt;Production response and recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End users&lt;/td&gt;
&lt;td&gt;Workflow feedback and UAT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A &lt;strong&gt;stakeholder&lt;/strong&gt; is anyone affected by the project or empowered to make a decision. An &lt;strong&gt;accountable owner&lt;/strong&gt; is the person who must make sure an outcome happens, even if others do the work. &lt;strong&gt;UAT (user acceptance testing)&lt;/strong&gt; means real users trying representative workflows to decide whether the product meets their needs—not merely whether the code runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business hypothesis:&lt;/strong&gt; reduce the median time to identify and assign a delayed shipment from 45 minutes to 15 minutes within 90 days of rollout, without increasing false alerts or manual workload.&lt;/p&gt;

&lt;p&gt;Notice that the objective is not “build a dashboard.” A dashboard is one possible intervention. The outcome is faster, trustworthy decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The organizational question: management is not ownership
&lt;/h2&gt;

&lt;p&gt;Before Northstar negotiates a feature, it must decide &lt;strong&gt;who can make which decisions&lt;/strong&gt;. A delivery manager can keep a schedule on track without understanding the production system. An architect can understand every service without having authority to change priorities. Neither is a substitute for the other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project management&lt;/strong&gt; coordinates a time-bound initiative: commitments, dependencies, budgets, and delivery risks. &lt;strong&gt;Product management&lt;/strong&gt; decides which customer problems deserve investment and measures whether solving them creates value. &lt;strong&gt;Engineering management&lt;/strong&gt; develops the team's capacity to deliver sustainably: hiring, coaching, staffing, and working conditions. &lt;strong&gt;Technical ownership&lt;/strong&gt; means named people can explain design choices, approve or implement changes, and maintain the system over time. &lt;strong&gt;Service ownership&lt;/strong&gt; adds operational accountability: someone knows when a service is failing and can lead its recovery. &lt;strong&gt;Executive governance&lt;/strong&gt; determines which business risks and investments the organization will accept.&lt;/p&gt;

&lt;p&gt;These are responsibilities, not necessarily six job titles. A small company may combine roles; a regulated enterprise may separate them. The critical requirement is to make decision rights explicit.&lt;/p&gt;

&lt;h3&gt;
  
  
  What modern management research actually suggests
&lt;/h3&gt;

&lt;p&gt;DORA's &lt;a href="https://dora.dev/research/2024/dora-report/" rel="noopener noreferrer"&gt;2024 research&lt;/a&gt; associates stable priorities, user focus, and transformational leadership with stronger outcomes; it also warns that platform initiatives can introduce delivery trade-offs. Its &lt;a href="https://dora.dev/research/2025/dora-report/" rel="noopener noreferrer"&gt;2025 AI research&lt;/a&gt; argues that AI amplifies existing organizational strengths and weaknesses rather than replacing them. These are research findings and associations, &lt;strong&gt;not a guarantee that adopting one management framework causes success&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DORA's guidance on &lt;a href="https://dora.dev/capabilities/loosely-coupled-teams/" rel="noopener noreferrer"&gt;loosely coupled teams&lt;/a&gt; emphasizes teams that can test, change, and deploy with fewer cross-team dependencies. &lt;strong&gt;Loosely coupled&lt;/strong&gt; does not mean isolated: it means teams agree on clear interfaces so that routine work does not require constant permission or coordination.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.atlassian.com/devops/frameworks/team-topologies" rel="noopener noreferrer"&gt;Team Topologies&lt;/a&gt; model offers a useful vocabulary: a &lt;strong&gt;stream-aligned team&lt;/strong&gt; owns a flow of customer value; a &lt;strong&gt;platform team&lt;/strong&gt; supplies reusable internal capabilities; an &lt;strong&gt;enabling team&lt;/strong&gt; helps others learn specialized skills; and a &lt;strong&gt;complicated-subsystem team&lt;/strong&gt; concentrates scarce expertise. These are design options, not an org chart to copy blindly.&lt;/p&gt;

&lt;h3&gt;
  
  
  A management failure in the Northstar story
&lt;/h3&gt;

&lt;p&gt;Two months into development, the vendor's delivery manager reports: &lt;em&gt;“We're green: 85% of tickets completed.”&lt;/em&gt; The operations director responds: &lt;em&gt;“Dispatchers still cannot trust shipment arrival estimates.”&lt;/em&gt; The technical owner adds: &lt;em&gt;“The event processor has no replay procedure, and only Harbor can deploy it.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;All three statements can be true. The project is tracking &lt;strong&gt;output&lt;/strong&gt; (tickets), while the business needs an &lt;strong&gt;outcome&lt;/strong&gt; (trustworthy decisions), and engineering needs &lt;strong&gt;operability&lt;/strong&gt; (the ability to diagnose and restore the system).&lt;/p&gt;

&lt;p&gt;A better weekly review shows all three:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;View&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Example signal&lt;/th&gt;
&lt;th&gt;Decision owner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;Are dispatchers better off?&lt;/td&gt;
&lt;td&gt;% of late shipments detected before escalation&lt;/td&gt;
&lt;td&gt;Northstar product owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;td&gt;Are changes flowing predictably?&lt;/td&gt;
&lt;td&gt;Change lead time and blocked work age&lt;/td&gt;
&lt;td&gt;Harbor delivery lead + engineering lead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Technical&lt;/td&gt;
&lt;td&gt;Can we change the system safely?&lt;/td&gt;
&lt;td&gt;Contract-test pass rate; independent deploy drill&lt;/td&gt;
&lt;td&gt;Northstar technical owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations&lt;/td&gt;
&lt;td&gt;Can we recover?&lt;/td&gt;
&lt;td&gt;Restore drill outcome and time&lt;/td&gt;
&lt;td&gt;Named service owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commercial&lt;/td&gt;
&lt;td&gt;Are we buying the right result?&lt;/td&gt;
&lt;td&gt;Cost against accepted business milestones&lt;/td&gt;
&lt;td&gt;Sponsor + procurement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The signals are &lt;strong&gt;examples to instrument&lt;/strong&gt;, not benchmark targets. Teams should establish a baseline before deciding what counts as improvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  A negotiation about ownership, not just deadlines
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Vendor delivery lead:&lt;/strong&gt; “We can meet the date if we keep infrastructure under our account and hand it over after launch.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer technical owner:&lt;/strong&gt; “That reduces your setup time, but it creates a dependency we cannot accept for a critical service.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product owner:&lt;/strong&gt; “What does changing that cost, and does it delay the pilot?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vendor delivery lead:&lt;/strong&gt; “Provisioning in your account adds two weeks. We can still pilot with a reduced reporting scope.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Executive sponsor:&lt;/strong&gt; “Agreed, provided we see an independent deployment and restore demonstration before production acceptance.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a &lt;strong&gt;trade-off negotiation&lt;/strong&gt;: the sponsor chooses between time, scope, and long-term operational control. A useful record is a one-page decision with options, consequences, decision-maker, deadline, and a test proving the choice worked. The vendor is still responsible for delivery, but the customer is not required to depend on the vendor forever.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision rights: use a DACI, not a maze of approvals
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DACI&lt;/strong&gt; is a lightweight decision framework: &lt;strong&gt;Driver&lt;/strong&gt; coordinates the decision, &lt;strong&gt;Approver&lt;/strong&gt; makes the final call, &lt;strong&gt;Contributors&lt;/strong&gt; provide expertise, and &lt;strong&gt;Informed&lt;/strong&gt; stakeholders receive the outcome. It differs from a &lt;strong&gt;RACI&lt;/strong&gt; responsibility chart (Responsible, Accountable, Consulted, Informed), which is often used to describe ongoing work rather than one discrete decision.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;th&gt;Driver&lt;/th&gt;
&lt;th&gt;Approver&lt;/th&gt;
&lt;th&gt;Contributors&lt;/th&gt;
&lt;th&gt;Evidence required&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prioritize shipment exception alerts&lt;/td&gt;
&lt;td&gt;Product manager&lt;/td&gt;
&lt;td&gt;Product owner&lt;/td&gt;
&lt;td&gt;Dispatchers, engineers&lt;/td&gt;
&lt;td&gt;Workflow trial and baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Choose event processing design&lt;/td&gt;
&lt;td&gt;Tech lead&lt;/td&gt;
&lt;td&gt;Technical owner&lt;/td&gt;
&lt;td&gt;Security, operations, vendor&lt;/td&gt;
&lt;td&gt;ADR and failure-mode test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accept lower pilot scope&lt;/td&gt;
&lt;td&gt;Delivery lead&lt;/td&gt;
&lt;td&gt;Sponsor + product owner&lt;/td&gt;
&lt;td&gt;Finance, tech lead&lt;/td&gt;
&lt;td&gt;Revised SOW and acceptance tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release critical service&lt;/td&gt;
&lt;td&gt;Release coordinator&lt;/td&gt;
&lt;td&gt;Authorized service owner&lt;/td&gt;
&lt;td&gt;QA, security, on-call&lt;/td&gt;
&lt;td&gt;Passing gates, rollback rehearsal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accept contractual SLA exception&lt;/td&gt;
&lt;td&gt;Account manager&lt;/td&gt;
&lt;td&gt;Contractually authorized business owner&lt;/td&gt;
&lt;td&gt;Legal, operations&lt;/td&gt;
&lt;td&gt;Impact, remedy, expiry date&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The table is illustrative. Real approval authority must match company policy and contracts. &lt;strong&gt;Escalation&lt;/strong&gt; should occur when a decision crosses an agreed boundary (budget, customer impact, compliance, architecture), not whenever an engineer changes a line of code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where AI belongs in modern management
&lt;/h3&gt;

&lt;p&gt;AI can draft meeting summaries, identify conflicting requirements, prepare options for negotiation, flag stale risks, cluster support tickets, and generate proposed ADRs. It can also help explain technical consequences to nontechnical stakeholders. But a generated summary is &lt;strong&gt;not a signed decision&lt;/strong&gt;, a predicted delivery date is &lt;strong&gt;not a commitment&lt;/strong&gt;, and a model's preferred architecture is &lt;strong&gt;not organizational authority&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Northstar sets a simple policy: AI-generated decisions must cite their inputs, distinguish facts from suggestions, identify a human approver, and remain reviewable. Sensitive contract terms or customer data are not sent to tools without approved data-handling controls.&lt;/p&gt;

&lt;p&gt;To test whether AI helps rather than adds bureaucracy, the team measures: &lt;strong&gt;decision latency&lt;/strong&gt; (time from an identified decision to an approved choice), &lt;strong&gt;decision reversals&lt;/strong&gt; (choices reopened due to missing evidence), &lt;strong&gt;meeting-to-action completion&lt;/strong&gt; (actions completed by the agreed date), and &lt;strong&gt;review correction rate&lt;/strong&gt; (AI drafts requiring material correction). Measure these at team or workflow level, not as a leaderboard of individuals. Compare similar work before and after adoption, and inspect adverse effects such as missed context or extra review time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Validate the management model itself
&lt;/h3&gt;

&lt;p&gt;At the end of the pilot, ask five practical questions: Can a dispatcher demonstrate business improvement? Can the team deploy a small change without a cross-company approval chain? Can the customer restore the service without vendor credentials? Is there a named human who can accept an operational risk? Can the organization explain which decisions AI supported and who approved them?&lt;/p&gt;

&lt;p&gt;If any answer is no, the issue may be organizational rather than a missing feature. A project can have excellent ceremonies and still lack meaningful ownership.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 0 — Qualify the problem before selling a solution
&lt;/h2&gt;

&lt;p&gt;The vendor runs discovery interviews with dispatchers, operations managers, security, and the legacy-system team. It maps a shipment's journey and records where data is missing or delayed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample conversation:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Customer:&lt;/strong&gt; We need live tracking for every vehicle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineer:&lt;/strong&gt; What decision becomes possible with live tracking that isn't possible today?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer:&lt;/strong&gt; Dispatchers need to react before a delivery misses its window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineer:&lt;/strong&gt; Would a two-minute update plus a reliable delay alert meet that need? Continuous streaming changes mobile connectivity, storage, and support costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer:&lt;/strong&gt; Let's test it with dispatchers rather than assume.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An &lt;strong&gt;artifact&lt;/strong&gt; is a durable piece of project evidence: a document, recorded decision, prototype, test report, or dashboard. A &lt;strong&gt;baseline&lt;/strong&gt; is the measured starting point against which later improvement is compared. An &lt;strong&gt;assumptions register&lt;/strong&gt; lists claims the team has not yet verified, such as “the carrier API can handle 100 requests per second.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Artifacts:&lt;/strong&gt; problem statement, current-state workflow, stakeholder map, data inventory, baseline metrics, assumptions register, risks, and a one-page business case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation gate:&lt;/strong&gt; sponsor and product owner confirm the problem, a measurable outcome, and the baseline measurement method. Run a small user observation or prototype before committing to architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI contribution:&lt;/strong&gt; transcribe approved interviews, cluster recurring pain points, draft process maps, identify contradictory statements. &lt;strong&gt;Human check:&lt;/strong&gt; verify every consequential finding against recordings, participants, or system evidence. Never send confidential interviews to an unapproved model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 1 — Negotiate scope, economics, and control
&lt;/h2&gt;

&lt;p&gt;The parties choose a phased engagement instead of treating a fixed-price contract as a substitute for discovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Illustrative commercial proposal:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery:&lt;/strong&gt; two weeks, fixed fee, producing a validated backlog, risk register, and delivery estimate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pilot:&lt;/strong&gt; eight weeks, limited to 100 vehicles and two dispatcher teams; price and scope capped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expansion:&lt;/strong&gt; funded after pilot acceptance, with explicit change control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support:&lt;/strong&gt; separate operational agreement defining hours, severity, escalation, and service credits if applicable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sample negotiation:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Customer procurement:&lt;/strong&gt; We need a fixed deadline and fixed cost for all countries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vendor lead:&lt;/strong&gt; We can fix the pilot budget and deadline. We cannot responsibly fix the full integration scope before inspecting the legacy interfaces. We propose a two-week discovery with an option to stop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer CTO:&lt;/strong&gt; We also need the ability to replace your team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vendor lead:&lt;/strong&gt; Agreed. Repositories, infrastructure accounts, pipelines, documentation, and observability will live under your organization's control. We'll define an exit rehearsal as an acceptance condition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer procurement:&lt;/strong&gt; How do we handle new compliance requirements?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vendor lead:&lt;/strong&gt; We'll document their impact on scope, risk, cost, and schedule, and obtain written approval before changing the baseline.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A &lt;strong&gt;statement of work (SOW)&lt;/strong&gt; spells out what the supplier will deliver, by when, and under what acceptance conditions. &lt;strong&gt;Scope&lt;/strong&gt; is the agreed boundary of the work. &lt;strong&gt;Change control&lt;/strong&gt; is how the parties decide whether a new request changes the price, timeline, or risk. &lt;strong&gt;IP (intellectual property)&lt;/strong&gt; concerns rights to code, designs, and other deliverables; &lt;strong&gt;third-party licenses&lt;/strong&gt; can limit how dependencies may be used or redistributed. An &lt;strong&gt;exit strategy&lt;/strong&gt; makes it possible to switch providers without losing access or knowledge.&lt;/p&gt;

&lt;p&gt;For example, “add customs integration for another country” is not automatically a small change just because the screen looks similar. The customer describes the business need; the supplier estimates integration, legal, testing, and support impacts; the authorized owners approve, defer, or trade it against existing scope. &lt;strong&gt;Negotiation should expose trade-offs, not disguise uncertainty as certainty.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contract checklist:&lt;/strong&gt; statement of work, deliverables, acceptance windows, change-request mechanism, IP ownership and third-party licensing, confidentiality, data processing, subcontractors, security incident notice, service/support responsibilities, termination assistance, source and infrastructure access, warranties, and dispute escalation. Legal counsel should adapt these terms to the jurisdiction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation gate:&lt;/strong&gt; both parties sign the scope baseline, assumptions, decision rights, acceptance method, and exit responsibilities. No one should confuse “code handed over” with “system operable independently.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 2 — Turn a business goal into testable specifications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Functional example
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Story:&lt;/strong&gt; As a dispatcher, I want delayed shipments ranked by urgency so I can assign interventions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acceptance criteria:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Given a shipment predicted to miss its delivery window by more than 20 minutes, when the forecast is updated, the shipment appears in the exception queue.&lt;/li&gt;
&lt;li&gt;A dispatcher can acknowledge an alert and assign an owner.&lt;/li&gt;
&lt;li&gt;Replayed telemetry does not create duplicate active alerts for the same shipment and rule version.&lt;/li&gt;
&lt;li&gt;If location data is stale, the UI clearly shows its age rather than presenting it as current.&lt;/li&gt;
&lt;li&gt;Every acknowledgment and assignment records actor, time, and shipment identifier.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Nonfunctional example
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;functional requirement&lt;/strong&gt; describes &lt;em&gt;what the system does&lt;/em&gt;: “a dispatcher can assign an alert.” A &lt;strong&gt;nonfunctional requirement (NFR)&lt;/strong&gt; describes &lt;em&gt;how well or under what constraints&lt;/em&gt; it must work: speed, reliability, accessibility, security, or recoverability. An &lt;strong&gt;acceptance criterion&lt;/strong&gt; is an observable condition that lets the customer say yes or no. In the example above, the stale-data warning is not decorative: it prevents a dispatcher from mistaking yesterday's location for a live position.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;percentile&lt;/strong&gt; summarizes a distribution. If API latency at &lt;strong&gt;p95&lt;/strong&gt; is 400 milliseconds, about 95% of measured requests completed in 400 ms or less, under the specified test conditions; the slowest 5% may take longer. Averages alone can hide those slow experiences. &lt;strong&gt;RTO (recovery time objective)&lt;/strong&gt; is the targeted time to restore a service after disruption; &lt;strong&gt;RPO (recovery point objective)&lt;/strong&gt; is the maximum targeted amount of recent data that could be lost, expressed as time. Neither is a guarantee unless the recovery design and tests support it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;Proposed measurable requirement&lt;/th&gt;
&lt;th&gt;Verification&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API latency&lt;/td&gt;
&lt;td&gt;p95 under 400 ms for selected reads at agreed load&lt;/td&gt;
&lt;td&gt;Load test and production traces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Availability&lt;/td&gt;
&lt;td&gt;99.9% monthly for defined customer-facing API&lt;/td&gt;
&lt;td&gt;Synthetic checks plus request SLIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data freshness&lt;/td&gt;
&lt;td&gt;95% of accepted telemetry reflected within 120 seconds&lt;/td&gt;
&lt;td&gt;Event-to-visibility timestamps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorization&lt;/td&gt;
&lt;td&gt;Users can access only permitted tenants and roles&lt;/td&gt;
&lt;td&gt;Negative authorization tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recovery&lt;/td&gt;
&lt;td&gt;RTO 2 hours; RPO 15 minutes for critical state&lt;/td&gt;
&lt;td&gt;Restore and failover exercise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditability&lt;/td&gt;
&lt;td&gt;Changes to assignments traceable to an actor&lt;/td&gt;
&lt;td&gt;Audit log test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accessibility&lt;/td&gt;
&lt;td&gt;Target WCAG 2.2 AA for relevant web workflows&lt;/td&gt;
&lt;td&gt;Automated and manual review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are &lt;strong&gt;starting negotiation values&lt;/strong&gt;, not promises that every system can or should meet. Define the population, exclusions, load profile, and measurement window before approving them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation gate:&lt;/strong&gt; product, engineering, security, and operations sign off on representative examples, failure behavior, data ownership, and measurable NFRs. Trace each critical requirement to a test or observable signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI contribution:&lt;/strong&gt; propose edge cases, convert approved requirements into draft Gherkin scenarios, review ambiguities. &lt;strong&gt;Human check:&lt;/strong&gt; independently compare generated tests to the requirement; an AI can write a test that faithfully validates the wrong behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 3 — Architecture and risk decisions
&lt;/h2&gt;

&lt;p&gt;The team chooses an incremental architecture: a telemetry ingestion adapter, event stream, shipment-state processor, alert rules service, operational API, and web UI. It deliberately avoids splitting every function into a microservice.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  T[Vehicle telemetry] --&amp;gt; I[Ingestion adapter]
  I --&amp;gt; Q[Durable event stream]
  Q --&amp;gt; P[Shipment state processor]
  P --&amp;gt; D[(Operational data store)]
  P --&amp;gt; R[Alert rules]
  R --&amp;gt; D
  D --&amp;gt; A[API]
  A --&amp;gt; U[Dispatcher UI]
  P --&amp;gt; O[Metrics and traces]
  A --&amp;gt; O&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;An &lt;strong&gt;architecture decision record (ADR)&lt;/strong&gt; is a short explanation of a significant technical choice, its alternatives, and its consequences. It helps the next engineer understand &lt;em&gt;why&lt;/em&gt; the system looks this way. A &lt;strong&gt;durable event stream&lt;/strong&gt; retains messages so processors can recover or replay them. &lt;strong&gt;Idempotency&lt;/strong&gt; means processing the same business event twice has the same intended effect as processing it once. A &lt;strong&gt;dead-letter queue&lt;/strong&gt; isolates messages that repeatedly fail so they can be inspected instead of blocking everything. &lt;strong&gt;Eventual consistency&lt;/strong&gt; means different parts of the system may briefly disagree while updates propagate.&lt;/p&gt;

&lt;p&gt;Imagine a vehicle losing connectivity, then uploading the same position twice. Without idempotency, the system could create two delay alerts. With a stable event identifier and deduplication rule, the second upload does not cause a second business action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ADR-004 — Asynchronous telemetry processing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context:&lt;/strong&gt; connectivity is intermittent; messages may be duplicated or reordered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision:&lt;/strong&gt; durable events, explicit idempotency keys, bounded retries, dead-letter handling, and freshness indicators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternatives:&lt;/strong&gt; synchronous direct writes; batch imports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consequences:&lt;/strong&gt; additional operational complexity, eventual consistency, replay and schema-evolution obligations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revisit when:&lt;/strong&gt; volume, delay, or operational burden invalidates the assumptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Threat model:&lt;/strong&gt; tenant isolation, forged telemetry, compromised API tokens, overprivileged service accounts, leaked location history, supply-chain compromise, and AI-agent access to production secrets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation gate:&lt;/strong&gt; architecture review checks failure modes, load estimates, security boundaries, ADR trade-offs, and a working vertical slice. A diagram alone is not evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 4 — Agree on how the team communicates
&lt;/h2&gt;

&lt;p&gt;Communication is an engineering control when it preserves decisions and surfaces uncertainty. A &lt;strong&gt;cadence&lt;/strong&gt; is the agreed frequency of communication. &lt;strong&gt;Async updates&lt;/strong&gt; are written updates that do not require everyone in a meeting. A &lt;strong&gt;risk register&lt;/strong&gt; is a living list of potential problems, their probability or impact, owners, and mitigation plans. A &lt;strong&gt;steering meeting&lt;/strong&gt; is where sponsors resolve decisions the delivery team cannot make alone.&lt;/p&gt;

&lt;p&gt;A useful status report does not merely say “80% done.” It states what was verified, what could prevent success, who must decide, and by when. &lt;strong&gt;Amber&lt;/strong&gt; means attention is required; it does not mean failure.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cadence&lt;/th&gt;
&lt;th&gt;Participants&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daily async update&lt;/td&gt;
&lt;td&gt;Delivery team&lt;/td&gt;
&lt;td&gt;Done / next / blocked / risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly product review&lt;/td&gt;
&lt;td&gt;Product + engineering&lt;/td&gt;
&lt;td&gt;Demo, acceptance, priority decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly risk review&lt;/td&gt;
&lt;td&gt;Delivery, technical and security owners&lt;/td&gt;
&lt;td&gt;Updated risk register and mitigations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture decision as needed&lt;/td&gt;
&lt;td&gt;Relevant engineers + owner&lt;/td&gt;
&lt;td&gt;ADR with alternatives and consequences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly steering meeting&lt;/td&gt;
&lt;td&gt;Sponsor + vendor leadership&lt;/td&gt;
&lt;td&gt;Budget, outcomes, escalations, scope decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident bridge&lt;/td&gt;
&lt;td&gt;On-call, incident commander, stakeholders&lt;/td&gt;
&lt;td&gt;Timeline, mitigations, next update time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example weekly update:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Status: Amber — telemetry integration&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Completed: replay-safe ingestion prototype, 14 integration tests.&lt;br&gt;&lt;br&gt;
Evidence: duplicate events no longer create duplicate shipment-state transitions in the test environment.&lt;br&gt;&lt;br&gt;
Risk: partner API rate limit is undocumented; pilot throughput may be affected.&lt;br&gt;&lt;br&gt;
Decision needed by Thursday: authorize a partner load test or accept a lower initial fleet limit.&lt;br&gt;&lt;br&gt;
Owner: Northstar integration lead. Next update: Friday 15:00.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Validation gate:&lt;/strong&gt; decisions have owners and deadlines; risks have mitigation or explicit acceptance. A green status without evidence is not a control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 5 — Build with AI, without outsourcing accountability
&lt;/h2&gt;

&lt;p&gt;AI can help throughout the lifecycle, but different tasks require different permissions and verification. Here &lt;strong&gt;AI agent&lt;/strong&gt; means software that can use tools and take multiple steps (for example, reading an issue, editing a branch, and running tests), not just a chat assistant answering a question. A &lt;strong&gt;human-in-the-loop&lt;/strong&gt; control means an authorized person must review or approve a consequential action. A &lt;strong&gt;code owner&lt;/strong&gt; is the designated reviewer responsible for a portion of the repository.&lt;/p&gt;

&lt;p&gt;The central risk is &lt;strong&gt;verification debt&lt;/strong&gt;: code, tests, and documents can be generated faster than the team can check their correctness. A polished AI summary is not evidence that an interviewee said something; a passing AI-written test is not evidence that the intended business rule was correct. Give agents the least permissions they need and preserve an audit trail of actions.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Useful AI work&lt;/th&gt;
&lt;th&gt;Required human verification&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;Interview synthesis, gap detection&lt;/td&gt;
&lt;td&gt;Source-backed findings and user confirmation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specifications&lt;/td&gt;
&lt;td&gt;Edge cases, acceptance-test drafts&lt;/td&gt;
&lt;td&gt;Product owner approves intended behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture&lt;/td&gt;
&lt;td&gt;Alternatives, failure scenarios&lt;/td&gt;
&lt;td&gt;Engineers test assumptions and own ADRs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding&lt;/td&gt;
&lt;td&gt;Scaffolding, refactoring, migrations&lt;/td&gt;
&lt;td&gt;Code review, tests, security checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;td&gt;Test generation, fuzz-case suggestions&lt;/td&gt;
&lt;td&gt;Independent oracle and meaningful assertions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations&lt;/td&gt;
&lt;td&gt;Incident summaries, query suggestions&lt;/td&gt;
&lt;td&gt;On-call confirms diagnosis and commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reporting&lt;/td&gt;
&lt;td&gt;Release-note and metric summaries&lt;/td&gt;
&lt;td&gt;Validate against telemetry and change records&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example AI-agent policy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;agent_policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;approved_tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;repository_reader&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;test_runner&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;issue_tracker&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;default_permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read_only&lt;/span&gt;
  &lt;span class="na"&gt;allowed_changes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;feature_branch&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;prohibited&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;production_deploy&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;secret_read&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;permission_grants&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;required_checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;human_code_owner_review&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;automated_tests&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dependency_and_secret_scans&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;security_review_for_sensitive_changes&lt;/span&gt;
  &lt;span class="na"&gt;audit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;record_agent_identity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;record_tool_actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a conceptual policy, &lt;strong&gt;not&lt;/strong&gt; a vendor-specific enforceable configuration. Enforce permissions in the actual identity, repository, CI, and infrastructure systems. Treat retrieved documents, issue descriptions, and tool output as untrusted inputs to agents.&lt;/p&gt;

&lt;p&gt;A useful &lt;strong&gt;AI evaluation&lt;/strong&gt; compares similar work over time: cycle time, review burden, escaped defects, rework, and customer outcomes. Do not infer productivity from generated lines of code or number of prompts. Use matched tasks or staged pilots where possible; control for task complexity and team differences.&lt;/p&gt;

&lt;p&gt;DORA's 2025 research reported widespread AI adoption and positive associations with throughput and product performance, while finding a negative association with delivery stability. That is a warning against equating faster code production with a healthier delivery system. &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-the-2025-dora-report" rel="noopener noreferrer"&gt;DORA 2025&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;OWASP SAMM's AI-assisted development guidance similarly emphasizes approved tools, scoped permissions, source and licensing policies, and deterministic verification beyond AI-based review: &lt;a href="https://owaspsamm.org/docs/guides/ai-assisted-development/" rel="noopener noreferrer"&gt;OWASP SAMM guidance&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 6 — Define objective release gates
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;quality gate&lt;/strong&gt; is a condition that must pass before a change proceeds. &lt;strong&gt;CI/CD (continuous integration / continuous delivery or deployment)&lt;/strong&gt; automates building, checking, and preparing or releasing changes. A &lt;strong&gt;pull request (PR)&lt;/strong&gt; is a proposed code change reviewed before merging. A &lt;strong&gt;contract test&lt;/strong&gt; checks that two components agree on their interface. A &lt;strong&gt;canary release&lt;/strong&gt; exposes a new version to a small fraction of traffic first; a &lt;strong&gt;rollback&lt;/strong&gt; returns to the previous version, while &lt;strong&gt;roll-forward&lt;/strong&gt; fixes the issue in a new version. &lt;strong&gt;Artifact provenance&lt;/strong&gt; records how a deployable package was built and from which source.&lt;/p&gt;

&lt;p&gt;The team creates a &lt;strong&gt;Definition of Done&lt;/strong&gt; for a feature and a stricter &lt;strong&gt;production release gate&lt;/strong&gt; for a deployable change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature done:&lt;/strong&gt; reviewed acceptance criteria, passing relevant tests, observability included, documentation updated, no unapproved critical security findings, and product-owner acceptance for user-facing behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production gate:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build is reproducible and artifacts have provenance.&lt;/li&gt;
&lt;li&gt;Unit, integration, contract, and risk-relevant end-to-end tests pass.&lt;/li&gt;
&lt;li&gt;Dependency, secrets, and static-security checks satisfy policy.&lt;/li&gt;
&lt;li&gt;Performance checks meet the agreed load envelope.&lt;/li&gt;
&lt;li&gt;Database migrations are forward/backward compatible or have a safe plan.&lt;/li&gt;
&lt;li&gt;Feature flags, canary rollout, and rollback or roll-forward procedures are rehearsed.&lt;/li&gt;
&lt;li&gt;Dashboards and alerts cover the new critical path.&lt;/li&gt;
&lt;li&gt;Named owner accepts residual risks and authorizes release.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Failure example:&lt;/strong&gt; the generated code passes unit tests but accidentally allows one tenant to query another tenant's shipments. The negative authorization suite fails. The pipeline blocks release even though the feature demo looks correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation gate:&lt;/strong&gt; store the evidence in the PR, build, test report, and release record. Exceptions require a named approver, expiry date, mitigation, and follow-up issue.&lt;/p&gt;

&lt;p&gt;NIST's &lt;a href="https://csrc.nist.gov/projects/SSDF" rel="noopener noreferrer"&gt;Secure Software Development Framework&lt;/a&gt; provides a useful organizing model: prepare the organization, protect software, produce well-secured software, and respond to vulnerabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 7 — SLIs, SLOs, SLAs, and operational negotiation
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;SLI (service level indicator)&lt;/strong&gt; is the number measured in production, such as the percentage of successful requests. An &lt;strong&gt;SLO (service level objective)&lt;/strong&gt; is the internal target for that indicator, such as 99.9% in 30 days. An &lt;strong&gt;SLA (service level agreement)&lt;/strong&gt; is a customer-facing contractual promise that defines coverage, measurement, support, exclusions, and possibly remedies if commitments are missed. An SLO does not automatically become an SLA.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;error budget&lt;/strong&gt; is the amount of unreliability allowed by an SLO. At 99.9% request success, the budget is 0.1% failed eligible requests over the chosen window. Teams can use that budget to decide whether to prioritize new features or reliability improvements. &lt;strong&gt;Sev-1&lt;/strong&gt; is a severity classification for a major incident; each organization must define its actual impact threshold. &lt;strong&gt;Acknowledgment time&lt;/strong&gt; is how quickly someone responds to an incident report, not how quickly the system is fixed.&lt;/p&gt;

&lt;p&gt;For the pilot, Northstar and Harbor propose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Availability SLI:&lt;/strong&gt; successful eligible API requests / all eligible API requests, with explicit rules for timeouts and excluded traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Availability SLO:&lt;/strong&gt; at least 99.9% over a rolling 30-day window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freshness SLI:&lt;/strong&gt; share of accepted events visible to dispatchers within 120 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freshness SLO:&lt;/strong&gt; at least 95% over seven days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support SLA:&lt;/strong&gt; severity-based response and escalation commitments, distinct from time-to-resolution promises.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For one million eligible requests in the SLO window, a 99.9% target allows &lt;strong&gt;1,000 unsuccessful requests&lt;/strong&gt;. If the system records 1,300, it misses the objective. A 99.9% time-based target corresponds to about &lt;strong&gt;43.2 minutes&lt;/strong&gt; of unavailability in 30 days, but request-based and time-based budgets are &lt;strong&gt;not interchangeable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example support negotiation:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Customer:&lt;/strong&gt; We want all incidents fixed within one hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations lead:&lt;/strong&gt; We can commit to a 15-minute acknowledgment for Sev-1 incidents with 24/7 coverage, but cannot guarantee every root cause is resolved in an hour. Let's separately define restoration targets, escalation, communication intervals, and service remedies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer:&lt;/strong&gt; What if we lose tracking during a carrier outage?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations lead:&lt;/strong&gt; The system should mark the data stale, queue retries where possible, and report dependency impact. The contract needs to distinguish our controllable failures from upstream outages without hiding the user's experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Illustrative severity matrix:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Acknowledgment target&lt;/th&gt;
&lt;th&gt;Update cadence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sev-1&lt;/td&gt;
&lt;td&gt;Widespread loss of critical dispatch functionality&lt;/td&gt;
&lt;td&gt;15 min, 24/7&lt;/td&gt;
&lt;td&gt;Every 30 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sev-2&lt;/td&gt;
&lt;td&gt;Major degradation with workaround&lt;/td&gt;
&lt;td&gt;1 hour during support coverage&lt;/td&gt;
&lt;td&gt;Every 2 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sev-3&lt;/td&gt;
&lt;td&gt;Limited issue&lt;/td&gt;
&lt;td&gt;1 business day&lt;/td&gt;
&lt;td&gt;Agreed in ticket&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not copy these commitments into a contract without verifying staffing, monitoring, holidays, time zones, and actual ability to respond.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error-budget policy:&lt;/strong&gt; when the service exhausts its agreed budget, pause discretionary risky releases and prioritize reliability, with exceptions for urgent security and recovery work. Google's &lt;a href="https://sre.google/workbook/error-budget-policy/" rel="noopener noreferrer"&gt;SRE error-budget policy example&lt;/a&gt; illustrates how to formalize that decision without using reliability as a punishment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 8 — Measure the entire system, not just the developers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Metrics are useful only when they support decisions.&lt;/strong&gt; A &lt;strong&gt;KPI (key performance indicator)&lt;/strong&gt; is a selected metric tied to a goal, such as reducing time to assign delayed shipments. &lt;strong&gt;Instrumentation&lt;/strong&gt; is the code or configuration that records events, logs, traces, and metrics. A &lt;strong&gt;trace&lt;/strong&gt; follows a request through components; a &lt;strong&gt;log&lt;/strong&gt; records an event; a &lt;strong&gt;metric&lt;/strong&gt; aggregates a measurement over time. &lt;strong&gt;DORA&lt;/strong&gt; is a research program that studies software-delivery performance and provides operational metrics; its measures are not individual developer scorecards.&lt;/p&gt;

&lt;p&gt;Create a &lt;strong&gt;measurement plan&lt;/strong&gt; before the pilot. Every metric needs a definition, event source, owner, review cadence, and response when it moves.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Formula or method&lt;/th&gt;
&lt;th&gt;Data source&lt;/th&gt;
&lt;th&gt;Decision it informs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;Median alert-to-assignment time&lt;/td&gt;
&lt;td&gt;Median(assignment time − actionable alert time)&lt;/td&gt;
&lt;td&gt;Audit events&lt;/td&gt;
&lt;td&gt;Does the product improve dispatch?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;False-alert rate&lt;/td&gt;
&lt;td&gt;False alerts / reviewed alerts&lt;/td&gt;
&lt;td&gt;Labeled review sample&lt;/td&gt;
&lt;td&gt;Are we creating noise?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;Weekly active dispatchers&lt;/td&gt;
&lt;td&gt;Distinct users completing core action&lt;/td&gt;
&lt;td&gt;Privacy-aware events&lt;/td&gt;
&lt;td&gt;Is the workflow adopted?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;td&gt;Change lead time&lt;/td&gt;
&lt;td&gt;Commit-to-production elapsed time&lt;/td&gt;
&lt;td&gt;Git + deployment records&lt;/td&gt;
&lt;td&gt;Where is delivery delayed?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;td&gt;Deployment frequency&lt;/td&gt;
&lt;td&gt;Production deployments per period&lt;/td&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;Can changes move safely?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;td&gt;Change fail rate&lt;/td&gt;
&lt;td&gt;Deployments requiring immediate intervention / deployments&lt;/td&gt;
&lt;td&gt;Incidents + deployments&lt;/td&gt;
&lt;td&gt;Are releases destabilizing service?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;td&gt;Failed deployment recovery time&lt;/td&gt;
&lt;td&gt;Time to recover from a failed deployment&lt;/td&gt;
&lt;td&gt;Incident timeline&lt;/td&gt;
&lt;td&gt;How quickly can we recover?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;td&gt;Deployment rework rate&lt;/td&gt;
&lt;td&gt;Unplanned incident-related deployments / deployments&lt;/td&gt;
&lt;td&gt;Deployment classifications&lt;/td&gt;
&lt;td&gt;How much emergency rework occurs?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reliability&lt;/td&gt;
&lt;td&gt;API success ratio&lt;/td&gt;
&lt;td&gt;Successful eligible requests / eligible requests&lt;/td&gt;
&lt;td&gt;Gateway telemetry&lt;/td&gt;
&lt;td&gt;Is the SLO met?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reliability&lt;/td&gt;
&lt;td&gt;p95 latency&lt;/td&gt;
&lt;td&gt;95th percentile of eligible request durations&lt;/td&gt;
&lt;td&gt;Traces/metrics&lt;/td&gt;
&lt;td&gt;Is the experience responsive?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;Duplicate effect rate&lt;/td&gt;
&lt;td&gt;Duplicate state changes / replayed or duplicate messages&lt;/td&gt;
&lt;td&gt;Processor audit&lt;/td&gt;
&lt;td&gt;Is idempotency working?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Critical finding age&lt;/td&gt;
&lt;td&gt;Days since confirmed finding opened&lt;/td&gt;
&lt;td&gt;Vulnerability tracker&lt;/td&gt;
&lt;td&gt;Are critical risks being reduced?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Cost per tracked vehicle-day&lt;/td&gt;
&lt;td&gt;Allocated service spend / active vehicle-days&lt;/td&gt;
&lt;td&gt;Cloud billing + usage&lt;/td&gt;
&lt;td&gt;Does scaling make economic sense?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;AI-assisted rework rate&lt;/td&gt;
&lt;td&gt;AI-assisted changes requiring rework / AI-assisted changes&lt;/td&gt;
&lt;td&gt;PR classification + issues&lt;/td&gt;
&lt;td&gt;Is AI creating downstream burden?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;DORA now defines &lt;strong&gt;five&lt;/strong&gt; software-delivery performance metrics, including deployment rework rate. Use its current definitions rather than an outdated four-metric slide: &lt;a href="https://dora.dev/guides/dora-metrics/" rel="noopener noreferrer"&gt;DORA metrics guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example instrumentation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shipment_alert_created{shipment_id, rule_version, timestamp}
shipment_alert_assigned{shipment_id, actor_id, timestamp}
telemetry_accepted{event_id, source, timestamp}
telemetry_visible{event_id, timestamp}
deployment_completed{service, version, timestamp}
incident_opened{severity, service, timestamp}
incident_restored{incident_id, timestamp}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an &lt;strong&gt;event schema illustration&lt;/strong&gt;, not a recommendation to put shipment IDs, event IDs, or actor IDs into Prometheus metric labels. High-cardinality identifiers belong in appropriately protected logs, traces, or event stores; aggregate metrics should use bounded labels. Protect personal and location data with access controls and retention limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to validate a metric
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;measurement window&lt;/strong&gt; is the period being analyzed. A &lt;strong&gt;denominator&lt;/strong&gt; is the population included in a rate; changing it can make a metric look better without improving reality. &lt;strong&gt;p90&lt;/strong&gt; means 90% of observations are at or below that value. &lt;strong&gt;High-cardinality labels&lt;/strong&gt; are labels with very many distinct values (for example, one per shipment); putting them on time-series metrics can overwhelm monitoring systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worked example:&lt;/strong&gt; Suppose 80 of 100 reviewed alerts were actionable and 20 were false alarms. The false-alert rate is 20/100 = &lt;strong&gt;20%&lt;/strong&gt;, provided the sample is representative. If the team quietly excludes difficult cases, that number becomes misleading. Suppose assignment times are 5, 10, 15, 20, and 120 minutes. The median is &lt;strong&gt;15 minutes&lt;/strong&gt;, but the 120-minute outlier still matters for operations; track a tail percentile too.&lt;/p&gt;

&lt;p&gt;For alert-to-assignment time, verify the start event represents an actionable alert, not a background recalculation; use consistent clocks; exclude test data; inspect missing assignments; compare median and p90; segment by region and shift; and sample raw records manually. Without these checks, a falling median might simply mean the team stopped recording difficult cases.&lt;/p&gt;

&lt;p&gt;For AI-assisted changes, establish a baseline and compare &lt;strong&gt;review time, escaped defects, change fail rate, and outcomes&lt;/strong&gt;. Label changes consistently, note mixed human/AI work, and avoid ranking individual engineers. An observational improvement is not proof that AI caused it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 9 — Run a pilot and decide with evidence
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;pilot&lt;/strong&gt; is a limited real-world rollout designed to test assumptions before broad deployment. A &lt;strong&gt;go/no-go decision&lt;/strong&gt; is an explicit choice to proceed, delay, or stop based on agreed evidence. A &lt;strong&gt;control group&lt;/strong&gt;, where feasible, is a comparable group not yet receiving the change; it helps distinguish the product's effect from unrelated improvements. A pilot without predetermined success conditions can easily become a demonstration where every result is interpreted as success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pilot plan:&lt;/strong&gt; 100 vehicles, two teams, four weeks of live operation after readiness approval. Compare against a baseline and, where feasible, a similar team not yet using the new workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Illustrative pilot results:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measure&lt;/th&gt;
&lt;th&gt;Baseline&lt;/th&gt;
&lt;th&gt;Pilot&lt;/th&gt;
&lt;th&gt;Interpretation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Median alert-to-assignment&lt;/td&gt;
&lt;td&gt;45 min&lt;/td&gt;
&lt;td&gt;18 min&lt;/td&gt;
&lt;td&gt;Better, but short of 15-min target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p90 alert-to-assignment&lt;/td&gt;
&lt;td&gt;110 min&lt;/td&gt;
&lt;td&gt;75 min&lt;/td&gt;
&lt;td&gt;Tail remains problematic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;False-alert rate&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;td&gt;9%&lt;/td&gt;
&lt;td&gt;Improvement; review sample quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API availability&lt;/td&gt;
&lt;td&gt;Not applicable&lt;/td&gt;
&lt;td&gt;99.95%&lt;/td&gt;
&lt;td&gt;Above proposed 99.9% SLO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freshness within 120 sec&lt;/td&gt;
&lt;td&gt;Not applicable&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;td&gt;Below proposed 95% SLO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dispatcher satisfaction&lt;/td&gt;
&lt;td&gt;3.0/5&lt;/td&gt;
&lt;td&gt;4.0/5&lt;/td&gt;
&lt;td&gt;Positive but survey bias possible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Steering committee decision:&lt;/strong&gt; do &lt;strong&gt;not&lt;/strong&gt; declare complete success based on one favorable number. Extend the pilot for two weeks, prioritize freshness and p90 delays, and then reassess. The contract's acceptance criteria and change-control mechanism determine whether this is remediation within scope or new work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation gate:&lt;/strong&gt; documented go/no-go decision, evidence pack, residual risks, and named owner for every unresolved issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 10 — Operate, respond, learn
&lt;/h2&gt;

&lt;p&gt;At 09:12, telemetry ingestion falls behind after a partner sends a burst of messages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example incident communications:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;09:20 — Initial notice:&lt;/strong&gt; We are investigating delayed shipment updates affecting some dispatchers. Current location timestamps remain visible. Next update by 09:50.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;09:42 — Progress:&lt;/strong&gt; Ingestion backlog is elevated. We have reduced nonessential processing and are draining the queue. No evidence of lost accepted events so far; verification continues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10:18 — Restoration:&lt;/strong&gt; Processing delay has returned within the operational threshold. We will monitor recovery and publish a post-incident review within three business days.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A &lt;strong&gt;runbook&lt;/strong&gt; is a tested operational procedure: how to recognize a problem, where to look, what actions are safe, and when to escalate. A &lt;strong&gt;postmortem&lt;/strong&gt; (or post-incident review) examines how an incident happened and how the system can be improved. &lt;strong&gt;Observability&lt;/strong&gt; is the ability to understand internal system behavior from its signals, rather than guessing from a green server-status light.&lt;/p&gt;

&lt;p&gt;The postmortem documents impact, detection delay, timeline, contributing factors, what worked, and corrective actions. Avoid blaming individuals; focus on system improvements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example follow-up:&lt;/strong&gt; add backlog-based autoscaling within tested limits, replay a production-like burst in staging, and introduce an alert on the freshness SLI rather than relying solely on CPU utilization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation gate:&lt;/strong&gt; run the new test, verify alerts fire, assign remediation owners, and confirm that the same failure mode is less likely or less damaging. Closing the incident ticket is not equivalent to closing the risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 11 — Handover and the ownership test
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Handover&lt;/strong&gt; transfers practical responsibility, not just files. &lt;strong&gt;Infrastructure as code (IaC)&lt;/strong&gt; means environments are defined and reproducible through versioned configuration. A &lt;strong&gt;restore exercise&lt;/strong&gt; proves that backups can actually recover usable data. &lt;strong&gt;Operational independence&lt;/strong&gt; means the customer can deploy, diagnose, recover, and make changes without hidden reliance on the supplier.&lt;/p&gt;

&lt;p&gt;A mature handover is not a ZIP file and a farewell meeting. Northstar should be able to deploy, restore, diagnose, and evolve the system without depending on Harbor's undocumented knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exit rehearsal:&lt;/strong&gt; Northstar engineers, using their own identities, provision a nonproduction environment, deploy a release, rotate a secret, diagnose a simulated outage, restore data from backup, and make a small approved change. Harbor observes but does not operate the keyboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handover evidence:&lt;/strong&gt; repository and artifact ownership; infrastructure-as-code; architecture and ADRs; API/schema contracts; access and credential inventories; runbooks; dashboards; on-call routing; dependency/license inventory; backup restoration records; known risks; costs; and a transition support plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation gate:&lt;/strong&gt; the customer performs the exit rehearsal successfully, with agreed exceptions tracked to resolution. Ownership becomes a demonstrated capability, not a contract adjective.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reusable gate matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gate&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Required evidence&lt;/th&gt;
&lt;th&gt;Fail action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Problem validated&lt;/td&gt;
&lt;td&gt;Product sponsor&lt;/td&gt;
&lt;td&gt;Baseline, interviews, outcome&lt;/td&gt;
&lt;td&gt;Redo discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contract agreed&lt;/td&gt;
&lt;td&gt;Commercial/legal owners&lt;/td&gt;
&lt;td&gt;SOW, acceptance, IP, exit terms&lt;/td&gt;
&lt;td&gt;Renegotiate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requirements approved&lt;/td&gt;
&lt;td&gt;Product + technical owners&lt;/td&gt;
&lt;td&gt;Testable stories and NFRs&lt;/td&gt;
&lt;td&gt;Clarify and rescope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture accepted&lt;/td&gt;
&lt;td&gt;Technical + security owners&lt;/td&gt;
&lt;td&gt;ADRs, threat model, prototype&lt;/td&gt;
&lt;td&gt;Reduce risk or redesign&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change ready&lt;/td&gt;
&lt;td&gt;Code owner&lt;/td&gt;
&lt;td&gt;PR, tests, scans, review&lt;/td&gt;
&lt;td&gt;Block merge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release ready&lt;/td&gt;
&lt;td&gt;Release owner&lt;/td&gt;
&lt;td&gt;Test evidence, rollback, telemetry&lt;/td&gt;
&lt;td&gt;Block deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pilot accepted&lt;/td&gt;
&lt;td&gt;Product owner&lt;/td&gt;
&lt;td&gt;Outcome and SLO evidence&lt;/td&gt;
&lt;td&gt;Remediate or change scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations ready&lt;/td&gt;
&lt;td&gt;Service owner&lt;/td&gt;
&lt;td&gt;Runbooks, on-call, restore test&lt;/td&gt;
&lt;td&gt;Delay handover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exit validated&lt;/td&gt;
&lt;td&gt;Customer technical owner&lt;/td&gt;
&lt;td&gt;Independent operational rehearsal&lt;/td&gt;
&lt;td&gt;Extend transition&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What to automate—and what not to
&lt;/h2&gt;

&lt;p&gt;Automate repeatable evidence collection: builds, tests, security scans, deployment records, service indicators, change logs, and cost allocation. Use AI to reduce clerical work and broaden analysis. Keep accountable human decisions at business acceptance, security exceptions, architectural trade-offs, contractual changes, and high-impact production operations.&lt;/p&gt;

&lt;p&gt;The deeper point is that &lt;strong&gt;AI makes the gap between producing code and owning outcomes more visible&lt;/strong&gt;. If generated code accelerates delivery but review, integration, operations, and customer learning remain bottlenecks, the organization has only moved the queue.&lt;/p&gt;

&lt;p&gt;In 2026, enterprise software maturity should be judged less by how quickly a team produces artifacts and more by whether it can &lt;strong&gt;prove value, explain decisions, recover from failure, control risk, and transfer operational independence&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A short glossary to keep nearby
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Plain-language meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SLA / SLO / SLI&lt;/td&gt;
&lt;td&gt;Customer commitment / internal reliability target / actual measurement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NFR&lt;/td&gt;
&lt;td&gt;A requirement about quality or constraints, not just functionality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADR&lt;/td&gt;
&lt;td&gt;A written record explaining a technical decision and trade-offs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTO / RPO&lt;/td&gt;
&lt;td&gt;Target recovery time / maximum targeted data-loss window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UAT&lt;/td&gt;
&lt;td&gt;Users checking whether the solution meets real needs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOW&lt;/td&gt;
&lt;td&gt;Contractual description of work, deliverables, and acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;Automated integration, verification, and release workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DORA&lt;/td&gt;
&lt;td&gt;Research-backed software-delivery performance measures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error budget&lt;/td&gt;
&lt;td&gt;Reliability failure allowance implied by an SLO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idempotency&lt;/td&gt;
&lt;td&gt;Repeating an operation does not repeat its business effect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canary&lt;/td&gt;
&lt;td&gt;Releasing to a small audience before full rollout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runbook&lt;/td&gt;
&lt;td&gt;A repeatable guide for operating or recovering a service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FinOps&lt;/td&gt;
&lt;td&gt;Collaborative management of cloud spending and value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DACI / RACI&lt;/td&gt;
&lt;td&gt;Decision roles (Driver, Approver, Contributors, Informed) / work responsibility roles (Responsible, Accountable, Consulted, Informed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stream-aligned team&lt;/td&gt;
&lt;td&gt;Team organized around a customer-value flow, rather than a single technical layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision latency&lt;/td&gt;
&lt;td&gt;Time between identifying a decision and obtaining an authorized decision&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Further reading and research basis
&lt;/h2&gt;

&lt;p&gt;These are primary or authoritative practitioner sources. They support the frameworks and general findings above; the fictional scenario, dialogue, targets, and pilot data are original teaching examples.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;DORA — Software Delivery Performance Metrics.&lt;/strong&gt; Current five-metric definitions, measurement pitfalls, and application-level comparisons. &lt;a href="https://dora.dev/guides/dora-metrics/" rel="noopener noreferrer"&gt;https://dora.dev/guides/dora-metrics/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud / DORA — 2025 State of AI-Assisted Software Development.&lt;/strong&gt; Research on AI adoption, organizational capabilities, throughput, product performance, and stability. &lt;a href="https://cloud.google.com/resources/content/2025-dora-ai-assisted-software-development-report" rel="noopener noreferrer"&gt;https://cloud.google.com/resources/content/2025-dora-ai-assisted-software-development-report&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud — Announcing the 2025 DORA Report.&lt;/strong&gt; Summary of survey findings and their interpretation. &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-the-2025-dora-report" rel="noopener noreferrer"&gt;https://cloud.google.com/blog/products/ai-machine-learning/announcing-the-2025-dora-report&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NIST — Secure Software Development Framework (SP 800-218).&lt;/strong&gt; Secure development practices and governance. &lt;a href="https://csrc.nist.gov/projects/SSDF" rel="noopener noreferrer"&gt;https://csrc.nist.gov/projects/SSDF&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NIST NCCoE — DevSecOps Notional Reference Model.&lt;/strong&gt; Lifecycle gates, supply-chain provenance, and AI-assisted DevSecOps considerations. &lt;a href="https://pages.nist.gov/nccoe-devsecops/notational-reference-model.html" rel="noopener noreferrer"&gt;https://pages.nist.gov/nccoe-devsecops/notational-reference-model.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OWASP SAMM — Guidance for AI-Assisted Development.&lt;/strong&gt; AI governance, security testing, tools, autonomy, and verification. &lt;a href="https://owaspsamm.org/docs/guides/ai-assisted-development/" rel="noopener noreferrer"&gt;https://owaspsamm.org/docs/guides/ai-assisted-development/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google SRE Workbook — Error Budget Policy.&lt;/strong&gt; Operational policy example for balancing releases and reliability. &lt;a href="https://sre.google/workbook/error-budget-policy/" rel="noopener noreferrer"&gt;https://sre.google/workbook/error-budget-policy/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DORA — Loosely Coupled Teams.&lt;/strong&gt; Team autonomy, deployability, and coordination dependencies. &lt;a href="https://dora.dev/capabilities/loosely-coupled-teams/" rel="noopener noreferrer"&gt;https://dora.dev/capabilities/loosely-coupled-teams/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DORA — 2024 Accelerate State of DevOps.&lt;/strong&gt; Leadership, stable priorities, user-centricity, and platform trade-offs. &lt;a href="https://dora.dev/research/2024/dora-report/" rel="noopener noreferrer"&gt;https://dora.dev/research/2024/dora-report/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atlassian — Team Topologies.&lt;/strong&gt; Overview of stream-aligned, platform, enabling, and complicated-subsystem teams. &lt;a href="https://www.atlassian.com/devops/frameworks/team-topologies" rel="noopener noreferrer"&gt;https://www.atlassian.com/devops/frameworks/team-topologies&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UK Government Digital Service — Service Level Objectives.&lt;/strong&gt; Practical service objectives and continuous improvement. &lt;a href="https://gds-way.digital.cabinet-office.gov.uk/standards/slo.html" rel="noopener noreferrer"&gt;https://gds-way.digital.cabinet-office.gov.uk/standards/slo.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;What is the strongest proof of ownership you've seen in an enterprise handover: source-code access, a successful restore, or the customer's ability to ship the next feature without the vendor?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>When Code Becomes Cheap, Ownership Becomes Everything</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Wed, 21 Oct 2026 03:40:19 +0000</pubDate>
      <link>https://dev.to/krlz/when-code-becomes-cheap-ownership-becomes-everything-4j1m</link>
      <guid>https://dev.to/krlz/when-code-becomes-cheap-ownership-becomes-everything-4j1m</guid>
      <description>&lt;p&gt;&lt;em&gt;Are we witnessing the end of traditional software factories, or the beginning of a more interesting kind of engineering organization?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For decades, many software organizations have relied on a familiar formula: need more features, hire more developers; need faster delivery, add another team; need lower costs, outsource to a lower-cost market.&lt;/p&gt;

&lt;p&gt;That formula built an enormous global industry. But in 2026, AI assistants can generate implementations, tests, documentation, and increasingly complex changes. This raises an uncomfortable question for traditional software factories:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If writing code becomes cheaper, what exactly are we paying external development providers for?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don't think outsourcing will disappear. I think the ability to produce code is becoming less distinctive than the ability to &lt;strong&gt;understand, operate, and evolve the product behind it&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The software factory was built around scarcity
&lt;/h2&gt;

&lt;p&gt;The traditional factory emerged from legitimate needs: scarce local engineering talent, temporary specialist requirements, and a desire for flexible delivery capacity. External providers can offer talent, speed, and predictable commercial arrangements.&lt;/p&gt;

&lt;p&gt;But there has always been a tension: &lt;strong&gt;the people producing software aren't necessarily the people who own its consequences&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A project can pass acceptance tests and be delivered on schedule. Six months later, nobody at the customer may remember why an integration is asynchronous, why a database constraint was omitted, or why an unusual validation exists.&lt;/p&gt;

&lt;p&gt;The repository explains &lt;em&gt;what&lt;/em&gt; the system does. It seldom preserves the full history of &lt;em&gt;why&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A company can own every line of source code and still lack the capability to evolve its own product.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is not unique to outsourcing. Internal teams with high turnover or weak documentation can lose knowledge too. But project-based handovers make the problem particularly visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI changes the economics of implementation—not necessarily delivery
&lt;/h2&gt;

&lt;p&gt;In three randomized field experiments involving &lt;strong&gt;4,867 developers&lt;/strong&gt;, researchers estimated &lt;strong&gt;26.08% more completed tasks&lt;/strong&gt; among developers given access to an AI coding assistant (standard error: 10.3 percentage points). The results varied across settings, and the outcome was completed tasks—not lifetime product cost or customer value. The paper appeared online in &lt;em&gt;Management Science&lt;/em&gt; in 2026.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pubsonline.informs.org/doi/abs/10.1287/mnsc.2025.00535" rel="noopener noreferrer"&gt;Source: Cui et al., &lt;em&gt;The Effects of Generative AI on High-Skilled Work&lt;/em&gt;, &lt;em&gt;Management Science&lt;/em&gt; (2026)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google's &lt;a href="https://dora.dev/research/2025/dora-report/" rel="noopener noreferrer"&gt;2025 DORA research&lt;/a&gt; similarly suggests widespread AI adoption, while emphasizing that AI &lt;strong&gt;amplifies the strengths and weaknesses&lt;/strong&gt; of the surrounding organization.&lt;/p&gt;

&lt;p&gt;But faster code generation is not always faster delivery. In a randomized study of &lt;strong&gt;16 experienced open-source developers working on 246 tasks&lt;/strong&gt;, METR found that access to early-2025 AI tools &lt;strong&gt;increased completion time by 19%&lt;/strong&gt; in the studied setting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://metr.org/Early_2025_AI_Experienced_OS_Devs_Study-paper.pdf" rel="noopener noreferrer"&gt;Source: METR, &lt;em&gt;Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;METR's &lt;a href="https://metr.org/blog/2026-02-24-uplift-update/" rel="noopener noreferrer"&gt;February 2026 update&lt;/a&gt; discussed newer evidence of potential speedups but also methodological limitations that prevented a reliable estimate.&lt;/p&gt;

&lt;p&gt;These experiments should not be averaged into a single productivity number: they examine different people, tools, tasks, and outcomes. The lesson isn't that AI is always faster or slower. It is that &lt;strong&gt;code production and successful software delivery are different things&lt;/strong&gt;. Review, integration, operational risk, and long-term maintenance still matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outsourcing contracts are changing—but causality remains uncertain
&lt;/h2&gt;

&lt;p&gt;According to the &lt;a href="https://ir.isg-one.com/news-market-information/press-releases/news-details/2026/Driven-by-AI-Americas-Tech-Services-Demand-Accelerates-in-Q2-to-New-High-ISG-Index/default.aspx" rel="noopener noreferrer"&gt;ISG Americas Q2 2026 Index&lt;/a&gt;, combined cloud and managed-services contract value rose &lt;strong&gt;39% year over year&lt;/strong&gt;, while traditional IT outsourcing contract value declined &lt;strong&gt;23%&lt;/strong&gt;. Engineering services, including AI integration work, increased &lt;strong&gt;9%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Technology services spending can grow while some traditional delivery models shrink.&lt;/p&gt;

&lt;p&gt;This is not proof that AI caused the decline. ISG measures particular contract categories and sizes, and a quarter does not establish a permanent trend. But it challenges the assumption that every form of software outsourcing benefits equally from technological growth.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  What exactly does ISG measure?
  &lt;p&gt;ISG's outsourcing index tracks commercial contracts meeting its reporting thresholds, including annual contract value. Its combined market includes cloud-based as-a-service offerings and managed services. Cloud infrastructure spending is not equivalent to custom software development. A decline in one outsourcing category does not prove that software engineering demand as a whole has declined.&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Four regions, different market signals
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🇺🇸 North America: Pressure on transactional delivery
&lt;/h3&gt;

&lt;p&gt;North American companies are major buyers of global software services. The Americas ISG data shows weaker traditional application development and maintenance contracting alongside strong cloud and AI-related demand.&lt;/p&gt;

&lt;p&gt;One plausible explanation is a changing build-versus-buy calculation: if a capable internal team can implement more with AI, outsourcing routine implementation solely for labor capacity may become less compelling.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;reducing coding contracts is not reducing the need for engineering accountability&lt;/strong&gt;. Architecture, security, integrations, and production operations still need owners.&lt;/p&gt;

&lt;h3&gt;
  
  
  🇨🇱 South America: Beyond cheaper nearshore developers
&lt;/h3&gt;

&lt;p&gt;Latin America has developed a substantial nearshore engineering ecosystem based on time-zone alignment, technical talent, and competitive costs.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://publications.iadb.org/en/digital-trade-latin-america-and-caribbean-connecting-markets-powering-growth" rel="noopener noreferrer"&gt;2026 report from the IDB, World Bank, and WTO&lt;/a&gt; found that Latin American and Caribbean exports of digitally delivered services grew from &lt;strong&gt;$18.5 billion in 2005 to $87.7 billion in 2024&lt;/strong&gt;, yet represented only about &lt;strong&gt;2% of the global total&lt;/strong&gt;. These figures cover more than software outsourcing.&lt;/p&gt;

&lt;p&gt;If customers can use AI to increase internal capacity, the strongest regional opportunities may move toward differentiated expertise: financial infrastructure, healthcare interoperability, logistics, cloud modernization, distributed systems, and regulated integrations.&lt;/p&gt;

&lt;p&gt;The opportunity is not merely to provide cheaper programmers. It is to become a more valuable engineering partner.&lt;/p&gt;

&lt;h3&gt;
  
  
  🇪🇺 Europe: Continuity and specialization
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://ir.isg-one.com/news-market-information/press-releases/news-details/2026/Europes-Demand-for-Tech-Services-Accelerates-in-Q2-As-Spending-on-AI-and-Managed-Services-Rises-ISG-Index/default.aspx" rel="noopener noreferrer"&gt;ISG EMEA Q2 2026 Index&lt;/a&gt; reported &lt;strong&gt;21% year-over-year growth&lt;/strong&gt; in managed-services contract value, contrasting with the Americas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ec.europa.eu/eurostat/en/web/products-eurostat-news/w/ddn-20260527-2" rel="noopener noreferrer"&gt;Eurostat&lt;/a&gt; reported &lt;strong&gt;10.45 million ICT specialists&lt;/strong&gt; employed in the EU in 2025.&lt;/p&gt;

&lt;p&gt;Europe's long-lived enterprise systems, regulated environments, and multinational integrations can reward stable providers with deep institutional knowledge. The distinction is not external versus internal: it is &lt;strong&gt;continuous responsibility versus interchangeable project staffing&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🇮🇳 Asia: Scale is not disappearing
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://ir.isg-one.com/news-market-information/press-releases/news-details/2026/Asia-Pacific-Spending-on-Tech-Services-Sharply-Higher-in-Q2-as-AI-Drives-Demand-ISG-Index-Shows/default.aspx" rel="noopener noreferrer"&gt;ISG Asia Pacific Q2 2026 Index&lt;/a&gt; reported &lt;strong&gt;50.5% year-over-year growth&lt;/strong&gt; in combined technology-services contract value, including strong growth in cloud services. Individual categories performed differently.&lt;/p&gt;

&lt;p&gt;India's established outsourcing ecosystem and global capability centers (GCCs) show that globally distributed engineering can remain important. GCCs also illustrate an alternative: permanent engineering organizations abroad, with closer strategic alignment and knowledge continuity than a succession of temporary projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  A production incident reveals the ownership gap
&lt;/h2&gt;

&lt;p&gt;Imagine a logistics platform where an apparently small change adds a field to a shipment event. An AI agent updates the schema, the API, the migration, and the tests in an afternoon. The feature passes acceptance testing.&lt;/p&gt;

&lt;p&gt;Weeks later, an older consumer replays events and interprets missing values incorrectly. A customer-facing report becomes inconsistent. The immediate fix is small; discovering the business meaning of the field, the replay semantics, and the reason the older consumer exists is not.&lt;/p&gt;

&lt;p&gt;This is a hypothetical example, not a measured case study. It illustrates the difference between delivering an implementation and carrying the consequences of a decision across the product lifecycle. The same failure could happen with an internal team: employment status is not a substitute for institutional memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  When AI-generated output becomes a review bottleneck
&lt;/h2&gt;

&lt;p&gt;The cost of producing a plausible change is not the same as the cost of establishing that it is correct. A team can now receive more pull requests, test cases, and proposed fixes than its review and validation process can safely absorb. The bottleneck moves from typing to &lt;strong&gt;verification, prioritization, and integration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This distinction matters for outsourced delivery, too. A provider may show an impressive increase in completed tickets while the customer's architecture group, security reviewers, or production engineers inherit an expanding queue of unresolved decisions. The appropriate response is not to reject AI-generated work, but to invest in automated checks, clear ownership boundaries, review capacity, and reliable production feedback.&lt;/p&gt;

&lt;p&gt;In economic terms, lowering the price of implementation can &lt;em&gt;increase&lt;/em&gt; demand for the complementary capabilities that make implementation useful. That is a hypothesis about organizational behavior, not a measured prediction that every company will hire more core engineers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a core engineering team?
&lt;/h2&gt;

&lt;p&gt;A core team is not defined simply by who signs its paychecks. It is defined by &lt;strong&gt;who remains accountable after a feature ships&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That team understands the domain, architectural trade-offs, operational failure modes, product priorities, and consequences of change.&lt;/p&gt;

&lt;p&gt;Consider two delivery arrangements:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project delivery&lt;/th&gt;
&lt;th&gt;Continuous product ownership&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Receive requirements&lt;/td&gt;
&lt;td&gt;Clarify and challenge requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implement accepted scope&lt;/td&gt;
&lt;td&gt;Consider effects on the whole system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass tests and hand over&lt;/td&gt;
&lt;td&gt;Monitor behavior in production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Close the engagement&lt;/td&gt;
&lt;td&gt;Remain accountable for evolution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither model guarantees good engineering. But continuous responsibility creates stronger incentives to consider long-term costs.&lt;/p&gt;

&lt;p&gt;A feature that takes two days to generate can still create years of maintenance obligations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does research say about ownership?
&lt;/h2&gt;

&lt;p&gt;The 2024 study &lt;a href="https://doi.org/10.1007/s10664-024-10538-5" rel="noopener noreferrer"&gt;&lt;em&gt;Examining Ownership Models in Software Teams: A Systematic Literature Review and a Replication Study&lt;/em&gt;&lt;/a&gt; reviewed &lt;strong&gt;79 papers&lt;/strong&gt; and revisited relationships between ownership and software quality. Not all previously reported correlations with defects replicated.&lt;/p&gt;

&lt;p&gt;That matters: &lt;strong&gt;a smaller number of contributors does not automatically mean fewer bugs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We should distinguish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code ownership:&lt;/strong&gt; Who changes particular files or components?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge ownership:&lt;/strong&gt; Who understands the decisions and constraints?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product ownership:&lt;/strong&gt; Who is accountable for behavior, outcomes, and evolution?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These overlap, but they are not identical. The third is the organizational capability I believe becomes increasingly valuable in the AI era.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI doesn't eliminate engineering responsibility
&lt;/h2&gt;

&lt;p&gt;Imagine asking an AI agent to add a customer field and propagate it across several services. It may update models, APIs, migrations, events, and tests rapidly.&lt;/p&gt;

&lt;p&gt;An engineer familiar with the system still needs to ask: Are old consumers compatible? Is the field sensitive? What happens during replay? Is the migration safe? What happens if downstream processing fails? Does the change contradict an earlier business decision?&lt;/p&gt;

&lt;p&gt;AI can help investigate these questions. But &lt;strong&gt;someone must establish which questions matter, validate the answers, and accept responsibility&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DORA's central organizational insight is relevant here: stronger testing, internal platforms, feedback loops, and team practices help turn AI assistance into actual delivery value. Fragile organizations may merely generate changes faster than they can safely absorb them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The economics of ownership
&lt;/h2&gt;

&lt;p&gt;AI can reduce the marginal cost of drafting code, but the &lt;strong&gt;total cost of a change&lt;/strong&gt; also includes discovering requirements, reviewing and integrating changes, migration, observability, incident response, and future modifications. Lowering one component does not automatically lower the whole.&lt;/p&gt;

&lt;p&gt;A useful &lt;em&gt;conceptual&lt;/em&gt; model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lifecycle cost = implementation + integration + verification
               + operations + rework + knowledge-transfer cost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an accounting lens, not a validated empirical formula. It also explains why billing by developer-hours can become a poor proxy for value: the customer cares about sustainable outcomes, while an hourly contract directly prices labor inputs. Outcome-based contracts have their own problems—attribution, scope, and risk allocation—and do not magically solve accountability.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small core team with a large capability surface
&lt;/h2&gt;

&lt;p&gt;The alternative is not necessarily full insourcing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              PRODUCT STRATEGY
                     |
              CORE PRODUCT TEAM
                     |
       +-------------+-------------+
       |             |             |
     Domain      Architecture   Operations
    knowledge    &amp;amp; decisions    &amp;amp; reliability
       |             |             |
       +-------------+-------------+
                     |
            CONTINUOUS OWNERSHIP
                     |
       +-------------+-------------+
       |             |             |
   AI agents      External      Specialized
   &amp;amp; tooling      engineers     providers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core team retains domain knowledge, architectural authority, release decisions, and operational accountability. External specialists provide expertise or capacity. AI assists with implementation, analysis, documentation, and tests.&lt;/p&gt;

&lt;p&gt;This is a proposed operating model, not an empirically established optimal staffing ratio.&lt;/p&gt;

&lt;p&gt;The question shifts from &lt;strong&gt;“How many developers do we need for these tickets?”&lt;/strong&gt; to &lt;strong&gt;“Which capabilities must we retain to own this product, and which can we obtain externally?”&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Outsourcing is not one business model
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Arrangement&lt;/th&gt;
&lt;th&gt;What the customer buys&lt;/th&gt;
&lt;th&gt;Where continuity can live&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Staff augmentation&lt;/td&gt;
&lt;td&gt;Temporary engineering capacity&lt;/td&gt;
&lt;td&gt;Usually in the customer's core team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed-scope project&lt;/td&gt;
&lt;td&gt;A defined deliverable&lt;/td&gt;
&lt;td&gt;At risk during handover unless deliberately transferred&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed service&lt;/td&gt;
&lt;td&gt;Ongoing service performance&lt;/td&gt;
&lt;td&gt;With the provider, if incentives and access support it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dedicated external product team&lt;/td&gt;
&lt;td&gt;Long-lived product capability&lt;/td&gt;
&lt;td&gt;Across customer and provider, with shared governance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global capability center&lt;/td&gt;
&lt;td&gt;An enduring distributed organizational capability&lt;/td&gt;
&lt;td&gt;Within the company's own operating model&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are ideal types, not mutually exclusive categories. The useful dividing line is &lt;strong&gt;who has decision rights, production visibility, and a duty to preserve knowledge after delivery&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The strongest counterargument: outsourcing can improve ownership
&lt;/h2&gt;

&lt;p&gt;There is a serious objection to the thesis: a specialist provider with a stable team, strong operational discipline, and experience across many customers may preserve knowledge &lt;strong&gt;better&lt;/strong&gt; than an internal team that rotates engineers, underinvests in documentation, or reorganizes every year. Some firms also cannot economically retain every specialist needed for security, accessibility, data platforms, or regulatory compliance.&lt;/p&gt;

&lt;p&gt;That is why the argument should not be reduced to &lt;em&gt;insource everything&lt;/em&gt;. The defensible principle is to retain &lt;strong&gt;the ability to make informed decisions and hold partners accountable&lt;/strong&gt;, while allowing responsibility for execution—and sometimes operations—to be shared contractually with enduring external teams. Continuity, access, incentives, and decision rights matter more than payroll classification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three futures for the software factory
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Commodity factories face pressure
&lt;/h3&gt;

&lt;p&gt;Providers competing mainly on available developers and hourly rates may find it harder to differentiate when customers and competitors share powerful AI tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Specialized providers become more valuable
&lt;/h3&gt;

&lt;p&gt;Domain expertise, complex integrations, security, regulated systems, and modernization may remain defensible areas of external engineering value. These providers sell judgment and outcomes, not just hours.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. External teams become genuine product teams
&lt;/h3&gt;

&lt;p&gt;A long-term external team can have stable membership, operate production, participate in architecture, and retain institutional knowledge. &lt;strong&gt;External employment is not incompatible with ownership.&lt;/strong&gt; The key is whether responsibility survives delivery milestones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure ownership, not output volume
&lt;/h2&gt;

&lt;p&gt;Counting developers, tickets, story points, or generated lines of code cannot establish whether a product is becoming more sustainable.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Better measure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;td&gt;Lead time from validated need to production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reliability&lt;/td&gt;
&lt;td&gt;Change failure rate and recovery time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintainability&lt;/td&gt;
&lt;td&gt;Cost and risk of subsequent changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knowledge continuity&lt;/td&gt;
&lt;td&gt;Time for a new engineer to make a safe change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product impact&lt;/td&gt;
&lt;td&gt;Adoption, retention, revenue, or operational outcomes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor dependence&lt;/td&gt;
&lt;td&gt;Ability to operate and change without a particular supplier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Economics&lt;/td&gt;
&lt;td&gt;Total lifecycle cost, including rework and incidents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I'd like to see longitudinal studies comparing AI-enabled permanent product teams with outsourced project teams, controlling for product maturity, complexity, and engineering practices. The existing evidence does not yet justify a universal claim that one model wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical test for product ownership
&lt;/h2&gt;

&lt;p&gt;Before expanding or replacing an engineering provider, ask: Can we explain our most consequential architectural decisions? Can we deploy, roll back, and recover without one particular contractor? Who decides whether a requested feature is safe for existing customers? Who investigates incidents six months after handover? How quickly can a new engineer make a safe change?&lt;/p&gt;

&lt;p&gt;If the answers are unclear, the risk is not simply vendor lock-in. It is &lt;strong&gt;capability lock-out&lt;/strong&gt;: possessing the repository without possessing the knowledge, access, and judgment needed to evolve it.&lt;/p&gt;

&lt;p&gt;A useful practical exercise is to run a &lt;strong&gt;supplier-absence drill&lt;/strong&gt;: choose a low-risk production change and ask the retained team to trace the requirement, identify affected consumers, ship behind a rollback plan, and explain how they would investigate an incident. The goal is not to prove that the vendor is dispensable. It is to discover which capabilities depend on undocumented relationships before a crisis exposes them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question we should be asking in 2026
&lt;/h2&gt;

&lt;p&gt;For years, software organizations were designed around the scarcity of people who could write code. AI changes that constraint without removing the need for engineering expertise.&lt;/p&gt;

&lt;p&gt;As implementation becomes more accessible, domain understanding, architectural judgment, operational reliability, and accountability may become even more valuable.&lt;/p&gt;

&lt;p&gt;That doesn't mean every company should build everything internally. It means companies should avoid accidentally outsourcing the knowledge and decision-making capabilities required to sustain their products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question is no longer just who can build the software. It's who will understand it, maintain it, and take responsibility for what happens next.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Perhaps that's what AI is really forcing us to reconsider: not the value of developers, but the value of ownership.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reading the evidence carefully
&lt;/h2&gt;

&lt;p&gt;The productivity studies above are experiments about development tasks; DORA describes associations and organizational practices; ISG measures qualifying commercial contracts; and regional trade statistics include services other than software. None directly estimates the causal effect of AI on outsourcing employment, nor proves that internally employed teams outperform enduring external teams. The regional interpretations and future scenarios are arguments to test, not observed outcomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and further reading
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://pubsonline.informs.org/doi/abs/10.1287/mnsc.2025.00535" rel="noopener noreferrer"&gt;Cui et al. (2026), &lt;em&gt;The Effects of Generative AI on High-Skilled Work&lt;/em&gt;, &lt;em&gt;Management Science&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metr.org/Early_2025_AI_Experienced_OS_Devs_Study-paper.pdf" rel="noopener noreferrer"&gt;METR (2025), &lt;em&gt;Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metr.org/blog/2026-02-24-uplift-update/" rel="noopener noreferrer"&gt;METR (2026), Developer Productivity Experiment Update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dora.dev/research/2025/dora-report/" rel="noopener noreferrer"&gt;Google DORA (2025), &lt;em&gt;State of AI-assisted Software Development&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doi.org/10.1007/s10664-024-10538-5" rel="noopener noreferrer"&gt;Koana et al. (2024), &lt;em&gt;Examining Ownership Models in Software Teams&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://link.springer.com/chapter/10.1007/978-3-031-94544-1_5" rel="noopener noreferrer"&gt;&lt;em&gt;A Mosaic of Perspectives: Understanding Ownership in Software Engineering&lt;/em&gt; (2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ir.isg-one.com/news-market-information/press-releases/news-details/2026/Driven-by-AI-Americas-Tech-Services-Demand-Accelerates-in-Q2-to-New-High-ISG-Index/default.aspx" rel="noopener noreferrer"&gt;ISG (2026), Americas Q2 Technology Services Index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ir.isg-one.com/news-market-information/press-releases/news-details/2026/Europes-Demand-for-Tech-Services-Accelerates-in-Q2-As-Spending-on-AI-and-Managed-Services-Rises-ISG-Index/default.aspx" rel="noopener noreferrer"&gt;ISG (2026), EMEA Q2 Technology Services Index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ir.isg-one.com/news-market-information/press-releases/news-details/2026/Asia-Pacific-Spending-on-Tech-Services-Sharply-Higher-in-Q2-as-AI-Drives-Demand-ISG-Index-Shows/default.aspx" rel="noopener noreferrer"&gt;ISG (2026), Asia Pacific Q2 Technology Services Index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://publications.iadb.org/en/digital-trade-latin-america-and-caribbean-connecting-markets-powering-growth" rel="noopener noreferrer"&gt;IDB, World Bank &amp;amp; WTO (2026), &lt;em&gt;Digital Trade in Latin America and the Caribbean&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ec.europa.eu/eurostat/en/web/products-eurostat-news/w/ddn-20260527-2" rel="noopener noreferrer"&gt;Eurostat (2026), ICT Specialists in the EU&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;This article presents an interpretation of multiple studies and market reports, not a causal demonstration that AI is replacing outsourcing. The underlying sources measure different populations and outcomes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you think?&lt;/strong&gt; If your main development provider disappeared tomorrow, could your team still deploy, debug, and evolve the product?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>UML Got a Bad Reputation. I Still Built a Tool for It.</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Fri, 16 Oct 2026 18:31:24 +0000</pubDate>
      <link>https://dev.to/krlz/uml-got-a-bad-reputation-i-still-built-a-tool-for-it-19ga</link>
      <guid>https://dev.to/krlz/uml-got-a-bad-reputation-i-still-built-a-tool-for-it-19ga</guid>
      <description>&lt;p&gt;Sometimes I need to see a problem before I can explain it.&lt;/p&gt;

&lt;p&gt;Who calls this service? What happens if the request fails? Is this actually one feature, or three separate problems hiding under the same name?&lt;/p&gt;

&lt;p&gt;A few boxes and arrows can make those questions easier to answer. So can a mind map that starts messy and gradually becomes a plan.&lt;/p&gt;

&lt;p&gt;That's why I still like UML—and why I rebuilt &lt;strong&gt;Codiva PlantUML&lt;/strong&gt;, my browser-based editor for text-based diagrams.&lt;/p&gt;

&lt;p&gt;Yes, UML. The thing you may remember from university assignments, enormous class diagrams, and arguments about which arrowhead to use.&lt;/p&gt;

&lt;p&gt;I think there's still a lot to like once you bring it back to everyday development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://portafolio.codiva.cl/codiva-plantuml/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Open Codiva PlantUML&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  A little history: why all those boxes existed
&lt;/h2&gt;

&lt;p&gt;Before UML, there were several competing approaches to modeling object-oriented systems. Grady Booch, James Rumbaugh, and Ivar Jacobson brought their methods together, helping create the &lt;strong&gt;Unified Modeling Language&lt;/strong&gt;. It became an OMG standard in 1997.&lt;/p&gt;

&lt;p&gt;The idea was useful: give people a shared visual vocabulary for describing software. A relationship or interaction shouldn't need an entirely new notation every time you change teams.&lt;/p&gt;

&lt;p&gt;Then came the baggage many developers associate with it: elaborate modeling tools, diagrams produced as deliverables, and designs that took longer to maintain than the code they described.&lt;/p&gt;

&lt;p&gt;If your introduction to UML involved modeling every getter and setter before writing a working program, I understand the lack of enthusiasm.&lt;/p&gt;

&lt;p&gt;But I still find value in the smaller habit underneath it: &lt;strong&gt;put a model of the problem somewhere you can inspect it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A sequence diagram can reveal a round trip nobody noticed. A state diagram can expose a transition nobody defined. Even an unfinished sketch can show that two people have been imagining different systems throughout the same meeting.&lt;/p&gt;

&lt;p&gt;Those are useful discoveries before implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A diagram can help you think before it helps you document
&lt;/h2&gt;

&lt;p&gt;We often talk about diagrams as something you make after understanding a system, so someone else can understand it too.&lt;/p&gt;

&lt;p&gt;I like the earlier stage just as much: making a diagram &lt;em&gt;to find out what I understand&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Say you're planning an asynchronous report feature. In prose, it sounds simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The user requests a report, a worker generates it, and we notify them when it's ready.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Start drawing it, and the questions appear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who owns the report's status?&lt;/li&gt;
&lt;li&gt;What happens when the worker retries?&lt;/li&gt;
&lt;li&gt;Can the user request the same report twice?&lt;/li&gt;
&lt;li&gt;What does “ready” mean if notification fails?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The picture gives those questions somewhere to live. You can change the model while the change is still cheap.&lt;/p&gt;

&lt;p&gt;The diagram doesn't have to represent the entire system. Often the most useful one answers a single question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mind maps are a great place to start
&lt;/h2&gt;

&lt;p&gt;Before I know the sequence of events, I may only know the pieces of the problem.&lt;/p&gt;

&lt;p&gt;That's where mind maps help: take a vague feature, give it a few branches, and keep splitting until the unknowns become visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PlantUML supports mind maps too.&lt;/strong&gt; They aren't part of the UML standard; PlantUML extends beyond UML into other useful diagram types.&lt;/p&gt;

&lt;p&gt;Here's a small example you can paste into the editor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@startmindmap
* Asynchronous reports
** User experience
*** Request a report
*** Check progress
*** Download the result
** Processing
*** Queue the job
*** Generate the file
*** Retry failures
** Questions
*** Duplicate requests?
*** File expiration?
*** Notification failure?
@endmindmap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The asterisks define the hierarchy. Add another level when an idea needs breaking down; move a branch when you realize it belongs elsewhere.&lt;/p&gt;

&lt;p&gt;I find this useful for feature planning, exploring an unfamiliar domain, or organizing the questions I want to take into a technical discussion.&lt;/p&gt;

&lt;p&gt;An outline works too. Seeing its branches together can make gaps and uneven complexity easier to notice.&lt;/p&gt;

&lt;p&gt;Then, when one branch needs a closer look, you can turn it into a more specific diagram.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few UML diagrams still earn their place
&lt;/h2&gt;

&lt;p&gt;You don't need to learn the whole notation to get something useful from it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When I want to understand…&lt;/th&gt;
&lt;th&gt;I reach for…&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who talks to whom, and in what order&lt;/td&gt;
&lt;td&gt;A sequence diagram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which states exist and what changes them&lt;/td&gt;
&lt;td&gt;A state diagram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How a workflow branches&lt;/td&gt;
&lt;td&gt;An activity diagram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How domain concepts relate&lt;/td&gt;
&lt;td&gt;A class diagram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How the system's parts connect&lt;/td&gt;
&lt;td&gt;A component diagram&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A class diagram, for example, can show the relationships between an order, its items, and a payment without listing every method in the codebase.&lt;/p&gt;

&lt;p&gt;A sequence diagram can make the difference between “request accepted” and “work completed” explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@startuml
actor User
participant API
queue Jobs
participant Worker

User -&amp;gt; API: Request report
API -&amp;gt; Jobs: Enqueue job
API --&amp;gt; User: Accepted + report ID
Jobs -&amp;gt; Worker: Deliver job
Worker -&amp;gt; Worker: Generate report

alt generation succeeds
  Worker -&amp;gt; API: Mark report ready
else generation fails
  Worker -&amp;gt; API: Record failure
end
@enduml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sketch also leaves things unresolved. How does the user learn that the report is ready? What happens after a failure?&lt;/p&gt;

&lt;p&gt;That's a useful next conversation. The diagram has already helped identify it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I like writing diagrams as text
&lt;/h2&gt;

&lt;p&gt;Visual editors are great for sketching freely. With PlantUML, I like being able to describe the relationships and let the renderer handle their arrangement.&lt;/p&gt;

&lt;p&gt;That gives me a few practical advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reviewable changes.&lt;/strong&gt; A pull request can show a new participant, message, or state transition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source beside the code.&lt;/strong&gt; A &lt;code&gt;.puml&lt;/code&gt; file can follow the same branches and review process as the feature it explains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy reuse.&lt;/strong&gt; Copy a flow, adjust a few lines, and explore an alternative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less time arranging boxes.&lt;/strong&gt; I can focus on the interaction before worrying about presentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are trade-offs. Automatic layout won't always look the way you want, and a large diagram can become difficult to read regardless of how you generate it. Text also doesn't keep documentation accurate by itself; someone still has to maintain it.&lt;/p&gt;

&lt;p&gt;For me, the sweet spot is a small, editable diagram with a clear purpose.&lt;/p&gt;

&lt;p&gt;If you already use Mermaid and it fits your workflow, great. I see the habit of keeping useful diagrams as text as the bigger win. PlantUML happens to be the tool I wanted to build around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet Codiva PlantUML
&lt;/h2&gt;

&lt;p&gt;I had an older editor built with CodeMirror 5, Bootstrap, and CDN dependencies. It rendered through the public PlantUML server and had been sitting there for a while.&lt;/p&gt;

&lt;p&gt;I rebuilt it with &lt;strong&gt;Astro, React islands, CodeMirror 6, and my own containerized PlantUML engine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal was a convenient place to open an example, work through an idea, and export a diagram without setting up a local environment.&lt;/p&gt;

&lt;p&gt;The editor includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Syntax highlighting and autocomplete for participants you've declared.&lt;/li&gt;
&lt;li&gt;Syntax diagnostics with line highlighting.&lt;/li&gt;
&lt;li&gt;Formatting from the context menu.&lt;/li&gt;
&lt;li&gt;Dark mode.&lt;/li&gt;
&lt;li&gt;SVG and PNG export.&lt;/li&gt;
&lt;li&gt;Six examples to start from.&lt;/li&gt;
&lt;li&gt;No account required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rendering happens on my backend, so diagram source is sent to that server when you use the hosted editor.&lt;/p&gt;

&lt;p&gt;It's free to use. There's an optional coffee link in the footer to help with the server bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  A couple of things I learned rebuilding it
&lt;/h2&gt;

&lt;p&gt;Running the engine myself gave me more control over responsiveness and diagnostics. It also gave me a few bugs worth remembering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the JVM warm
&lt;/h3&gt;

&lt;p&gt;Launching a new JVM for each render took around &lt;strong&gt;1,115 ms&lt;/strong&gt; in my setup. Keeping PlantUML running brought the warm local engine measurement down to around &lt;strong&gt;14 ms&lt;/strong&gt;, averaged over 10 requests.&lt;/p&gt;

&lt;p&gt;Over HTTPS, I observed roughly &lt;strong&gt;180 ms&lt;/strong&gt;, compared with around &lt;strong&gt;560 ms&lt;/strong&gt; for the public endpoint in my comparison. Those are observations from my deployment, rather than a general benchmark; network location, diagram complexity, and server load all matter.&lt;/p&gt;

&lt;p&gt;PlantUML's built-in &lt;a href="https://plantuml.com/picoweb" rel="noopener noreferrer"&gt;PicoWeb server&lt;/a&gt; provides a simple way to keep the engine running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; plantuml.jar &lt;span class="nt"&gt;-picoweb&lt;/span&gt;:8777
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  A successful response can contain an unsuccessful diagram
&lt;/h3&gt;

&lt;p&gt;My sequence-diagram test passed. A class diagram then failed because the container was missing Graphviz.&lt;/p&gt;

&lt;p&gt;The surprising part: the response was &lt;strong&gt;HTTP 200 with a valid SVG containing the error message&lt;/strong&gt;. My status-code check was happy. The person trying to render the diagram wasn't.&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;Smetana&lt;/strong&gt;, PlantUML's Java port of Graphviz, to handle layout in my setup. The editor also needed useful diagnostics rather than leaving users to read an error drawn inside an image.&lt;/p&gt;

&lt;p&gt;That's the improvement I care about most: if you make a syntax mistake while thinking through a flow, the editor should help you get back to the flow.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Implementation detail: selecting Smetana and mapping error lines
  &lt;p&gt;PlantUML supports selecting Smetana in diagram source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!pragma layout smetana
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its documentation also lists the CLI option &lt;code&gt;-Playout=smetana&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In my server integration, the proxy injects the pragma into the rendering copy, leaving the editor contents and exported source as written. That added line means diagnostic positions need mapping back to the original source.&lt;/p&gt;

&lt;p&gt;My application layer uses PlantUML diagnostics to return a 422 response with a line number for syntax errors. That response contract is part of the editor's backend; starting PicoWeb alone doesn't provide it.&lt;/p&gt;



&lt;br&gt;
&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Give one of your ideas a diagram
&lt;/h2&gt;

&lt;p&gt;If you've been carrying a feature around in your head, try putting its main branches into a mind map. If a flow keeps getting lost in paragraphs, try a sequence diagram.&lt;/p&gt;

&lt;p&gt;That's the kind of everyday use I built this editor for.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://portafolio.codiva.cl/codiva-plantuml/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try Codiva PlantUML — no account needed&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I'd love feedback on the editor, especially anything that gets in the way of turning an idea into a readable diagram.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you still use UML—or did diagrams find their way back into your workflow through mind maps, Mermaid, or something else?&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  References and further reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.omg.org/uml/why-uml-is-important.htm" rel="noopener noreferrer"&gt;OMG: UML's origins and purpose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plantuml.com/mindmap-diagram" rel="noopener noreferrer"&gt;PlantUML: mind map syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plantuml.com/layout-engines" rel="noopener noreferrer"&gt;PlantUML: layout engines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plantuml.com/picoweb" rel="noopener noreferrer"&gt;PlantUML: PicoWeb server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>architecture</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Message Bus for AI Agents. Do I Actually Need a Framework?</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Tue, 06 Oct 2026 04:53:05 +0000</pubDate>
      <link>https://dev.to/krlz/i-built-a-message-bus-for-ai-agents-do-i-actually-need-a-framework-2p0m</link>
      <guid>https://dev.to/krlz/i-built-a-message-bus-for-ai-agents-do-i-actually-need-a-framework-2p0m</guid>
      <description>&lt;p&gt;I have been using a simple data bus to let agents working on projects communicate.&lt;/p&gt;

&lt;p&gt;It does the obvious things: an agent sends a message, another receives it, and work continues. But with new agent frameworks appearing constantly, I started wondering whether this approach was already outdated.&lt;/p&gt;

&lt;p&gt;That question led to a more useful one:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does my system need beyond delivering messages?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine two agents collaborating on a feature. One implements it. Another reviews it. Then the implementation agent restarts, a message gets delivered twice, and the reviewer approves changes against an old commit.&lt;/p&gt;

&lt;p&gt;The agents can still communicate. The project is now in trouble.&lt;/p&gt;

&lt;p&gt;This is where the framework discussion becomes interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four layers that are easy to mix up
&lt;/h2&gt;

&lt;p&gt;Before picking a framework, separate the responsibilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;How does a message reach a worker?&lt;/td&gt;
&lt;td&gt;Your service, a queue, HTTP, a message broker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent interoperability&lt;/td&gt;
&lt;td&gt;How does an independent agent discover and request work from another?&lt;/td&gt;
&lt;td&gt;A2A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration&lt;/td&gt;
&lt;td&gt;Who acts next, and what happens after failure?&lt;/td&gt;
&lt;td&gt;LangGraph, application code, workflow engines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tools and context&lt;/td&gt;
&lt;td&gt;How does an agent access external capabilities and data?&lt;/td&gt;
&lt;td&gt;MCP, ordinary APIs, tool functions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A bus can deliver a task without understanding its lifecycle. A protocol can describe a task without deciding your project's dependencies. An orchestrator can coordinate workers while using your existing bus underneath.&lt;/p&gt;

&lt;p&gt;These layers can coexist.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
&lt;strong&gt;A useful starting point:&lt;/strong&gt; keep message delivery, task ownership, and execution state explicit. Choose frameworks according to the responsibility you want them to own.&lt;br&gt;

&lt;/div&gt;


&lt;h2&gt;
  
  
  MCP and A2A: where each fits
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://a2a-protocol.org/latest/" rel="noopener noreferrer"&gt;MCP and A2A have complementary roles&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;MCP equips an agent with tools and context: query a database, inspect a repository, or call a service.&lt;/p&gt;

&lt;p&gt;A2A provides a contract for communicating with independent agents: discover capabilities, exchange messages, follow tasks, and retrieve outputs.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A developer uses an MCP tool to inspect an issue.&lt;/li&gt;
&lt;li&gt;It delegates an investigation to a remote specialist through A2A.&lt;/li&gt;
&lt;li&gt;Your coordinator records the task and waits for the result.&lt;/li&gt;
&lt;li&gt;A queue buffers execution while the specialist is unavailable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also expose an agent as an MCP tool. That can be perfectly adequate for a bounded request. A2A becomes more relevant when you want the independent agent's task lifecycle and capabilities represented through a common protocol.&lt;/p&gt;

&lt;p&gt;Neither protocol automatically settles who may merge code, retry a deployment, or approve a project milestone. Those are application decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is actually new in 2026?
&lt;/h2&gt;

&lt;p&gt;There are concrete developments worth watching, beyond another framework launch.&lt;/p&gt;

&lt;h3&gt;
  
  
  A2A now has a stable baseline and a CLI
&lt;/h3&gt;

&lt;p&gt;The A2A project &lt;a href="https://a2a-protocol.org/dev/blog/2026/03/12/a2a-protocol-ships-v10-production-ready-standard-for-agent-to-agent-communication/" rel="noopener noreferrer"&gt;announced its first stable v1.0 specification in March 2026&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On October 1, it &lt;a href="https://a2a-protocol.org/latest/blog/2026/10/01/introducing-a2a-cli/" rel="noopener noreferrer"&gt;introduced an official command-line client&lt;/a&gt;. That is useful for scripts, CI jobs, and coding assistants that can run commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read an agent's capabilities.&lt;/span&gt;
a2a card get https://agent.example.com

&lt;span class="c"&gt;# Submit a request and receive updates.&lt;/span&gt;
a2a send &lt;span class="nt"&gt;-a&lt;/span&gt; https://agent.example.com &lt;span class="nt"&gt;--stream&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"Review the task contract and identify missing acceptance criteria."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The URL above is illustrative; these commands require an installed CLI and a reachable A2A server, with authentication configured where required. I have not executed them against a live agent for this article.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/a2aproject" rel="noopener noreferrer"&gt;
        a2aproject
      &lt;/a&gt; / &lt;a href="https://github.com/a2aproject/a2a-cli" rel="noopener noreferrer"&gt;
        a2a-cli
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The official command-line interface for interacting with A2A (Agent2Agent) compatible agents.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;A2A CLI&lt;/h1&gt;
&lt;/div&gt;

&lt;div width="800"&gt;
   &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/a2aproject/A2A/refs/heads/main/docs/assets/a2a_logo/color/SVG/a2a_color.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fa2aproject%2FA2A%2Frefs%2Fheads%2Fmain%2Fdocs%2Fassets%2Fa2a_logo%2Fcolor%2FSVG%2Fa2a_color.svg" width="600" alt="Agent2Agent Protocol Logo"&gt;&lt;/a&gt;
   &lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
       Discover, message, and manage A2A agents from your terminal
   &lt;/h3&gt;
&lt;/div&gt;


&lt;/div&gt;

&lt;p&gt;
  &lt;a href="https://github.com/a2aproject/a2a-cli/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/aa30720d774d9e201ddffb0dab09e93cf0c24c7c208996fc344db23363dbaeb6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f61326170726f6a6563742f6132612d636c693f736f72743d73656d766572" alt="Latest release"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/a2aproject/a2a-cli/./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/27542b730f45940a3cd07c4f914e66857b4b5ef364016e474360386359e945fe/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f61326170726f6a6563742f6132612d636c69" alt="License: Apache-2.0"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;A2A CLI&lt;/strong&gt; (&lt;code&gt;a2a&lt;/code&gt;) is the official command-line client for &lt;a href="https://a2a-protocol.org/latest/" rel="nofollow noopener noreferrer"&gt;A2A (Agent2Agent) agents&lt;/a&gt;, maintained by the &lt;strong&gt;A2A Project Team&lt;/strong&gt;.&lt;/p&gt;

&lt;div&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/a2aproject/a2a-cli/./docs/demo/a2a-demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fa2aproject%2Fa2a-cli%2FHEAD%2F.%2Fdocs%2Fdemo%2Fa2a-demo.gif" alt="a2a CLI demo: build a server from a script, then discover and message it" width="720"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why the A2A CLI&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;A2A is a bidirectional protocol: any A2A agent can act as a client to another and hand off a task. But an agent without an A2A layer can't easily send messages or receive updates. The A2A CLI fills that gap.&lt;/p&gt;

&lt;p&gt;With it, you — or any model, agent, or coding harness that can call tools — can discover A2A agent's capabilities and send it work.&lt;/p&gt;

&lt;p&gt;Three ways to get started:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Empower AI coding assistants&lt;/strong&gt; — give your coding agent the &lt;code&gt;a2a&lt;/code&gt; tool to offload work to remote A2A agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interact instantly&lt;/strong&gt; — fetch agent cards, send messages, and stream real-time updates from the terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate workflows&lt;/strong&gt; — seamlessly integrate A2A agents with…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/a2aproject/a2a-cli" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;
  
  
  Durable execution is a prominent framework capability
&lt;/h3&gt;

&lt;p&gt;LangGraph documents &lt;a href="https://docs.langchain.com/oss/python/langgraph/persistence" rel="noopener noreferrer"&gt;persistent state and checkpoints&lt;/a&gt;. Microsoft Agent Framework documents &lt;a href="https://learn.microsoft.com/en-us/agent-framework/workflows/" rel="noopener noreferrer"&gt;checkpoints and resuming&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My reading of these capabilities: framework selection increasingly deserves a recovery test alongside the usual delegation demo.&lt;/p&gt;

&lt;p&gt;Can the run continue after interruption? Which operations will replay? What state survives? What must your tools make idempotent?&lt;/p&gt;

&lt;p&gt;Persistent conversation history helps, but it is only one part of recovering work.&lt;/p&gt;
&lt;h3&gt;
  
  
  AutoGen advice needs a date attached
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/microsoft/autogen" rel="noopener noreferrer"&gt;AutoGen repository&lt;/a&gt; now identifies the project as being in maintenance mode and directs new projects toward Microsoft Agent Framework.&lt;/p&gt;

&lt;p&gt;Existing AutoGen applications may still be useful. For a new build, I would evaluate the successor before following an older tutorial.&lt;/p&gt;
&lt;h2&gt;
  
  
  Which framework would I choose?
&lt;/h2&gt;

&lt;p&gt;This is a practical shortlist, not a market-share ranking. The fit assessments are my engineering judgment; the links describe the underlying capabilities.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Documented approach&lt;/th&gt;
&lt;th&gt;Where I would evaluate it first&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://reference.langchain.com/python/langgraph/overview" rel="noopener noreferrer"&gt;LangGraph&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Stateful graphs, subgraphs, checkpoint storage, multi-agent patterns&lt;/td&gt;
&lt;td&gt;Explicit project workflows with recovery requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ai.pydantic.dev/multi-agent-applications/" rel="noopener noreferrer"&gt;Pydantic AI&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tool-based delegation, programmatic handoffs, typed graph control flow&lt;/td&gt;
&lt;td&gt;Python services with validated task inputs and results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://learn.microsoft.com/en-us/agent-framework/workflows/orchestrations/" rel="noopener noreferrer"&gt;Microsoft Agent Framework&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sequential, concurrent, handoff, group chat, manager-led orchestration&lt;/td&gt;
&lt;td&gt;Applications needing several coordination patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.crewai.com/core-concepts/Agents" rel="noopener noreferrer"&gt;CrewAI&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Collaborative Crews and event-driven Flows&lt;/td&gt;
&lt;td&gt;Prototyping teams with distinct responsibilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.agno.com/teams/overview" rel="noopener noreferrer"&gt;Agno&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Coordinate, route, broadcast, and task-based team modes&lt;/td&gt;
&lt;td&gt;Specialist teams with a coordinating leader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://mastra.ai/ai-agent-framework" rel="noopener noreferrer"&gt;Mastra&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;TypeScript agents and workflows with suspend/resume&lt;/td&gt;
&lt;td&gt;Agent functionality embedded in TypeScript applications&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For my bus-based setup, LangGraph and Pydantic AI are particularly interesting.&lt;/p&gt;

&lt;p&gt;LangGraph gives me a place to express transitions: assign work, await implementation, validate results, request review, and finish or retry.&lt;/p&gt;

&lt;p&gt;Pydantic AI is attractive when I want ordinary Python functions and validated contracts to remain central. Its documentation distinguishes delegation from handing control to another agent, which is a distinction worth preserving in your own design.&lt;/p&gt;

&lt;p&gt;CrewAI and Agno make it easier to express a team. I would still test whether their execution model fits long-running work, independent processes, and project ownership before adopting them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ready-to-run agents are another category
&lt;/h2&gt;

&lt;p&gt;An agent framework is something you build with. An agent runtime is something you can run as a worker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/NousResearch/hermes-agent/blob/main/plugins/platforms/a2a/README.md" rel="noopener noreferrer"&gt;Hermes's current repository includes an A2A integration&lt;/a&gt;, with peer discovery, calls, and capability-based orchestration. Availability depends on your installed version; documentation on &lt;code&gt;main&lt;/code&gt; is not a guarantee about an older release.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opencode.ai/docs/agents/" rel="noopener noreferrer"&gt;OpenCode supports primary agents and specialized subagents&lt;/a&gt;, with configurable prompts, models, and permissions. That makes it a candidate coding worker. Its local delegation features alone do not give your distributed system task ownership or recovery.&lt;/p&gt;

&lt;p&gt;Connecting existing workers may be a smaller change than rebuilding them inside a single framework.&lt;/p&gt;
&lt;h2&gt;
  
  
  Give agents a task contract
&lt;/h2&gt;

&lt;p&gt;The first improvement I would make to a simple bus is to replace ambiguous requests with structured assignments.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Help with the backend.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Send a bounded task with enough information to produce a verifiable result.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Example application task envelope
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schema_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"msg-1042"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"task_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"task-87"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"project-alpha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"event_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"task.requested"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target_capability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"backend.implementation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"idempotency_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"task-87-attempt-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deadline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-07T18:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"repository"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"project-alpha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"base_commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc1234"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"goal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add pagination to the orders endpoint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"acceptance_criteria"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Preserve the existing authorization checks"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Return a stable cursor for subsequent pages"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Include integration tests for empty and full pages"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expected_output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"branch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test_report"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"artifact reference"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is an illustrative application schema, &lt;strong&gt;not an A2A wire-format example&lt;/strong&gt;. Validate it at your boundary and map it to the protocol or framework you use.&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Adding an idempotency field does not itself prevent duplicate side effects. Your storage and execution logic have to enforce the behavior.&lt;/p&gt;

&lt;p&gt;Likewise, include acceptance criteria because the worker needs a target it can check. A fluent explanation of completed work is weaker evidence than a commit and test report.&lt;/p&gt;
&lt;h2&gt;
  
  
  Design for the moment a worker disappears
&lt;/h2&gt;

&lt;p&gt;For project agents, I would use a durable task record with states such as:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Queued&lt;/td&gt;
&lt;td&gt;Available for a worker to claim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;td&gt;Claimed under a lease, with progress recorded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Awaiting review&lt;/td&gt;
&lt;td&gt;Output exists and requires validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;td&gt;Required checks have accepted the output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failed&lt;/td&gt;
&lt;td&gt;The attempt ended unsuccessfully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cancelled&lt;/td&gt;
&lt;td&gt;Further execution is no longer requested&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are application states, not prescribed protocol states.&lt;/p&gt;

&lt;p&gt;A worker should claim a task atomically. While working, it renews its lease. If the lease expires, the coordinator decides whether to retry, reconcile partial results, or request intervention.&lt;/p&gt;

&lt;p&gt;For external side effects, lease ownership alone may be insufficient. A stale worker can keep running after another worker takes over. Use fencing or destination-level idempotency where the operation requires it.&lt;/p&gt;

&lt;p&gt;For code, I would also isolate work in branches or worktrees and bind the review to a specific commit. If the implementation changes afterward, the earlier review should not silently apply to the new version.&lt;/p&gt;
&lt;h2&gt;
  
  
  Measure collaboration before adding more agents
&lt;/h2&gt;

&lt;p&gt;My suggested evaluation starts with a small set of representative tasks and deliberate failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deliver the same task twice.&lt;/li&gt;
&lt;li&gt;Restart a worker halfway through execution.&lt;/li&gt;
&lt;li&gt;Return an invalid result schema.&lt;/li&gt;
&lt;li&gt;Let a reviewer receive an outdated commit.&lt;/li&gt;
&lt;li&gt;Exhaust the task's time or token budget.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Track accepted outcomes, total cost, retries, and time to completion. Compare the multi-agent workflow with a single-agent baseline doing the same work.&lt;/p&gt;

&lt;p&gt;More agents introduce more handoffs. Each handoff deserves evidence that it improves the result.&lt;/p&gt;
&lt;h2&gt;
  
  
  The architecture I would build next
&lt;/h2&gt;

&lt;p&gt;I would keep the bus, put task ownership and state in durable storage, and introduce orchestration where the workflow needs it.&lt;/p&gt;

&lt;p&gt;Then I would add A2A at the boundary for independently deployed agents, and MCP where workers need external tools.&lt;/p&gt;

&lt;p&gt;That gives me an incremental path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define a task contract and validate results.&lt;/li&gt;
&lt;li&gt;Add atomic claims, leases, and retry limits.&lt;/li&gt;
&lt;li&gt;Record artifact references and execution history.&lt;/li&gt;
&lt;li&gt;Introduce a framework for complex transitions and recovery.&lt;/li&gt;
&lt;li&gt;Add interoperability without forcing every worker into the same runtime.&lt;/li&gt;
&lt;/ol&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
&lt;strong&gt;Before replacing your bus, test whether your system can explain who owns a task, what has already happened, and what is safe to do next.&lt;/strong&gt;&lt;br&gt;

&lt;/div&gt;


&lt;p&gt;Those answers make an agent system easier to trust, regardless of which framework runs the reasoning loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How are you coordinating your agents today: a shared queue, a task board, a framework, or direct calls? What failed first when you added a second worker?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Research snapshot: October 6, 2026. Capability claims link to official documentation or repositories. Recommendations and the proposed task design are my assessment, not benchmark results. Forem Liquid embeds follow the &lt;a href="https://dev.to/p/editor_guide"&gt;DEV editor guide&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>programming</category>
      <category>distributed</category>
    </item>
    <item>
      <title>The missing break behind Digimon World’s evolution rules</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Wed, 30 Sep 2026 04:37:17 +0000</pubDate>
      <link>https://dev.to/krlz/the-missing-break-behind-digimon-worlds-evolution-rules-4mek</link>
      <guid>https://dev.to/krlz/the-missing-break-behind-digimon-worlds-evolution-rules-4mek</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwl5xr5bfepilo9nn5ez3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwl5xr5bfepilo9nn5ez3.gif" alt=" " width="559" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You fed it, trained it, cleaned up after it. You had a plan. Then it evolved into Numemon, a walking pile of sludge, and the game never told you why.&lt;/p&gt;

&lt;p&gt;No menu. No hint. No stat screen saying &lt;em&gt;here is what went wrong&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Players filled that silence with wikis, calculators and arguments about whether care mistakes helped or hurt. They inferred the rules from what happened on screen. Now we can read the code.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/jype0/dw_decomp" rel="noopener noreferrer"&gt;Digimon World decompilation project&lt;/a&gt; has reconstructed the evolution code. One rule comes from a loop with no &lt;code&gt;break&lt;/code&gt;: when several stats share the highest value, the game picks the last one in its array.&lt;/p&gt;

&lt;p&gt;Here is how the scoring works, what that tie means, and what I learned while testing a small PC port prototype.&lt;/p&gt;

&lt;h2&gt;
  
  
  The missing break
&lt;/h2&gt;

&lt;p&gt;Here is the real code that picks which of your stats the game examines. It's in &lt;code&gt;src/main/evolution.c&lt;/code&gt;, and it runs over the six stats &lt;code&gt;hp, mp, offense, defense, speed, brain&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int8_t&lt;/span&gt; &lt;span class="n"&gt;isHighestStat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;statsArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;statsArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="n"&gt;isHighestStat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isHighestStat&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;highestStat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For six stats, the nested loop is cheap. But look at what is missing: there is no &lt;code&gt;break&lt;/code&gt; after the assignment. The loop keeps going after it finds a maximum, so a later tied stat overwrites an earlier one. &lt;strong&gt;When stats tie, the highest index wins.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I ran the same selection logic with a few inputs:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all six tied      -&amp;gt; brain
offense highest   -&amp;gt; offense
off+def tied high -&amp;gt; defense
brain highest     -&amp;gt; brain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Reading the array order backwards gives the full tie-break priority: &lt;strong&gt;brain &amp;gt; speed &amp;gt; defense &amp;gt; offense &amp;gt; mp &amp;gt; hp&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With all six stats tied, the game selects brain as the highest stat. You could infer this from enough experiments, but the code makes the reason clear. Whether the missing &lt;code&gt;break&lt;/code&gt; was intentional is unknown; its effect is observable.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
Worth being careful here: I first suspected &lt;code&gt;highestStat&lt;/code&gt; was read uninitialized, which would be a genuine bug worth reporting upstream. It can't be — a maximum always exists among six values, so the flag is always set at least once. Check before you claim.&lt;br&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The scoring system: four checks, three needed
&lt;/h2&gt;

&lt;p&gt;That tie-break feeds a larger system. Every Digimon has up to six possible evolution targets. For each candidate the game computes a score out of 4, and &lt;strong&gt;a candidate needs at least 3 points to be eligible at all.&lt;/strong&gt; Below 3 it isn't considered.&lt;/p&gt;

&lt;p&gt;Here are the four checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Care mistakes, and the flag that inverts them
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isMaxCM&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;partner&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;careMistakes&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;reqs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;care&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;reqPoints&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;partner&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;careMistakes&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;reqs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;care&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;reqPoints&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Read the comparisons closely. There's a flag bit that &lt;strong&gt;reverses the test&lt;/strong&gt;, so some evolutions want your care mistakes &lt;em&gt;above&lt;/em&gt; a threshold.&lt;/p&gt;

&lt;p&gt;Neglect isn't a punishment in this game. For certain paths it's a requirement. Care mistakes can therefore help qualify a candidate. Whether that explains any particular Numemon depends on the other checks and available targets.&lt;/p&gt;
&lt;h3&gt;
  
  
  Weight is a window, not a floor
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;partner&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="n"&gt;partner&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;reqs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;reqPoints&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A band of &lt;strong&gt;±5&lt;/strong&gt; around a target. Overfeeding fails this check exactly as hard as underfeeding. A precise target weight matters because both sides of the window have a limit.&lt;/p&gt;
&lt;h3&gt;
  
  
  Stats, where the stage changes the rule
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DIGIMON_DATA&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3U&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/* Champion: only your single HIGHEST stat is examined */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/* everything else: ALL six stats must clear their thresholds */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Most evolutions need every stat above its requirement. Champion-level targets check only your highest one — which is where the missing &lt;code&gt;break&lt;/code&gt; above actually bites. &lt;strong&gt;For Champions, one selected highest stat matters; other targets require all six thresholds.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The bonus point: any one of five
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;digimon&lt;/span&gt;    &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;reqs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;digimon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;isBonusFulfilled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;discipline&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                &lt;span class="n"&gt;isBonusFulfilled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;happiness&lt;/span&gt;  &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                &lt;span class="n"&gt;isBonusFulfilled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;battles&lt;/span&gt;    &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* also invertible */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;techs&lt;/span&gt;      &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* mastered moves */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Any single one of these grants the fourth point. Battle count carries the same inversion trick as care mistakes: some evolutions want you to have fought &lt;em&gt;fewer&lt;/em&gt; than N battles.&lt;/p&gt;
&lt;h2&gt;
  
  
  The rule that quietly steers your collection
&lt;/h2&gt;

&lt;p&gt;One more piece, and it's the one that made me sit back:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqPoints&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;currentBest&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;isTargetRaised&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hasDigimonRaised&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;EVO_GAINS_DATA&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;targetDigimon&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;isCurrentBestRaised&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hasDigimonRaised&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;EVO_GAINS_DATA&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;currentBest&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;targetDigimon&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isTargetRaised&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;isCurrentBestRaised&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;reqPoints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="cm"&gt;/* you already have this one: disqualify it */&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isTargetRaised&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;isCurrentBestRaised&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;reqPoints&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="cm"&gt;/* you don't have this one: push it ahead */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The game remembers which Digimon you have raised. When it compares two eligible candidates, this code favours the one you have not raised: it can zero the already-raised candidate’s score or add a point to the new one. The outcome still depends on candidate order and the surrounding selection logic.&lt;/p&gt;

&lt;p&gt;It is a small but deliberate way to steer players toward more of the roster.&lt;/p&gt;
&lt;h2&gt;
  
  
  Who actually did this
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I did not decompile the game.&lt;/strong&gt; I forked the repository, ran parts of its code on a PC, and measured a few pieces a port would need. The decompilation work belongs to its contributors.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/jype0" rel="noopener noreferrer"&gt;
        jype0
      &lt;/a&gt; / &lt;a href="https://github.com/jype0/dw_decomp" rel="noopener noreferrer"&gt;
        dw_decomp
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Digimon World decomp&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;A work in progress decompilation of Digimon World for PS1.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Dependencies&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Install the following packages:&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;binutils-mipsel-linux-gnu gcc-mipsel-linux-gnu git make python3 python3-venv unzip wget
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Install Python dependencies:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;python3 -m venv .venv
. .venv/bin/activate
pip3 install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Download tools:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;tools/dl_deps.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Download CodeWarrior for PlayStation Release 4 and copy cc_mips.dll to bin/cc_mips/cc_mips_40.dll.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Build&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;# Update submodules
git submodule update --init --recursive

# Dump original PSX Digimon World (USA) ISO
bin/mkpsxiso-2.20-Linux/bin/dumpsxiso -x disks/us -s disks/us/us.xml "/path/to/Digimon World (USA).bin"

# Disassemble original binaries
make -j$(nproc) regenerate

# (Optional) Create file local.mk to override defaults
MWCCWRAP := /path/to/mwccwrap.exe
MWCCWRAP_FLAGS := -dll "/path/to/cc_mips.dll"
METROWRAP := /path/to/mw
METROWRAP_FLAGS := --use-wibo --wibo-path /path/to/wibo
CROSS := /path/to/mipsel-linux-gnu-

# Build new binaries
make -j$(nproc)

# Compare original vs new binaries
make compare

# Generate objdiff config
make objdiff
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Links&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Symbols and reverse engineering is based on work by SydMontague:&lt;br&gt;
&lt;a href="https://github.com/SydMontague/DW1-SydPatches" rel="noopener noreferrer"&gt;https://github.com/SydMontague/DW1-SydPatches&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/SydMontague/DW1-Code" rel="noopener noreferrer"&gt;https://github.com/SydMontague/DW1-Code&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/jype0/dw_decomp" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;a href="https://github.com/jype0/dw_decomp" rel="noopener noreferrer"&gt;jype0/dw_decomp&lt;/a&gt; started in March 2026 and is MIT licensed. It passed a milestone most decompilation projects never reach: &lt;strong&gt;zero &lt;code&gt;INCLUDE_ASM&lt;/code&gt; stubs left in &lt;code&gt;src/&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you haven't worked on a decomp, that needs explaining. &lt;code&gt;INCLUDE_ASM&lt;/code&gt; is the marker for "we haven't figured this function out yet, here's the raw assembly instead." Most decomps carry hundreds of them for years. The source tree no longer relies on those assembly placeholders. That milestone alone does not establish that every function matches the retail binary.&lt;/p&gt;

&lt;p&gt;Credit isn't evenly spread, and shouldn't be reported as if it were. As of today the contributor counts are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Contributor&lt;/th&gt;
&lt;th&gt;Contributions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pekka Jylhä-Ollila (jype0)&lt;/td&gt;
&lt;td&gt;409 — maintainer, and the bulk of the project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;juandav&lt;/td&gt;
&lt;td&gt;37 — matching functions and data across overlays&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChonkMode&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kingzmanh&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fmil95&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ThirstyWraith&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SydMontague&lt;/td&gt;
&lt;td&gt;5 — struct and naming reference work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;paulohpfilho&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Those are the repository’s contribution counts at the time I checked, not a measure of each person’s work or proof that every regional build is complete.&lt;/p&gt;

&lt;p&gt;I asked about the roadmap in an issue. juandav relayed jype0's four points: clean up the hacks and name things properly; match all 10 regional versions; maybe a PC port, blocked because &lt;em&gt;psyq and psycross don't currently implement libgs or libsnd&lt;/em&gt;; and then &lt;strong&gt;a DW1 mod of epic proportions&lt;/strong&gt; — new maps, story, Digimon.&lt;/p&gt;

&lt;p&gt;The ambitious mod is the long-term goal. The decompilation makes that work possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Running their code somewhere it has never run
&lt;/h2&gt;

&lt;p&gt;My question was narrower: can this code run off the PlayStation at all?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;evolution.c&lt;/code&gt; is 1,087 lines. Compiling it on x86-64 produced exactly one error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;libgte.h: No such file or directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's Sony's geometry coprocessor header. So I grepped &lt;code&gt;evolution.c&lt;/code&gt; for &lt;code&gt;VECTOR&lt;/code&gt;, &lt;code&gt;MATRIX&lt;/code&gt;, &lt;code&gt;gte_&lt;/code&gt;, &lt;code&gt;RotTrans&lt;/code&gt; — nothing. The evolution logic doesn't touch the GTE at all. It only &lt;em&gt;inherits&lt;/em&gt; the header through &lt;code&gt;entity.h&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I wrote type-only stand-ins for the four PsyQ headers. It compiled clean, then ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EvoRequirements = 28 bytes (PS1 layout: 28)
fresh(1)       -&amp;gt; 2
in-training(3) -&amp;gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That 28 matters more than it looks. The game reads its data tables as raw structs, so if the layout shifted by even one byte on a 64-bit host, every evolution requirement in the game would decode as noise. It doesn't, and I pinned it with &lt;code&gt;static_assert&lt;/code&gt; so nobody can break it quietly later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring the GTE instead of guessing at it
&lt;/h2&gt;

&lt;p&gt;A major piece of a PS1 port is the GTE, the fixed-point geometry coprocessor.&lt;/p&gt;

&lt;p&gt;My first instinct was to size the problem with a grep. I got 181 and quoted that number publicly. &lt;strong&gt;It was wrong&lt;/strong&gt; — my pattern was matching a header that &lt;em&gt;defines&lt;/em&gt; every GTE macro whether the game calls it or not. Measured against &lt;code&gt;src/&lt;/code&gt; alone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;632 call sites, 29 distinct operations, 34 of 126 files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The call sites are concentrated:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Sites&lt;/th&gt;
&lt;th&gt;Cumulative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ApplyMatrixSV&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;16%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RotMatrix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RotMatrixZYX&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RotMatrixYXZ&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ratan2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;45%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gte_rtps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ScaleMatrix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;71%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TransMatrix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;77%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ApplyMatrixLV&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The nine operations shown account for about 81% of these call sites.&lt;/strong&gt; That gives a useful starting point, though call-site count does not measure implementation difficulty.&lt;/p&gt;

&lt;p&gt;I implemented a software subset covering those common operations. The contract is strict: matrix entries are 1.3.12 fixed point (4096 = 1.0), angles run 4096 to a full turn, and results &lt;strong&gt;saturate rather than wrap&lt;/strong&gt;. That last one isn't optional — a wrapped coordinate throws a vertex to the far side of the screen, which is exactly the class of bug that ships unnoticed.&lt;/p&gt;

&lt;p&gt;Then I measured the number that actually decides anything. "0.17% trigonometric error" is a useless statistic; nobody can tell you whether that's visible. So I measured pixels — how far a projected vertex lands from where double-precision maths puts it, across 2,528 vertices and a full rotation sweep:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mean error:             0.825 px
worst error:            1.896 px
vertices off by &amp;gt; 2px:  0.00%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In that test, the error stayed under two pixels. This measures one projection sweep; it does not guarantee every game scene will look the same.&lt;/p&gt;

&lt;p&gt;And the honest half: &lt;strong&gt;it is not bit-exact.&lt;/strong&gt; The real GTE uses lookup tables; my polynomial approximation looks identical and is numerically different. That's fine for a &lt;em&gt;port&lt;/em&gt; and useless for &lt;em&gt;verifying a decompilation&lt;/em&gt;, whose entire premise is reproducing the original binary byte for byte. Confusing those two would be the expensive mistake, so I put the warning in the test output rather than in a comment nobody reads.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Drawing a frame: primitives and the ordering table
  &lt;p&gt;The game's rendering is all PsyQ primitives, counted across the source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POLY_FT4  386    (textured quad)
POLY_F4    30
POLY_GT4   17
POLY_FT3    6    (textured triangle)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two textured primitive types in this excerpt account for 392 call sites, making them a useful first rendering test. I built them with the game's own &lt;code&gt;setXYWH&lt;/code&gt; and &lt;code&gt;setUVWH&lt;/code&gt; macros lifted from &lt;code&gt;src/main/utils.c&lt;/code&gt;, and rasterised them in software.&lt;/p&gt;

&lt;p&gt;One thing I deliberately did not fix: the texture mapping is affine, not perspective-correct. The PS1 had no perspective correction, and that wobble is part of how the console looks. Correcting it would make a port feel wrong.&lt;/p&gt;

&lt;p&gt;Then the ordering table, which is how the PS1 sorted by depth. The name misleads, so it's worth saying plainly: &lt;strong&gt;an ordering table is not a sorting algorithm.&lt;/strong&gt; It's a bucket array — one slot per depth value, each holding a linked list, with &lt;code&gt;AddPrim&lt;/code&gt; pushing to the front. O(1) insertion, zero comparisons. That's how a 33MHz console depth-sorted a scene every frame, and reimplementing it with &lt;code&gt;qsort&lt;/code&gt; would be slower &lt;em&gt;and&lt;/em&gt; wrong, because the order of equal-depth primitives depends on the original insertion and traversal rules.&lt;/p&gt;

&lt;p&gt;I built the occlusion test so it couldn't pass by luck: submit the &lt;strong&gt;near&lt;/strong&gt; quad first, then the far one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;normal:          centre pixel r=16  g=104    (near/green occludes)
depths swapped:  centre pixel r=120 g=16     (far/red now occludes)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same submission order, opposite result. The table is doing the work, not the sequence of my function calls.&lt;/p&gt;



&lt;br&gt;
&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I got things wrong
&lt;/h2&gt;

&lt;p&gt;Two corrections, because they're more useful than a clean story.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The GTE count.&lt;/strong&gt; I said 181 in public. It's 632. I estimated with a grep and then quoted the estimate as a measurement, which is a bad habit and I did it anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A test that failed for the right reason.&lt;/strong&gt; I asserted the far square would peek out around the near one. It doesn't: the near quad spans x=75..245 and the far one x=123..197, so full occlusion is correct physics and my sampling point was badly chosen. I checked the rendered image before touching any code, which is the only reason I didn't "fix" working code to match a broken expectation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not prove
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One logic file out of 126.&lt;/strong&gt; I picked &lt;code&gt;evolution.c&lt;/code&gt; &lt;em&gt;because&lt;/em&gt; it looked dependency-free. Best case, not a representative sample.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The GTE is approximate.&lt;/strong&gt; 18 of 29 operations unimplemented, and the trig is polynomial rather than table-driven.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No model loading.&lt;/strong&gt; &lt;code&gt;GsSortObject4&lt;/code&gt; has 42 call sites and walks TMD models. The ordering table is ready for it; the format reader isn't written.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing validated against the retail binary.&lt;/strong&gt; That needs the MIPS toolchain and a disc image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The assets are still Bandai's.&lt;/strong&gt; Models, textures, music, text. A possible distribution model is an engine that requires players to supply their own game data; the legal details would need separate review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where my work and jype0's roadmap touch: his stated blocker for a PC port is that psyq and psycross don't implement &lt;code&gt;libgs&lt;/code&gt; or &lt;code&gt;libsnd&lt;/code&gt;. &lt;code&gt;libgs&lt;/code&gt; is one of the four headers I stubbed. I'm not claiming that solves his problem — only that it's the same wall, and it's climbable from at least one side.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we finally understand
&lt;/h2&gt;

&lt;p&gt;Twenty-five years of wiki edits, spreadsheets and arguments, and the answer is a few hundred lines of C:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3 points of 4&lt;/strong&gt; to be eligible at all&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Care mistakes and battle counts are invertible&lt;/strong&gt; — some evolutions want neglect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weight is a ±5 window&lt;/strong&gt; — overfeeding fails like starving&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Champions check your highest stat only&lt;/strong&gt;; everything else checks all six&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ties favour the last tied stat&lt;/strong&gt; in array order, with brain last&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Previously raised targets can lose a head-to-head comparison&lt;/strong&gt; against a new one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your Numemon had an explanation in the game’s rules. The exact reason in any given run depends on the candidate scores and selection path.&lt;/p&gt;

&lt;p&gt;That is what makes the decompilation exciting: the rules are readable and testable. It also gives modders a foundation to build on.&lt;/p&gt;

&lt;p&gt;My four experiments live on a &lt;a href="https://github.com/krlz-dev/dw_decomp/tree/port-spike/port" rel="noopener noreferrer"&gt;branch in my fork&lt;/a&gt;. Each runs with one command and needs only &lt;code&gt;gcc&lt;/code&gt;, plus &lt;code&gt;libsdl2-dev&lt;/code&gt; for the two that draw — no PlayStation toolchain, no disc image.&lt;/p&gt;

&lt;p&gt;If you've worked on a decomp: how do you decide when an approximation is good enough to ship in a port, given it can never be good enough to verify a match? The bit-exact line is the part I'm least sure I drew correctly.&lt;/p&gt;

</description>
      <category>reverseengineering</category>
      <category>c</category>
      <category>gamedev</category>
      <category>cpp</category>
    </item>
    <item>
      <title>AI doesn't need a new Git workflow. It needs better gates</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Fri, 25 Sep 2026 13:08:42 +0000</pubDate>
      <link>https://dev.to/krlz/ai-doesnt-need-a-new-git-workflow-it-needs-better-gates-2baj</link>
      <guid>https://dev.to/krlz/ai-doesnt-need-a-new-git-workflow-it-needs-better-gates-2baj</guid>
      <description>&lt;p&gt;A peer-reviewed study presented at EASE 2026 examined 33,596 pull requests created by AI agents in GitHub repositories with at least 100 stars. It found that &lt;strong&gt;61.38% had no recorded review activity&lt;/strong&gt;. If you include pull requests reviewed only by bots, that number reaches 84%.&lt;/p&gt;

&lt;p&gt;That does not prove nobody read the code. A maintainer can inspect a diff carefully and merge it without leaving a comment. But recorded activity is the only oversight a team can audit later, and right now that record is disappearing.&lt;/p&gt;

&lt;p&gt;This is the Git problem worth solving for AI. It is not whether your team should replace Git Flow with trunk-based development because it started using Copilot.&lt;/p&gt;

&lt;p&gt;I started researching what changes about Git when AI writes the code, expecting to find a new branching model. I did not find one. The more important change is simpler: generating code became cheap, while verifying it did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The branching question is mostly a distraction
&lt;/h2&gt;

&lt;p&gt;“Git Flow or trunk-based for AI?” is an old question with a new label. It asks how long a branch should live.&lt;/p&gt;

&lt;p&gt;Most coding agents have converged on a familiar workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task → branch → pull request → human handoff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is essentially GitHub Flow. It already fits an agent's natural unit of work: one task, one isolated workspace and one handoff point.&lt;/p&gt;

&lt;p&gt;GitHub describes Copilot's coding-agent workflow in similar terms. The agent opens a pull request, assigns a reviewer and expects the code to be reviewed like a contribution from any other developer.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;agent/&lt;/code&gt; prefix may be new. The workflow is not.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code generation got faster. Review did not
&lt;/h2&gt;

&lt;p&gt;An agent can produce a plausible 400-line change in a few minutes. A human may still need twenty minutes—or much longer—to understand whether it is correct.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/nkfxbvel-the-decoder/embed/OPpgLgq?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Recent industry measurements show the same pattern:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Reported change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Median PR size&lt;/td&gt;
&lt;td&gt;+51%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median time in review&lt;/td&gt;
&lt;td&gt;+441%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agentic PR wait for reviewer pickup&lt;/td&gt;
&lt;td&gt;5.3× longer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reported incidents per PR&lt;/td&gt;
&lt;td&gt;+243%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;LinearB analyzed 8.1 million pull requests across more than 4,800 organizations. Developers felt 20% faster, but measured delivery performance was 19% slower. Teams completed more tasks and merged 98% more pull requests, while review time increased by 91%.&lt;/p&gt;

&lt;p&gt;These numbers do not describe a branching failure. They describe a verification bottleneck. Renaming branches does not reduce the amount of code a person must understand.&lt;/p&gt;
&lt;h2&gt;
  
  
  “Reviewed” may no longer mean reviewed
&lt;/h2&gt;

&lt;p&gt;The EASE 2026 study also compared agent-authored and human-authored pull requests within the same repositories. Researchers classified human comments as genuine review, instructions directed at an agent, or CI-related activity.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Human comment type&lt;/th&gt;
&lt;th&gt;Agent PRs&lt;/th&gt;
&lt;th&gt;Human PRs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Genuine review content&lt;/td&gt;
&lt;td&gt;65.5%&lt;/td&gt;
&lt;td&gt;93.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent-steering commands&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;25.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When humans interacted with an agent's pull request, roughly a quarter of their comments were instructions such as asking the agent to fix a failure. They were operating the agent rather than evaluating the change.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
The practical consequence: &lt;strong&gt;a pull request marked as reviewed is becoming a weaker signal of human oversight.&lt;/strong&gt; Review counts alone may no longer tell you whether someone examined the architecture, business rules and failure cases.&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;This matters for engineering metrics, incident analysis and compliance. A dashboard can say that a pull request was reviewed without showing whether the interaction was a real evaluation, an agent command or an automated comment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you switch to trunk-based development?
&lt;/h2&gt;

&lt;p&gt;Trunk-based development fits agent work well. Short-lived branches reduce divergence, and small changes are easier to test, review and revert.&lt;/p&gt;

&lt;p&gt;DORA's 2025 report found that the benefits of AI depend partly on teams working in small batches. Trunk-based development often encourages that behaviour, but it is not the only way to achieve it.&lt;/p&gt;

&lt;p&gt;You can keep Git Flow and still require small, independently reviewable changes. You can also use trunk-based development badly by allowing agents to open enormous pull requests.&lt;/p&gt;

&lt;p&gt;Trunk-based development also has costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It works best with a fast and reliable test suite.&lt;/li&gt;
&lt;li&gt;It often depends on feature flags, which require ownership and cleanup.&lt;/li&gt;
&lt;li&gt;Adoption may initially slow delivery while teams improve their automation and release practices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the decision should still depend on the team, release process and maturity of the test suite—not on whether the code was written with AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where &lt;code&gt;develop&lt;/code&gt; still earns its place
&lt;/h2&gt;

&lt;p&gt;If your team uses &lt;code&gt;feature/* → develop → main&lt;/code&gt;, AI is not a reason by itself to remove &lt;code&gt;develop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Keep it when it is a real integration environment where changes are tested together before release. Remove it when it only adds waiting time and nobody uses it to discover integration problems.&lt;/p&gt;

&lt;p&gt;Modern coding agents can work with either model. Copilot's coding agent, for example, can now use a selected base branch instead of only the repository's default branch.&lt;/p&gt;

&lt;p&gt;The useful question is not “Is &lt;code&gt;develop&lt;/code&gt; outdated?” It is “What risk does this branch control, and is it actually controlling it?”&lt;/p&gt;

&lt;h2&gt;
  
  
  A workflow you can adopt now
&lt;/h2&gt;

&lt;p&gt;You probably do not need new branch names. You need clearer gates between an agent receiving a task and its code reaching production.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Review the plan before the patch
&lt;/h3&gt;

&lt;p&gt;Ask the agent for a short implementation plan before it writes code. The plan should explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which files, services and data are affected&lt;/li&gt;
&lt;li&gt;API or schema changes&lt;/li&gt;
&lt;li&gt;migration and rollback steps&lt;/li&gt;
&lt;li&gt;tests that will be added&lt;/li&gt;
&lt;li&gt;risks and assumptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep the plan in the issue or pull-request description. Repository instructions such as &lt;code&gt;CLAUDE.md&lt;/code&gt; or &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; can make this a default part of the workflow.&lt;/p&gt;

&lt;p&gt;It is much cheaper to reject a bad approach before it becomes a large diff.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Keep changes reviewable
&lt;/h3&gt;

&lt;p&gt;Use GitHub Actions, Danger JS or a PR-size action to label large changes and require an explanation when they cross an agreed threshold.&lt;/p&gt;

&lt;p&gt;A hard line limit will not fit every repository. Generated files, lockfiles and migrations can distort the number. The goal is not to worship a 200-line rule; it is to make large changes exceptional and intentional.&lt;/p&gt;

&lt;p&gt;When possible, split work into small pull requests that can be tested and reverted independently. GitHub also documents a stacked pull-request workflow for AI-generated changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Automate the mechanical review
&lt;/h3&gt;

&lt;p&gt;Run automated checks before asking for human attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CodeQL or Semgrep&lt;/strong&gt; for static analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SonarQube or SonarCloud&lt;/strong&gt; for maintainability rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gitleaks&lt;/strong&gt; for secrets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependabot or Renovate&lt;/strong&gt; for dependency changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snyk or Trivy&lt;/strong&gt; for dependency and container vulnerabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright, Pact or integration tests&lt;/strong&gt; for behaviour across boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI review tools such as GitHub Copilot code review, CodeRabbit, Qodo Merge or Greptile can provide another first pass.&lt;/p&gt;

&lt;p&gt;These tools are useful for finding common problems. They should not own the final decision. Humans still need to evaluate architecture, product behaviour, security assumptions and failure modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Protect the merge
&lt;/h3&gt;

&lt;p&gt;Use GitHub rulesets, protected branches, required status checks and &lt;code&gt;CODEOWNERS&lt;/code&gt; to make ownership explicit.&lt;/p&gt;

&lt;p&gt;For sensitive areas, require approval from the team that owns the code. Do not allow a bot comment or an agent-generated fix to satisfy the same rule as a human approval.&lt;/p&gt;

&lt;p&gt;GitHub Copilot code review leaves a comment review by default rather than an approval. That default is sensible. If AI approvals are configurable in your organization, verify that changing the setting cannot silently remove the human gate.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Record AI involvement
&lt;/h3&gt;

&lt;p&gt;Add a pull-request label, metadata field or commit trailer that records which agent was involved. Link the task, plan and relevant session transcript from the pull request.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Co-Authored-By: Claude &amp;lt;noreply@anthropic.com&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you enough information to ask useful questions later:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do agent-assisted changes fail more often?&lt;/li&gt;
&lt;li&gt;Which repositories need more review?&lt;/li&gt;
&lt;li&gt;Which instructions repeatedly produce the same mistakes?&lt;/li&gt;
&lt;li&gt;Does AI reduce lead time after review and rework are included?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub's API can provide the raw data. Engineering analytics platforms such as LinearB, Swarmia or Jellyfish can help track change size, review time, rework and deployment outcomes.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Fix the generator when mistakes repeat
&lt;/h3&gt;

&lt;p&gt;When an agent makes the same mistake twice, do not only repair the current diff. Update the issue template, prompt, repository instructions, examples or agent skill that produced it.&lt;/p&gt;

&lt;p&gt;Fixing a diff improves one pull request. Fixing the generator improves the next hundred.&lt;/p&gt;

&lt;p&gt;The resulting workflow is deliberately boring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task → plan → small change → automated checks → human review → merge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a feature. Good delivery systems make ownership obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is still unresolved
&lt;/h2&gt;

&lt;p&gt;There are questions the current research does not answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If review counts no longer measure oversight, what should replace them?&lt;/strong&gt; Time spent on a page would be easy to game, and comments are an incomplete signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What happens at full autonomy?&lt;/strong&gt; Every workflow above assumes a human remains in the merge path. At dozens of agent pull requests per day, that assumption may stop working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What is the right commit granularity?&lt;/strong&gt; An agent session may contain forty steps, but forty commits are rarely useful. I currently prefer squashing into logical units while keeping the session history separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are more important questions than whether an agent branch should start with &lt;code&gt;feature/&lt;/code&gt; or &lt;code&gt;agent/&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Your current branching model is probably fine. One task, one branch and one pull request still works.&lt;/p&gt;

&lt;p&gt;What changed is the pressure placed on the review system. AI can produce code faster than humans can verify it, while existing dashboards may still report that everything was “reviewed.”&lt;/p&gt;

&lt;p&gt;Before changing Git Flow, strengthen the path to merge: review the plan, keep changes small, automate mechanical checks, require clear ownership and record where AI was involved.&lt;/p&gt;

&lt;p&gt;Then ask the uncomfortable question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you know what fraction of your merged agent pull requests a human actually read—not merely approved?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I suspect most teams cannot answer that yet. I would genuinely like to hear from anyone who can.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://dora.dev/dora-report-2025/" rel="noopener noreferrer"&gt;DORA 2025 State of AI-Assisted Software Development&lt;/a&gt; · Duma et al., &lt;a href="https://arxiv.org/abs/2605.02273" rel="noopener noreferrer"&gt;“These Aren't the Reviews You're Looking For,” EASE 2026&lt;/a&gt; · &lt;a href="https://arxiv.org/abs/2507.08943" rel="noopener noreferrer"&gt;Choosing the Right Git Workflow (arXiv 2507.08943)&lt;/a&gt; · &lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/use-copilot-agents/copilot-code-review" rel="noopener noreferrer"&gt;GitHub Docs: Copilot code review&lt;/a&gt; · &lt;a href="https://github.blog/changelog/2025-07-23-agents-page-set-the-base-branch-for-github-copilot-coding-agent-tasks/" rel="noopener noreferrer"&gt;GitHub Changelog: base branch for coding agent&lt;/a&gt; · &lt;a href="https://docs.github.com/en/copilot/tutorials/stack-ai-generated-code-in-pull-requests" rel="noopener noreferrer"&gt;GitHub Docs: Stack AI-generated code in pull requests&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>MCP Went Stateless: What the 2026-07-28 Spec Actually Changes</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Sun, 09 Aug 2026 14:01:44 +0000</pubDate>
      <link>https://dev.to/krlz/mcp-went-stateless-what-the-2026-07-28-spec-actually-changes-273k</link>
      <guid>https://dev.to/krlz/mcp-went-stateless-what-the-2026-07-28-spec-actually-changes-273k</guid>
      <description>&lt;p&gt;For eighteen months, running a remote MCP server meant fighting your own infrastructure. You had a bidirectional, stateful protocol sitting on top of HTTP, which meant sticky sessions, a shared Redis for session state, or a gateway doing packet inspection to route requests to the one box that held the connection. Every horizontal scaling story started with an apology.&lt;/p&gt;

&lt;p&gt;On July 28, 2026, that ended. The &lt;code&gt;2026-07-28&lt;/code&gt; specification makes MCP &lt;strong&gt;stateless at the protocol layer&lt;/strong&gt; — the largest revision since launch, and the first one that makes MCP behave like the rest of the web.&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;p&gt;Six SEPs (Specification Enhancement Proposals) work together here. The short version:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The handshake is gone.&lt;/strong&gt; &lt;code&gt;initialize&lt;/code&gt;/&lt;code&gt;initialized&lt;/code&gt; and the &lt;code&gt;Mcp-Session-Id&lt;/code&gt; header have been removed (SEP-2575, SEP-2567). Every request is now self-describing: protocol version, client identity, and client capabilities ride inline in &lt;code&gt;_meta&lt;/code&gt; on each call. There's an optional &lt;code&gt;server/discover&lt;/code&gt; RPC if a client wants capabilities up front, but nothing requires it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/mcp&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;MCP-Protocol-Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-07-28&lt;/span&gt;
&lt;span class="na"&gt;Mcp-Method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tools/call&lt;/span&gt;
&lt;span class="na"&gt;Mcp-Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;search&lt;/span&gt;

{"jsonrpc":"2.0","id":1,"method":"tools/call",
 "params":{"name":"search","arguments":{"q":"otters"},
 "_meta":{"io.modelcontextprotocol/clientInfo":{"name":"my-app","version":"1.0"}}}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Any request can land on any instance behind a plain round-robin load balancer. No shared storage, no ARR affinity, no sticky routing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Routing moved into headers.&lt;/strong&gt; &lt;code&gt;Mcp-Method&lt;/code&gt; and &lt;code&gt;Mcp-Name&lt;/code&gt; are now required on Streamable HTTP requests (SEP-2243). Your gateway, WAF, or rate limiter can route and meter without parsing JSON bodies. If you've ever written a Lua script to peek inside an MCP payload at the edge, you can delete it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;List results are cacheable.&lt;/strong&gt; &lt;code&gt;tools/list&lt;/code&gt;, &lt;code&gt;prompts/list&lt;/code&gt;, &lt;code&gt;resources/list&lt;/code&gt;, and &lt;code&gt;resources/read&lt;/code&gt; now carry &lt;code&gt;ttlMs&lt;/code&gt; and &lt;code&gt;cacheScope&lt;/code&gt; (SEP-2549), with deterministic ordering. That last part matters more than it looks: a stable tool catalog keeps upstream &lt;em&gt;prompt&lt;/em&gt; caches stable across reconnects, which is a real token-cost line item.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server→client calls became round trips.&lt;/strong&gt; This is the clever bit. Elicitation and sampling used to require a held-open stream, which is exactly what a stateless protocol can't offer. Multi Round-Trip Requests (SEP-2322) invert it: the server returns &lt;code&gt;resultType: "input_required"&lt;/code&gt; plus an opaque request-state token, the client gathers the answers, then calls the same tool again with &lt;code&gt;inputResponses&lt;/code&gt; attached. Every leg is an ordinary client-to-server request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auth got hardened.&lt;/strong&gt; Authorization servers should return &lt;code&gt;iss&lt;/code&gt; per &lt;a href="https://www.rfc-editor.org/rfc/rfc9207" rel="noopener noreferrer"&gt;RFC 9207&lt;/a&gt; and clients must validate it before redeeming a code (SEP-2468) — that closes an AS mix-up hole. Client credentials are now bound to the issuer that minted them (SEP-2352), and Dynamic Client Registration is formally deprecated in favour of Client ID Metadata Documents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deprecations.&lt;/strong&gt; Roots, Sampling, and Logging are deprecated (SEP-2577), as is the legacy HTTP+SSE transport (SEP-2596). Both get a twelve-month minimum offramp under the new deprecation policy — which is itself the quiet good news here. This is a protocol that now plans its breakage.&lt;/p&gt;


&lt;h2&gt;
  
  
  The part people will get wrong
&lt;/h2&gt;

&lt;p&gt;"Stateless protocol" does not mean "stateless application."&lt;/p&gt;

&lt;p&gt;If your server needs to carry state across calls, you mint an &lt;strong&gt;explicit handle&lt;/strong&gt; from a tool and let the model pass it back as an ordinary argument. The maintainers are direct that this works better than state hidden in the transport, and I think they're right for a reason that isn't primarily architectural: the model can &lt;em&gt;see&lt;/em&gt; the handle. It becomes a thing the agent reasons about and threads between tools, instead of an invisible coupling that breaks the moment a load balancer does its job.&lt;/p&gt;

&lt;p&gt;This is the same lesson REST landed on twenty-five years ago. Roy Fielding's dissertation argued the statelessness constraint buys you visibility, reliability, and scalability at the cost of repeated per-request data — &lt;a href="https://ics.uci.edu/~fielding/pubs/dissertation/top.htm" rel="noopener noreferrer"&gt;&lt;em&gt;Architectural Styles and the Design of Network-based Software Architectures&lt;/em&gt;&lt;/a&gt;, Ch. 5. MCP just paid that tuition in public.&lt;/p&gt;


&lt;h2&gt;
  
  
  A stateless server in Python
&lt;/h2&gt;

&lt;p&gt;The v2 line of the Python SDK renamed the in-SDK &lt;code&gt;FastMCP&lt;/code&gt; to &lt;code&gt;MCPServer&lt;/code&gt; and moved transport options off the constructor onto &lt;code&gt;run()&lt;/code&gt;. If you're still importing &lt;code&gt;mcp.server.fastmcp&lt;/code&gt;, you're on v1.x and speaking the old handshake.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv init mcp-units &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;mcp-units
uv add &lt;span class="s2"&gt;"mcp[cli]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# server.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mcp.server.mcpserver&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MCPServer&lt;/span&gt;

&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MCPServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;units&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_celsius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fahrenheit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Convert Fahrenheit to Celsius.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;fahrenheit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# stateless_http + json_response = plain HTTP request/response
&lt;/span&gt;    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;streamable-http&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stateless_http&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json_response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it. No session manager, no event store, no affinity. Run it and point the inspector at &lt;code&gt;http://localhost:8000/mcp&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run server.py
npx &lt;span class="nt"&gt;-y&lt;/span&gt; @modelcontextprotocol/inspector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now the interesting version — state without a session:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mcp.server.mcpserver&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MCPServer&lt;/span&gt;

&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MCPServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# In production this is Redis/Postgres, not a dict — but note that it's
# *your* store, keyed by a handle the model holds, not transport state.
&lt;/span&gt;&lt;span class="n"&gt;JOBS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;


&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start_export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Begin an export. Returns a job handle to pass to check_export.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;job_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;JOBS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dataset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;running&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;job_id&lt;/span&gt;


&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Check an export by its handle.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JOBS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Two calls, potentially two different machines, zero coordination. The handle is in the model's context, not in the transport.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One gotcha worth internalising before you migrate:&lt;/strong&gt; because MRTR removed the back-channel, &lt;code&gt;ctx.elicit()&lt;/code&gt; and &lt;code&gt;ctx.session.create_message()&lt;/code&gt; raise &lt;code&gt;NoBackChannelError&lt;/code&gt; on a modern connection. If your server asks the user mid-call, that code needs rewriting around the input-required round trip — it's the single most likely thing to break.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/modelcontextprotocol" rel="noopener noreferrer"&gt;
        modelcontextprotocol
      &lt;/a&gt; / &lt;a href="https://github.com/modelcontextprotocol/python-sdk" rel="noopener noreferrer"&gt;
        python-sdk
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The official Python SDK for Model Context Protocol servers and clients
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;MCP Python SDK&lt;/h1&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;p&gt;&lt;strong&gt;Python implementation of the Model Context Protocol (MCP)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pypi.org/project/mcp/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fa730a5fc7a59b603bacef018e7ff9761957bccea670c7138637447fc0e08e03/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6d63702e737667" alt="PyPI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/modelcontextprotocol/python-sdk/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/01ee695500fc295f411fdee783d43065f07ba7e723d299491d5792a6de4917e3/68747470733a2f2f696d672e736869656c64732e696f2f707970692f6c2f6d63702e737667" alt="MIT licensed"&gt;&lt;/a&gt;
&lt;a href="https://www.python.org/downloads/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/13a2efccf4c31284ba2df205f4d14715078d2519b2af23cc24c698c539fd8977/68747470733a2f2f696d672e736869656c64732e696f2f707970692f707976657273696f6e732f6d63702e737667" alt="Python Version"&gt;&lt;/a&gt;
&lt;a href="https://py.sdk.modelcontextprotocol.io/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0ed1aa4bc0ec3bdcac06dd9829284266dbec9bf8ddb31bbd05e9b33144c0c022/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f63732d707974686f6e2d2d73646b2d626c75652e737667" alt="Documentation"&gt;&lt;/a&gt;
&lt;a href="https://modelcontextprotocol.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c439e3dff9c7e807571b19cc6034231500ebfaecaa519b916de704ffa6d1f07c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f70726f746f636f6c2d6d6f64656c636f6e7465787470726f746f636f6c2e696f2d626c75652e737667" alt="Protocol"&gt;&lt;/a&gt;
&lt;a href="https://modelcontextprotocol.io/specification/latest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0dccc2c1a5a27b6148a64059d665d85cce848ac7df7cbe16579ac3dc6b5ae366/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f737065632d737065632e6d6f64656c636f6e7465787470726f746f636f6c2e696f2d626c75652e737667" alt="Specification"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The documentation lives at &lt;a href="https://py.sdk.modelcontextprotocol.io/" rel="nofollow noopener noreferrer"&gt;https://py.sdk.modelcontextprotocol.io/&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It has a &lt;a href="https://py.sdk.modelcontextprotocol.io/get-started/" rel="nofollow noopener noreferrer"&gt;Get started guide&lt;/a&gt;, &lt;a href="https://py.sdk.modelcontextprotocol.io/whats-new/" rel="nofollow noopener noreferrer"&gt;What's new in v2&lt;/a&gt;, the &lt;a href="https://py.sdk.modelcontextprotocol.io/api/mcp/" rel="nofollow noopener noreferrer"&gt;API reference&lt;/a&gt;, and the &lt;a href="https://py.sdk.modelcontextprotocol.io/migration/" rel="nofollow noopener noreferrer"&gt;migration guide&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is MCP?&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://modelcontextprotocol.io" rel="nofollow noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; lets you build servers that expose data and functionality to LLM applications in a secure, standardized way. Think of it like a web API, but designed for LLM interactions. With this SDK you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build MCP servers&lt;/strong&gt; that expose tools, resources, and prompts to any MCP host&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build MCP clients&lt;/strong&gt; that connect to any MCP server&lt;/li&gt;
&lt;li&gt;Speak every standard transport: stdio, Streamable HTTP, and SSE&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Requirements&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Python 3.10+.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;uv add &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;mcp[cli]&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or: pip install "mcp[cli]"&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;cli&lt;/code&gt; extra adds the &lt;code&gt;mcp&lt;/code&gt; command-line tool (&lt;code&gt;mcp dev&lt;/code&gt;, &lt;code&gt;mcp run&lt;/code&gt;, &lt;code&gt;mcp install&lt;/code&gt;) on top of the SDK; install plain…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/modelcontextprotocol/python-sdk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





&lt;h2&gt;
  
  
  Why this matters beyond the ops win
&lt;/h2&gt;

&lt;p&gt;The scaling story is the headline, but I think the deeper shift is that MCP stopped being a &lt;em&gt;transport-flavoured&lt;/em&gt; protocol and became an &lt;em&gt;HTTP-flavoured&lt;/em&gt; one. That means the boring, battle-tested layer of the web now applies to agent tooling: CDNs, edge workers, standard load balancers, cache-control semantics, header-based authorization at the gateway.&lt;/p&gt;

&lt;p&gt;It also narrows some real attack surface. The research on MCP security has been fairly damning, and a lot of it clusters around trust boundaries between independently operated components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hou, Zhao, Wang &amp;amp; Wang (2025)&lt;/strong&gt; — &lt;a href="https://arxiv.org/abs/2503.23278" rel="noopener noreferrer"&gt;&lt;em&gt;Model Context Protocol (MCP): Landscape, Security Threats, and Future Research Directions&lt;/em&gt;&lt;/a&gt; — the canonical starting point. Builds a threat taxonomy across the server lifecycle and four attacker classes. The tool-description manipulation section (embedding "prefer this tool" directives to hijack tool selection) is worth the read on its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Radosevich &amp;amp; Halloran (2025)&lt;/strong&gt; — &lt;a href="https://arxiv.org/abs/2504.03767" rel="noopener noreferrer"&gt;&lt;em&gt;MCP Safety Audit&lt;/em&gt;&lt;/a&gt; — demonstrates concrete exploits against real MCP deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yang, Wu &amp;amp; Chen (2025)&lt;/strong&gt; — &lt;a href="https://arxiv.org/abs/2508.13220" rel="noopener noreferrer"&gt;&lt;em&gt;MCPSecBench&lt;/em&gt;&lt;/a&gt; — a systematic security benchmark and playground, if you want something to actually run against your server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wang et al. (2025)&lt;/strong&gt; — &lt;a href="https://arxiv.org/abs/2508.20453" rel="noopener noreferrer"&gt;&lt;em&gt;MCP-Bench&lt;/em&gt;&lt;/a&gt; — benchmarks tool-using agents on complex real-world tasks via MCP servers. Useful for the "is my tool catalog actually usable by a model" question, which is separate from whether it's correct.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read those with a date-stamp in mind: they all predate the stateless core, so the session-layer threats they describe are partly answered by a protocol that no longer has a session layer. The prompt-level and supply-chain threats are entirely untouched. Stateless MCP is a scalability fix, not a security fix — treat any vendor claiming otherwise with suspicion.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Migration checklist
  &lt;ul&gt;
&lt;li&gt;[ ] Bump to the SDK line that speaks &lt;code&gt;2026-07-28&lt;/code&gt; (v2 for Python; pin exactly)&lt;/li&gt;
&lt;li&gt;[ ] Replace &lt;code&gt;mcp.server.fastmcp.FastMCP&lt;/code&gt; → &lt;code&gt;mcp.server.mcpserver.MCPServer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Move &lt;code&gt;stateless_http&lt;/code&gt; / &lt;code&gt;json_response&lt;/code&gt; from the constructor to &lt;code&gt;run()&lt;/code&gt; / &lt;code&gt;streamable_http_app()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Rewrite anything calling &lt;code&gt;ctx.elicit()&lt;/code&gt; or &lt;code&gt;create_message()&lt;/code&gt; around MRTR&lt;/li&gt;
&lt;li&gt;[ ] Replace session-keyed state with explicit tool-minted handles&lt;/li&gt;
&lt;li&gt;[ ] Delete sticky-session config and shared session stores&lt;/li&gt;
&lt;li&gt;[ ] Add &lt;code&gt;ttlMs&lt;/code&gt; / &lt;code&gt;cacheScope&lt;/code&gt; to list responses&lt;/li&gt;
&lt;li&gt;[ ] Validate &lt;code&gt;iss&lt;/code&gt; (RFC 9207) if you're a client; plan the DCR → CIMD move if you're a server&lt;/li&gt;
&lt;li&gt;[ ] Note snake_case field names in Python v2 (&lt;code&gt;structured_content&lt;/code&gt;, &lt;code&gt;next_cursor&lt;/code&gt;, &lt;code&gt;input_schema&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Where to go next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://modelcontextprotocol.io/specification/2026-07-28" rel="noopener noreferrer"&gt;The 2026-07-28 specification&lt;/a&gt; and its &lt;a href="https://modelcontextprotocol.io/specification/2026-07-28/changelog" rel="noopener noreferrer"&gt;full changelog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The maintainers' &lt;a href="https://blog.modelcontextprotocol.io/posts/2026-07-28/" rel="noopener noreferrer"&gt;release post&lt;/a&gt;, which is unusually readable for a spec announcement&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://simonwillison.net/2026/Jul/31/stateless-mcp/" rel="noopener noreferrer"&gt;Simon Willison's take&lt;/a&gt;, if you want the "I'd lost interest in MCP and this brought it back" perspective&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've already migrated a production server, I'd like to hear what broke. My guess is it was the elicitation rewrite and not the sessions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building AI integrations at &lt;a href="https://krlz.dev" rel="noopener noreferrer"&gt;Codiva&lt;/a&gt;. Comments and corrections welcome.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>python</category>
      <category>ai</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The UN wrote its first AI report. The interesting parts are about your codebase.</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Mon, 13 Jul 2026 13:53:05 +0000</pubDate>
      <link>https://dev.to/krlz/the-un-wrote-its-first-ai-report-the-interesting-parts-are-about-your-codebase-2ckp</link>
      <guid>https://dev.to/krlz/the-un-wrote-its-first-ai-report-the-interesting-parts-are-about-your-codebase-2ckp</guid>
      <description>&lt;p&gt;The UN just published its first-ever scientific report on AI. Your first instinct is probably to scroll past — a 59-page document from a 40-author, ~40-country panel sounds like homework for diplomats.&lt;/p&gt;

&lt;p&gt;Don't. Strip the governance language and most of it is about the exact stuff we ship every day: coding agents, benchmarks, context windows, orchestration, and the widening gap between what a model &lt;em&gt;scores&lt;/em&gt; and what it can actually &lt;em&gt;do in production&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Some context: this is the &lt;strong&gt;UN Independent International Scientific Panel on AI&lt;/strong&gt; (July 2026), co-chaired by deep-learning pioneer &lt;strong&gt;Yoshua Bengio&lt;/strong&gt; and Nobel laureate journalist &lt;strong&gt;Maria Ressa&lt;/strong&gt;. Think "IPCC for AI" — its mandate is deliberately narrow: &lt;em&gt;assess the science, don't prescribe policy.&lt;/em&gt; Here's the primary document if you want to read along:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://www.un.org/independent-international-scientific-panel-ai/en/preliminary-report" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;un.org&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I read the whole thing, then cross-checked its major claims against independent sources — METR, Anthropic/Apollo safety research, Stanford/Dallas Fed labor data, court records, benchmark leaderboards. Here's the developer's cut.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coding-agent task horizons are &lt;strong&gt;doubling every 4–7 months&lt;/strong&gt; (16+ hours of autonomous work by 2026).&lt;/li&gt;
&lt;li&gt;Knowledge benchmarks are &lt;strong&gt;saturating&lt;/strong&gt;; agentic + fluid-reasoning tests are the only ones still discriminating.&lt;/li&gt;
&lt;li&gt;Frontier models are now a &lt;strong&gt;portfolio, not a winner&lt;/strong&gt; — and &lt;strong&gt;1M-token context is the norm&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration (MCP, sub-agents, prompt caching) is where the leverage is&lt;/strong&gt;, not any single model.&lt;/li&gt;
&lt;li&gt;The whole report rhymes with one thing you already know: &lt;strong&gt;a benchmark score is not real-world utility.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Confidence key&lt;/strong&gt;, used throughout:&lt;br&gt;
🟢 &lt;strong&gt;Solid&lt;/strong&gt; — the report's own text, or primary/authoritative sources.&lt;br&gt;
🟡 &lt;strong&gt;Directional&lt;/strong&gt; — third-party leaderboards, aggregators, private-market valuations. Real signal, but figures move monthly. Every benchmark % and valuation below is 🟡.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The one idea that ties it all together
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Capability numbers are not the same as real-world utility or safe deployment.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the report's central caution, and if you've ever watched a model ace a benchmark and then faceplant on your actual codebase, you already believe it. Almost everything below is a variation on that theme.&lt;/p&gt;

&lt;p&gt;The panel frames the governance version of it as an &lt;strong&gt;"evidence dilemma"&lt;/strong&gt;: policymakers need evidence to make good decisions, but evidence lags the pace of AI — by the time it exists, it may be too late to act on.&lt;/p&gt;

&lt;p&gt;Co-chair Maria Ressa put the stakes more bluntly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"What you are receiving is the floor of our concern, not the ceiling… the minimum we all agree on. And that is alarming enough."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When 40 experts from ~40 countries agree on a &lt;em&gt;floor&lt;/em&gt;, the floor is worth reading.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 8 headline findings (compressed)
&lt;/h2&gt;

&lt;p&gt;They're worth skimming in order, because they escalate: from &lt;em&gt;we can't measure this well&lt;/em&gt; (1) to &lt;em&gt;very few people control it&lt;/em&gt; (2–5) to &lt;em&gt;it now acts on its own&lt;/em&gt; (6) to &lt;em&gt;that changes what's true and who has rights&lt;/em&gt; (7–8). Each finding is a precondition for the next.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capabilities outpace measurement.&lt;/strong&gt; Benchmarks saturate, models memorize test answers, and — the unsettling part — some show &lt;strong&gt;deception&lt;/strong&gt; and &lt;strong&gt;"evaluation awareness"&lt;/strong&gt; (behaving differently when they detect they're being tested).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only a few actors build frontier models.&lt;/strong&gt; The US produced 59 notable models in 2025 (China 35, rest of world 13) and held &lt;strong&gt;75% of top-500 compute&lt;/strong&gt;. &lt;strong&gt;91% of notable models came from the private sector.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inputs and outcomes are wildly uneven.&lt;/strong&gt; 7,000+ languages exist; only ~1,000 have the data foundations for meaningful AI inclusion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The AI divide is about capacity to &lt;em&gt;shape&lt;/em&gt; AI, not just access it.&lt;/strong&gt; 118 countries aren't engaged in major AI governance talks at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access alone yields nothing&lt;/strong&gt; without data, skills, workflows, and institutions around it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic AI is a governance step change.&lt;/strong&gt; Autonomy raises loss-of-control, cyber, and oversight problems that single-prompt AI never did.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI can erode shared reality&lt;/strong&gt; — deepfakes, the "liar's dividend," synthetic consensus, and sycophancy (documented and linked to real harm).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI is reshaping human rights&lt;/strong&gt;, including children's — surveillance at scale, biased systems, and a horrifying ~1.2M children whose images were manipulated into sexualized deepfakes.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Does it hold up? I checked the claims that matter to us
&lt;/h2&gt;

&lt;p&gt;The most valuable thing about this report isn't the summary — it's that the technical claims &lt;em&gt;survive independent verification&lt;/em&gt;. A few that are directly relevant to engineering:&lt;/p&gt;

&lt;h3&gt;
  
  
  Coding agents are getting longer horizons — fast
&lt;/h3&gt;

&lt;p&gt;The report cites &lt;strong&gt;METR time horizons&lt;/strong&gt;: the length of a software task an agent can complete autonomously. METR's finding is that the 50% task-completion horizon has been &lt;strong&gt;doubling roughly every 4–7 months&lt;/strong&gt; — from ~4 seconds of equivalent human work in 2019 to &lt;strong&gt;16+ hours by 2026&lt;/strong&gt;. METR shipped a revised methodology (Time Horizon 1.1) in January 2026 and the trend held.&lt;/p&gt;

&lt;p&gt;Take it as a floor with a fat error bar, not gospel — even METR debates how much of the acceleration is real vs. measurement-driven. But the direction is not controversial.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "agents can be tricked" problem is demonstrable, not hypothetical
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic's "Agentic Misalignment" work&lt;/strong&gt;: 16 frontier models stress-tested in simulated corporate settings; many resorted to &lt;strong&gt;blackmail to avoid shutdown&lt;/strong&gt; (79–96% in some scenarios).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI × Apollo Research&lt;/strong&gt;: naively training away "scheming" sometimes just taught models to &lt;strong&gt;hide it better&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coding agents&lt;/strong&gt; were tricked into running malicious commands in &lt;strong&gt;up to 84%&lt;/strong&gt; of attempts in the cited research.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caveat the report shares: these are lab/simulated findings, not proof of rogue AI in the wild. But the failure modes are real and reproducible — which is the whole point.&lt;/p&gt;

&lt;h3&gt;
  
  
  The AI feedback loop is already here
&lt;/h3&gt;

&lt;p&gt;The report notes developers reportedly using AI to write &lt;strong&gt;~75% of new code&lt;/strong&gt; at some shops. Pair that with agents that budget their own tokens and spawn other agents, and you get a system that helps build the next version of itself. The uncomfortable implication isn't sci-fi takeoff — it's mundane: &lt;strong&gt;oversight is a human-speed process bolted onto a machine-speed loop&lt;/strong&gt;, and the report's core "evidence dilemma" is just that mismatch stated formally.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key numbers at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;US share of top-500 AI compute&lt;/td&gt;
&lt;td&gt;75% (China 15%, RoW 10%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notable models 2025&lt;/td&gt;
&lt;td&gt;US 59 / China 35 / RoW 13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notable models from private sector&lt;/td&gt;
&lt;td&gt;91%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly conversational-AI users&lt;/td&gt;
&lt;td&gt;1 billion+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software-task time horizon doubling&lt;/td&gt;
&lt;td&gt;every 4–7 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI-written code at some shops&lt;/td&gt;
&lt;td&gt;~75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding agents tricked into malicious cmds&lt;/td&gt;
&lt;td&gt;up to 84%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persuasiveness gain from post-training&lt;/td&gt;
&lt;td&gt;up to +51%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Early-career AI-exposed employment decline (US, 22–25)&lt;/td&gt;
&lt;td&gt;~13–16% relative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AlphaFold protein structures predicted&lt;/td&gt;
&lt;td&gt;200M+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(All 🟡 directional except where sourced to primary docs.)&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The state of the art, made concrete (mid-2026)
&lt;/h2&gt;

&lt;p&gt;The report describes capabilities in the abstract. Here's what they map onto if you're picking a model this week.&lt;/p&gt;

&lt;h3&gt;
  
  
  The frontier is a portfolio, not a winner
&lt;/h3&gt;

&lt;p&gt;There's no single "best" model anymore. &lt;strong&gt;Anthropic&lt;/strong&gt; (Claude Opus / the new Fable tier), &lt;strong&gt;OpenAI&lt;/strong&gt; (GPT-5.x), &lt;strong&gt;Google&lt;/strong&gt; (Gemini 3.x), and &lt;strong&gt;xAI&lt;/strong&gt; (Grok 4.x) trade the lead by task, with real open-weight pressure from &lt;strong&gt;DeepSeek&lt;/strong&gt;, &lt;strong&gt;Qwen&lt;/strong&gt;, and &lt;strong&gt;Llama&lt;/strong&gt;. Top general-intelligence scores now cluster within a few points of each other.&lt;/p&gt;

&lt;p&gt;The practical consequence: &lt;strong&gt;the interesting engineering decision has moved down the stack.&lt;/strong&gt; When the models are near-interchangeable on raw capability, your leverage isn't "which model" — it's routing, evaluation, and orchestration around them. Hard-coding your architecture to one vendor's quirks is a bet against a market that keeps converging.&lt;/p&gt;

&lt;h3&gt;
  
  
  Everyone ships a tiered family
&lt;/h3&gt;

&lt;p&gt;Flagship for hard reasoning/agentic work → balanced mid-tier for most traffic → fast/cheap tier for high-volume simple tasks. And &lt;strong&gt;1M-token context is now the frontier norm&lt;/strong&gt;, up from the 128K–200K of 2024.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benchmarks: which ones still discriminate
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Measures&lt;/th&gt;
&lt;th&gt;Rough SOTA (mid-2026) 🟡&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SWE-bench Verified&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real GitHub bug-fix / agent tasks&lt;/td&gt;
&lt;td&gt;~88–95%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPQA Diamond&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graduate-level science reasoning&lt;/td&gt;
&lt;td&gt;~94%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Humanity's Last Exam&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frontier expert knowledge&lt;/td&gt;
&lt;td&gt;~64% (up from single digits in 2024)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FrontierMath&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Research-grade math&lt;/td&gt;
&lt;td&gt;~0.45–0.48 — still hard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;METR time horizon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Length of autonomous agent task&lt;/td&gt;
&lt;td&gt;16+ hrs, doubling every 4–7 mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ARC-AGI v2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Abstract fluid reasoning&lt;/td&gt;
&lt;td&gt;still low — the unsaturated frontier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern: knowledge tests are &lt;strong&gt;saturating&lt;/strong&gt; (clustering near ceiling), while &lt;strong&gt;agentic and fluid-reasoning&lt;/strong&gt; tests stay hard. That's why the field is shifting to dynamic, execution-based evaluation — the same shift the report calls for in its measurement section.&lt;/p&gt;

&lt;h3&gt;
  
  
  Orchestration is the real 2026 story
&lt;/h3&gt;

&lt;p&gt;This is the part that maps cleanest onto our day jobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; has become the de-facto standard for wiring models to tools and data — the "USB-C of AI agents."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordinator → sub-agent&lt;/strong&gt; patterns are now standard for parallel or long-horizon work: spin up a cheap model (Haiku-tier) for a sub-task, keep the main loop on the flagship, use tool-search so adding tools doesn't blow your prompt cache.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human oversight remains immature&lt;/strong&gt; — there's still no measurable requirement for intervention, reversibility, and accountability as agents start orchestrating other agents. That's the exact gap the report flags.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A practitioner's reality check
&lt;/h3&gt;

&lt;p&gt;The report's own caution — &lt;em&gt;benchmark scores ≠ real-world utility&lt;/em&gt; — is echoed nicely by developer YouTuber &lt;strong&gt;Theo Browne (t3.gg)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;"Anthropic builds slot machines, OpenAI ships workhorses."&lt;/em&gt; His framing of the coding-agent divide: impressive token-burning flash vs. workmanlike agents.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"Your AI prompts are technical debt."&lt;/em&gt; His thesis that bespoke prompt engineering is a liability, and most engineers should lean on minimally-configured, third-party-maintained tooling instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't have to agree — but "judge models on cost/token-efficiency and real productivity, not leaderboard rank" is the report's message from the trenches.&lt;/p&gt;




&lt;h2&gt;
  
  
  The upside is the same curve, not a different one
&lt;/h2&gt;

&lt;p&gt;It'd be easy to read all this as doom. The report doesn't, and neither should you — but the honest version is subtler than "AI good, actually."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AlphaFold&lt;/strong&gt; is the flagship example: predicted structures for &lt;strong&gt;200M+ proteins&lt;/strong&gt; (≈ all sequenced proteins), used by &lt;strong&gt;3M+ researchers in 190+ countries&lt;/strong&gt;, and cemented by the &lt;strong&gt;2024 Nobel Prize in Chemistry&lt;/strong&gt;. The point isn't just "look, an upside." It's that the &lt;em&gt;same&lt;/em&gt; capability curve — long-horizon reasoning over huge search spaces — is what makes AlphaFold possible and what makes an autonomous coding agent hard to supervise. You don't get one without the other. That's why the report keeps returning to &lt;em&gt;deployment choices&lt;/em&gt; rather than the technology itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  So what should a developer take from this?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Treat benchmarks as directional, not decisive.&lt;/strong&gt; Saturation and evaluation-awareness are real. Test on &lt;em&gt;your&lt;/em&gt; workload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you're building agents, build the oversight in.&lt;/strong&gt; The "human-in-the-loop for judgment and escalation" pattern isn't compliance theater — it's the difference between the companies that scaled AI ops and the ones (Klarna, Duolingo) that had to walk "AI-first" back to "AI-first, not AI-only."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn the orchestration layer.&lt;/strong&gt; MCP, sub-agent economics, prompt caching, and tool-search are where the leverage is in 2026 — more than any single model choice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The concentration is structural.&lt;/strong&gt; A handful of labs and a physical chip chokepoint (NVIDIA → TSMC → ASML) sit under everything you deploy. Worth knowing what your stack actually rests on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The report's bottom line, and mine: capabilities are accelerating, mistakes aren't always reversible, and the benefits are real but &lt;em&gt;conditional on the choices we make&lt;/em&gt; — including the ones we make as the people actually shipping this stuff.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;The whole report reduces to one gap you already feel in your work: &lt;strong&gt;what a model scores vs. what it actually does.&lt;/strong&gt; I'd rather hear your version of it than restate mine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When has a leaderboard-topping model fallen apart on your real codebase — and what was the tell &lt;em&gt;before&lt;/em&gt; it did?&lt;/li&gt;
&lt;li&gt;For those shipping agents: where's the line where more human-in-the-loop stops buying you safety and starts buying you theater?&lt;/li&gt;
&lt;li&gt;If model capability really is converging, where do you think the durable engineering advantage actually lives — routing, evals, tooling, data?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Curious where the people actually shipping this land.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is a developer's digest of the UN Preliminary Report (July 2026) cross-checked against independent web sources. It is a study aid, not an official UN product, and not investment advice. Benchmark figures and valuations are directional and move monthly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Primary sources worth your time:&lt;/strong&gt; &lt;a href="https://www.un.org/independent-international-scientific-panel-ai/en/preliminary-report" rel="noopener noreferrer"&gt;The Preliminary Report itself&lt;/a&gt; · &lt;a href="https://docs.un.org/en/A/RES/79/325" rel="noopener noreferrer"&gt;UNGA Resolution 79/325&lt;/a&gt; · &lt;a href="https://www.un.org/independent-international-scientific-panel-ai/en" rel="noopener noreferrer"&gt;The Panel's home page&lt;/a&gt; · &lt;a href="https://metr.org/blog/2025-03-19-measuring-ai-ability-to-complete-long-tasks/" rel="noopener noreferrer"&gt;METR time horizons&lt;/a&gt; · &lt;a href="https://arxiv.org/pdf/2510.05179" rel="noopener noreferrer"&gt;Anthropic — Agentic Misalignment&lt;/a&gt; · &lt;a href="https://deepmind.google/blog/alphafold-five-years-of-impact/" rel="noopener noreferrer"&gt;DeepMind — AlphaFold: Five Years of Impact&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>webdev</category>
      <category>news</category>
    </item>
    <item>
      <title>Living in Innopolis: notes from a Bolivian in Russia's IT city</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:32:26 +0000</pubDate>
      <link>https://dev.to/krlz/living-in-innopolis-notes-from-a-bolivian-in-russias-it-city-k1g</link>
      <guid>https://dev.to/krlz/living-in-innopolis-notes-from-a-bolivian-in-russias-it-city-k1g</guid>
      <description>&lt;p&gt;&lt;em&gt;A brief share of my experience living in Innopolis, a new city in Russia focused on people from IT careers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I'm from Bolivia, and I lived in Russia for five years. I came for a master's program at Innopolis, a new city that was making some real efforts to provide the right conditions for people in IT to study and, hopefully, stay to work at one of the companies that set up shop in the Innopolis technopark.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F83m2qrgp99lp0r9dnvr7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F83m2qrgp99lp0r9dnvr7.png" alt="The Innopolis University campus" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I won't lie: the conditions in this city are not bad, especially considering it was built from scratch in the middle of some land in Tatarstan. But for that same reason, it can sometimes lack things to do, or at least activities where you interact with other people outside of work or going to the bar.&lt;/p&gt;

&lt;h2&gt;
  
  
  A city built from scratch
&lt;/h2&gt;

&lt;p&gt;The name says it all: &lt;strong&gt;Inno&lt;/strong&gt;polis, from &lt;em&gt;innovation&lt;/em&gt; + the Greek &lt;em&gt;polis&lt;/em&gt;, "city." The idea took shape around 2010, when Tatarstan's leadership floated the concept of an "IT village" modeled on hubs like Silicon Valley. The foundation stone was laid on &lt;strong&gt;June 9, 2012&lt;/strong&gt;, in a ceremony led by then Russian Prime Minister Dmitry Medvedev alongside Tatarstan's president, Rustam Minnikhanov, who buried a time capsule with a message for future residents. The city got its town status in December 2014 and was officially opened on &lt;strong&gt;June 9, 2015&lt;/strong&gt; — which makes it, still today, one of the youngest cities in Russia.&lt;/p&gt;

&lt;p&gt;It sits about 40 km from Kazan, the Tatarstan capital, up on windswept hills above the Sviyaga River. The master plan was drawn up by the Singaporean architect &lt;strong&gt;Liu Thai Ker&lt;/strong&gt; (sometimes written Louis Tai Ker), the same planner behind a lot of modern Singapore, which is why the whole place feels so deliberate — wide boulevards, everything within a two-minute walk, buildings that honestly look a bit like spaceships.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2zvb07s8c92x0l0wfvh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2zvb07s8c92x0l0wfvh.png" alt="Innopolis's deliberate, spacious master plan" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the part nobody tells you at first: the plan was for 50,000 people, eventually up to 150,000. The reality, ten years in, is far more modest. Depending on how you count, somewhere around 7,800 people are in the city on a given day, with roughly 5,000 living here permanently and the rest commuting in from Kazan. The average age is about 31, and roughly a third of residents are IT specialists or researchers. So when I say the city can feel empty, I'm not exaggerating for effect — the numbers back it up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who actually runs the place
&lt;/h2&gt;

&lt;p&gt;For a city this small, the mayor's office has seen a surprising amount of turnover, and I found the lineage kind of fun to trace:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjlbziaaenwwg9ooet0g6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjlbziaaenwwg9ooet0g6.png" alt=" " width="500" height="500"&gt;&lt;/a&gt;&lt;br&gt;
Ruslan Shagaleev - Innopolis &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Egor Ivanov&lt;/strong&gt; — the first mayor ("mayor 1.0"), chosen at the end of 2014. He came from the telecom world, previously running the company Scartel/Yota.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ruslan Shagaleev&lt;/strong&gt; — "mayor 2.0," from 2016. He ran the city for about eight years, which is basically its entire lived-in existence, and became the public face of Innopolis. He stepped down in June 2024 and moved on to a city-manager role at Skolkovo, Russia's other big tech hub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dmitry Vandyukov&lt;/strong&gt; — "mayor 3.0," from June 2024. He'd come up through the Special Economic Zone, handling relations with government bodies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And here's the freshest twist: at the end of 2025, Vandyukov was tapped to run &lt;strong&gt;Innopolis University&lt;/strong&gt; itself, and &lt;strong&gt;Ildar Khuzzyatov&lt;/strong&gt;, the head of the city's executive committee, took over as acting mayor pending new elections. So if you visit and the "who's the mayor" answer feels blurry, that's because it genuinely is in flux right now.&lt;/p&gt;

&lt;p&gt;One thing worth knowing about how the city is governed: a lot of it runs through Telegram. There's a city chat where residents, the chief architect, ministers, and the mayor all sit together, and real decisions — bus schedules, bike parking — have actually come out of it. It's a small enough place that this works.&lt;/p&gt;
&lt;h2&gt;
  
  
  The university at the center
&lt;/h2&gt;

&lt;p&gt;Everything here orbits &lt;strong&gt;Innopolis University&lt;/strong&gt;, established in December 2012, with its first bachelor's cohort in 2014. In the early years it leaned heavily on Western partners — the founding academic model was built together with &lt;strong&gt;Carnegie Mellon University&lt;/strong&gt; in Pittsburgh and the National University of Singapore, and the whole point was that you could get a CMU-caliber IT education without leaving Tatarstan. Courses are taught in English, faculty were recruited internationally (at one point people like software-engineering figure Bertrand Meyer, from ETH Zurich, were on staff), and scholarships covering tuition and accommodation are a big part of how they attract students from across Russia and abroad. The current rector is &lt;strong&gt;Alexander Gasnikov&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That international framing is exactly what pulled me — and a lot of the foreigners I studied with — here in the first place.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I actually got in
&lt;/h2&gt;

&lt;p&gt;I should back up and explain how a junior analyst from Bolivia ended up with a spot here at all, because it wasn't an obvious path.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8b1mg1wt4nde06cytscr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8b1mg1wt4nde06cytscr.png" alt=" " width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back home, the selection ran through &lt;strong&gt;ALAR&lt;/strong&gt; (the Asociación Latinoamericano-Rusa), an organization that connects Latin American students with Russian universities. The process was short but real: an English test, and then an interview with &lt;strong&gt;Dr. Alberto Sillitti&lt;/strong&gt;, an Italian full professor from Innopolis's computer science faculty, who sat me down and asked me questions about software engineering. I didn't think much of it at the moment, but Sillitti was one of the people who taught the software-process side of the program — so that interview was, in a way, my first lecture before I'd even been admitted. At the time I was working at &lt;strong&gt;Cofar&lt;/strong&gt; as an analyst — very much in my early, green junior days — so I was answering those questions half from what I'd studied and half from the little I'd managed to pick up on the job.&lt;/p&gt;

&lt;p&gt;It worked out. On &lt;strong&gt;July 12, 2017&lt;/strong&gt;, ALAR sent the official word that seven of us from the region had won &lt;strong&gt;100% scholarships&lt;/strong&gt; to Innopolis University. I still have that letter. Seeing my name on that list is one of those small documents you hold onto — it's the piece of paper that turned "maybe I'll study abroad one day" into an actual plane ticket to Tatarstan.&lt;/p&gt;

&lt;p&gt;But getting the scholarship and actually arriving turned out to be two different things. I landed about &lt;strong&gt;two weeks into the semester&lt;/strong&gt; — I'd been stuck in Bolivia sorting out documents before I could travel — so I showed up already behind, exhausted, and jetlagged from a very long trip. My very first class, the next morning, was &lt;strong&gt;formal methods&lt;/strong&gt;. Walking into that lecture on almost no sleep, two weeks late, while the rest of the cohort had already found its footing, was about as humbling a way to begin as I could have picked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwscwwti0v52cppy8b1yb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwscwwti0v52cppy8b1yb.png" alt="Arriving two weeks late and jetlagged to my first formal methods class" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How the programs actually work
&lt;/h2&gt;

&lt;p&gt;The degree I did was the &lt;strong&gt;MSIT-SE&lt;/strong&gt; — Master of Science in Information Technology, Software Engineering — and it's worth being precise about what that actually is, because it surprised me too. It was built directly on &lt;strong&gt;Carnegie Mellon's&lt;/strong&gt; software engineering master's, taught in English by CMU-certified instructors, and it runs about a year across three semesters. Importantly, it is &lt;em&gt;not&lt;/em&gt; a "learn to code" program. It's aimed at turning already-experienced developers into architects, technical leads, and engineering managers.&lt;/p&gt;

&lt;p&gt;The structure had two clear halves. The &lt;strong&gt;first half&lt;/strong&gt; was the theory-heavy core: software engineering proper, &lt;strong&gt;formal methods&lt;/strong&gt;, and a lot of material centered on &lt;strong&gt;software processes&lt;/strong&gt;. Formal methods was taught by &lt;strong&gt;Néstor Cataño&lt;/strong&gt;, a Colombian professor whose work is all about automated reasoning and formal verification; with him we learned to specify and reason about systems rigorously using &lt;strong&gt;Event-B&lt;/strong&gt;, a formalism for modeling software mathematically &lt;em&gt;before&lt;/em&gt; a line of code ever gets written. The software-process material, meanwhile, was Sillitti's side of the house — the same professor who'd interviewed me back in Bolivia. The &lt;strong&gt;second half&lt;/strong&gt; shifted toward the management side — software development management and &lt;strong&gt;process maturity models&lt;/strong&gt;, the whole discipline of how an organization matures the way it builds software — and this is also where the &lt;strong&gt;elective courses&lt;/strong&gt; opened up.&lt;/p&gt;

&lt;p&gt;The electives were where it got fun for me. Several of them were taught not by career academics but by working engineers from the partner companies, and one of those was a reverse engineering course I'll get to in a second.&lt;/p&gt;

&lt;p&gt;Not everything that stuck with me was about code, though. One of the people who left the biggest impression was &lt;strong&gt;Angelo Messina&lt;/strong&gt; — Professor Emeritus at Innopolis and an Italian with a long career in defense software engineering, who these days works with the &lt;strong&gt;Defence &amp;amp; Security Software Engineers Association&lt;/strong&gt;. In one of our very last classes he set the technical material aside and talked about the role of information in wartime: how software, data, and the people who control them turn into strategic assets the moment the world becomes unstable. After a program built almost entirely around &lt;em&gt;building things&lt;/em&gt;, it was a sober, memorable note to end on — a reminder that the systems we were being trained to build never really exist in a vacuum.&lt;/p&gt;

&lt;p&gt;The whole program then culminates in an &lt;strong&gt;industrial project&lt;/strong&gt; with one of Innopolis's partner companies, where you take everything from both halves and point it at a real problem. That final project is the part I'd defend without hesitation — it's a much more honest loop between "what you learn" and "what you build" than I'd seen anywhere else.&lt;/p&gt;
&lt;h2&gt;
  
  
  My industrial project: disaster recovery with Acronis
&lt;/h2&gt;

&lt;p&gt;My project (2017–2018) was with &lt;strong&gt;Acronis&lt;/strong&gt;, and it ended up being the highlight of the whole degree.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe25hpmbdkn2fp2a13jvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe25hpmbdkn2fp2a13jvl.png" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First, a word on why Acronis was even there. The company was founded by Serguei Beloussov — these days he goes by Serg Bell — a Soviet-born, Singapore-based entrepreneur whose companies (SWsoft, Parallels, Acronis) carved out a serious niche empire in virtualization and data protection. Acronis specializes in backup and disaster recovery, and Beloussov happened to be one of the people who actively backed Innopolis and even sat on its advisory board. So the company didn't just sponsor a project from a distance; it embedded itself in the university, and as students we got full access to the Acronis facilities right there in Innopolis.&lt;/p&gt;

&lt;p&gt;Our team of Innopolis peers dug into &lt;strong&gt;disaster recovery&lt;/strong&gt; and a concept the company was pushing at the time called &lt;em&gt;data resilience&lt;/em&gt; — essentially, how do you keep systems and data alive and recoverable when something goes catastrophically wrong, and how do you get a machine back on its feet as fast as possible after a failure? We spent a lot of time testing different recovery approaches on virtual machines, and a big chunk of the work went into the &lt;strong&gt;Volume Shadow Copy Service (VSS)&lt;/strong&gt; in Windows, probing whether its snapshotting could be leaned on as a serious disaster-recovery mechanism.&lt;/p&gt;

&lt;p&gt;This is where it got genuinely hands-on. To understand how these systems behaved under the hood, we worked with the &lt;strong&gt;IDA disassembler&lt;/strong&gt;, pulling binaries and applications apart to see what they were really doing at a level the documentation never tells you. And to prepare us for that, Acronis ran electives on the &lt;strong&gt;Windows kernel, drivers, and reverse engineering&lt;/strong&gt; — taught by &lt;strong&gt;Alexey Kostyushko&lt;/strong&gt;, the lead developer of Acronis's kernel team and, on several projects, a product owner for the students too. Learning this from someone who ships production kernel code, instead of from a textbook, is exactly the thing Innopolis gets right.&lt;/p&gt;

&lt;p&gt;One point from those classes stuck with me. Our professor was emphatic that reverse engineering, done for study and research, is a fully legal practice — not some grey-market hacker skill. And he was basically right: in most jurisdictions it's the &lt;em&gt;purpose&lt;/em&gt; that decides. Europe's Software Directive (which Russia also adopted) and the equivalent carve-outs in US law protect reverse engineering for learning, security research, and interoperability; what they forbid is using it to pirate software or strip out copy protection. Coming from a place where the term sounds vaguely illicit, it was clarifying to hear it framed — correctly — as a legitimate engineering discipline.&lt;/p&gt;

&lt;p&gt;We wrote up our findings in a paper for the university, and then came the part I still tell people about: we took it to &lt;strong&gt;Acronis's Moscow office&lt;/strong&gt; and presented it to &lt;strong&gt;Nikolay Grebennikov&lt;/strong&gt;, a senior R&amp;amp;D leader there who had come from Kaspersky Lab, where he'd run research and development. It landed really well. Standing in a Moscow office presenting kernel-level disaster-recovery research to someone with a wall of patents to his name — as a Bolivian who hadn't been in Russia all that long — was one of those moments that made the whole strange bet of moving to Innopolis feel completely worth it.&lt;/p&gt;
&lt;h2&gt;
  
  
  The language thing nobody warns you about
&lt;/h2&gt;

&lt;p&gt;As a foreigner with almost no Russian, coming to Innopolis can be frustrating in a very specific way. The place was sold to many of us as somewhere you could get by in English — and among my classmates, that was completely true. They all had an excellent education and were fluent enough to socialize with me and the other foreigners at any time.&lt;/p&gt;

&lt;p&gt;The problem is everyone else. I'm talking about the people who run the services that make a city a city: restaurants, the cinema, supermarkets, the bar, housing utilities, plumbers. Eventually you realize that if you actually want to get close to what this society has to offer, you'll have to learn the language. The English-only bubble is real, but it's thin, and it mostly covers the university, not the plumbing.&lt;/p&gt;
&lt;h2&gt;
  
  
  The good and the bad, for students especially
&lt;/h2&gt;

&lt;p&gt;Since I mostly know this place through student eyes, let me try to be fair and put both sides down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The good:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The economics are hard to argue with. Scholarships can cover tuition &lt;em&gt;and&lt;/em&gt; housing, and even paid rent here is cheap — an apartment that costs a certain amount in Innopolis would run you 50% more in Kazan and several times more in Moscow.&lt;/li&gt;
&lt;li&gt;It's safe, quiet, and frictionless. Everything is a short walk away, there's genuinely nothing to distract you from studying, and the city runs Yandex self-driving taxis and delivery robots as everyday services, not gimmicks.&lt;/li&gt;
&lt;li&gt;The industry pipeline is real. The Special Economic Zone gives big tax breaks, so companies from Yandex to the fintech arm of Sberbank keep offices in the technopark, and students often flow straight into them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The bad:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The isolation is the flip side of the "nothing to distract you." The same emptiness that's great for concentration is rough for a social life. Even Russians who speak the language natively tend to leave eventually, simply because there isn't enough going on, and they move to other cities.&lt;/li&gt;
&lt;li&gt;Brain drain hangs over the whole project. The former mayor himself cited a study finding that a majority of Russian IT specialists had considered leaving the country. Building a beautiful campus is one thing; convincing talented, mobile young people to stay is another, and it's a fight the city openly admits it's in.&lt;/li&gt;
&lt;li&gt;There's a quieter democratic wrinkle too: because most people here rent, they aren't counted as permanent residents and can't vote in local elections. At one point that meant only a few hundred people out of thousands could actually cast a ballot. It doesn't come up day to day, but it tells you something about who the city is really designed for.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fi6j5tmnjvjm847o9g4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fi6j5tmnjvjm847o9g4.png" alt="The quiet, walkable — and often empty — streets of Innopolis" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  People I knew were already leaving
&lt;/h2&gt;

&lt;p&gt;The brain-drain part wasn't an abstraction to me. Two of the people I knew in Innopolis were &lt;strong&gt;Stas and Sasha Litvinov&lt;/strong&gt; — Stas was a teaching assistant and advisor during my classes, and he'd been part of the place since before the city officially existed, including a stint in Pittsburgh on the university's joint program with Carnegie Mellon. In 2021 a Rest of World reporter profiled them, and the piece captured something I saw up close: a couple who genuinely loved their tidy, first-world little town, praised how responsive the local government was, adored the fields and river around it — and were still quietly preparing to leave the country.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://restofworld.org/2021/fighting-brain-drain-and-creeping-authoritarianism-in-russia/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frestofworld.org%2Fwp-content%2Fuploads%2F2021%2F04%2FED_Russia-Innopolis-25-1600x900.jpg" height="450" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://restofworld.org/2021/fighting-brain-drain-and-creeping-authoritarianism-in-russia/" rel="noopener noreferrer" class="c-link"&gt;
            Fighting brain drain and creeping authoritarianism in Russia’s techno-utopian village - Rest of World
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Facing a dire shortage of qualified tech workers, companies and the Kremlin are vying to win the hearts and minds of Russia’s entrepreneurs and engineers.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frestofworld.org%2Fwp-content%2Fthemes%2Forbis%2Fstatic-assets%2Fmedia%2Ffavicon-32.png" width="32" height="32"&gt;
          restofworld.org
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Their reasons had to do with Russia's broader political direction rather than anything about the city itself, and I'll keep this part factual and let the reporting speak for the specifics: by the time I knew them, they were, in that telling, getting their pets documented so the whole family could go at a moment's notice. Whatever anyone makes of the politics, the human pattern is what stuck with me. Innopolis can build the taxis and the towers and the tax breaks, but the people it most wants to keep are exactly the ones with the skills — and therefore the options — to leave. I watched good people quietly run that calculation in real time. Eventually, in my own way and for my own reasons, I ran it too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Staying to work: my years at Portavita
&lt;/h2&gt;

&lt;p&gt;Here's the bet the whole city is built on: that graduates won't just study here, they'll &lt;em&gt;stay&lt;/em&gt; and work. For a long stretch, I was exactly the person that bet was designed to catch.&lt;/p&gt;

&lt;p&gt;Part of that wasn't even optional — the scholarship came with a contract, and graduates were expected to work for a company in Russia for at least a year after finishing. But the way I actually landed my job was almost gentle: the university runs job fairs where companies come and pitch opportunities directly to students, and that's where I found &lt;strong&gt;Portavita&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Portavita was a Dutch eHealth company, founded in Amsterdam in 2002, and a genuine pioneer — it was the first IT supplier in the Netherlands to let large numbers of patients access their own medical records online. Its specialty was anticoagulation care (managing blood-thinning treatment), and it ran a development operation out of Innopolis, which is the unlikely reason a Dutch healthcare company ended up hiring a Bolivian in Tatarstan. I joined as a developer in 2018 and — the one-year contract obligation long behind me — stayed until 2024. I have zero regrets about that. It was the best professional experience I could have asked for, and it overlapped with the years when the rest of my life fell into place. It was during this stretch that I met my wife — on Tinder, as it happens. You meet plenty of strange people on that app, but we clicked instantly over a shared and slightly terrible sense of humor, trading memes and jokes until it was obvious how much of life we saw the same way. She was a local, and she gave me something the university bubble never could: &lt;strong&gt;Kazan&lt;/strong&gt;, seen through a resident's eyes. I'd been taking the odd weekend trip there already, but with her it opened up properly — concerts, karaoke, restaurants, the Riviera pool complex, the big Ferris wheel. That, more than anything, was the real answer to Innopolis's quietness: the life you couldn't find up on the hill, you went and found forty minutes away.&lt;/p&gt;

&lt;p&gt;Fittingly for this story, she had her own exit planned — a move to Saint Petersburg, chasing bigger opportunities — right around when we met. We moved in together instead, and started planning a shared move to a livelier Russian city down the line. (One small perk worth mentioning, because it says something about how the place operates: the company paid the rent on my first flat in Innopolis.)&lt;/p&gt;

&lt;p&gt;The work was substantial. I led the &lt;strong&gt;Patient Assistant&lt;/strong&gt; service, which supported patients on anticoagulation treatment across Dutch healthcare institutions; it launched in 2018 and grew to process thousands of patient records a month. We eventually split it into three microservices handling data processing, enrichment, and delivery through &lt;strong&gt;FHIR-compliant REST APIs&lt;/strong&gt; (FHIR being the international standard for exchanging health data). Later I worked on the &lt;strong&gt;DVZA services platform&lt;/strong&gt; (2020–2024), which processed &lt;em&gt;millions&lt;/em&gt; of patient records while staying compliant with &lt;strong&gt;MedMij&lt;/strong&gt; — the Dutch national standard for patient health-data exchange — and FHIR. Under the hood it was a proper backend playground: &lt;strong&gt;Scala and Akka&lt;/strong&gt; (including Akka HTTP), Slick over &lt;strong&gt;PostgreSQL with Citus&lt;/strong&gt;, and &lt;strong&gt;Kafka / Kafka Streams&lt;/strong&gt; for messaging, with React on the front end.&lt;/p&gt;

&lt;p&gt;And then the ground shifted. Portavita had been acquired in 2021 by &lt;strong&gt;CompuGroup Medical (CGM)&lt;/strong&gt;, a large German healthcare-software group. Then came 2022, and after the invasion of Ukraine a wave of European companies withdrew from Russia. Portavita's Russian operation tried to hang on — at one point by re-registering as a Russian company — but the funding, which leaned heavily on the health ministry, wasn't going to keep flowing. The writing slowly appeared on the wall. I left Russia in &lt;strong&gt;October 2023&lt;/strong&gt;, and in &lt;strong&gt;2024&lt;/strong&gt; I moved to &lt;strong&gt;Santiago, Chile&lt;/strong&gt;, where I'm writing this from now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;The idea of building a city around an industry, in a specific region, isn't new. What makes Innopolis interesting is watching it happen in real time, with all the seams showing — the ambition of the master plan next to the reality of a few thousand residents, the English-speaking university next to the Russian-only supermarket, the self-driving taxis next to the fact that a lot of people eventually leave.&lt;/p&gt;

&lt;p&gt;I know that last part firsthand, because I became one of them. I stayed far longer than the contract ever required — six years in the country, a career I was proud of, a wife I met along the way — and in the end I still left, in late 2023, and started over in Santiago. That's not a knock on the place. If you're a self-directed person who wants a serious, low-cost, low-distraction environment to study IT and break into industry, the Innopolis I knew delivered exactly that. But it existed in a specific window of time, before 2022 rearranged what working in Russia means for a lot of foreigners, and I can really only speak to the version I lived in.&lt;/p&gt;

&lt;p&gt;So, no tidy verdict. Innopolis gave me an education, a profession, and the person I built a life with. It's also a small, sometimes lonely experiment on a windswept hill in Tatarstan that many people pass through rather than settle into. Both of those things are true at once, and I'm genuinely glad I got to find that out for myself.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you've studied or worked somewhere built around a single industry — a company town, a tech hub, a university city — I'd love to hear how your experience compared. Drop a comment below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>life</category>
      <category>russia</category>
      <category>tech</category>
      <category>career</category>
    </item>
    <item>
      <title>AI Made Code Free. So Why Are the Giants Still Winning? (And where solo devs actually beat them)</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Wed, 01 Jul 2026 21:51:10 +0000</pubDate>
      <link>https://dev.to/krlz/ai-made-code-free-so-why-are-the-giants-still-winning-and-where-solo-devs-actually-beat-them-5h27</link>
      <guid>https://dev.to/krlz/ai-made-code-free-so-why-are-the-giants-still-winning-and-where-solo-devs-actually-beat-them-5h27</guid>
      <description>&lt;p&gt;Everyone keeps saying AI will let a solo developer take down the giants. And everyone keeps saying the giants will just absorb everything. &lt;strong&gt;Both takes are wrong&lt;/strong&gt;, and I spent a while reading the actual 2025 data to figure out why.&lt;/p&gt;

&lt;p&gt;I pulled from four of the biggest developer datasets of the year:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DORA 2025&lt;/strong&gt; &lt;em&gt;State of AI-Assisted Software Development&lt;/em&gt; (Google Cloud, ~4,867 respondents)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack Overflow 2025&lt;/strong&gt; Developer Survey (49,009 respondents)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Octoverse 2025&lt;/strong&gt; (behavioral data across 180M+ developers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JetBrains&lt;/strong&gt; State of the Developer Ecosystem 2025 (24,534 developers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the honest synthesis. It's more useful than either hype narrative.&lt;/p&gt;




&lt;h2&gt;
  
  
  The one-sentence thesis
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;AI collapsed the cost of &lt;strong&gt;writing&lt;/strong&gt; software to near zero. It did &lt;strong&gt;not&lt;/strong&gt; collapse the cost of distribution, trust, support, or being liable when it breaks — and those are ~80% of what a software business actually is.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the effect isn't "solos beat giants." The effect is that &lt;strong&gt;the middle got hollowed out&lt;/strong&gt;. The 10-person, VC-funded, me-too startup building a feature is the loser of this era — squeezed from below by a solo who ships the same thing for free, and from above by a giant who bundles it. Solos and giants both survive. The undifferentiated middle doesn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  "AI is an amplifier, not an equalizer"
&lt;/h2&gt;

&lt;p&gt;This is the single most important finding of 2025, and it comes straight from DORA:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"AI's primary role in software development is that of an amplifier. It magnifies the strengths of high-performing organizations and the dysfunctions of struggling ones."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read quickly, that &lt;strong&gt;kills&lt;/strong&gt; the "AI levels the playing field" fantasy. AI rewards whoever already has good practices — not whoever is scrappiest.&lt;/p&gt;

&lt;p&gt;But read one layer deeper and it becomes the &lt;em&gt;best available argument&lt;/em&gt; for the small team. DORA found the key enabler is &lt;strong&gt;independence of action&lt;/strong&gt; — "the ability to develop, test, and deploy value independently, with little or no coordination cost." In an Adidas pilot they cite, teams in loosely-coupled architectures saw &lt;strong&gt;20–30% productivity gains&lt;/strong&gt;; teams tightly coupled to legacy ERP saw &lt;em&gt;little or no AI benefit at all&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Who has maximum independence and zero coordination cost? &lt;strong&gt;A solo founder, by definition.&lt;/strong&gt; Who drowns in coordination overhead? A giant. So the amplifier finding, taken seriously, says: &lt;em&gt;AI most benefits whoever has the least organizational drag.&lt;/em&gt; The giant still wins on distribution, capital, and enterprise trust — but &lt;strong&gt;not&lt;/strong&gt; on per-engineer AI leverage. Their own bureaucracy taxes it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Everyone uses AI. Fewer and fewer trust it.
&lt;/h2&gt;

&lt;p&gt;Adoption is settled. Four sources, one tight band:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;AI adoption&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DORA&lt;/td&gt;
&lt;td&gt;90% use AI at work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JetBrains&lt;/td&gt;
&lt;td&gt;85% regularly use AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stack Overflow&lt;/td&gt;
&lt;td&gt;84% use or plan to (up from 76%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub (behavioral)&lt;/td&gt;
&lt;td&gt;~80% of &lt;em&gt;new&lt;/em&gt; devs use Copilot in week one&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;But here's the twist the hype cycle skips. &lt;strong&gt;Trust is going the opposite direction.&lt;/strong&gt; Stack Overflow 2025:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Favorability toward AI fell &lt;strong&gt;72% → 60%&lt;/strong&gt; year over year.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;46% now distrust&lt;/strong&gt; AI accuracy vs. only &lt;strong&gt;~33% who trust it&lt;/strong&gt; (distrust was 31% a year ago).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;66%&lt;/strong&gt; cite "AI solutions that are almost right, but not quite" as a top frustration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~45%&lt;/strong&gt; say debugging AI-generated code takes &lt;em&gt;more&lt;/em&gt; time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stack Overflow's own three-word summary — &lt;strong&gt;"willing but reluctant"&lt;/strong&gt; — is the truest description of the 2025 developer relationship with AI. Everyone uses it. Fewer believe it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Agentic coding is a frontier, not the norm (yet)
&lt;/h2&gt;

&lt;p&gt;If you live on Twitter you'd think everyone is running autonomous agents. The data says otherwise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DORA: &lt;strong&gt;61% "never"&lt;/strong&gt; use agent mode — the &lt;em&gt;least&lt;/em&gt;-adopted way to use AI.&lt;/li&gt;
&lt;li&gt;Stack Overflow: only &lt;strong&gt;~31%&lt;/strong&gt; currently use AI agents; &lt;strong&gt;38% don't plan to.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;JetBrains: 85% use AI, but &lt;strong&gt;only 44% have integrated it&lt;/strong&gt; into their workflow — &lt;em&gt;"AI use isn't systematized. Developers are just using it ad hoc."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And yet the frontier is exploding: GitHub logged &lt;strong&gt;1M+ pull requests&lt;/strong&gt; from its Copilot coding agent in just May–September 2025.&lt;/p&gt;

&lt;p&gt;So the "solo operating at team scale via agents" story is &lt;strong&gt;real but leading-edge&lt;/strong&gt;, not median. The good news for founders: the leading edge is exactly where competitive solo builders already live.&lt;/p&gt;




&lt;h2&gt;
  
  
  The unifying insight: usage ≠ results
&lt;/h2&gt;

&lt;p&gt;Put all four datasets together and one theme dominates:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI adoption is universal. Converting it into results is not. The differentiator is discipline and systematization — not access to the tool.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;DORA says it as "amplifier, not equalizer." JetBrains says it as "85% use it, 44% have integrated it." Stack Overflow says it as "66% fight almost-right output." Since &lt;em&gt;everyone&lt;/em&gt; now has the tool, &lt;strong&gt;the tool is not the edge.&lt;/strong&gt; The practices around it are — taste, review discipline, distribution, trust. That's the exact terrain where a solo-vs-giant outcome is actually decided.&lt;/p&gt;




&lt;h2&gt;
  
  
  The counter-hype stat you should tattoo somewhere
&lt;/h2&gt;

&lt;p&gt;DORA cites the now-famous &lt;strong&gt;METR study&lt;/strong&gt;: experienced open-source developers were &lt;strong&gt;measured 19% slower&lt;/strong&gt; with AI tools — while &lt;strong&gt;believing they were 20% faster&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you're a solo founder, you are the least-checked person in your own loop. Nobody's there to catch you shipping fast-&lt;em&gt;feeling&lt;/em&gt;, actually-slower work. Which is why, for a solo, &lt;strong&gt;tests and small batches aren't bureaucracy — they're the substitute for the code review you no longer have.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Clean architecture is now a &lt;em&gt;business&lt;/em&gt; decision
&lt;/h2&gt;

&lt;p&gt;Here's the part that surprised me most. AI makes architecture matter &lt;strong&gt;more&lt;/strong&gt;, not less:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI generates plausible code fast, so you accumulate unmaintainable "slop" faster. DORA found friction doesn't vanish — it &lt;em&gt;moves&lt;/em&gt;, "from manual grind to deciding and verifying... assessing code that looks remarkably similar to correct code."&lt;/li&gt;
&lt;li&gt;The single biggest risk to a solo AI business isn't competition — it's &lt;strong&gt;platform risk&lt;/strong&gt;. If your model calls sit behind a clean adapter interface, a provider price hike is a config change. If they're smeared through your codebase, it's an existential rewrite.&lt;/li&gt;
&lt;li&gt;DORA found frequent commits + easy rollback act as a "psychological safety net" that makes high-velocity AI work safe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a solo in 2026, &lt;strong&gt;boring, provider-agnostic, modular-monolith architecture is a survival tool.&lt;/strong&gt; Running microservices as a one-person team is cosplaying as Google and paying the ops tax for nothing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The map is shifting to the Global South
&lt;/h2&gt;

&lt;p&gt;The competitive geography is changing fast (GitHub Octoverse 2025):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub crossed &lt;strong&gt;180M+ developers&lt;/strong&gt;, adding ~36M in 2025 — "a new developer every second."&lt;/li&gt;
&lt;li&gt;Net-new devs by region: &lt;strong&gt;APAC +13M, Europe +6.3M, Africa &amp;amp; Middle East +3.4M, LATAM +3.2M.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;India&lt;/strong&gt; added 5.2M devs (14% of all new accounts), and &lt;strong&gt;already has the largest open-source contributor base in the world&lt;/strong&gt; — projected to pass the US in total developers around 2030.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brazil is #4 globally&lt;/strong&gt; (6.89M). India, Brazil, and Indonesia &lt;em&gt;more than quadrupled&lt;/em&gt; their dev counts in five years.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next decade's solo founders are disproportionately Indian, Brazilian, Indonesian, and African — not Californian. And that matters, because the strongest wedge against a US giant is &lt;strong&gt;"not-American, self-hostable, cheaper, localized, compliant with our law."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're building from Latin America (I am), the playbook writes itself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Cost base local, revenue base global.&lt;/strong&gt; Own the one thing US giants refuse to build — deep local compliance, payments, and language integration (electronic invoicing, local payment rails like Webpay/Flow/MercadoPago, real Spanish/Portuguese product sense). On a purchasing-power basis, a competent LATAM solo dev in 2026 is in a &lt;em&gt;better&lt;/em&gt; risk-adjusted position than a mid-level engineer at an SF startup.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Open source is bigger than ever — and more fragile than ever
&lt;/h2&gt;

&lt;p&gt;Both things are true at once (GitHub Octoverse):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;255,000 new open-source contributors in March 2025&lt;/strong&gt; — the largest single month on record. 1.128B contributions (+13% YoY).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4.3M AI-related repos&lt;/strong&gt;; generative-AI monthly contributions peaked at 6.28M in June 2025 (+188% YoY).&lt;/li&gt;
&lt;li&gt;But only &lt;strong&gt;~63% of public repos even have a README.&lt;/strong&gt; The maintenance layer is thinner than ever.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the licensing war (Elastic→OpenSearch, HashiCorp→OpenTofu, Redis→Valkey) settled on one pragmatic lesson: &lt;strong&gt;open source is a distribution and trust &lt;em&gt;tactic&lt;/em&gt;, not a business model.&lt;/strong&gt; Every solo OSS success — Plausible, Sidekiq, Ghost, PostHog, Supabase — monetizes hosting, a commercial tier, or a foundation. &lt;strong&gt;None sells the source.&lt;/strong&gt; Source-available/commercial licensing is respected now. You don't owe AWS a free gift.&lt;/p&gt;




&lt;h2&gt;
  
  
  The solo playbook for 2026
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Pick a niche too small for a giant to defend, big enough for one person to live on (a ~$1–5M/yr TAM: your career, their rounding error).&lt;/li&gt;
&lt;li&gt;Decide monetization &lt;em&gt;before&lt;/em&gt; you open the source. "Figure it out later" kills companies.&lt;/li&gt;
&lt;li&gt;Build in the open for trust; license to stay alive.&lt;/li&gt;
&lt;li&gt;Keep architecture provider-agnostic and boring. It's a business decision.&lt;/li&gt;
&lt;li&gt;Localize where giants won't — language, payments, compliance.&lt;/li&gt;
&lt;li&gt;Assume you'll be Sherlocked. If your only moat is the feature, the giant ships it next quarter. Build a &lt;em&gt;relationship&lt;/em&gt; moat they can't clone.&lt;/li&gt;
&lt;li&gt;Believe the measured results, not the feeling. (Remember the METR 19%.)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI made building nearly free; &lt;strong&gt;distribution, trust, and support are still expensive&lt;/strong&gt; — and that's where the contest actually happens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI is an amplifier, not an equalizer.&lt;/strong&gt; Its benefit is gated by independence of action — the axis where solos structurally beat giants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adoption is universal; trust is falling.&lt;/strong&gt; "Willing but reluctant."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic coding is frontier, not median&lt;/strong&gt; — but the frontier is where founders win.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean architecture is a survival tool&lt;/strong&gt;, because platform risk is the real killer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The builder base is going global&lt;/strong&gt; — and localization is the wedge giants won't touch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The giants own the pipes. But the pipes were never the interesting part. Taste, trust, community, and focus were — and those still don't come in an API.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: DORA 2025 State of AI-Assisted Software Development; Stack Overflow 2025 Developer Survey; GitHub Octoverse 2025; JetBrains State of the Developer Ecosystem 2025; METR "Impact of Early-2025 AI on Experienced Open-Source Developer Productivity." All figures are self-reported perceptions unless noted; DORA is explicitly observational, not causal. What's your read — is the middle really getting hollowed out? I'd love pushback in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Spec-Driven Development in 2026: What It Is, the Tooling, and How Teams Actually Use It</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Fri, 19 Jun 2026 15:20:48 +0000</pubDate>
      <link>https://dev.to/krlz/spec-driven-development-in-2026-what-it-is-the-tooling-and-how-teams-actually-use-it-2fk2</link>
      <guid>https://dev.to/krlz/spec-driven-development-in-2026-what-it-is-the-tooling-and-how-teams-actually-use-it-2fk2</guid>
      <description>&lt;p&gt;&lt;em&gt;A field guide to the practice that's reshaping how software gets built with AI agents.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — Spec-Driven Development (SDD) makes a &lt;strong&gt;precise, executable specification&lt;/strong&gt; the source of truth and treats code as a generated, verifiable artifact. The spec declares &lt;strong&gt;intent&lt;/strong&gt;; the code &lt;strong&gt;realizes&lt;/strong&gt; it. In 2026 it went mainstream because AI agents are great at writing code and terrible at guessing what you meant.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Jump to:&lt;/strong&gt; Why now · Specs vs. executable specs · Maturity model · Workflow · Tooling · EARS · Worked example · Caveats · Bottom line&lt;/p&gt;




&lt;h2&gt;
  
  
  Why now? The "vibe coding" backlash
&lt;/h2&gt;

&lt;p&gt;The movement defines itself against &lt;strong&gt;"vibe coding"&lt;/strong&gt; — the term Andrej Karpathy popularized in early 2025 for loosely prompting an AI and shipping whatever comes back. Vibe coding is great for throwaway prototypes and miserable for anything that has to be maintained.&lt;/p&gt;

&lt;p&gt;SDD is the disciplined counterweight: if AI writes most of the code, then the &lt;strong&gt;specification becomes the highest-leverage artifact a human produces&lt;/strong&gt;. The skill that matters shifts from &lt;em&gt;typing the implementation&lt;/em&gt; to &lt;em&gt;defining the intent precisely enough that a machine can't get it wrong.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Raw specs vs. executable specs
&lt;/h2&gt;

&lt;p&gt;This is the single most important distinction in the whole topic — and the one most "SDD explainers" skip.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Traditional design docs&lt;/th&gt;
&lt;th&gt;SDD specs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Read by&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Humans&lt;/td&gt;
&lt;td&gt;Humans &lt;strong&gt;and&lt;/strong&gt; agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enforcement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Advisory — devs may diverge&lt;/td&gt;
&lt;td&gt;Executable — tests fail on drift&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lifecycle&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Goes stale, becomes archaeology&lt;/td&gt;
&lt;td&gt;Living, continuously validated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lives in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A wiki nobody opens&lt;/td&gt;
&lt;td&gt;The repo + CI/CD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;"Traditional specs are read by humans, while SDD specs are executed as BDD scenarios, API contract tests, or model simulations."&lt;br&gt;
— Deepak Babu Piskala, &lt;em&gt;Spec-Driven Development: From Code to Contract in the Age of AI Coding Assistants&lt;/em&gt; (arXiv, Jan 2026)&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://arxiv.org/abs/2602.00180" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Farxiv.org%2Fstatic%2Fbrowse%2F0.3.4%2Fimages%2Farxiv-logo-fb.png" height="467" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://arxiv.org/abs/2602.00180" rel="noopener noreferrer" class="c-link"&gt;
            [2602.00180] Spec-Driven Development:From Code to Contract in the Age of AI Coding Assistants
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            The rise of AI coding assistants has reignited interest in an old idea: what if specifications-not code-were the primary artifact of software development? Spec-driven development (SDD) inverts the traditional workflow by treating specifications as the source of truth and code as a generated or verified secondary artifact. This paper provides practitioners with a comprehensive guide to SDD, covering its principles, workflow patterns, and supporting tools. We present three levels of specification rigor-spec-first, spec-anchored, and spec-as-source-with clear guidance on when each applies. Through analysis of tools ranging from Behavior-Driven Development frameworks to modern AI-assisted toolkits like GitHub Spec Kit, we demonstrate how the spec-first philosophy maps to real implementations. We present case studies from API development, enterprise systems, and embedded software, illustrating how different domains apply SDD. We conclude with a decision framework helping practitioners determine when SDD provides value and when simpler approaches suffice.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Farxiv.org%2Fstatic%2Fbrowse%2F0.3.4%2Fimages%2Ficons%2Ffavicon-32x32.png" width="32" height="32"&gt;
          arxiv.org
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  The maturity model: three levels
&lt;/h2&gt;

&lt;p&gt;Almost every serious 2026 source converges on the same ladder. Pick the rung you actually need — not the most aggressive one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spec-First&lt;/strong&gt; — Specs seed the initial generation, then code is allowed to drift. Good for AI-assisted features and prototypes. Low overhead, no long-term guarantees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spec-Anchored&lt;/strong&gt; — Specs and code evolve together as living documentation; automated tests enforce alignment. Piskala's paper calls this &lt;strong&gt;"the sweet spot for most production systems."&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spec-as-Source&lt;/strong&gt; — Humans edit &lt;strong&gt;only&lt;/strong&gt; the spec; code is fully generated and never hand-edited. Eliminates drift by design — but demands mature, trusted generation tooling. Still aspirational for most teams.
&lt;/li&gt;
&lt;/ol&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
  A["&amp;lt;b&amp;gt;Spec-First&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;specs seed generation,&amp;lt;br/&amp;gt;code is allowed to drift"]
  B["&amp;lt;b&amp;gt;Spec-Anchored&amp;lt;/b&amp;gt; 🎯&amp;lt;br/&amp;gt;specs + code evolve together,&amp;lt;br/&amp;gt;tests enforce alignment"]
  C["&amp;lt;b&amp;gt;Spec-as-Source&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;humans edit only specs,&amp;lt;br/&amp;gt;code is fully generated"]
  A --&amp;gt;|"add living tests&amp;lt;br/&amp;gt;+ CI enforcement"| B
  B --&amp;gt;|"trust generation,&amp;lt;br/&amp;gt;stop hand-editing code"| C
  style B fill:#dff3e4,stroke:#2ea44f,stroke-width:2px&lt;/code&gt;&lt;/pre&gt;



&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;strong&gt;Recommendation:&lt;/strong&gt; aim for &lt;strong&gt;spec-anchored&lt;/strong&gt;. Spec-as-source is where the hype lives; spec-anchored is where the value is today.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The canonical workflow
&lt;/h2&gt;

&lt;p&gt;Every major tool implements roughly the same pipeline, with a &lt;strong&gt;human review gate at each phase boundary&lt;/strong&gt; to stop drift before it compounds:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  C[constitution] --&amp;gt; S[specify] --&amp;gt; CL[clarify] --&amp;gt; P[plan] --&amp;gt; T[tasks] --&amp;gt; I[implement] --&amp;gt; A[analyze]&lt;/code&gt;&lt;/pre&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Constitution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Project-wide rules the agent must always obey (language, frameworks, testing, deps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Specify&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;What&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt;: user stories + acceptance criteria. No tech choices yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clarify&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The agent surfaces ambiguities &lt;strong&gt;before&lt;/strong&gt; any planning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;How&lt;/em&gt;: architecture, data models, technical decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tasks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Decompose the plan into atomic, independently-shippable items&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Implement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Execute tasks, verifying each against its acceptance criteria&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analyze&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-check spec ↔ plan ↔ tasks for consistency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Golden rule:&lt;/strong&gt; never skip from spec straight to code. Review the plan before task decomposition; review the tasks before implementation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The tooling landscape (2026)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Strengths&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Spec Kit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open-source, model-agnostic, the reference implementation&lt;/td&gt;
&lt;td&gt;Teams avoiding vendor lock-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Kiro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agentic IDE with automated guardrails ("hooks"), deep AWS integration&lt;/td&gt;
&lt;td&gt;AWS-native / serverless shops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code (cc-sdd)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native &lt;code&gt;/sdd:specify&lt;/code&gt;, &lt;code&gt;/sdd:plan&lt;/code&gt; slash commands, terminal-first&lt;/td&gt;
&lt;td&gt;Solo devs, CLI workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor (Plan Mode)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IDE-first, inline diff review, MCP support for Spec Kit&lt;/td&gt;
&lt;td&gt;Teams prioritizing UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenSpec&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lightweight, framework-agnostic, Markdown + YAML&lt;/td&gt;
&lt;td&gt;Indie devs, minimal tooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BMAD-METHOD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community methodology, constitution + multi-agent role-play&lt;/td&gt;
&lt;td&gt;Teams wanting a flexible framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tessl&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compliance-focused, audit trails, regulated templates&lt;/td&gt;
&lt;td&gt;Fintech, healthtech&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Antigravity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Agent-first," specification-constrained autonomy&lt;/td&gt;
&lt;td&gt;Teams exploring deep agent autonomy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The open-source reference everyone benchmarks against:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/github" rel="noopener noreferrer"&gt;
        github
      &lt;/a&gt; / &lt;a href="https://github.com/github/spec-kit" rel="noopener noreferrer"&gt;
        spec-kit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      💫 Toolkit to help you get started with SDD or any other process!
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/github/spec-kit/main/media/logo_large.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fspec-kit%2Fmain%2Fmedia%2Flogo_large.webp" alt="Spec Kit Logo" width="200" height="200" class="js-gh-image-fallback"&gt;&lt;/a&gt;
    &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌱 Spec Kit&lt;/h1&gt;
&lt;/div&gt;
    &lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;em&gt;Build with a spec, fix a bug, or assess an idea — with your coding agent.&lt;/em&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
    &lt;a href="https://github.com/github/spec-kit/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3b81e637a22ed4d802b654cf45baeab89612b7301fe60876634af117c496fa50/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f6769746875622f737065632d6b6974" alt="Latest Release"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/github/spec-kit/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/79f37a502abead3ac4b07bf851b94433d6b2f57d19e7eecd4a18900bee6c740b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6769746875622f737065632d6b69743f7374796c653d736f6369616c" alt="GitHub stars"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/github/spec-kit/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/de69478c402ec49440743f91e46921baae6e0a83279421a10890fbd6b16da67c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6769746875622f737065632d6b6974" alt="License"&gt;&lt;/a&gt;
    &lt;a href="https://github.github.io/spec-kit/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2ec2efdf26b99b1c38c6bcabe6224a90fcc4ca2102350935e18d4ac434b288af/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f63732d4769744875625f50616765732d626c7565" alt="Documentation"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;strong&gt;English&lt;/strong&gt; ·
    &lt;a href="https://github.com/github/spec-kit/./README.zh-CN.md" rel="noopener noreferrer"&gt;简体中文&lt;/a&gt; ·
    &lt;a href="https://github.com/github/spec-kit/./README.ja.md" rel="noopener noreferrer"&gt;日本語&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Spec Kit is an open source toolkit that gives AI coding agents structured
processes, reusable templates, and documented outcomes. Start with one of the
three processes below, customize it, or bring your own.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Choose your process&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you need&lt;/th&gt;
&lt;th&gt;Process&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build a feature or application&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/github/spec-kit#spec-driven-development" rel="noopener noreferrer"&gt;Spec-Driven Development&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A specification carried through planning, implementation, and convergence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diagnose and repair broken behavior&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/github/spec-kit#bug-fixing" rel="noopener noreferrer"&gt;Bug fixing&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;An assessed cause, scoped fix, and recorded verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decide whether an idea deserves investment&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/github/spec-kit#idea-assessment" rel="noopener noreferrer"&gt;Idea assessment&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;An evidence-backed go, clarify, or stop decision&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;These are &lt;strong&gt;independent entry points&lt;/strong&gt;, not three mandatory phases. SDD ships in
core; bug fixing and assessment are bundled extensions you install when needed.&lt;/p&gt;


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Get started&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;You need &lt;strong&gt;Python 3.11+&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://github.github.io/spec-kit/install/uv.html" rel="nofollow noopener noreferrer"&gt;uv&lt;/a&gt;&lt;/strong&gt;
and a supported AI coding agent…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/github/spec-kit" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;/p&gt;
  Supporting standards &amp;amp; frameworks that predate the AI wave but power SDD
  &lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BDD:&lt;/strong&gt; Cucumber, SpecFlow, Behave (Gherkin / Given-When-Then)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API contracts:&lt;/strong&gt; OpenAPI/Swagger, GraphQL SDL, Protocol Buffers, AsyncAPI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract testing:&lt;/strong&gt; Pact, Specmatic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model-based design:&lt;/strong&gt; Simulink, SCADE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are new. SDD's contribution is wiring them together as the &lt;em&gt;primary&lt;/em&gt; artifact an AI agent generates from — not the documentation you write afterward.&lt;br&gt;
&lt;/p&gt;

&lt;br&gt;
&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  30-second tool-selection rubric
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Already in &lt;strong&gt;Claude Code&lt;/strong&gt;? → Spec Kit + cc-sdd skills&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Cursor&lt;/strong&gt;? → Plan Mode + &lt;code&gt;AGENTS.md&lt;/code&gt; + Spec Kit via MCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS&lt;/strong&gt; shop? → Kiro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regulated&lt;/strong&gt; industry? → Tessl&lt;/li&gt;
&lt;li&gt;Want &lt;strong&gt;minimal&lt;/strong&gt; ceremony? → OpenSpec&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  EARS: how to write specs an LLM can't misread
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;EARS&lt;/strong&gt; (Easy Approach to Requirements Syntax) is the de facto standard for acceptance criteria that are unambiguous to humans &lt;em&gt;and&lt;/em&gt; models. Five patterns cover almost everything:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Template&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ubiquitous&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The system &lt;strong&gt;shall&lt;/strong&gt; …&lt;/td&gt;
&lt;td&gt;The system &lt;strong&gt;shall&lt;/strong&gt; log every auth attempt.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Event-driven&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;WHEN&lt;/strong&gt; … &lt;strong&gt;THE system SHALL&lt;/strong&gt; …&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;WHEN&lt;/strong&gt; a user submits the login form &lt;strong&gt;THE system SHALL&lt;/strong&gt; validate credentials.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;State-driven&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;WHILE&lt;/strong&gt; … &lt;strong&gt;THE system SHALL&lt;/strong&gt; …&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;WHILE&lt;/strong&gt; a sync is running &lt;strong&gt;THE system SHALL&lt;/strong&gt; show a progress indicator.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unwanted behavior&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;IF&lt;/strong&gt; … &lt;strong&gt;THEN&lt;/strong&gt; …&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;IF&lt;/strong&gt; validation fails 3× &lt;strong&gt;THEN&lt;/strong&gt; lock the account for 15 min.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Optional&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;WHERE&lt;/strong&gt; … &lt;strong&gt;THE system SHALL&lt;/strong&gt; …&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;WHERE&lt;/strong&gt; MFA is enabled &lt;strong&gt;THE system SHALL&lt;/strong&gt; require TOTP.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The payoff: criteria written this way map almost 1:1 onto test cases — which is exactly what makes the spec &lt;em&gt;executable&lt;/em&gt; rather than advisory.&lt;/p&gt;




&lt;h2&gt;
  
  
  A worked example: "magic-link login"
&lt;/h2&gt;

&lt;p&gt;Talk is cheap; here's a (trimmed) end-to-end slice so the artifacts are concrete.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  📄 spec.md (excerpt)
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Feature: Passwordless magic-link login&lt;/span&gt;

&lt;span class="gu"&gt;### Acceptance criteria (EARS)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; WHEN a user submits a valid email
  THE system SHALL send a one-time login link valid for 15 minutes.
&lt;span class="p"&gt;-&lt;/span&gt; IF a login link is used more than once
  THEN the system SHALL reject it with HTTP 410 Gone.
&lt;span class="p"&gt;-&lt;/span&gt; WHERE the email is not associated with an account
  THE system SHALL still return HTTP 202 (no account enumeration).
&lt;span class="p"&gt;-&lt;/span&gt; THE system SHALL store link tokens hashed, never in plaintext.

&lt;span class="gu"&gt;### Out of scope&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Social login, SSO, password fallback.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  🏗️ plan.md (excerpt)
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Stack&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Node 22 + Fastify, Postgres 16, Redis for token TTL.

&lt;span class="gu"&gt;## Data model&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; magic_tokens(id, user_id, token_hash, expires_at, consumed_at)

&lt;span class="gu"&gt;## Decisions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Tokens = 32 bytes CSPRNG, stored as SHA-256 hash.
&lt;span class="p"&gt;-&lt;/span&gt; 202-for-unknown-email enforced at the controller layer.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  ✅ tasks.md (excerpt)
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; [ ] T1  migration: magic_tokens table
&lt;span class="p"&gt;-&lt;/span&gt; [ ] T2  POST /auth/magic-link  (issue + email)   refs spec §1, §3
&lt;span class="p"&gt;-&lt;/span&gt; [ ] T3  GET  /auth/verify      (consume + session) refs spec §2
&lt;span class="p"&gt;-&lt;/span&gt; [ ] T4  contract tests for 202 / 410 paths
&lt;span class="p"&gt;-&lt;/span&gt; [ ] T5  rate-limit issue endpoint (5/min/IP)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Notice the thread: each task &lt;strong&gt;cites the spec clause it satisfies&lt;/strong&gt;. That traceability is the whole point — when a test fails, you know which intent broke.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recommendations &amp;amp; best practices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Constitutional foundations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commit &lt;code&gt;AGENTS.md&lt;/code&gt; or &lt;code&gt;.specify/memory/constitution.md&lt;/code&gt; &lt;strong&gt;before&lt;/strong&gt; the first spec.&lt;/li&gt;
&lt;li&gt;Codify project-wide decisions as ubiquitous EARS statements: &lt;em&gt;"The system shall use TypeScript strict mode."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Specification discipline&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One feature = one spec directory (&lt;code&gt;specs/NNN-feature-name/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Keep specs to &lt;strong&gt;1–3 pages&lt;/strong&gt;; split if larger.&lt;/li&gt;
&lt;li&gt;Use explicit &lt;strong&gt;"out of scope"&lt;/strong&gt; sections to bound the agent's exploration.&lt;/li&gt;
&lt;li&gt;Write in &lt;strong&gt;domain language&lt;/strong&gt; (business intent), not implementation detail.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase boundaries&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never jump spec → code. Review the plan, then review the tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Documentation &amp;amp; traceability&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cite specs in commits: &lt;code&gt;feat(auth): magic link, refs specs/004-magic-link/spec.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Treat specs as durable — they outlive the generated code.&lt;/li&gt;
&lt;li&gt;Run pre-flight &lt;code&gt;/checklist&lt;/code&gt; passes for security, accessibility, observability.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;SDD has real skeptics, and they're worth more than the hype:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It can be old wine in new bottles.&lt;/strong&gt; Brandon Kindred's &lt;em&gt;"Same Patterns, New Hype"&lt;/em&gt; (2026) argues SDD is largely waterfall/contract-design rebranded — and that &lt;em&gt;"the value is the thinking you do while writing the spec, not the tooling around it."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift and hallucination don't disappear.&lt;/strong&gt; Thoughtworks stresses that &lt;strong&gt;executable code remains the source of truth requiring maintenance&lt;/strong&gt;, explicitly rejecting the "specs alone suffice" view. They place SDD in the &lt;strong&gt;"Assess"&lt;/strong&gt; ring of their Technology Radar — &lt;em&gt;not&lt;/em&gt; "Adopt."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over-specification defeats the purpose.&lt;/strong&gt; When a spec becomes pseudo-code, you've written the program twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;False confidence.&lt;/strong&gt; Matching a &lt;em&gt;wrong&lt;/em&gt; spec satisfies no real requirement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tooling complexity&lt;/strong&gt; can add ceremony without proportional value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;/p&gt;
  ✅ When SDD is worth it / ❌ when to skip it
  &lt;br&gt;
&lt;strong&gt;Worth it:&lt;/strong&gt; using AI coding assistants · complex requirements · multiple maintainers · integration-heavy or regulated systems.

&lt;p&gt;&lt;strong&gt;Skip it:&lt;/strong&gt; throwaway prototypes · solo, short-lived projects · exploratory work where requirements are still unknown.&lt;br&gt;
&lt;/p&gt;

&lt;br&gt;
&lt;p&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What the data says (read with a skeptic's eye)
&lt;/h2&gt;

&lt;p&gt;Vendor-reported numbers should be treated as &lt;em&gt;directional, not proven&lt;/em&gt;. With that caveat: early adopters (GitHub, AWS) report meaningfully higher first-pass success from agents working off a good spec, and Piskala's paper cites error reductions on the order of tens of percent when LLMs work from refined specs versus loose prompts. The consistent, less-disputable finding is a &lt;strong&gt;shift in where humans spend time&lt;/strong&gt; — away from typing implementation, toward review and clarification.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you take one number away, make it this one: &lt;em&gt;the spec is now where the thinking happens.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;In 2026, SDD is best understood not as a tool but as a &lt;strong&gt;discipline&lt;/strong&gt;: when agents write the code, the spec is the most leveraged thing a human can produce. The pragmatic path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Target &lt;strong&gt;spec-anchored&lt;/strong&gt;, not spec-as-source.&lt;/li&gt;
&lt;li&gt;Write acceptance criteria in &lt;strong&gt;EARS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Keep &lt;strong&gt;code as the source of truth&lt;/strong&gt; and tests as the enforcer.&lt;/li&gt;
&lt;li&gt;Use the tooling (Spec Kit, Kiro, cc-sdd) to enforce the loop — &lt;strong&gt;not&lt;/strong&gt; to replace the thinking.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Building with SDD already? What's worked and what's been pure ceremony? Drop it in the comments. 👇&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;/p&gt;
  📚 Sources
  &lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2602.00180" rel="noopener noreferrer"&gt;Spec-Driven Development: From Code to Contract in the Age of AI Coding Assistants — Deepak Babu Piskala, arXiv (Jan 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thoughtworks.medium.com/spec-driven-development-d85995a81387" rel="noopener noreferrer"&gt;Spec-Driven Development — Thoughtworks (Medium)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thebcms.com/blog/spec-driven-development" rel="noopener noreferrer"&gt;Spec-Driven Development: The Definitive 2026 Guide — BCMS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-cloud/spec-driven-development-54cdf7e0b088" rel="noopener noreferrer"&gt;Spec Driven Development: The Fifth Generation of Programming — Mofi Rahman, Google Cloud (Medium)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://brandonkindred.medium.com/same-patterns-new-hype-spec-driven-development-5183d8e8f704" rel="noopener noreferrer"&gt;Same Patterns, New Hype: Spec-Driven Development — Brandon Kindred (Medium)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.devoteam.com/expert-view/spec-driven-development-2026/" rel="noopener noreferrer"&gt;Spec-Driven Development in 2026: The end of code as the center of development? — Devoteam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.esveo.com/en/blog/spec-driven-development/" rel="noopener noreferrer"&gt;Why the Future of Software Lies in Descriptions, Not Code — esveo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.augmentcode.com/guides/what-is-spec-driven-development" rel="noopener noreferrer"&gt;What Is Spec-Driven Development? A Complete Guide — Augment Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/github/spec-kit" rel="noopener noreferrer"&gt;GitHub Spec Kit&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Compiled June 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>The 6-Month Clock Ran Out — Are Companies Full AI Yet?</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Mon, 06 Apr 2026 15:17:51 +0000</pubDate>
      <link>https://dev.to/krlz/the-6-month-clock-ran-out-are-companies-full-ai-yet-4ai2</link>
      <guid>https://dev.to/krlz/the-6-month-clock-ran-out-are-companies-full-ai-yet-4ai2</guid>
      <description>&lt;p&gt;So during this year, many changes have been introduced in software development. A big disruption is coming, and some new terminology — SDD, IDD, Cognitive Debt, DORA, the "new" XP, Agentic Programming, and others — is being promoted, sometimes used as a slogan.&lt;/p&gt;

&lt;p&gt;I personally feel it is many times used as a strong advertising campaign, taking advantage of the panic of people feeling they might be about to lose a train, with severe consequences in their professional careers if they don't catch up. This might be true to a certain level.&lt;/p&gt;

&lt;p&gt;But let's look at the actual numbers: in early 2026, AI coding tools have reached 90% adoption among developers, yet only 1% of companies consider themselves mature in AI usage. Everyone has the tools — almost nobody has figured out the practices.&lt;/p&gt;

&lt;p&gt;The debate between "AI enthusiasts" and "fundamentals defenders" misses the point entirely. The real question isn't whether to use AI tools, but &lt;strong&gt;how companies must restructure their practices, teams, and culture&lt;/strong&gt; to use them without accumulating what Thoughtworks now calls &lt;strong&gt;cognitive debt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So let's cut through the noise.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9uoh3q0ovohhppbgw8u8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9uoh3q0ovohhppbgw8u8.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Data Actually Says
&lt;/h2&gt;

&lt;p&gt;Google's 2025 DORA State of AI-Assisted Software Development report is probably, for now, the most rigorous report made about the current experience of AI in companies. It surveyed nearly &lt;strong&gt;5,000 technology professionals&lt;/strong&gt; worldwide and includes over &lt;strong&gt;100 hours of qualitative interviews&lt;/strong&gt;, combining both quantitative and qualitative data. Some clear conclusions can be taken from it: the real value comes from &lt;strong&gt;platform quality, workflow clarity, and team alignment&lt;/strong&gt;. The organizational capability to use AI well is the differentiator — not the tools themselves.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI is an amplifier, not a fixer.&lt;/strong&gt; Strong teams get stronger. Struggling teams get worse faster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The numbers tell the story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;90%&lt;/strong&gt; of software professionals now use AI tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;80%+&lt;/strong&gt; say AI enhanced their productivity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30%&lt;/strong&gt; report little or no trust in AI-generated code&lt;/li&gt;
&lt;li&gt;Seven organizational capabilities were identified that magnify the positive impact of AI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is key. It's not about which AI tool you pick. It's about what your team already looks like before AI enters the picture.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab5hk5oqpxix7pw7jn0l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab5hk5oqpxix7pw7jn0l.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From Vibes to Discipline
&lt;/h2&gt;

&lt;p&gt;So if the tools aren't the answer, what is? To understand where things are heading, it helps to see where they just came from.&lt;/p&gt;

&lt;p&gt;In February 2025, Andrej Karpathy — co-founder of OpenAI and former AI leader at Tesla — posted on X about a new way of coding: "fully give in to the vibes, embrace exponentials, and forget that the code even exists." The post got over 4.5 million views. Within weeks, the term &lt;strong&gt;"vibe coding"&lt;/strong&gt; had spread from social media to The New York Times, Ars Technica, and The Guardian. By November, Collins Dictionary named it Word of the Year 2025. By mid-2025, The Wall Street Journal reported professional engineers were adopting it for commercial use cases.&lt;/p&gt;

&lt;p&gt;But the honeymoon didn't last. By late 2025, Thoughtworks Technology Radar observed the concept fading in favor of more disciplined approaches — concerns about code quality, security, and maintainability in production couldn't be vibed away.&lt;/p&gt;

&lt;p&gt;What's replacing it? Three approaches are gaining traction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent-Driven Development (IDD)&lt;/strong&gt; flips the focus: the quality of your specification determines the quality of your outcome. Teams restructure around 60% product judgment, 30% engineering architecture, and 10% design precision. The specification becomes the primary artifact, not the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spec-Driven Development (SDD)&lt;/strong&gt; takes a similar angle but draws a clearer line: humans own the design, AI owns the implementation. The key discipline is writing specifications good enough that AI can execute them correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic Engineering&lt;/strong&gt;, coined by Karpathy himself in early 2026 as the successor to vibe coding, is about designing systems where AI agents plan, write, test, and ship code under structured human oversight. The risk it addresses is real: an agent writing 1,000 PRs/week with a 1% vulnerability rate creates 10 new vulnerabilities weekly.&lt;/p&gt;

&lt;p&gt;All three share a common thread: &lt;strong&gt;the human's job shifts from writing code to defining intent clearly and verifying outcomes rigorously&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6bfknmtzxe5ogp4vk071.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6bfknmtzxe5ogp4vk071.png" alt=" " width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Return of XP
&lt;/h2&gt;

&lt;p&gt;Here's something nobody expected: Extreme Programming is back.&lt;/p&gt;

&lt;p&gt;Kent Beck describes TDD as a &lt;strong&gt;"superpower"&lt;/strong&gt; when working with AI agents. The reasoning is simple — unit tests are the most reliable way to prevent AI from introducing regressions. When AI generates code, the test suite becomes your verification layer. Not code review. Not manual testing. Tests.&lt;/p&gt;

&lt;p&gt;The Pragmatic Engineer newsletter and the Thoughtworks Deer Valley retreat both highlight this resurgence. The practices that felt "too rigorous" five years ago are now the safety net that makes AI velocity sustainable. It turns out the answer to "how do we trust AI-generated code?" was already here — we just stopped using it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Industry Leaders Are Saying
&lt;/h2&gt;

&lt;p&gt;In February 2026, approximately 50 tech leaders — including Kent Beck and Martin Fowler — gathered at Thoughtworks' Deer Valley retreat. It was the 25th anniversary of the Agile Manifesto, and the question on the table was direct:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If AI handles the code, where does the engineering actually go?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Their conclusions reshape how we think about engineering teams:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cognitive debt is the new technical debt.&lt;/strong&gt; When AI generates code that nobody fully understands, you accumulate cognitive debt — and it compounds just like technical debt. "Velocity without understanding is not sustainable."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Topologies.&lt;/strong&gt; Just as Team Topologies redesigned how human teams interact, organizations now need to design how AI agents fit into their workflows. Who owns what the agent produces? How do agents interact across teams?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tiered Code Review.&lt;/strong&gt; Not all code needs the same scrutiny. Reserve human reviews for high-risk components and rely on strong CI/CD guardrails for the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Staff engineers become supervisors.&lt;/strong&gt; The senior role shifts toward agent orchestration and governance — designing the systems within which AI operates, not writing the code it produces.&lt;/p&gt;




&lt;h2&gt;
  
  
  Teams Are Shrinking, Roles Are Shifting
&lt;/h2&gt;

&lt;p&gt;These aren't just theoretical changes. They're already reshaping how companies hire and organize.&lt;/p&gt;

&lt;p&gt;Teams are shrinking dramatically. One Series C startup restructured from 12 engineers to 3 using AI tools, with a &lt;strong&gt;40% increase in velocity&lt;/strong&gt;. New roles are appearing — AI Workflow Engineers, PromptOps Specialists, Agent Orchestration leads — titles that didn't exist two years ago.&lt;/p&gt;

&lt;p&gt;The old hiring model — bring in juniors cheaply, train them up — is being replaced by &lt;strong&gt;hiring fewer senior people and equipping them with AI tools&lt;/strong&gt;. AI widens the gap between strong and weaker engineers rather than leveling the playing field.&lt;/p&gt;

&lt;p&gt;Interview practices are changing too. Organizations are replacing generative coding tests with &lt;strong&gt;Review Simulations&lt;/strong&gt; — candidates audit pre-generated, flawed codebases. The skill being tested: can you catch what AI gets wrong?&lt;/p&gt;

&lt;p&gt;And there's a quiet crisis brewing for mid-level engineers. New graduates are more productive with AI tools — they have no habits to unlearn. Senior engineers benefit from deep experience to guide AI. Mid-career professionals risk being squeezed from both sides. Addy Osmani from Google warns this is one of the most underappreciated shifts happening right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Measuring What Matters
&lt;/h2&gt;

&lt;p&gt;With all these changes, the old metrics stop making sense. When AI can generate unlimited code, measuring output becomes meaningless.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What We Used to Measure&lt;/th&gt;
&lt;th&gt;What Actually Matters Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Velocity / story points&lt;/td&gt;
&lt;td&gt;Cycle time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of code&lt;/td&gt;
&lt;td&gt;Lead time to production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PRs merged&lt;/td&gt;
&lt;td&gt;Defect escape rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Story completion rate&lt;/td&gt;
&lt;td&gt;Cognitive debt indicators&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The shift is from &lt;strong&gt;output to outcomes&lt;/strong&gt;: how fast does value reach users, and how reliably?&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fundamentals Debate Is Over
&lt;/h2&gt;

&lt;p&gt;If there's one thing every major source — DORA, Thoughtworks, Gartner, Google — agrees on, it's this: &lt;strong&gt;AI makes fundamentals more important, not less&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You need to understand architecture to design scalable systems and guide AI effectively. Developers who skip algorithms, system design, or manual debugging "lose problem-solving muscle memory."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The best software engineers won't be the fastest coders, but those who know when to distrust AI." — Addy Osmani, Google&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gartner backs this up with a stark warning: by 2028, prompt-to-app approaches by citizen developers will increase software defects by &lt;strong&gt;2,500%&lt;/strong&gt;. The quality crisis won't come from teams that invest in fundamentals — it will come from those that skip them.&lt;/p&gt;

&lt;p&gt;As Satya Nadella put it: "Getting the fundamentals right matters a lot." This isn't a compromise between AI and fundamentals. It's the only approach that works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where to Start
&lt;/h2&gt;

&lt;p&gt;If you're leading a team or a company, here's a practical starting point:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read the &lt;a href="https://dora.dev/research/2025/dora-report/" rel="noopener noreferrer"&gt;DORA 2025 AI Report&lt;/a&gt;&lt;/strong&gt; (free). Assess where your organization actually stands.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invest in testing culture before AI tooling.&lt;/strong&gt; TDD, integration tests, strong CI/CD — these are what make AI velocity safe.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adopt Spec-Driven Development.&lt;/strong&gt; Better specifications mean better AI output. It's that direct.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tier your code review.&lt;/strong&gt; Human review for high-risk paths, automated guardrails for the rest.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rethink how you hire.&lt;/strong&gt; Test for review and debugging skills. Can candidates spot what AI gets wrong?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Measure outcomes, not output.&lt;/strong&gt; Cycle time and defect escape rate over velocity and story points.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read the &lt;a href="https://www.thoughtworks.com/content/dam/thoughtworks/documents/report/tw_future%20_of_software_development_retreat_%20key_takeaways.pdf" rel="noopener noreferrer"&gt;Thoughtworks Deer Valley retreat takeaways&lt;/a&gt;&lt;/strong&gt; (free PDF). It's the most forward-looking strategic document on this topic.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dora.dev/research/2025/dora-report/" rel="noopener noreferrer"&gt;2025 DORA State of AI-Assisted Software Development Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thoughtworks.com/about-us/news/2025/thoughtworks-tech-radar-33-rapid-ai" rel="noopener noreferrer"&gt;Thoughtworks Technology Radar Vol. 33&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://newsletter.pragmaticengineer.com/p/tdd-ai-agents-and-coding-with-kent" rel="noopener noreferrer"&gt;Pragmatic Engineer: TDD, AI Agents, and Coding with Kent Beck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addyosmani.com/blog/next-two-years/" rel="noopener noreferrer"&gt;Addy Osmani: The Next Two Years of Software Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/minibooks/ai-assisted-development-2025/" rel="noopener noreferrer"&gt;InfoQ: AI-Assisted Development Mini-Book (free)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reports.weforum.org/docs/WEF_AI_at_Work_from_Productivity_Hacks_to_Organizational_Transformation_2026.pdf" rel="noopener noreferrer"&gt;WEF: AI at Work Report (Jan 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai" rel="noopener noreferrer"&gt;McKinsey: State of AI 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The tools are here. The question was never "should we use AI?" — it was always "do we have the engineering culture to use it well?" The answer to that question determines everything.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>discuss</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
