<?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>The Most Important AI Engineering Skill Is Saying No (AI-DLC, bolts, and autonomous agents)</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Wed, 04 Nov 2026 19:52:39 +0000</pubDate>
      <link>https://dev.to/krlz/the-most-important-ai-engineering-skill-is-saying-no-ai-dlc-bolts-and-autonomous-agents-20ob</link>
      <guid>https://dev.to/krlz/the-most-important-ai-engineering-skill-is-saying-no-ai-dlc-bolts-and-autonomous-agents-20ob</guid>
      <description>&lt;p&gt;AI can now propose an architecture, break requirements into tasks, write the implementation, generate tests, and prepare a deployment.&lt;/p&gt;

&lt;p&gt;And we are increasingly building entire development methodologies around that capability.&lt;/p&gt;

&lt;p&gt;AWS introduced the &lt;strong&gt;AI-Driven Development Lifecycle (AI-DLC)&lt;/strong&gt;, with concepts such as &lt;em&gt;Units of Work&lt;/em&gt;, &lt;em&gt;Bolts&lt;/em&gt;, &lt;em&gt;Mob Elaboration&lt;/em&gt;, and &lt;em&gt;Mob Construction&lt;/em&gt;. Frameworks such as &lt;a href="https://specs.md/" rel="noopener noreferrer"&gt;specs.md&lt;/a&gt; bring similar ideas into tools like Claude Code.&lt;/p&gt;

&lt;p&gt;The promise is compelling: shorter development cycles, persistent context, specialized agents, and fewer manual handoffs.&lt;/p&gt;

&lt;p&gt;But after exploring these methodologies, I keep returning to a question that seems more important than how quickly AI can produce software:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is actually making the engineering decisions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not who approves the final pull request. Not who clicks "continue" when an agent requests permission.&lt;/p&gt;

&lt;p&gt;Who decides whether an architectural proposal makes sense in the first place?&lt;/p&gt;


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

  &lt;br&gt;
&lt;strong&gt;My argument:&lt;/strong&gt; The most valuable human contribution to AI-driven software development may be the ability to reject an AI proposal, establish constraints, demand alternatives, and stop execution.

&lt;p&gt;If developers lose that authority, human-in-the-loop becomes little more than a ceremonial approval process.&lt;br&gt;

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


&lt;h2&gt;
  
  
  We are redesigning software development around AI
&lt;/h2&gt;

&lt;p&gt;For years, the software industry has experimented with methodologies intended to improve how teams deliver software.&lt;/p&gt;

&lt;p&gt;Waterfall emphasized sequential phases. Agile introduced iterative development and faster feedback. Scrum provided a framework for organizing complex work, while Kanban emphasized managing flow.&lt;/p&gt;

&lt;p&gt;Now we have AI-native development methodologies.&lt;/p&gt;

&lt;p&gt;AWS describes AI-DLC as a model in which AI creates plans, asks questions, proposes solutions, and executes work after human validation.&lt;/p&gt;

&lt;p&gt;Its lifecycle has three major phases:&lt;/p&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;AI responsibility&lt;/th&gt;
&lt;th&gt;Human responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inception&lt;/td&gt;
&lt;td&gt;Elaborate requirements and propose units&lt;/td&gt;
&lt;td&gt;Validate business intent and scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Construction&lt;/td&gt;
&lt;td&gt;Propose designs, generate code, and test&lt;/td&gt;
&lt;td&gt;Make technical decisions and validate results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations&lt;/td&gt;
&lt;td&gt;Prepare infrastructure and operational changes&lt;/td&gt;
&lt;td&gt;Provide oversight and authorize consequential actions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The methodology also introduces &lt;strong&gt;Bolts&lt;/strong&gt;, short execution cycles generally measured in hours or days rather than weeks.&lt;/p&gt;

&lt;p&gt;The ambition is to reorganize the development lifecycle around AI's ability to generate and execute work rapidly.&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://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" 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%2Fd2908q01vomqb2.cloudfront.net%2F7719a1c782a1ba91c031a682a0a2f8658209adbf%2F2025%2F07%2F31%2Faidlc-1120x630.png" 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://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" rel="noopener noreferrer" class="c-link"&gt;
            AI-Driven Development Life Cycle: Reimagining Software Engineering | AWS DevOps &amp;amp; Developer Productivity Blog
          &lt;/a&gt;
        &lt;/h2&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%2Fa0.awsstatic.com%2Fmain%2Fimages%2Fsite%2Ffav%2Ffavicon.ico" width="16" height="16"&gt;
          aws.amazon.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;This is a legitimate direction to explore.&lt;/p&gt;

&lt;p&gt;But there is a subtle difference between accelerating software development and accelerating the production of software artifacts.&lt;/p&gt;

&lt;p&gt;An agent can produce five architectural alternatives in minutes.&lt;/p&gt;

&lt;p&gt;It cannot guarantee that any of them is appropriate for the organization, its operational constraints, or the business problem.&lt;/p&gt;

&lt;p&gt;That distinction becomes increasingly important as agents gain autonomy.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Bolt is not a substitute for engineering judgment
&lt;/h2&gt;

&lt;p&gt;Consider a traditional development team implementing a reservation management feature.&lt;/p&gt;

&lt;p&gt;A developer might spend time understanding the domain, inspecting existing services, discussing edge cases, and choosing an implementation strategy.&lt;/p&gt;

&lt;p&gt;With an AI-driven workflow, an agent may perform much of that investigation and propose an implementation plan.&lt;/p&gt;

&lt;p&gt;The team can then approve the plan and let the agent execute it.&lt;/p&gt;

&lt;p&gt;This sounds efficient.&lt;/p&gt;

&lt;p&gt;But consider what happens when the agent proposes an unnecessarily complicated solution.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Introduce a Kafka topic to propagate reservation state changes, a Redis cache for availability lookups, and a new microservice responsible for reservation lifecycle management.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It sounds like an architecture.&lt;/p&gt;

&lt;p&gt;It even sounds like a reasonably sophisticated one.&lt;/p&gt;

&lt;p&gt;But what if the system currently handles a few hundred reservations per day, uses a single PostgreSQL database, and has no demonstrated scaling problem?&lt;/p&gt;

&lt;p&gt;The correct engineering decision might be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No. We do not need any of that.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We might need one additional endpoint, a transaction, a database constraint, and two integration tests.&lt;/p&gt;

&lt;p&gt;An AI agent can generate a technically coherent architecture that is nevertheless a poor engineering decision.&lt;/p&gt;

&lt;p&gt;The danger is not only incorrect code.&lt;/p&gt;

&lt;p&gt;It is &lt;em&gt;unnecessary complexity delivered at extraordinary speed&lt;/em&gt;.&lt;/p&gt;


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

  &lt;br&gt;
&lt;strong&gt;A successful Bolt should not be measured by how much work the agent completed.&lt;/strong&gt;

&lt;p&gt;It should be measured by whether the team delivered a correct, maintainable increment that solves the intended problem.&lt;br&gt;

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


&lt;h2&gt;
  
  
  Human-in-the-loop is not the same as human-in-control
&lt;/h2&gt;

&lt;p&gt;This distinction deserves more attention.&lt;/p&gt;

&lt;p&gt;Many AI workflows include human checkpoints. The agent presents a plan, and a developer approves or rejects it.&lt;/p&gt;

&lt;p&gt;That is useful, but insufficient.&lt;/p&gt;

&lt;p&gt;Imagine the following interaction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI:&lt;/strong&gt; I recommend introducing an event-driven architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer:&lt;/strong&gt; Approved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI:&lt;/strong&gt; I will implement three services and their supporting infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer:&lt;/strong&gt; Approved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI:&lt;/strong&gt; Implementation complete. All generated tests pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer:&lt;/strong&gt; Approved.&lt;/p&gt;

&lt;p&gt;There were three human checkpoints.&lt;/p&gt;

&lt;p&gt;Yet we have no evidence that meaningful engineering judgment occurred at any of them.&lt;/p&gt;

&lt;p&gt;Now consider a different interaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI:&lt;/strong&gt; I recommend introducing an event-driven architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer:&lt;/strong&gt; Why? What problem does it solve that our existing transactional design cannot?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI:&lt;/strong&gt; It could improve decoupling and asynchronous processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer:&lt;/strong&gt; Show me three alternatives. Compare operational cost, consistency guarantees, failure recovery, and migration effort. Our team maintains this platform with limited infrastructure capacity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI:&lt;/strong&gt; A transactional implementation appears sufficient under those constraints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer:&lt;/strong&gt; Proceed with that approach. Do not introduce new infrastructure.&lt;/p&gt;

&lt;p&gt;The second interaction may produce less code.&lt;/p&gt;

&lt;p&gt;It may also produce substantially better software.&lt;/p&gt;

&lt;p&gt;The developer was not merely validating output.&lt;/p&gt;

&lt;p&gt;The developer was actively shaping the solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human-in-the-loop describes participation. Human-in-control describes authority.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They are not equivalent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four powers developers must retain
&lt;/h2&gt;

&lt;p&gt;I believe every serious AI engineering workflow should explicitly preserve four human capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Reject a proposal
&lt;/h3&gt;

&lt;p&gt;Developers must be able to reject a design without having to provide a replacement implementation immediately.&lt;/p&gt;

&lt;p&gt;This matters because rejecting a bad abstraction is often easier than constructing a better one.&lt;/p&gt;

&lt;p&gt;An AI-generated design may be logically consistent but violate established architectural boundaries, introduce unnecessary dependencies, or optimize for a problem that does not exist.&lt;/p&gt;

&lt;p&gt;A useful rejection should identify the concern:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reject this proposal. It introduces a new service without demonstrating a need for independent scaling, deployment, or domain ownership.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is an engineering decision.&lt;/p&gt;

&lt;p&gt;Not an obstacle to automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Establish constraints
&lt;/h3&gt;

&lt;p&gt;AI agents need boundaries.&lt;/p&gt;

&lt;p&gt;Not just coding conventions, but architectural and operational constraints.&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 yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;architecture&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;new_microservices&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prohibited&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgresql&lt;/span&gt;
  &lt;span class="na"&gt;messaging&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;existing_kafka_topics_only&lt;/span&gt;
  &lt;span class="na"&gt;public_api_breaking_changes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prohibited&lt;/span&gt;

&lt;span class="na"&gt;reliability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;retries_must_be_bounded&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;idempotency_required_for_commands&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;backward_compatibility&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;required&lt;/span&gt;

&lt;span class="na"&gt;delivery&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;unrelated_refactoring&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prohibited&lt;/span&gt;
  &lt;span class="na"&gt;integration_tests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;required&lt;/span&gt;
  &lt;span class="na"&gt;production_deployment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;manual_approval&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is an illustrative policy, not a native specs.md configuration file.&lt;/p&gt;

&lt;p&gt;The point is that constraints should be explicit, versioned, and testable wherever possible.&lt;/p&gt;

&lt;p&gt;A developer should not need to repeat the same architectural principles every time a new agent session begins.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Demand alternatives
&lt;/h3&gt;

&lt;p&gt;One of the most dangerous properties of AI-generated solutions is how persuasive they can appear.&lt;/p&gt;

&lt;p&gt;A complete design document with diagrams, tradeoff tables, and confident explanations can create the impression that the design space has already been explored.&lt;/p&gt;

&lt;p&gt;It may not have been.&lt;/p&gt;

&lt;p&gt;For consequential decisions, developers should ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the simplest viable alternative?&lt;/li&gt;
&lt;li&gt;What can we implement using existing components?&lt;/li&gt;
&lt;li&gt;Which assumptions would make this design inappropriate?&lt;/li&gt;
&lt;li&gt;What are the operational and maintenance costs?&lt;/li&gt;
&lt;li&gt;What would make us reverse this decision six months from now?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions force the agent to explore the decision rather than simply defend its first proposal.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Stop execution
&lt;/h3&gt;

&lt;p&gt;Autonomy should have boundaries.&lt;/p&gt;

&lt;p&gt;An agent should stop when it encounters an unresolved architectural decision, a destructive operation, a security-sensitive change, or a conflict between requirements.&lt;/p&gt;

&lt;p&gt;Consider a database migration.&lt;/p&gt;

&lt;p&gt;The agent discovers that implementing a new feature requires modifying a heavily used table.&lt;/p&gt;

&lt;p&gt;It should not automatically choose a destructive migration merely because doing so would complete the task.&lt;/p&gt;

&lt;p&gt;It should surface the conflict.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EXECUTION PAUSED

Reason:
The proposed schema change may break
existing consumers.

Options:
A. Backward-compatible additive migration
B. Versioned API and staged migration
C. Redesign the feature to avoid the change

Decision required:
Authorized engineering owner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Stopping is not failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stopping at the correct moment is a feature of a well-governed autonomous system.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  But who should make these decisions?
&lt;/h2&gt;

&lt;p&gt;Not every decision belongs to the same person.&lt;/p&gt;

&lt;p&gt;Product owners and business stakeholders should determine which outcomes matter.&lt;/p&gt;

&lt;p&gt;Domain experts should validate business rules.&lt;/p&gt;

&lt;p&gt;Developers and technical leads should own engineering decisions, including architecture, implementation constraints, reliability, and maintainability.&lt;/p&gt;

&lt;p&gt;Authorized operational owners should control production releases.&lt;/p&gt;

&lt;p&gt;AI can help each group evaluate alternatives and execute approved work.&lt;/p&gt;

&lt;p&gt;It should not silently inherit their authority.&lt;/p&gt;

&lt;p&gt;This is also where AI-DLC should be evaluated against established engineering practices.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://scrumguides.org/scrum-guide.html" rel="noopener noreferrer"&gt;Scrum Guide&lt;/a&gt; makes developers accountable for creating the Sprint Backlog, adapting their plan, and maintaining quality through the Definition of Done.&lt;/p&gt;

&lt;p&gt;AI-DLC changes the mechanics of planning and implementation, but it should not erase that accountability.&lt;/p&gt;

&lt;p&gt;There is a difference between delegating execution and delegating responsibility.&lt;/p&gt;
&lt;h2&gt;
  
  
  What happens when agents start making architecture decisions?
&lt;/h2&gt;

&lt;p&gt;Imagine a team maintaining a mature backend platform.&lt;/p&gt;

&lt;p&gt;The system has accumulated years of architectural decisions, operational lessons, domain-specific exceptions, and integration constraints.&lt;/p&gt;

&lt;p&gt;An AI agent receives a request:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Implement real-time reporting for active alerts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent examines the existing implementation and proposes a separate Redis-backed endpoint for active alerts, while historical alerts remain in PostgreSQL.&lt;/p&gt;

&lt;p&gt;At first glance, the design may appear reasonable.&lt;/p&gt;

&lt;p&gt;But the engineering team knows that this introduces two sources of truth for reporting.&lt;/p&gt;

&lt;p&gt;Now every consumer needs to understand which endpoint to query, how to reconcile results, and what happens during synchronization failures.&lt;/p&gt;

&lt;p&gt;The developer may instead insist on a unified reporting model with explicitly defined state transitions.&lt;/p&gt;

&lt;p&gt;That decision requires understanding more than the immediate feature.&lt;/p&gt;

&lt;p&gt;It requires understanding the system's history, consistency requirements, and future maintenance burden.&lt;/p&gt;

&lt;p&gt;AI can help investigate those concerns.&lt;/p&gt;

&lt;p&gt;But it cannot automatically determine which organizational tradeoffs are acceptable.&lt;/p&gt;

&lt;p&gt;This is precisely where experienced engineering judgment becomes valuable.&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem with measuring AI development through speed
&lt;/h2&gt;

&lt;p&gt;AI-DLC introduces shorter execution cycles, and frameworks such as specs.md provide structured workflows for implementing them.&lt;/p&gt;

&lt;p&gt;But how should we evaluate whether these methodologies work?&lt;/p&gt;

&lt;p&gt;A common demonstration shows an agent producing a working application in a few hours or days.&lt;/p&gt;

&lt;p&gt;That is impressive.&lt;/p&gt;

&lt;p&gt;It is not sufficient evidence of long-term engineering effectiveness.&lt;/p&gt;

&lt;p&gt;I would be more interested in what happens after six months.&lt;/p&gt;

&lt;p&gt;Can another developer understand the architecture?&lt;/p&gt;

&lt;p&gt;Can the team safely introduce a new feature?&lt;/p&gt;

&lt;p&gt;Do the specifications still describe the implementation?&lt;/p&gt;

&lt;p&gt;Can a developer challenge an earlier decision without rebuilding half the platform?&lt;/p&gt;

&lt;p&gt;How much human effort is required to review and repair generated changes?&lt;/p&gt;

&lt;p&gt;And when something fails in production, can the team diagnose it without depending on the original agent's conversation history?&lt;/p&gt;

&lt;p&gt;Those questions are harder to demonstrate than a successful prototype.&lt;/p&gt;

&lt;p&gt;But they are closer to what professional software engineering actually requires.&lt;/p&gt;

&lt;p&gt;A useful evaluation should compare:&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;What it reveals&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Acceptance-test success&lt;/td&gt;
&lt;td&gt;Whether the implementation meets requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human review time&lt;/td&gt;
&lt;td&gt;How much effort correctness requires&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rework after implementation&lt;/td&gt;
&lt;td&gt;Whether the initial solution was appropriate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architectural complexity&lt;/td&gt;
&lt;td&gt;Whether unnecessary components were introduced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational incidents&lt;/td&gt;
&lt;td&gt;Whether the system remains reliable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost per accepted change&lt;/td&gt;
&lt;td&gt;Whether faster generation creates real efficiency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintainability over time&lt;/td&gt;
&lt;td&gt;Whether future engineers can safely evolve the system&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Counting completed Bolts is not enough.&lt;/p&gt;

&lt;p&gt;Counting generated lines of code is even less useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The meaningful unit of progress is not AI activity. It is validated software value.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Are we accidentally reinventing Waterfall?
&lt;/h2&gt;

&lt;p&gt;There is another uncomfortable possibility.&lt;/p&gt;

&lt;p&gt;Spec-driven AI development often emphasizes generating requirements, architecture documents, implementation plans, tasks, and tests before or during execution.&lt;/p&gt;

&lt;p&gt;These artifacts can improve traceability and preserve context.&lt;/p&gt;

&lt;p&gt;But if teams begin treating AI-generated specifications as authoritative simply because they were approved, we risk recreating a familiar problem.&lt;/p&gt;

&lt;p&gt;The process becomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate extensive requirements.&lt;/li&gt;
&lt;li&gt;Approve the requirements.&lt;/li&gt;
&lt;li&gt;Generate the architecture.&lt;/li&gt;
&lt;li&gt;Approve the architecture.&lt;/li&gt;
&lt;li&gt;Generate the implementation.&lt;/li&gt;
&lt;li&gt;Discover that the original assumptions were wrong.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is not automatically Agile because the implementation happened in short Bolts.&lt;/p&gt;

&lt;p&gt;Agility requires the ability to revise assumptions and respond to new information.&lt;/p&gt;

&lt;p&gt;A Bolt can be short while the overall process remains rigid.&lt;/p&gt;

&lt;p&gt;Conversely, a team can use AI-generated specifications effectively if those specifications remain open to challenge, revision, and even deletion.&lt;/p&gt;

&lt;p&gt;The value of a specification is not that it exists.&lt;/p&gt;

&lt;p&gt;It is that it helps the team make and revisit decisions.&lt;/p&gt;
&lt;h2&gt;
  
  
  A better AI engineering workflow
&lt;/h2&gt;

&lt;p&gt;I would rather see teams organize AI-assisted development around explicit decision boundaries.&lt;/p&gt;

&lt;p&gt;Not every small change needs a complete architectural review.&lt;/p&gt;

&lt;p&gt;But not every change should run on autopilot either.&lt;/p&gt;

&lt;p&gt;Here is a practical model.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;th&gt;AI autonomy&lt;/th&gt;
&lt;th&gt;Human involvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Documentation correction&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Review output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small API enhancement&lt;/td&gt;
&lt;td&gt;High within constraints&lt;/td&gt;
&lt;td&gt;Validate contract and tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal refactoring&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Review behavior preservation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-service integration&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Approve design and failure handling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data migration&lt;/td&gt;
&lt;td&gt;Restricted&lt;/td&gt;
&lt;td&gt;Approve migration and rollback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security-sensitive change&lt;/td&gt;
&lt;td&gt;Restricted&lt;/td&gt;
&lt;td&gt;Independent security review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production deployment&lt;/td&gt;
&lt;td&gt;Policy-controlled&lt;/td&gt;
&lt;td&gt;Authorized release decision&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important property is that autonomy is &lt;strong&gt;proportional to risk&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An agent should not require permission to rename a local variable.&lt;/p&gt;

&lt;p&gt;It should not be allowed to invent a new distributed architecture without engineering approval.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  An example: an architecture decision prompt for an AI agent
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before implementing this feature:

1. Identify the affected domain boundaries.

2. Propose at least two viable solutions,
   including one that reuses existing infrastructure.

3. Compare:
   - Complexity
   - Reliability
   - Operational cost
   - Backward compatibility
   - Migration effort
   - Failure recovery

4. Explicitly identify assumptions and unknowns.

5. Recommend the simplest solution satisfying
   the documented requirements.

6. Do not implement until the architectural
   decision is approved.

7. If new information invalidates the approved
   design, stop and request a new decision.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is not a replacement for engineering expertise.&lt;/p&gt;

&lt;p&gt;It is a way to make that expertise visible in the workflow.&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The developer's role is changing, but not disappearing
&lt;/h2&gt;

&lt;p&gt;I do not think the future of software engineering is developers manually writing every line of code.&lt;/p&gt;

&lt;p&gt;Nor do I think it is developers approving whatever an autonomous agent produces.&lt;/p&gt;

&lt;p&gt;The interesting future lies between those extremes.&lt;/p&gt;

&lt;p&gt;Developers may spend less time producing routine implementations and more time defining constraints, exploring tradeoffs, validating behavior, and managing complexity.&lt;/p&gt;

&lt;p&gt;But there is a danger in describing this transformation as developers becoming merely supervisors of AI agents.&lt;/p&gt;

&lt;p&gt;Supervision without sufficient technical understanding is fragile.&lt;/p&gt;

&lt;p&gt;If developers stop exercising implementation and architectural judgment, their ability to challenge increasingly sophisticated AI proposals may deteriorate.&lt;/p&gt;

&lt;p&gt;We could end up with systems that are easier to generate than to understand.&lt;/p&gt;

&lt;p&gt;And organizations that can produce software faster than they can responsibly maintain it.&lt;/p&gt;

&lt;p&gt;That would not be an improvement in software engineering.&lt;/p&gt;

&lt;p&gt;It would be an improvement in software production at the expense of engineering control.&lt;/p&gt;
&lt;h2&gt;
  
  
  The real test of AI-DLC
&lt;/h2&gt;

&lt;p&gt;I am interested in AI-DLC, Bolts, and spec-driven development because they attempt to solve real problems: lost context, slow handoffs, inconsistent implementation, and repetitive work.&lt;/p&gt;

&lt;p&gt;I also think they deserve more rigorous evaluation than demonstrations of rapid application generation.&lt;/p&gt;

&lt;p&gt;The most convincing evidence would be a substantial production platform developed and maintained through many AI-driven iterations, with its architectural decisions, specification changes, failures, and operational history available for examination.&lt;/p&gt;

&lt;p&gt;Not just the first successful release.&lt;/p&gt;

&lt;p&gt;The tenth feature.&lt;/p&gt;

&lt;p&gt;The unexpected migration.&lt;/p&gt;

&lt;p&gt;The production incident.&lt;/p&gt;

&lt;p&gt;The architectural decision that turned out to be wrong.&lt;/p&gt;

&lt;p&gt;And the developer who recognized the mistake before an autonomous agent made it worse.&lt;/p&gt;


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

  &lt;br&gt;
&lt;strong&gt;The goal should not be to remove developers from the decision-making process.&lt;/strong&gt;

&lt;p&gt;It should be to give developers better information, more alternatives, and greater leverage over the decisions that matter.&lt;/p&gt;

&lt;p&gt;An AI engineering methodology succeeds when it improves engineering judgment—not when it makes that judgment optional.&lt;br&gt;

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



&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;AI can propose a solution in seconds.&lt;/p&gt;

&lt;p&gt;It can generate thousands of lines of code, construct tests, document decisions, and execute an entire development workflow.&lt;/p&gt;

&lt;p&gt;But engineering has never been only about producing implementations.&lt;/p&gt;

&lt;p&gt;It is also about knowing when an implementation should not exist.&lt;/p&gt;

&lt;p&gt;When an abstraction is unnecessary.&lt;/p&gt;

&lt;p&gt;When a dependency introduces more risk than value.&lt;/p&gt;

&lt;p&gt;When a requirement is incomplete.&lt;/p&gt;

&lt;p&gt;When a system should remain simple.&lt;/p&gt;

&lt;p&gt;And when execution must stop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The most important AI engineering skill may not be writing better prompts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It may be knowing when to say no.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Further reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/" rel="noopener noreferrer"&gt;AWS — AI-Driven Development Life Cycle: Reimagining Software Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/devops/building-with-ai-dlc-using-amazon-q-developer/" rel="noopener noreferrer"&gt;AWS — Building with AI-DLC using Amazon Q Developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/awslabs/aidlc-workflows" rel="noopener noreferrer"&gt;AWS Labs — AI-DLC Workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://specs.md/" rel="noopener noreferrer"&gt;specs.md — AI-native development workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scrumguides.org/scrum-guide.html" rel="noopener noreferrer"&gt;The Scrum Guide (2020)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What do you think? Are AI-native development methodologies giving engineers more control over software design, or gradually turning them into reviewers of decisions made by agents?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Architecture of Public Opinion: How Digital Media Shapes What We Believe</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:58:27 +0000</pubDate>
      <link>https://dev.to/krlz/the-architecture-of-public-opinion-how-digital-media-shapes-what-we-believe-2lcg</link>
      <guid>https://dev.to/krlz/the-architecture-of-public-opinion-how-digital-media-shapes-what-we-believe-2lcg</guid>
      <description>&lt;h1&gt;
  
  
  The Architecture of Public Opinion
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;How digital media systems shape what we see, what we fear, and what we believe.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Imagine two reports covering the same protest.&lt;/p&gt;

&lt;p&gt;One explains the demands, interviews participants, checks official statements, and reports incidents of violence. The other opens with burning barricades, police sirens, and a headline about chaos.&lt;/p&gt;

&lt;p&gt;Both may contain accurate facts. Yet they produce very different impressions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A news report doesn't need to be false to create a misleading picture of reality.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The difference is not just the opinion of a journalist. Behind each report is a system: editorial workflows, publishing software, business incentives, recommendation algorithms, and audience feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. News Is a Sociotechnical System
&lt;/h2&gt;

&lt;p&gt;A simplified digital-news pipeline looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Real-world events
       |
       v
News selection
       |
       v
Editorial decisions
(sources, images, words, context)
       |
       v
CMS and publication
       |
       v
Distribution
(search, social, recommendations)
       |
       v
Audience and public conversation
       |
       v
Analytics and feedback --------+
       |                       |
       +----&amp;gt; Future editorial decisions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step has rules and incentives. Which event is newsworthy? Which photograph gets selected? Who is quoted? Which headline generates the most clicks?&lt;/p&gt;

&lt;p&gt;The final article is a &lt;em&gt;representation&lt;/em&gt; of an event, assembled through decisions. This does not make journalism inherently dishonest; it makes editorial accountability essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Three Frameworks for Understanding Influence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Agenda-setting:&lt;/strong&gt; McCombs and Shaw's classic research explains how media attention can influence which issues audiences consider important. Frequent crime coverage, for example, can raise the perceived importance of crime without telling us whether crime rates are rising.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Framing:&lt;/strong&gt; Robert Entman's framework explains how selecting and emphasizing particular aspects of events promotes particular interpretations. A protest framed mainly through property damage is understood differently from one framed through its political demands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cultivation theory:&lt;/strong&gt; George Gerbner's work explores how prolonged exposure to recurring television portrayals can influence perceptions of social reality, including danger and violence.&lt;/p&gt;

&lt;p&gt;These are research frameworks, not proof that every viewer is manipulated or that a particular newsroom deliberately distorts reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. When Engagement Becomes the Objective
&lt;/h2&gt;

&lt;p&gt;Digital publishers can track clicks, watch time, retention, comments, shares, and advertising revenue.&lt;/p&gt;

&lt;p&gt;Those metrics answer: &lt;em&gt;Did people interact?&lt;/em&gt; They do not necessarily answer: &lt;em&gt;Did people understand?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Consider two articles about migration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Article A&lt;/strong&gt; provides statistics, historical context, limitations, and interviews with researchers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Article B&lt;/strong&gt; pairs one violent incident with alarming imagery and a provocative headline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If Article B attracts more attention, a system optimized primarily for engagement may distribute it more widely. The software might be performing perfectly against its target while the larger information system performs poorly against a public-interest goal.&lt;/p&gt;

&lt;p&gt;This echoes &lt;strong&gt;Goodhart's Law&lt;/strong&gt;: once a measure becomes a target, it can lose its value as a measure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Engagement is a product metric. Public understanding is a social outcome. They are not interchangeable.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. Crime, Protest, and Dehumanization
&lt;/h2&gt;

&lt;p&gt;Accurate crime reporting is necessary. So is reporting violence at demonstrations. But reporting these events does not require dehumanizing people.&lt;/p&gt;

&lt;p&gt;Editorial choices can create serious problems when they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Present suspects as guilty before conviction.&lt;/li&gt;
&lt;li&gt;Generalize individual crimes to entire nationalities or communities.&lt;/li&gt;
&lt;li&gt;Treat all protesters as responsible for the actions of a few.&lt;/li&gt;
&lt;li&gt;Use unrelated images that associate particular groups with danger.&lt;/li&gt;
&lt;li&gt;Remove the demands, history, or social conditions surrounding an event.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A photograph is not neutral merely because it is authentic. Its timing, cropping, caption, and placement affect meaning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Objectivity is not indifference to violence. It is a commitment to evidence, context, proportionality, and human dignity.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Social Media Adds a Feedback Loop
&lt;/h2&gt;

&lt;p&gt;A headline leaves the newsroom and enters social platforms. It becomes a shortened post, a clipped video, a thumbnail, and a comment thread. Audience reactions then influence subsequent exposure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Editorial framing
      |
      v
Social distribution
      |
      v
Comments, shares, watch time
      |
      v
Ranking and recommendation
      |
      +------&amp;gt; Further exposure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under some conditions, engagement-based ranking can amplify emotionally provocative or hostile content. But &lt;strong&gt;amplification is not the same as proven long-term persuasion&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Experiments published in &lt;em&gt;Science&lt;/em&gt; in 2023 found that replacing algorithmic Facebook and Instagram feeds with chronological ones changed content exposure without significant changes in measured political attitudes over the study period. This is a useful reminder to distinguish mechanisms, observations, and causal claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. National Identity and the Construction of Outsiders
&lt;/h2&gt;

&lt;p&gt;National identity is not inherently discriminatory. But news narratives can reinforce exclusion when they divide society into legitimate insiders and threatening outsiders.&lt;/p&gt;

&lt;p&gt;In coverage of migration or protests, three distinctions matter:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Responsible distinction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who committed a crime?&lt;/td&gt;
&lt;td&gt;Individual responsibility versus collective identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What happened at a protest?&lt;/td&gt;
&lt;td&gt;Peaceful participation versus specific violent acts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does a nationality explain?&lt;/td&gt;
&lt;td&gt;Relevant verified context versus unsupported association&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Journalism should neither hide uncomfortable facts nor turn human beings into stereotypes.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Ground News: A Useful but Limited Response
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ground.news" rel="noopener noreferrer"&gt;Ground News&lt;/a&gt;, founded in Canada by engineers Harleen Kaur and Sukh Singh, compares coverage across news outlets. It highlights differences in political orientation, uneven coverage (&lt;em&gt;Blindspot&lt;/em&gt;), source reliability assessments, and media ownership.&lt;/p&gt;

&lt;p&gt;It draws on external rating organizations including &lt;a href="https://www.allsides.com/media-bias" rel="noopener noreferrer"&gt;AllSides&lt;/a&gt;, &lt;a href="https://adfontesmedia.com/" rel="noopener noreferrer"&gt;Ad Fontes Media&lt;/a&gt;, and &lt;a href="https://mediabiasfactcheck.com/" rel="noopener noreferrer"&gt;Media Bias/Fact Check&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This gives readers a way to compare sources instead of relying on one feed. But outlet-level political ratings do not fact-check individual articles. Nor do they reliably identify misleading image selection, dehumanizing language, or missing social context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ground News helps inspect published outputs. The harder challenge is auditing how those outputs were produced.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. What Software Engineering Can Contribute
&lt;/h2&gt;

&lt;p&gt;The comparison with software engineering is useful if we treat it as an analogy, not a literal equivalence:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Software engineering&lt;/th&gt;
&lt;th&gt;Media accountability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Requirements&lt;/td&gt;
&lt;td&gt;Editorial standards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quality assurance&lt;/td&gt;
&lt;td&gt;Fact-checking and review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;Source and decision traceability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change history&lt;/td&gt;
&lt;td&gt;Headline revisions and corrections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident response&lt;/td&gt;
&lt;td&gt;Corrections and public explanations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance&lt;/td&gt;
&lt;td&gt;Editorial responsibility and oversight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance metrics&lt;/td&gt;
&lt;td&gt;Reach, trust, accuracy, and public value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Consider &lt;strong&gt;editorial observability&lt;/strong&gt;: retaining evidence for major claims, recording the provenance and context of photographs, and making substantive corrections visible.&lt;/p&gt;

&lt;p&gt;A hypothetical publishing record could look like this:&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;article&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;headline&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Protest&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Santiago"&lt;/span&gt;
  &lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;official_record&lt;/span&gt;
      &lt;span class="na"&gt;verified&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eyewitness&lt;/span&gt;
      &lt;span class="na"&gt;verified&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;media&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;provenance&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verified&lt;/span&gt;
    &lt;span class="na"&gt;context_review&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;completed&lt;/span&gt;
  &lt;span class="na"&gt;editorial&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;fact_check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;completed&lt;/span&gt;
    &lt;span class="na"&gt;corrections_visible&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 schema is illustrative, not a recognized industry standard. Such metadata cannot certify impartiality. It could, however, support more rigorous review and audits while protecting confidential sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Governance Is Already Evolving
&lt;/h2&gt;

&lt;p&gt;The EU's &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/digital-services-act-package" rel="noopener noreferrer"&gt;Digital Services Act&lt;/a&gt; requires very large online platforms to assess and mitigate certain systemic risks, including risks to fundamental rights and civic discourse.&lt;/p&gt;

&lt;p&gt;In Chile, &lt;a href="https://www.bcn.cl/leychile/navegar?idNorma=30214" rel="noopener noreferrer"&gt;Law 18.838&lt;/a&gt; establishes a television-regulation framework addressing human dignity and pluralism. Its scope is not identical to regulation of online platforms.&lt;/p&gt;

&lt;p&gt;Researchers are also studying &lt;strong&gt;value-aware news recommendation systems&lt;/strong&gt;: ranking approaches that consider journalistic values alongside immediate relevance or engagement.&lt;/p&gt;

&lt;p&gt;None of these offers a universal algorithm for truth. They do show that information quality must be addressed through system design, governance, and human judgment together.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. When Every Component Succeeds but Society Loses
&lt;/h2&gt;

&lt;p&gt;Imagine a newsroom where reporters are rewarded for speed, editors for audience growth, social teams for shares, and distribution algorithms for retention.&lt;/p&gt;

&lt;p&gt;Everyone may be following the rules. Yet the combined system can reward sensationalism over context.&lt;/p&gt;

&lt;p&gt;Engineers recognize the pattern: &lt;strong&gt;local optimization does not guarantee a desirable system-level outcome&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Fixing it requires more than asking individual journalists to be ethical. It requires examining incentives, workflows, metrics, review processes, and the effects of distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: What Are We Optimizing?
&lt;/h2&gt;

&lt;p&gt;Digital news is not simply journalism delivered through software. It is a sociotechnical system that helps construct the public's picture of reality.&lt;/p&gt;

&lt;p&gt;That system can expose injustice, support democratic debate, and inform communities. It can also reinforce fear, stereotypes, and hostility when its incentives and editorial practices favor those outcomes.&lt;/p&gt;

&lt;p&gt;A political-bias label alone will not solve this. Neither will a fact-check badge or a supposedly neutral recommendation algorithm.&lt;/p&gt;

&lt;p&gt;We need to understand how the system works, make important decisions traceable, and define success more carefully.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If a news platform maximizes engagement while undermining public understanding, is it succeeding or failing?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question belongs to journalists, editors, designers, platform operators, regulators, and software engineers alike.&lt;/p&gt;




&lt;h2&gt;
  
  
  References and Further Reading
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;McCombs, M. E., &amp;amp; Shaw, D. L. (1972). &lt;a href="https://doi.org/10.1086/267990" rel="noopener noreferrer"&gt;The Agenda-Setting Function of Mass Media&lt;/a&gt;. &lt;em&gt;Public Opinion Quarterly&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Entman, R. M. (1993). &lt;a href="https://doi.org/10.1111/j.1460-2466.1993.tb01304.x" rel="noopener noreferrer"&gt;Framing: Toward Clarification of a Fractured Paradigm&lt;/a&gt;. &lt;em&gt;Journal of Communication&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Cohen, S. (1972). &lt;em&gt;Folk Devils and Moral Panics&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Gerbner, G., &amp;amp; Gross, L. (1976). &lt;em&gt;Living with Television: The Violence Profile&lt;/em&gt;. &lt;em&gt;Journal of Communication&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Reuters Institute. &lt;a href="https://reutersinstitute.politics.ox.ac.uk/digital-news-report/2026/dnr-executive-summary" rel="noopener noreferrer"&gt;Digital News Report 2026&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.ivir.nl/publications/popularity-driven-metrics-audience-analytics-and-shifting-opinion-power-to-digital-platforms/" rel="noopener noreferrer"&gt;Popularity-driven Metrics: Audience Analytics and Shifting Opinion Power to Digital Platforms&lt;/a&gt; (2023). &lt;em&gt;Journalism Studies&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.gsb.stanford.edu/faculty-research/publications/how-do-social-media-feed-algorithms-affect-attitudes-behavior" rel="noopener noreferrer"&gt;How Do Social Media Feed Algorithms Affect Attitudes and Behavior?&lt;/a&gt; (2023). &lt;em&gt;Science&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://doi.org/10.1145/3654805" rel="noopener noreferrer"&gt;Where Are the Values? A Systematic Literature Review on News Recommender Systems&lt;/a&gt; (2024). &lt;em&gt;ACM&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ground.news" rel="noopener noreferrer"&gt;Ground News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://digital-strategy.ec.europa.eu/en/policies/digital-services-act-package" rel="noopener noreferrer"&gt;European Commission — Digital Services Act&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://reutersinstitute.politics.ox.ac.uk/news/guidelines-architecture-how-newsrooms-are-rethinking-ai-governance" rel="noopener noreferrer"&gt;Reuters Institute — From Guidelines to Architecture: AI Governance in Newsrooms&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;This article examines potential mechanisms and documented research, not a claim that all media outlets deliberately manipulate audiences or that algorithms determine individual beliefs.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>journalism</category>
      <category>technology</category>
      <category>architecture</category>
      <category>society</category>
    </item>
    <item>
      <title>The Buy Button Is the Easy Part: The Hidden World of E-Commerce in 2026</title>
      <dc:creator>Krlz</dc:creator>
      <pubDate>Sun, 25 Oct 2026 17:03:59 +0000</pubDate>
      <link>https://dev.to/krlz/the-buy-button-is-the-easy-part-an-e-commerce-field-guide-for-2026-541e</link>
      <guid>https://dev.to/krlz/the-buy-button-is-the-easy-part-an-e-commerce-field-guide-for-2026-541e</guid>
      <description>&lt;p&gt;Imagine an online store with a beautiful product page. A shopper clicks &lt;strong&gt;Buy Now&lt;/strong&gt;. It feels like one action.&lt;/p&gt;

&lt;p&gt;Behind the monitor, imagine a factory staffed by hundreds of tiny, overworked gnomes. One checks stock. Another calls a bank. Another argues with customs. One is trying to print a shipping label; another is shouting that the food batch has been recalled. The security gnome suspects the coupon is fraudulent. The tax gnome wants to know where the buyer lives. And a very nervous gnome is asking whether the payment actually went through.&lt;/p&gt;

&lt;p&gt;The customer sees a spinner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An online purchase is not a button. It is a promise coordinated across organizations that do not share a database, a clock, a legal system, or even a definition of success.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2026, AI can generate the storefront in hours. It cannot make the supply chain, financial ledger, product law, or incident response disappear.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Global patterns, with examples from the EU, US, Latin America, and cross-border trade. Laws differ by product, seller location, buyer destination, fulfillment route, and business model. This is an engineering and business primer, not jurisdiction-specific legal advice. The stories below are illustrative scenarios, not documented incidents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Your product chooses your architecture
&lt;/h2&gt;

&lt;p&gt;Two shops may use the same checkout and have radically different businesses.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you sell&lt;/th&gt;
&lt;th&gt;The hidden difficulty&lt;/th&gt;
&lt;th&gt;What software must remember&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fashion&lt;/td&gt;
&lt;td&gt;Size exchanges, seasonal stock, returns&lt;/td&gt;
&lt;td&gt;Variant-level SKUs, reservations, reverse logistics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Electronics&lt;/td&gt;
&lt;td&gt;Serial numbers, warranties, batteries, recalls&lt;/td&gt;
&lt;td&gt;Unit traceability, RMA, restricted shipping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Packaged food&lt;/td&gt;
&lt;td&gt;Allergens, expiry, imported ingredients&lt;/td&gt;
&lt;td&gt;Lots, FEFO, labeling, quarantine, recall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refrigerated food&lt;/td&gt;
&lt;td&gt;Time and temperature&lt;/td&gt;
&lt;td&gt;Cold-chain events, delivery windows, spoilage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cosmetics&lt;/td&gt;
&lt;td&gt;Ingredients and market-specific rules&lt;/td&gt;
&lt;td&gt;Claims, registration or notification where required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Digital goods&lt;/td&gt;
&lt;td&gt;Fraud, licenses, territorial rights&lt;/td&gt;
&lt;td&gt;Entitlements, activation, revocation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketplace&lt;/td&gt;
&lt;td&gt;Many sellers, one customer payment&lt;/td&gt;
&lt;td&gt;Seller onboarding, commissions, settlement ledger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subscriptions&lt;/td&gt;
&lt;td&gt;Renewals, cancellations, payment failures&lt;/td&gt;
&lt;td&gt;Mandates, billing cycles, dunning, consent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Scene: The T-shirt that existed but could not be sold.&lt;/strong&gt; A warehouse has 80 shirts. The site confidently displays “In stock.” Unfortunately, all 80 are size XL, while the buyer wants M. The inventory count is correct; the domain model is wrong.&lt;/p&gt;

&lt;p&gt;The first lesson is not about databases. &lt;strong&gt;It is about understanding what a sellable unit actually means.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A product can be physically present and legally unsellable
&lt;/h2&gt;

&lt;p&gt;Picture a merchant sourcing specialty coffee from one country and selling it in another. The cartons arrive. The website is ready. But importing, storing, labeling, and selling are distinct permissions and obligations.&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;United States&lt;/strong&gt;, the FDA explains that food importers are responsible for compliant, safe, properly labeled food, and relevant facilities and shipments may face registration, prior-notice, verification, and inspection requirements. FDA does not simply “pre-approve” every food importer or product. &lt;a href="https://www.fda.gov/importing-food-products-united-states" rel="noopener noreferrer"&gt;FDA guidance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;European Union&lt;/strong&gt;, the General Product Safety Regulation applies to many non-food consumer products sold online and offline, while food has its own extensive legal framework. The GPSR has applied since December 2024. &lt;a href="https://www.consilium.europa.eu/en/policies/product-safety-market-surveillance/" rel="noopener noreferrer"&gt;EU Council overview&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Latin America&lt;/strong&gt;, sanitary registration or authorization, labeling, importer responsibilities, invoicing, and consumer rules vary by country. A product approved for one market is not automatically approved for another.&lt;/p&gt;

&lt;p&gt;Therefore &lt;code&gt;quantity &amp;gt; 0&lt;/code&gt; is not a safe definition of availability:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Physical inventory
  ├─ in transit
  ├─ received, pending inspection
  ├─ quarantined / recalled
  ├─ legally cleared, available
  ├─ reserved for orders
  ├─ picked / dispatched
  └─ expired / damaged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For food, keep &lt;code&gt;lotId&lt;/code&gt;, expiry, allergens, supplier, storage conditions, and the connection between shipped lots and customers. &lt;strong&gt;FEFO&lt;/strong&gt; (first-expiring, first-out) can matter more than FIFO (first-in, first-out).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scene: The recall email.&lt;/strong&gt; A supplier reports contamination in lot &lt;code&gt;K-482&lt;/code&gt;. The business needs to identify which customers received it. If fulfillment only recorded the product SKU, not the shipped lot, the team may know &lt;em&gt;what&lt;/em&gt; was sold but not &lt;em&gt;to whom the risky units went&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is why compliance changes the data model, not just the terms-and-conditions page.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Cross-border e-commerce: the border is part of checkout
&lt;/h2&gt;

&lt;p&gt;Suppose a seller in São Paulo ships to Berlin, New York, and Mexico City. The same product can have different duties, indirect taxes, labeling requirements, returns expectations, and restrictions at each destination.&lt;/p&gt;

&lt;p&gt;A global commerce model must distinguish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Seller of record:&lt;/strong&gt; Who contracts with the buyer?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Importer of record:&lt;/strong&gt; Who is responsible for import formalities?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merchant of record:&lt;/strong&gt; Who accepts payment and assumes associated obligations?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incoterms / delivery terms:&lt;/strong&gt; Who bears shipping costs and risks at each stage?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tax jurisdiction:&lt;/strong&gt; Where does VAT, GST, sales tax, or a similar obligation arise?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product jurisdiction:&lt;/strong&gt; Is this item legally marketable at the destination?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These roles can overlap, but they are not interchangeable.&lt;/p&gt;

&lt;p&gt;The EU's &lt;strong&gt;OSS/IOSS&lt;/strong&gt; mechanisms simplify certain cross-border VAT reporting. In September 2026 the European Commission reported more than €125 billion collected through its e-commerce VAT schemes over five years. &lt;a href="https://taxation-customs.ec.europa.eu/news/eu-vat-rules-e-commerce-five-years-more-eur125-billion-vat-revenue-2026-09-03_en" rel="noopener noreferrer"&gt;European Commission&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The EU also introduced major 2026 customs changes affecting low-value e-commerce imports, with additional reforms scheduled later. A price engine that assumes last year's import threshold can become a financial liability. &lt;a href="https://taxation-customs.ec.europa.eu/customs/eu-customs-reform_en" rel="noopener noreferrer"&gt;EU customs reform&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the US, sales-tax obligations depend on states and nexus rules; marketplaces may have facilitator responsibilities. Across the world, tax and customs rules must be modeled as &lt;strong&gt;versioned, jurisdiction-dependent policies&lt;/strong&gt;, not a single hardcoded percentage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scene: Free shipping wasn't free.&lt;/strong&gt; The store offers a global flat rate. A heavy parcel crosses a customs threshold and requires special handling. The conversion dashboard celebrates; the margin dashboard quietly catches fire.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Revenue is not margin, and a payment is not cash
&lt;/h2&gt;

&lt;p&gt;Consider a hypothetical $100 order. The seller might owe consumption tax, pay for the item, fund shipping, pay a payment processor, acquire the customer through ads, and later handle a return. The merchant may not receive settlement until days after the order.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Contribution per order ≈
  net sales revenue (excluding applicable pass-through taxes)
  − landed product cost
  − payment and platform fees
  − packaging and fulfillment
  − shipping subsidy
  − expected refunds / returns / fraud losses
  − attributable acquisition cost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is contribution, not accounting profit. Fixed overhead, financing, income taxes, and other items remain.&lt;/p&gt;

&lt;p&gt;The CFO cares about &lt;strong&gt;cash conversion&lt;/strong&gt;; marketing watches &lt;strong&gt;CAC and conversion&lt;/strong&gt;; operations watches &lt;strong&gt;stockouts and returns&lt;/strong&gt;; engineering watches &lt;strong&gt;checkout reliability&lt;/strong&gt;. These metrics describe the same system from different angles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scene: The record-breaking loss.&lt;/strong&gt; A company doubles sales with aggressive discounts and free returns. Revenue rises; contribution falls. The software did exactly what it was told. The commercial assumptions were the bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The cart is a wish; the order is a commitment
&lt;/h2&gt;

&lt;p&gt;The words &lt;em&gt;cart&lt;/em&gt;, &lt;em&gt;quote&lt;/em&gt;, &lt;em&gt;order&lt;/em&gt;, &lt;em&gt;payment&lt;/em&gt;, &lt;em&gt;shipment&lt;/em&gt;, and &lt;em&gt;refund&lt;/em&gt; describe different states and responsibilities.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
  actor Customer
  participant Checkout
  participant Stock as Inventory
  participant PSP as Payment provider
  participant Orders
  participant Warehouse
  Customer-&amp;gt;&amp;gt;Checkout: Buy
  Checkout-&amp;gt;&amp;gt;Stock: Reserve units (with expiry)
  Stock--&amp;gt;&amp;gt;Checkout: Reservation confirmed
  Checkout-&amp;gt;&amp;gt;Orders: Create pending order
  Checkout-&amp;gt;&amp;gt;PSP: Create payment attempt
  PSP--&amp;gt;&amp;gt;Customer: Hosted payment flow
  PSP--&amp;gt;&amp;gt;Checkout: Signed webhook
  Checkout-&amp;gt;&amp;gt;PSP: Verify payment status
  Checkout-&amp;gt;&amp;gt;Orders: Confirm once (idempotent)
  Orders-&amp;gt;&amp;gt;Warehouse: Release for fulfillment&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The customer's browser returning to a success page is &lt;strong&gt;not proof of payment&lt;/strong&gt;. The backend must verify authoritative payment status, amount, currency, and order identity. See &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Third_Party_Payment_Gateway_Integration_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP payment integration guidance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scene: The spinner that cost $200.&lt;/strong&gt; A customer clicks Pay twice. The first response times out; the bank approved the charge. The second click creates another charge. You now have two payment attempts, one intended purchase, and a support ticket.&lt;/p&gt;

&lt;p&gt;Use idempotency keys, durable operation records, uniqueness constraints, and reconciliation. &lt;strong&gt;Exactly-once delivery is not something you should casually assume from an HTTP request or message broker.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The last item: where concurrency becomes customer service
&lt;/h2&gt;

&lt;p&gt;Two customers simultaneously buy the final pair of shoes. Both browsers previously read &lt;code&gt;available = 1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Naively reading, then decrementing, allows overselling. A reservation should be atomic, constrained by available stock, and expire if checkout is abandoned. The exact mechanism might be a conditional SQL update, locking, or a dedicated inventory service.&lt;/p&gt;

&lt;p&gt;But physical stock is messier than database stock: a warehouse worker can damage an item, a shop can sell it offline, or a return can be unsellable. A robust model distinguishes &lt;strong&gt;on-hand, reserved, allocated, damaged, and available-to-promise&lt;/strong&gt; quantities.&lt;/p&gt;

&lt;p&gt;The interesting design question is not “Can Redis make this faster?” It is &lt;strong&gt;“Which system is authoritative, and how does it recover when reality disagrees?”&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Sagas: a distributed transaction is a business story
&lt;/h2&gt;

&lt;p&gt;A saga coordinates multiple local transactions when one atomic database transaction cannot cover the whole workflow. A coordinator may orchestrate the steps, or services may react to events. Both approaches trade simplicity for flexibility and require careful state management. &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/saga" rel="noopener noreferrer"&gt;Microsoft's saga pattern&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scene: The order that cannot be un-shipped.&lt;/strong&gt; The customer pays, the warehouse dispatches, and then the seller learns the item was recalled. You cannot roll back a truck with &lt;code&gt;ROLLBACK;&lt;/code&gt;. You need a new process: stop delivery if possible, contact the customer, arrange a return or recall, refund appropriately, and preserve the audit trail.&lt;/p&gt;

&lt;p&gt;A refund is not the inverse of history. It is a new financial event. A shipment recall is not an inverse SQL operation. &lt;strong&gt;Compensation is a domain action&lt;/strong&gt;, sometimes requiring humans.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure&lt;/th&gt;
&lt;th&gt;Sensible recovery&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stock reservation fails&lt;/td&gt;
&lt;td&gt;Do not initiate payment; explain unavailability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment definitively declined&lt;/td&gt;
&lt;td&gt;Release reservation and close attempt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment outcome unknown&lt;/td&gt;
&lt;td&gt;Query provider, wait for verified events, reconcile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shipment creation fails after payment&lt;/td&gt;
&lt;td&gt;Retry safely, change carrier, or initiate exception workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product recalled after dispatch&lt;/td&gt;
&lt;td&gt;Trace affected shipments, initiate recall and customer response&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Don't introduce a saga because the architecture diagram looks impressive. Introduce it when real transactional boundaries and business recovery requirements justify the complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Circuit breakers protect services, not business truth
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;timeout&lt;/strong&gt; bounds waiting. &lt;strong&gt;Retries with exponential backoff and jitter&lt;/strong&gt; help with transient failures. A &lt;strong&gt;circuit breaker&lt;/strong&gt; stops hammering an unhealthy dependency. A &lt;strong&gt;bulkhead&lt;/strong&gt; limits how much of your system one failing dependency can consume.&lt;/p&gt;

&lt;p&gt;None of these patterns can tell you whether an ambiguous card charge actually succeeded.&lt;/p&gt;

&lt;p&gt;Combine resilience mechanisms with verified webhooks, deduplication, transactional outbox where needed, dead-letter handling, audit trails, and reconciliation. OWASP emphasizes signature verification, replay protection, idempotent handlers, and safe treatment of out-of-order events. &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Webhook_Security_Cheat_Sheet.html" rel="noopener noreferrer"&gt;Webhook Security Cheat Sheet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scene: The helpful retry storm.&lt;/strong&gt; A shipping API slows down. Every worker retries immediately. Traffic multiplies, the provider slows further, and unrelated checkouts begin to time out. The system wasn't attacked; it attacked itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Security means defending commercial invariants
&lt;/h2&gt;

&lt;p&gt;TLS and authentication are the beginning, not the end. Think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Price tampering:&lt;/strong&gt; the browser must never define the authoritative total.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broken object-level authorization:&lt;/strong&gt; customer A must not see customer B's orders or addresses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coupon abuse:&lt;/strong&gt; promotions need transactional eligibility and redemption limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook forgery/replay:&lt;/strong&gt; external notifications need verified provenance and idempotent effects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credential stuffing:&lt;/strong&gt; rate limiting, bot defenses, and appropriate MFA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensitive data:&lt;/strong&gt; minimize collection, control retention, encrypt appropriately, and restrict access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Card data:&lt;/strong&gt; hosted/tokenized payment flows can reduce PCI DSS exposure, but integration and compliance scope still require assessment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Privacy requirements differ internationally: GDPR in the EU, a patchwork of federal/state rules in the US, LGPD in Brazil, and other national frameworks. Design for consent or other lawful bases where relevant, data subject rights, retention, breach response, and cross-border transfers—not just a cookie banner.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Consumer protection and returns are product features
&lt;/h2&gt;

&lt;p&gt;A returns policy is not just a paragraph in the footer. It requires eligibility rules, labels, warehouse inspection, replacement or refund decisions, inventory disposition, tax adjustments, and support communication.&lt;/p&gt;

&lt;p&gt;The EU has distance-selling consumer protections and platform obligations; the US has a different mix of federal and state consumer rules; other countries have their own withdrawal, warranty, and refund frameworks. &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/e-commerce-rules-eu" rel="noopener noreferrer"&gt;European Commission e-commerce overview&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scene: The refund button that does nothing.&lt;/strong&gt; Support marks an order &lt;code&gt;REFUNDED&lt;/code&gt;. Finance sees no corresponding processor transaction. The customer sees no money. A status label is not a financial operation.&lt;/p&gt;

&lt;p&gt;Model &lt;strong&gt;requested&lt;/strong&gt;, &lt;strong&gt;approved&lt;/strong&gt;, &lt;strong&gt;submitted&lt;/strong&gt;, &lt;strong&gt;settled&lt;/strong&gt;, and &lt;strong&gt;failed&lt;/strong&gt; refund states when the provider supports those distinctions. Reconcile against the payment processor and settlement records.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Marketplaces are not just stores with more products
&lt;/h2&gt;

&lt;p&gt;A marketplace introduces multiple parties: buyer, seller, platform, payment provider, carrier, and sometimes tax authorities. The platform may need identity verification, seller eligibility checks, payout schedules, reserves, dispute management, and a ledger that explains who owns each cent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scene: One order, three sellers.&lt;/strong&gt; A buyer pays $120 for items from three merchants. One cancels, one ships late, and one disputes a fee. A single &lt;code&gt;orders.total&lt;/code&gt; field cannot explain the resulting refunds, commissions, shipping adjustments, and payouts.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;double-entry-style financial ledgers&lt;/strong&gt;, explicit obligations, and durable event histories become valuable. A database table called &lt;code&gt;transactions&lt;/code&gt; is not automatically an accounting system.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Build or buy? The AI-era trap
&lt;/h2&gt;

&lt;p&gt;In 2026, AI-assisted development can generate a storefront, cart, admin panel, and integration scaffolding quickly. It cannot validate supplier reliability, write your return policy for every market, own the on-call rotation, or prove that your ledger reconciles.&lt;/p&gt;

&lt;p&gt;For many businesses, &lt;strong&gt;Shopify, WooCommerce, or another maintained commerce platform&lt;/strong&gt; is a better starting point than a custom distributed system. Build differentiated components when the business genuinely requires unusual inventory, pricing, fulfillment, marketplace settlement, or integrations.&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;Default posture&lt;/th&gt;
&lt;th&gt;Reason to evolve&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Test demand&lt;/td&gt;
&lt;td&gt;Hosted platform and proven payment integrations&lt;/td&gt;
&lt;td&gt;Need evidence that anyone wants the product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational complexity&lt;/td&gt;
&lt;td&gt;Modular monolith, relational DB, background jobs&lt;/td&gt;
&lt;td&gt;Workflows exceed platform capabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple independent domains&lt;/td&gt;
&lt;td&gt;Selective services, messaging, sagas, tracing&lt;/td&gt;
&lt;td&gt;Independent ownership and scaling justify overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global platform&lt;/td&gt;
&lt;td&gt;Regional compliance, multi-warehouse, ledger, governance&lt;/td&gt;
&lt;td&gt;Organization and business complexity demand it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There is no magic customer-count threshold for microservices. &lt;strong&gt;Complexity is earned by the problem, not awarded by traffic forecasts.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  13. What should a healthy commerce system measure?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Checkout conversion and abandonment&lt;/td&gt;
&lt;td&gt;Commercial friction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p95 checkout/payment latency&lt;/td&gt;
&lt;td&gt;Repeated clicks and failed conversions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oversell / reservation conflicts&lt;/td&gt;
&lt;td&gt;Broken promises&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid but unconfirmed orders&lt;/td&gt;
&lt;td&gt;Financial and customer risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unreconciled settlements&lt;/td&gt;
&lt;td&gt;Cash and accounting uncertainty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orders past promised dispatch date&lt;/td&gt;
&lt;td&gt;Fulfillment quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Return rate and contribution margin&lt;/td&gt;
&lt;td&gt;Actual unit economics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall traceability coverage&lt;/td&gt;
&lt;td&gt;Ability to protect customers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Correlate &lt;code&gt;cartId&lt;/code&gt;, &lt;code&gt;quoteId&lt;/code&gt;, &lt;code&gt;orderId&lt;/code&gt;, &lt;code&gt;paymentAttemptId&lt;/code&gt;, &lt;code&gt;shipmentId&lt;/code&gt;, and, where relevant, &lt;code&gt;lotId&lt;/code&gt;. Logs must avoid unnecessary personal and payment data.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. The tabletop exercise that reveals the architecture
&lt;/h2&gt;

&lt;p&gt;Try this with engineering, finance, operations, and support:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A customer in Germany buys the last two bags of imported coffee from a cross-border seller. The payment provider times out but later confirms the charge. The webhook arrives twice. The warehouse then quarantines the lot. A tax document has been issued. The customer demands a refund. Who owns the decision, which systems must change, and what evidence proves that the customer got their money back?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A good answer names authoritative states, legal and operational responsibilities, idempotency, compensation, reconciliation, customer communication, and a human owner. “We use Kafka” is not an answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing: the real product begins after Pay
&lt;/h2&gt;

&lt;p&gt;An online purchase is a promise made by a business and implemented through software. That promise has to survive imperfect data, failed dependencies, customs borders, product restrictions, accounting realities, and human mistakes.&lt;/p&gt;

&lt;p&gt;The cheerful &lt;strong&gt;Buy Now&lt;/strong&gt; button is easy to draw. The gnomes behind the screen are doing the real work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Primary sources and further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://digital-strategy.ec.europa.eu/en/policies/e-commerce-rules-eu" rel="noopener noreferrer"&gt;European Commission — e-commerce rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.consilium.europa.eu/en/policies/product-safety-market-surveillance/" rel="noopener noreferrer"&gt;EU Council — General Product Safety Regulation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://taxation-customs.ec.europa.eu/news/eu-vat-rules-e-commerce-five-years-more-eur125-billion-vat-revenue-2026-09-03_en" rel="noopener noreferrer"&gt;European Commission — EU VAT e-commerce schemes, September 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://taxation-customs.ec.europa.eu/customs/eu-customs-reform_en" rel="noopener noreferrer"&gt;European Commission — EU customs reform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fda.gov/importing-food-products-united-states" rel="noopener noreferrer"&gt;FDA — Importing food into the United States&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wto.org/english/news_e/news26_e/jsec_09jun26_414_e.htm" rel="noopener noreferrer"&gt;WTO — E-commerce agreement implementation discussions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/saga" rel="noopener noreferrer"&gt;Microsoft — Saga design pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Third_Party_Payment_Gateway_Integration_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP — Third-party payment gateway integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Webhook_Security_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP — Webhook security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;All scenes are fictional examples designed to illustrate recurring business and engineering failure modes.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>startup</category>
    </item>
    <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>
  </channel>
</rss>
