<?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: Shubham</title>
    <description>The latest articles on DEV Community by Shubham (@shubham399).</description>
    <link>https://dev.to/shubham399</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%2F366471%2F5ee5ca23-114c-4498-86ed-33a9db44c8a9.png</url>
      <title>DEV Community: Shubham</title>
      <link>https://dev.to/shubham399</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shubham399"/>
    <language>en</language>
    <item>
      <title>The Disconnected Edge: How We Solved In-Flight Data Sync at 35,000 Feet</title>
      <dc:creator>Shubham</dc:creator>
      <pubDate>Sun, 14 Jun 2026 01:55:15 +0000</pubDate>
      <link>https://dev.to/shubham399/the-disconnected-edge-how-we-solved-in-flight-data-sync-at-35000-feet-4baf</link>
      <guid>https://dev.to/shubham399/the-disconnected-edge-how-we-solved-in-flight-data-sync-at-35000-feet-4baf</guid>
      <description>&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%2Fimagedelivery.net%2FlLmNeOP7HXG0OqaG97wimw%2F95a7ced4-fd82-4716-a6d0-b434f9e2b1f7%2Fc284cbf6-34da-45e1-9dd7-2e603987826a.png%2Fpublic" 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%2Fimagedelivery.net%2FlLmNeOP7HXG0OqaG97wimw%2F95a7ced4-fd82-4716-a6d0-b434f9e2b1f7%2Fc284cbf6-34da-45e1-9dd7-2e603987826a.png%2Fpublic" width="1152" height="768"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When most engineers think about rolling out a modern streaming or web application, they visualize a standard cloud-native environment: a global CDN, elastic load balancers, and a continuous pipeline pushing updates to infinite resources.&lt;/p&gt;

&lt;p&gt;But what happens when your deployment target is an isolated, battery-powered hardware device flying inside a metal tube at 35,000 feet?&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://airfi.aero" rel="noopener noreferrer"&gt;AirFi&lt;/a&gt;, operating a next-generation In-Flight Entertainment (IFE) platform forced us to completely rethink modern web architecture. When you lack a persistent, high-bandwidth connection to AWS, the cloud can no longer be your source of immediate truth. Instead, you are forced to conquer the ultimate disconnected edge problem.&lt;/p&gt;

&lt;p&gt;Here is how we designed a hybrid, localized infrastructure to keep our systems updated without consuming precious in-flight bandwidth.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture: Hanger-Based Edge Proxies
&lt;/h3&gt;

&lt;p&gt;Instead of trying to fight the high cost and extreme latency of satellite internet mid-flight to update heavy media content (like Hollywood movies, music, or web apps), we shifted our synchronization strategy entirely to the ground.&lt;/p&gt;

&lt;p&gt;However, passenger gates are chaotic, and standard airport tarmac Wi-Fi is notoriously unreliable. To guarantee data integrity, we integrated our sync cycles into the aircraft's routine service windows, targeting two specific ground locations: &lt;strong&gt;airline plane hangers&lt;/strong&gt; and &lt;strong&gt;catering/food hangers&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
[ AWS Cloud Backend ]
        │
        ▼ (Over the Internet)
[ Hanger Content Proxy (Local Cache) ]
        │
        ▼ (High-Speed Local Wi-Fi)
[ Onboard Portable IFE Box ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We deployed localized &lt;strong&gt;Content Proxies&lt;/strong&gt; directly inside these hangers. These proxies acted as high-speed regional caches that pulled down global updates directly from AWS ahead of time. When an aircraft docked in or near the hanger for cleaning, catering, or maintenance, the portable IFE hardware automatically associated with the hanger’s dedicated high-speed Wi-Fi network to ingest the updates locally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Atomic, Split-Manifest Synchronization
&lt;/h3&gt;

&lt;p&gt;Even on a high-speed hanger network, turnaround windows can be unpredictably cut short. If a plane is pushed out early, a naive file-transfer system would result in corrupted movie files or broken application states.&lt;/p&gt;

&lt;p&gt;To solve this, we decoupled our data ingestion pipeline into two distinct layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Content Manifest as the Ultimate Source of Truth:&lt;/strong&gt; Rather than downloading a giant, opaque payload, the onboard device initially prioritized pulling down a highly compressed, lightweight &lt;strong&gt;Content Manifest&lt;/strong&gt;. This file detailed the precise global state, directory layout, dependency tree, and cryptographic hashes of every single asset the device was required to hold for its next flight lifecycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sequential Atomic Downloads:&lt;/strong&gt; Armed with the manifest, our synchronization engine didn't try to download everything at once. It processed assets sequentially and atomically—downloading and verifying exactly one manifest item at a time (e.g., syncing a single movie completely, writing it to disk, verifying its hash, and then moving onto the web application assets).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the device lost connection mid-sync because the plane was moving, previously completed assets remained 100% intact, validated, and ready for use.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hybrid Layer: GSM Failover for Critical Telemetry
&lt;/h3&gt;

&lt;p&gt;While transferring gigabytes of media assets was strictly gated to high-speed hanger Wi-Fi networks, certain data points couldn't wait for a hanger turnaround. Passenger usage analytics, digital menu transaction logs, and urgent system configuration overrides needed a faster loop back to our core backend.&lt;/p&gt;

&lt;p&gt;For this mission-critical data, we built a hybrid networking layer that utilized &lt;strong&gt;GSM (cellular) networks&lt;/strong&gt;. The moment the aircraft touched down on the tarmac anywhere in the world and a cellular signal became available, the device spun up its GSM module to securely offload encrypted telemetry and pull down vital system updates.&lt;/p&gt;

&lt;p&gt;By separating heavy media from critical operational telemetry, we ensured that our data loops remained low-latency and cost-effective, proving that navigating the edge isn't about having a constant connection—it's about making the absolute most of the connections you have.&lt;/p&gt;

</description>
      <category>edgecomputing</category>
    </item>
    <item>
      <title>Turning Your AI Into an Adversarial Security Agent: The SKILLS.md Framework</title>
      <dc:creator>Shubham</dc:creator>
      <pubDate>Sun, 07 Jun 2026 09:18:06 +0000</pubDate>
      <link>https://dev.to/shubham399/turning-your-ai-into-an-adversarial-security-agent-the-skillsmd-framework-2058</link>
      <guid>https://dev.to/shubham399/turning-your-ai-into-an-adversarial-security-agent-the-skillsmd-framework-2058</guid>
      <description>&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%2Fimagedelivery.net%2FlLmNeOP7HXG0OqaG97wimw%2F95a7ced4-fd82-4716-a6d0-b434f9e2b1f7%2F3f9a92b5-1a1a-4de4-ab07-e5b347d1b179.png%2Fpublic" 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%2Fimagedelivery.net%2FlLmNeOP7HXG0OqaG97wimw%2F95a7ced4-fd82-4716-a6d0-b434f9e2b1f7%2F3f9a92b5-1a1a-4de4-ab07-e5b347d1b179.png%2Fpublic"&gt;&lt;/a&gt;A continuation of: &lt;a href="https://www.shubhkumar.in/blogs/breaking-to-build-how-ctf-and-bug-bounty-hunting-rewires-system-design" rel="noopener noreferrer"&gt;&lt;em&gt;Breaking to Build: How CTF and Bug Bounty Hunting Rewires System Design&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my previous article, I explored how offensive security permanently changes the way engineers think about systems. Once you've spent enough time exploiting race conditions, bypassing authorization boundaries, abusing SSRF chains, and breaking assumptions hidden deep inside application logic, you stop viewing software as a collection of features.&lt;/p&gt;

&lt;p&gt;You start viewing it as an &lt;strong&gt;attack surface&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That shift fundamentally changes how you design production systems. The problem is that modern software development is no longer purely human-driven. Today, a massive percentage of engineering work happens alongside AI coding assistants. Tools now generate thousands of lines of code faster than most engineers can review them.&lt;/p&gt;

&lt;p&gt;And that introduces a brand new problem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI systems are optimized for one thing:&lt;/strong&gt; Generate code that works.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Attackers are optimized for something completely different:&lt;/strong&gt; Find code that breaks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That difference matters. A generated API endpoint might pass every functional test while still exposing a devastating BOLA (Broken Object Level Authorization) vulnerability. A generated webhook handler might function perfectly while allowing SSRF into your internal infrastructure. A generated payment workflow might appear correct while collapsing into a double-spend condition under concurrent execution.&lt;/p&gt;

&lt;p&gt;The code works. The architecture fails. And that is exactly where real-world vulnerabilities are born.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Missing Layer in AI-Assisted Development
&lt;/h2&gt;

&lt;p&gt;Most teams currently treat AI coding agents like extremely fast junior engineers. They give them instructions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;"Build this feature"&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;"Refactor this service"&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;"Create this migration"&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model responds by optimizing for correctness, readability, and implementation speed. Security is rarely treated as a first-class objective.&lt;/p&gt;

&lt;p&gt;Most AI systems are never explicitly taught to think like attackers. They are taught how software &lt;em&gt;should&lt;/em&gt; behave; they are not taught how software is &lt;em&gt;abused&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That distinction becomes increasingly dangerous as organizations move toward autonomous code generation, AI-assisted architecture, and agentic development workflows.&lt;/p&gt;

&lt;p&gt;The solution turns out to be surprisingly simple: instead of prompting for features alone, we inject a persistent security reasoning framework directly into the agent's operating context.&lt;/p&gt;

&lt;p&gt;That framework is &lt;strong&gt;SKILLS.md&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Is SKILLS.md?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;SKILLS.md&lt;/code&gt; is a structured operational framework that teaches an AI agent how to evaluate software through an adversarial lens. It is not a prompt, a simple checklist, or another copy-paste of the OWASP Top 10. It is a behavioral framework that continuously pushes the model to ask &lt;strong&gt;"How would an attacker abuse this?"&lt;/strong&gt; &lt;em&gt;before&lt;/em&gt; it asks &lt;strong&gt;"How do I implement this?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal is to transplant the mindset developed through years of CTF competitions, bug bounty hunting, and incident response directly into the AI’s reasoning process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Traditional Security Checklists Fail
&lt;/h3&gt;

&lt;p&gt;Most security documentation focuses on known vulnerability categories (XSS, SQLi, CSRF, SSRF, IDOR). These are important, but attackers rarely think in categories. &lt;strong&gt;They think in assumptions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every vulnerability exists because somebody assumed something was true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;The frontend won't send invalid values.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Only authenticated users can reach this endpoint.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;This request executes once at a time.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Nobody can access that internal network.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bug bounty hunting teaches you something uncomfortable: assumptions are where systems fail. Security is often less about blocking payloads and more about eliminating dangerous assumptions. &lt;code&gt;SKILLS.md&lt;/code&gt; is built entirely around that philosophy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Evolution From Builder To Breaker
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Traditional Engineering:
Requirement ──&amp;gt; Implementation ──&amp;gt; Testing ──&amp;gt; Deployment

Security-Oriented Engineering:
Requirement ──&amp;gt; Implementation ──&amp;gt; Abuse Analysis ──&amp;gt; Boundary Verification ──&amp;gt; Concurrency Analysis ──&amp;gt; Deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first workflow asks: &lt;em&gt;Does this feature work?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The second asks: &lt;em&gt;What happens when somebody intentionally tries to break it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SKILLS.md&lt;/code&gt; forces AI agents into the second mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Specifications: SKILLS.md
&lt;/h2&gt;

&lt;p&gt;Modern AI tools and tools like &lt;strong&gt;Claude Code&lt;/strong&gt; have evolved past static, single-file home directory configurations. They utilize the &lt;strong&gt;Agent Skills Standard&lt;/strong&gt;, which relies on a nested folder footprint (&lt;code&gt;skills/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/code&gt;) and mandatory &lt;strong&gt;YAML frontmatter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The frontmatter contains semantic metadata. When you start an AI session, the engine scans the &lt;code&gt;description&lt;/code&gt; block to automatically determine &lt;em&gt;when&lt;/em&gt; to pull this skill into context.&lt;/p&gt;

&lt;p&gt;Here is the production-ready implementation file.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;security-review&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Evaluates&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;software&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;architecture&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;through&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;an&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;adversarial&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;lens.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Automatically&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;invokes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;when&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generating&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;APIs,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;designing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;features,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;reviewing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;managing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;authentication,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;state,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;boundaries."&lt;/span&gt;
&lt;span class="na"&gt;user-invocable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Agent Skill: Security-First System Architecture (Breaking to Build)&lt;/span&gt;

&lt;span class="gu"&gt;## Purpose&lt;/span&gt;
This skill transforms the agent from a feature implementation assistant into a security-focused architectural reviewer. The objective is to continuously evaluate whether a design remains resilient under adversarial conditions.

Every system is evaluated from two perspectives:
&lt;span class="p"&gt;1.&lt;/span&gt; Functional correctness — Does it work?
&lt;span class="p"&gt;2.&lt;/span&gt; Adversarial resilience — How can it be abused, bypassed, or broken?
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## Core Philosophical Directive&lt;/span&gt;
Assume: Inputs are malicious, clients are untrusted, networks are hostile, dependencies may be compromised, and internal services are untrusted. Never trust; always verify at the point of execution.
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gh"&gt;# Exploitation Mindset → Resilient Architecture Matrix&lt;/span&gt;

&lt;span class="gu"&gt;### 1. State Isolation vs Race Conditions&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Exploitation:**&lt;/span&gt; Attackers exploit concurrent execution paths to double-spend balances, redeem coupons multiple times, or bypass inventory thresholds.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Requirements:**&lt;/span&gt; Enforce ACID transactions, row-level locking (&lt;span class="sb"&gt;`SELECT ... FOR UPDATE`&lt;/span&gt;), or distributed locks where required. Never rely on request timing assumptions.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Core Question:**&lt;/span&gt; &lt;span class="ge"&gt;*Can the same operation succeed twice if executed simultaneously?*&lt;/span&gt;

&lt;span class="gu"&gt;### 2. Explicit Authorization vs BOLA / IDOR&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Exploitation:**&lt;/span&gt; Modifying resource identifiers (e.g., &lt;span class="sb"&gt;`/api/users/1002`&lt;/span&gt;) to access unauthorized tenant data.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Requirements:**&lt;/span&gt; Decouple Authentication from Authorization. Force ownership validation directly at the data access layer. Never assume an authenticated user has access to all identifiers.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Core Question:**&lt;/span&gt; &lt;span class="ge"&gt;*What changes if the resource identifier changes?*&lt;/span&gt;

&lt;span class="gu"&gt;### 3. Deterministic Routing vs SSRF&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Exploitation:**&lt;/span&gt; User-controlled URLs triggering backend requests toward cloud metadata (&lt;span class="sb"&gt;`169.254.169.254`&lt;/span&gt;), internal container networks, or private admin panels.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Requirements:**&lt;/span&gt; Strict domain allowlists, network segmentation, outbound network proxies, and strict protocol restrictions. Never trust regex alone.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Core Question:**&lt;/span&gt; &lt;span class="ge"&gt;*Who ultimately controls destination routing?*&lt;/span&gt;

&lt;span class="gu"&gt;### 4. Canonical Resource Access vs Path Traversal&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Exploitation:**&lt;/span&gt; Path manipulation (&lt;span class="sb"&gt;`../../etc/passwd`&lt;/span&gt;) to escape intended local storage or file directories.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Requirements:**&lt;/span&gt; Use UUID object identifiers, decoupled cloud object storage, or strict canonical path resolution. Never trust raw user-controlled filesystem paths.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Core Question:**&lt;/span&gt; &lt;span class="ge"&gt;*Can users directly influence local file system paths?*&lt;/span&gt;

&lt;span class="gu"&gt;### 5. Blast Radius Reduction&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Exploitation:**&lt;/span&gt; Horizontal and vertical privilege expansion following an initial single-service or container compromise.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Requirements:**&lt;/span&gt; Enforce non-root containers, minimal Linux capabilities, least-privilege cloud IAM, scoped credentials, and network micro-segmentation.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Core Question:**&lt;/span&gt; &lt;span class="ge"&gt;*If this specific service is fully compromised, what else becomes reachable?*&lt;/span&gt;

&lt;span class="gu"&gt;### 6. Fail-Closed Security Controls&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Exploitation:**&lt;/span&gt; Exploiting undefined states where validation exceptions or errors allow execution to continue by default.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Requirements:**&lt;/span&gt; The default fallback state of any conditional check or exception catch block must be a hard &lt;span class="sb"&gt;`DENY`&lt;/span&gt;.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Core Question:**&lt;/span&gt; &lt;span class="ge"&gt;*What happens to system access if a code validation error occurs?*&lt;/span&gt;

&lt;span class="gu"&gt;### 7. Secrets and Cryptographic Isolation&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Exploitation:**&lt;/span&gt; Leaking persistent credentials via standard outputs, application logs, build system environment outputs, or source code management repositories.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Requirements:**&lt;/span&gt; Use external Secret Managers, automated key rotation, secure pseudo-random generators, and ephemeral execution credentials.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Core Question:**&lt;/span&gt; &lt;span class="ge"&gt;*Can this credential survive an active infrastructure compromise?*&lt;/span&gt;

&lt;span class="gu"&gt;### 8. Supply Chain Security&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Exploitation:**&lt;/span&gt; Malicious code updates introduced silently via compromised third-party package ecosystems.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Requirements:**&lt;/span&gt; Strict dependency pinning, cryptographic lockfiles, package signature verification, and a minimal external dependency footprint.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Core Question:**&lt;/span&gt; &lt;span class="ge"&gt;*What third-party code executes that we do not explicitly own or audit?*&lt;/span&gt;

&lt;span class="gu"&gt;### 9. Event-Driven Integrity&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Exploitation:**&lt;/span&gt; State corruption through message replays, duplicate webhooks, out-of-order queue events, or malicious message retries.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Requirements:**&lt;/span&gt; Enforce idempotent processing states, cryptographic event signatures, and isolated dead-letter queue fault handling.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Core Question:**&lt;/span&gt; &lt;span class="ge"&gt;*Can replaying an event alter the existing database state?*&lt;/span&gt;

&lt;span class="gu"&gt;### 10. AI and LLM Security Controls&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Exploitation:**&lt;/span&gt; Direct or indirect prompt injection causing unauthorized execution or data leakage via agentic tool use.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Requirements:**&lt;/span&gt; Treat all model outputs as untrusted data inputs. Enforce explicit tool-level authorization gateways, strict output schemas, and mandatory human-in-the-loop validation for privileged actions.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Core Question:**&lt;/span&gt; &lt;span class="ge"&gt;*What authorization boundaries exist between the model's output and execution layer?*&lt;/span&gt;
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## Agent Verification Protocol&lt;/span&gt;
Whenever reviewing or modifying system architecture, sequentially process these tasks:
&lt;span class="p"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**Deconstruct Trust:**&lt;/span&gt; Map out all input boundaries and strip assumptions of inherent safety.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Analyze Concurrency:**&lt;/span&gt; Evaluate execution state changes under parallel or overlapping conditions.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Inspect Boundaries:**&lt;/span&gt; Confirm authorization is validated sequentially on every request layer.
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Review Privileges:**&lt;/span&gt; Apply the principle of least privilege to access management.
&lt;span class="p"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**Simulate Full Compromise:**&lt;/span&gt; Map the potential blast radius assuming this logic is broken.

&lt;span class="ge"&gt;*Final Constraint: The target is not to write code that works under perfect conditions. The target is to build software that continues behaving predictably when an adversary is actively attempting to shatter it.*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installation Guide
&lt;/h2&gt;

&lt;p&gt;To ensure your AI assistant picks up this framework without breaking file path scopes, use the explicit terminal setups below depending on your favorite environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Claude Code
&lt;/h3&gt;

&lt;p&gt;Claude Code evaluates configurations from your global home configuration space (&lt;code&gt;~/.claude&lt;/code&gt;) or local workspaces (&lt;code&gt;.claude&lt;/code&gt;).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Global Installation&lt;/strong&gt; &lt;em&gt;(Applies across all code repositories on your machine without altering git states)&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;Bash&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p ~/.claude/skills/security-review
# Save the Markdown block above into this file:
nano ~/.claude/skills/security-review/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;**&lt;/span&gt;Project-Specific Installation&lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Committed directly into git to enforce security rules across the whole engineering team&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
  mkdir -p .claude/skills/security-review&lt;br&gt;
  nano .claude/skills/security-review/SKILL.md&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
### 2\. Cursor (and custom IDEs)

Cursor indexes markdown definitions gracefully via workspace indexing or dedicated custom instructions.

Bash

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
shell&lt;br&gt;
mkdir -p .cursor/skills/security-review&lt;br&gt;
nano .cursor/skills/security-review/SKILL.md&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
_(Alternatively, you can save it as a top-level_ `SKILLS.md` _file in your root workspace)._

### 3\. Orchestrated Agent Frameworks (CrewAI / LangGraph)

For autonomous multi-agent pipelines, pass the file directly as system background data inside your orchestration configuration:

YAML

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
yaml&lt;br&gt;
agent:&lt;br&gt;
  role: Adversarial Security Auditor&lt;br&gt;
  backstory: You analyze architectural code changes strictly through the lens of SKILLS.md rules.&lt;br&gt;
  instructions:&lt;br&gt;
    - Ingest the custom SKILLS.md baseline constraints.&lt;br&gt;
    - Check every generated code route against Concurrency and Trust Boundaries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## How to Use the Framework

Once installed, you don’t need to repeatedly copy-paste security prompts. The framework leverages both passive and active execution behaviors.

### Method A: Automated Semantic Triggering (Passive Mode)

Because the custom frontmatter contains a deep `description` string, the AI continuously evaluates your inputs. If you type a standard prompt that crosses defensive boundaries, the engine auto-activates the skill behind the scenes.

*   **Your Prompt:** _"Write an endpoint that takes a user's uploaded image URL, downloads it, and processes metadata."_

*   **The AI's Internal Action:** The engine intercepts words like _URL_ and _downloads_. It auto-loads `security-review` from disk, catches the **SSRF / Deterministic Routing** rule, and adds domain validation code before outputting the feature.


### Method B: Manual Slash Invocation (Active Mode)

If you want to explicitly mandate an application review, call the skill directly via standard interface paths.

*   **In Claude Code:** Use the custom command shortcut directly inside your terminal session:

    Bash

    ```


    /security-review Review our new database migration file for potential data isolation vulnerabilities.


    ```


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In Cursor Composer:&lt;/strong&gt; Force index mapping by targeting the file handle directly inside the chat bar:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Please build out our stripe payment callback router following the criteria defined in @SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real-World Transformations: Before and After
&lt;/h2&gt;

&lt;p&gt;When &lt;code&gt;SKILLS.md&lt;/code&gt; is active, the agent stops acting like a passive code generator and starts acting like an unyielding architecture reviewer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: Payment Balance Deduction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Without SKILLS.md:&lt;/strong&gt; The user asks for a simple point redemption function. The AI generates a standard &lt;code&gt;SELECT balance&lt;/code&gt; followed by an &lt;code&gt;UPDATE balance&lt;/code&gt; sequence. It looks clean, passes unit tests, but immediately falls to a race condition exploit when a user executes parallel curl requests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;With SKILLS.md:&lt;/strong&gt; The agent's internal reasoning detects a state change trigger. It forces the SQL generation to include row-level isolation via &lt;code&gt;SELECT ... FOR UPDATE&lt;/code&gt; or requires a strict &lt;code&gt;Idempotency-Key&lt;/code&gt; header transaction check.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example: User-Configured Webhooks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Without SKILLS.md:&lt;/strong&gt; The user prompts the AI to build an outbound webhook engine so users can get alerts. The AI uses a simple Axios/Fetch call passing the target parameter. An attacker signs up, sets their webhook to &lt;code&gt;[http://169.254.169.254/latest/meta-data/](http://169.254.169.254/latest/meta-data/)&lt;/code&gt;, and extracts cloud infrastructure IAM keys.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;With SKILLS.md:&lt;/strong&gt; The agent flags the user-controlled URL routing pattern. It refuses to output the code until it builds an accompanying domain allowlist check, wraps the execution in an isolated egress proxy, or isolates the protocol rules.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bigger Shift
&lt;/h2&gt;

&lt;p&gt;Today, engineers review AI-generated code. Tomorrow, AI systems will review AI-generated code. Eventually, entire engineering workflows will become completely autonomous.&lt;/p&gt;

&lt;p&gt;When that happens, security can no longer exist as an afterthought or a final manual compliance checklist performed at the tail end of a sprint. It has to become a core property of the AI's internal reasoning loop.&lt;/p&gt;

&lt;p&gt;AI does not automatically inherit security instincts. It inherits whatever mental models we explicitly give it. If you train an AI to think only like an engineer, it will build systems. If you train it to think like an attacker, it will help you build &lt;strong&gt;resilient&lt;/strong&gt; systems.&lt;/p&gt;

&lt;p&gt;The future belongs to the teams that can do both. Secure software is not created by accident; it is forged when someone spends enough time thinking about how it breaks first.&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
    </item>
    <item>
      <title>Breaking to Build: How CTF and Bug Bounty Hunting Rewires System Design</title>
      <dc:creator>Shubham</dc:creator>
      <pubDate>Sun, 31 May 2026 18:50:37 +0000</pubDate>
      <link>https://dev.to/shubham399/breaking-to-build-how-ctf-and-bug-bounty-hunting-rewires-system-design-2j7c</link>
      <guid>https://dev.to/shubham399/breaking-to-build-how-ctf-and-bug-bounty-hunting-rewires-system-design-2j7c</guid>
      <description>&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%2Fimagedelivery.net%2FlLmNeOP7HXG0OqaG97wimw%2F95a7ced4-fd82-4716-a6d0-b434f9e2b1f7%2F9824899b-3ed9-4d61-8e5a-d49568803653.png%2Fpublic" 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%2Fimagedelivery.net%2FlLmNeOP7HXG0OqaG97wimw%2F95a7ced4-fd82-4716-a6d0-b434f9e2b1f7%2F9824899b-3ed9-4d61-8e5a-d49568803653.png%2Fpublic" alt="feature image"&gt;&lt;/a&gt;As software engineers, we are trained to be creators. We stare at a product requirement document, map out the happy path, write the logic, pass the unit tests, and ship it. Our default mental model is constructive: &lt;em&gt;How do I make this system work?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But if you have ever spent a weekend hunting for bugs on a crowdsourced bounty platform or staying up until 3 AM playing a Capture The Flag (CTF) competition, your brain undergoes a permanent structural shift. You stop looking at code exclusively as an implementation of business requirements. Instead, you start looking at it as an attack surface.&lt;/p&gt;

&lt;p&gt;Playing on the offensive side of security completely changes the way I write code and architect distributed systems. The moment my fingers leave the keyboard after implementing a new feature, a second thought instantly kicks in: &lt;strong&gt;"If I were targeting this system, how would I break what I just wrote?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are the core system design lessons that offensive security beats into your engineering instincts.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Eradicating the Myth of the "Trusted Database"
&lt;/h2&gt;

&lt;p&gt;A classic flaw in traditional software engineering is the reliance on implicit trust boundaries. Developers are naturally paranoid about direct user inputs (like a POST request body), but they tend to drop their guard once data is written to the database. They treat data returned from a &lt;code&gt;SELECT&lt;/code&gt; query as inherently "safe."&lt;/p&gt;

&lt;p&gt;An attacker who understands vulnerabilities like &lt;strong&gt;SSTI (Server-Side Template Injection)&lt;/strong&gt; or &lt;strong&gt;Stored XSS&lt;/strong&gt; knows exactly how to exploit this complacency. They will inject a payload into a benign-looking field (like a profile username or an address line), let it sit quietly in your database, and wait for your backend to fetch it later and drop it un-sanitized into a high-privilege processing sink or HTML rendering engine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Attacker Payload] ──► [Inbound Request] ──► [Database (Stored Plaintext)]
                                                    │
                                        Backend fetches data later
                                                    │
                                                    ▼
[Malicious Execution Sink] ◄── [No Validation] ◄── [App Read Layer]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CTF experience forces you to adopt a strict &lt;strong&gt;Zero-Trust Input/Reflection Policy&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Every data point entering a processing context—whether it came from an unauthenticated webhook, a secure API call, or was reflected out of your own PostgreSQL database—is treated as radioactive untrusted data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sanitization and structural typing must happen not just at the network perimeter, but at the &lt;em&gt;boundary of every execution sink&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Eliminating IDOR by Architecting Hard Boundaries
&lt;/h2&gt;

&lt;p&gt;Insecure Direct Object References (IDOR) routinely sit at the top of real-world bug bounty payouts because they are incredibly easy to exploit but devastating in execution. An IDOR happens when a system exposes a direct reference to an internal database record (like an incremental integer or a plain UUID) via an API endpoint, and fails to validate if the requesting user actually owns that resource.&lt;/p&gt;

&lt;p&gt;A typical developer might implement a endpoint like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GET /api/v1/organization/getDetails?orgId=5690&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To an engineer with a bug bounty mindset, seeing an &lt;code&gt;orgId&lt;/code&gt; or &lt;code&gt;userId&lt;/code&gt; exposed directly in a query parameter or a mutable request header instantly triggers a red flag. It shouts: &lt;em&gt;“Change this number, read someone else’s data.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To completely engineer past this vulnerability, you shift the source of truth entirely away from client-controlled variables. Instead of trusting the request parameters to tell you who the organization or user is, you pull those identity markers exclusively from a &lt;strong&gt;cryptographically signed session context&lt;/strong&gt; or an immutable JWT verified at the gateway level.&lt;/p&gt;

&lt;p&gt;If the client wants to see their organization details, they call:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GET /api/v1/organization/myDetails&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The backend looks up the authentication session token, extracts the immutable, verified &lt;code&gt;orgId&lt;/code&gt; bound to that active session token, and queries the database using that token. The user can manipulate the HTTP parameters all they want; they can never force an out-of-bounds state transition because they don't control the variables powering the query.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Anticipating SSRF and CSRF in Component Design
&lt;/h2&gt;

&lt;p&gt;When you have spent hours constructing complex payloads to bypass firewalls in an &lt;strong&gt;SSRF (Server-Side Request Forgery)&lt;/strong&gt; challenge, you design internal networking components differently.&lt;/p&gt;

&lt;p&gt;If your backend needs to support a webhook notification feature or pull an image from a user-supplied URL, a non-security background might just use a standard HTTP client library to fire off the request. But an offensive mindset immediately foresees the vulnerability: an attacker passing &lt;code&gt;http://127.0.0.1:8500/&lt;/code&gt; or an internal AWS metadata endpoint (&lt;code&gt;http://169.254.169.254/&lt;/code&gt;) to scan your internal VPC from the inside out.&lt;/p&gt;

&lt;p&gt;Knowing this, you build defensiveness directly into your infrastructure blueprints: isolating egress traffic for user-supplied URLs to sandboxed network zones, enforcing strict DNS resolution checks against private IP ranges, and implementing secure Cross-Site Request Forgery (CSRF) tokens on all state-changing endpoints from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Verdict: Offensive Experience is a Defensive Superpower
&lt;/h2&gt;

&lt;p&gt;You can read every security checklist, memorize the OWASP Top 10, and mandate static analysis tools across your CI/CD pipeline—but nothing replaces the deep architectural paranoia gained by actively breaking systems.&lt;/p&gt;

&lt;p&gt;Playing CTFs and hunting bounties teaches you to read between the lines of your own source code. It transforms security from a tedious, compliance-driven box to check before a release into a continuous, active thread running through your entire system design process.&lt;/p&gt;

&lt;p&gt;When you learn how to think like a breaker, you become an infinitely better builder.&lt;/p&gt;

</description>
      <category>security</category>
    </item>
    <item>
      <title>Demystifying the Trinity: Functor, Applicative, and Monad in PureScript</title>
      <dc:creator>Shubham</dc:creator>
      <pubDate>Sat, 30 May 2026 04:24:48 +0000</pubDate>
      <link>https://dev.to/shubham399/demystifying-the-trinity-functor-applicative-and-monad-in-purescript-30m9</link>
      <guid>https://dev.to/shubham399/demystifying-the-trinity-functor-applicative-and-monad-in-purescript-30m9</guid>
      <description>&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%2Fimagedelivery.net%2FlLmNeOP7HXG0OqaG97wimw%2F95a7ced4-fd82-4716-a6d0-b434f9e2b1f7%2Fb545b1ef-a366-4f45-ae19-d8165269457d.png%2Fpublic" 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%2Fimagedelivery.net%2FlLmNeOP7HXG0OqaG97wimw%2F95a7ced4-fd82-4716-a6d0-b434f9e2b1f7%2Fb545b1ef-a366-4f45-ae19-d8165269457d.png%2Fpublic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When diving into pure functional programming, you are immediately confronted with three abstract terms that sound more like advanced physics concepts than software engineering patterns: &lt;strong&gt;Functors&lt;/strong&gt;, &lt;strong&gt;Applicatives&lt;/strong&gt;, and &lt;strong&gt;Monads&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For a long time, the internet has tried to explain them using metaphors like "burrito boxes" or "spaceships." Based on my experience and everyday usage, it is much better to look at them for what they truly are: &lt;strong&gt;elegant design patterns for managing data flow, context, and computation with mathematical certainty.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s break down this holy trinity of functional programming using clean, practical PureScript examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Concept: Values in a Context
&lt;/h2&gt;

&lt;p&gt;Before writing code, let’s establish a visual mental model. In PureScript, we often deal with values wrapped inside a &lt;strong&gt;context&lt;/strong&gt; (or container).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Maybe a&lt;/code&gt; represents a value of type &lt;code&gt;a&lt;/code&gt; that &lt;em&gt;might be missing&lt;/em&gt; (handling &lt;code&gt;null&lt;/code&gt; safely).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Either e a&lt;/code&gt; represents a computation that &lt;em&gt;might fail&lt;/em&gt; with an error of type &lt;code&gt;e&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Effect a&lt;/code&gt; represents a synchronous side-effect (like logging to the console or interacting with the DOM).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Trinity Functor, Applicative, and Monad are simply a progressive set of tools that allow us to manipulate these wrapped values without manually unwrapping and re-wrapping them at every single step.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Functor: Mapping over a Context
&lt;/h2&gt;

&lt;p&gt;The simplest abstraction is the &lt;strong&gt;Functor&lt;/strong&gt;. A Functor allows you to apply a normal, pure function to a value that is sitting inside a context.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Definition
&lt;/h3&gt;

&lt;p&gt;To be a Functor, a type constructor &lt;code&gt;f&lt;/code&gt; must implement the &lt;code&gt;map&lt;/code&gt; function (often written as the infix operator &lt;code&gt;&amp;lt;$&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Code snippet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Functor f where
  map :: forall a b. (a -&amp;gt; b) -&amp;gt; f a -&amp;gt; f b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage Example
&lt;/h3&gt;

&lt;p&gt;Imagine you are processing a transaction payload where the payment amount might be missing (&lt;code&gt;Maybe Int&lt;/code&gt;). You want to convert this amount into cents (multiply by 100).&lt;/p&gt;

&lt;p&gt;Code snippet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module Main where

import Prelude
import Data.Maybe (Maybe(..))
import Effect (Effect)
import Effect.Console (logShow)

-- A pure function that knows nothing about contexts
toCents :: Int -&amp;gt; Int
toCents dollar = dollar * 100

main :: Effect Unit
main = do
  let dynamicAmount = Just 50  -- A value inside a context
  let missingAmount = Nothing  -- An empty context

  -- Using map (&amp;lt;$&amp;gt;) to apply the pure function inside the context
  logShow (toCents &amp;lt;$&amp;gt; dynamicAmount) -- Output: (Just 5000)
  logShow (toCents &amp;lt;$&amp;gt; missingAmount) -- Output: Nothing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Crucial Insight:&lt;/strong&gt; Notice how &lt;code&gt;toCents&lt;/code&gt; takes a raw &lt;code&gt;Int&lt;/code&gt;, not a &lt;code&gt;Maybe Int&lt;/code&gt;. The Functor instance for &lt;code&gt;Maybe&lt;/code&gt; automatically handles the plumbing. If it’s &lt;code&gt;Just&lt;/code&gt;, it applies the function. If it’s &lt;code&gt;Nothing&lt;/code&gt;, it short-circuits safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Applicative: Function and Value Both in Contexts
&lt;/h2&gt;

&lt;p&gt;What happens if the function &lt;em&gt;itself&lt;/em&gt; is trapped inside a context? Or what if you want to apply a pure function that takes &lt;em&gt;multiple&lt;/em&gt; arguments to multiple wrapped values? This is where Functor falls short, and &lt;strong&gt;Applicative&lt;/strong&gt; steps in.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Definition
&lt;/h3&gt;

&lt;p&gt;An Applicative Functor extends Functor with two main functions: &lt;code&gt;pure&lt;/code&gt; (to lift a raw value into a context) and &lt;code&gt;apply&lt;/code&gt; (written as &lt;code&gt;&amp;lt;*&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Code snippet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Functor f &amp;lt;= Applicative f where
  pure  :: forall a. a -&amp;gt; f a
  apply :: forall a b. f (a -&amp;gt; b) -&amp;gt; f a -&amp;gt; f b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage Example
&lt;/h3&gt;

&lt;p&gt;Suppose we are building a user profile record from an API response. We have a pure data constructor &lt;code&gt;createUser&lt;/code&gt; that takes a &lt;code&gt;String&lt;/code&gt; (Name) and an &lt;code&gt;Int&lt;/code&gt; (User ID). However, both pieces of data are fetched independently and arrive wrapped in a &lt;code&gt;Maybe&lt;/code&gt; context.&lt;/p&gt;

&lt;p&gt;Code snippet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type User = { name :: String, id :: Int }

createUser :: String -&amp;gt; Int -&amp;gt; User
createUser name id = { name: name, id: id }

main :: Effect Unit
main = do
  let maybeName = Just "Alice"
  let maybeId   = Just 1024

  -- Functor + Applicative in harmony:
  -- 1. `createUser &amp;lt;$&amp;gt; maybeName` maps the first argument, returning: Maybe (Int -&amp;gt; User)
  -- 2. We use `&amp;lt;*&amp;gt;` to apply the remaining wrapped Int argument.
  let maybeUser = createUser &amp;lt;$&amp;gt; maybeName &amp;lt;*&amp;gt; maybeId

  logShow maybeUser 
  -- Output: (Just { name: "Alice", id: 1024 })

  -- If any piece is missing, the whole thing safely results in Nothing
  let partialUser = createUser &amp;lt;$&amp;gt; Nothing &amp;lt;*&amp;gt; maybeId
  logShow partialUser 
  -- Output: Nothing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Crucial Insight:&lt;/strong&gt; Applicatives allow you to run independent computations in isolation. The evaluation of &lt;code&gt;maybeId&lt;/code&gt; does not depend on the result of &lt;code&gt;maybeName&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Monad: Dependent Chaining (The Heavy Lifter)
&lt;/h2&gt;

&lt;p&gt;Finally, we reach the &lt;strong&gt;Monad&lt;/strong&gt;. While Applicatives handle independent wrapped values, Monads are designed to handle &lt;strong&gt;dependent sequential computations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Use a Monad when the output of one context-wrapped computation determines what the &lt;em&gt;next&lt;/em&gt; context-wrapped computation should look like.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Definition
&lt;/h3&gt;

&lt;p&gt;A Monad extends Applicative by introducing &lt;code&gt;bind&lt;/code&gt; (written as &lt;code&gt;&amp;gt;&amp;gt;=&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Code snippet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Applicative m &amp;lt;= Monad m where
  bind :: forall a m b. m a -&amp;gt; (a -&amp;gt; m b) -&amp;gt; m b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you tried to use regular &lt;code&gt;map&lt;/code&gt; with a function that returns a wrapped value (i.e., &lt;code&gt;a -&amp;gt; m b&lt;/code&gt;), you would end up with a messy nested context: &lt;code&gt;m (m b)&lt;/code&gt;. The Monad’s job is to apply the function &lt;em&gt;and automatically flatten&lt;/em&gt; the result.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage Example (PureScript &lt;code&gt;do&lt;/code&gt; notation)
&lt;/h3&gt;

&lt;p&gt;PureScript provides syntactic sugar called &lt;code&gt;do&lt;/code&gt; notation, which makes working with Monads look like imperative code while preserving pure functional guarantees under the hood.&lt;/p&gt;

&lt;p&gt;Let's look at a typical multi-step verification sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Validate a user ID.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If valid, look up their wallet balance (which could fail).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If they have enough funds, process the transaction.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Code snippet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Data.Maybe (Maybe(..))

-- Simulating dependent lookups
validateUser :: Int -&amp;gt; Maybe String
validateUser id = if id == 777 then Just "VIP_User" else Nothing

getWalletBalance :: String -&amp;gt; Maybe Int
getWalletBalance username = if username == "VIP_User" then Just 500 else Nothing

-- Monadic Chaining using `do` notation
processPayment :: Int -&amp;gt; Maybe String
processPayment userId = do
  username &amp;lt;- validateUser userId         -- Extracts string out of Maybe
  balance  &amp;lt;- getWalletBalance username   -- Dependent on previous username
  if balance &amp;gt; 100
    then Just "Payment Successful!"
    else Nothing

main :: Effect Unit
main = do
  logShow (processPayment 777) -- Output: (Just "Payment Successful!")
  logShow (processPayment 123) -- Output: Nothing (Fails safely at step 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Crucial Insight:&lt;/strong&gt; If &lt;code&gt;validateUser&lt;/code&gt; returns &lt;code&gt;Nothing&lt;/code&gt;, the Monad stops evaluating the rest of the block immediately. We get bulletproof error propagation without writing a single nested &lt;code&gt;if-else&lt;/code&gt; or &lt;code&gt;try-catch&lt;/code&gt; block.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary: Choosing Your Tool
&lt;/h2&gt;

&lt;p&gt;In my day-to-day workflow, I pick the right tool for the job by asking a simple question about what I am trying to combine:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abstraction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you have&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you want to apply&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code pattern&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Functor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Value in a context (&lt;code&gt;f a&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;A pure function (&lt;code&gt;a -&amp;gt; b&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;f &amp;lt;$&amp;gt; x&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Applicative&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Values in contexts (&lt;code&gt;f a&lt;/code&gt;, &lt;code&gt;f b&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;A pure multi-arg function&lt;/p&gt;

&lt;p&gt;&lt;code&gt;f &amp;lt;$&amp;gt; x &amp;lt;*&amp;gt; y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monad&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Value in a context (&lt;code&gt;m a&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;A function returning a context (&lt;code&gt;a -&amp;gt; m b&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;x &amp;gt;&amp;gt;= \v -&amp;gt; ...&lt;/code&gt; or &lt;code&gt;do&lt;/code&gt; blocks&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Adopting these typeclasses fundamentally shifts how you reason about software architecture.&lt;/p&gt;

&lt;p&gt;Before using this framework, handling multi-step asynchronous or conditional logic meant writing deeply nested error-handling logic. By leveraging &lt;strong&gt;Functor&lt;/strong&gt;, &lt;strong&gt;Applicative&lt;/strong&gt;, and &lt;strong&gt;Monad&lt;/strong&gt;, we compose complex architectures out of small, highly reusable, and predictable building blocks. It makes systems dramatically easier to refactor, impossible to crash with unexpected null pointers, and exceptionally clean to maintain.&lt;/p&gt;

</description>
      <category>functional</category>
    </item>
    <item>
      <title>AI Is Making Senior Engineers 10x Faster — And 10x More Exhausted</title>
      <dc:creator>Shubham</dc:creator>
      <pubDate>Thu, 28 May 2026 10:01:24 +0000</pubDate>
      <link>https://dev.to/shubham399/ai-is-making-senior-engineers-10x-faster-and-10x-more-exhausted-329e</link>
      <guid>https://dev.to/shubham399/ai-is-making-senior-engineers-10x-faster-and-10x-more-exhausted-329e</guid>
      <description>&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%2Fimagedelivery.net%2FlLmNeOP7HXG0OqaG97wimw%2F95a7ced4-fd82-4716-a6d0-b434f9e2b1f7%2Fc2aff1ec-2f4e-464d-b328-e8d2d6c00223.png%2Fpublic" 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%2Fimagedelivery.net%2FlLmNeOP7HXG0OqaG97wimw%2F95a7ced4-fd82-4716-a6d0-b434f9e2b1f7%2Fc2aff1ec-2f4e-464d-b328-e8d2d6c00223.png%2Fpublic" alt="ai-senior" width="1152" height="768"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When AI coding tools first appeared, I thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Nice. Less boilerplate.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now it feels like I’m managing a team of infinitely fast junior engineers that never sleep, constantly hallucinate, and submit pull requests every 30 seconds.&lt;/p&gt;

&lt;p&gt;As a senior engineer, AI has dramatically increased my productivity.&lt;/p&gt;

&lt;p&gt;It has also dramatically increased my cognitive load.&lt;/p&gt;

&lt;p&gt;Both things are true at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Good Part: AI Removes the Annoying Work
&lt;/h2&gt;

&lt;p&gt;There’s no denying it anymore.&lt;/p&gt;

&lt;p&gt;LLMs are insanely useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Writing repetitive code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generating tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refactoring old logic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explaining unfamiliar codebases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Writing SQL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generating migration scripts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Producing documentation nobody wanted to write&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Things that used to take 2 hours now take 15 minutes.&lt;/p&gt;

&lt;p&gt;I can scaffold APIs instantly.&lt;br&gt;&lt;br&gt;
I can debug faster.&lt;br&gt;&lt;br&gt;
I can prototype ideas without context-switching for half a day.&lt;/p&gt;

&lt;p&gt;AI gives senior engineers leverage.&lt;/p&gt;

&lt;p&gt;And leverage compounds fast.&lt;/p&gt;

&lt;p&gt;The productivity jump is real.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bad Part: Senior Engineers Became Human Validators
&lt;/h2&gt;

&lt;p&gt;Here’s the problem nobody talks about enough:&lt;/p&gt;

&lt;p&gt;AI shifted senior engineering from “building systems” to “constantly validating generated output.”&lt;/p&gt;

&lt;p&gt;Earlier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Juniors wrote code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seniors reviewed architecture and edge cases&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;AI writes massive amounts of code instantly&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seniors review ALL of it&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everywhere.&lt;/p&gt;

&lt;p&gt;All the time.&lt;/p&gt;

&lt;p&gt;And unlike juniors, AI has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Infinite confidence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No memory&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No accountability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No understanding of business context&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can generate code that &lt;em&gt;looks&lt;/em&gt; perfect while quietly introducing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;race conditions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;security issues&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hidden performance problems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;broken abstractions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fake APIs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;impossible edge-case handling&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The scary part is that the code often looks clean.&lt;/p&gt;

&lt;p&gt;Very clean.&lt;/p&gt;

&lt;p&gt;Sometimes cleaner than human-written code.&lt;/p&gt;

&lt;p&gt;Which makes spotting mistakes even harder.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Increased Output, But Also Increased Noise
&lt;/h2&gt;

&lt;p&gt;One senior engineer can now produce the output of an entire small team.&lt;/p&gt;

&lt;p&gt;Sounds amazing, right?&lt;/p&gt;

&lt;p&gt;Except now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;PR sizes explode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Architecture decisions happen too quickly&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;People ship generated code they barely understand&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Teams confuse “velocity” with “quality”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bottleneck is no longer writing code.&lt;/p&gt;

&lt;p&gt;The bottleneck is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;understanding systems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;validating correctness&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;maintaining consistency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;keeping complexity under control&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI accelerated code generation much faster than it accelerated engineering judgment.&lt;/p&gt;

&lt;p&gt;And that gap is becoming painful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context Engineering Is Becoming More Important Than Coding
&lt;/h2&gt;

&lt;p&gt;The best engineers I know today are not the people writing the most code.&lt;/p&gt;

&lt;p&gt;They are the people giving AI the best context.&lt;/p&gt;

&lt;p&gt;A weak prompt creates chaos.&lt;/p&gt;

&lt;p&gt;A strong prompt creates leverage.&lt;/p&gt;

&lt;p&gt;Senior engineers are now spending more time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;designing workflows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;defining constraints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;writing repository instructions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;creating architecture guardrails&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;building agent tooling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;managing AI behavior&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are slowly moving from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“software engineers”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“system directors for machine-generated software.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds futuristic.&lt;/p&gt;

&lt;p&gt;But honestly, it mostly feels like more responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Burnout Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;AI creates a weird kind of exhaustion.&lt;/p&gt;

&lt;p&gt;Not physical exhaustion.&lt;/p&gt;

&lt;p&gt;Cognitive exhaustion.&lt;/p&gt;

&lt;p&gt;You are constantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;verifying outputs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;re-checking assumptions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reviewing generated logic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;correcting hallucinations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;re-explaining context&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fighting subtle inconsistencies&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It feels like supervising an incredibly fast intern that learns nothing between conversations.&lt;/p&gt;

&lt;p&gt;And because the output is instant, expectations change instantly too.&lt;/p&gt;

&lt;p&gt;Management sees:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Tasks finish faster.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Senior engineers feel:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’m mentally reviewing 5x more moving pieces than before.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That mismatch is dangerous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Junior Engineers and the Experience Gap
&lt;/h2&gt;

&lt;p&gt;Another thing that worries me:&lt;/p&gt;

&lt;p&gt;Junior engineers can now generate advanced-looking systems without fully understanding them.&lt;/p&gt;

&lt;p&gt;That’s powerful.&lt;/p&gt;

&lt;p&gt;But also risky.&lt;/p&gt;

&lt;p&gt;Earlier, painful debugging built intuition.&lt;/p&gt;

&lt;p&gt;Now AI often bypasses the struggle phase completely.&lt;/p&gt;

&lt;p&gt;Which means senior engineers increasingly become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;teachers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;validators&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;architecture reviewers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;production safety nets&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gap between “can generate code” and “can engineer systems” is becoming massive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reality Nobody Wants to Admit
&lt;/h2&gt;

&lt;p&gt;AI is not replacing senior engineers.&lt;/p&gt;

&lt;p&gt;It’s making strong senior engineers more valuable.&lt;/p&gt;

&lt;p&gt;Because somebody still needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;understand distributed systems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;identify bad abstractions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reason about scale&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;evaluate trade-offs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;catch subtle failures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;make architectural decisions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI can generate solutions.&lt;/p&gt;

&lt;p&gt;It still cannot reliably judge consequences.&lt;/p&gt;

&lt;p&gt;And consequences are where senior engineering lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I genuinely love using AI.&lt;/p&gt;

&lt;p&gt;I use it every day.&lt;/p&gt;

&lt;p&gt;I would never go back.&lt;/p&gt;

&lt;p&gt;But AI didn’t reduce the importance of senior engineering.&lt;/p&gt;

&lt;p&gt;It amplified it.&lt;/p&gt;

&lt;p&gt;The industry thinks AI is automating software development.&lt;/p&gt;

&lt;p&gt;What it’s actually doing is increasing the demand for engineers who can think critically under complexity.&lt;/p&gt;

&lt;p&gt;AI removed a lot of typing.&lt;/p&gt;

&lt;p&gt;Unfortunately, it also created an endless stream of things that now require human judgment.&lt;/p&gt;

&lt;p&gt;And human judgment remains the most expensive part of software engineering.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
  </channel>
</rss>
