

“Set your heart upon your work, but never on its reward.”
Bhagavad Gita

“Set your heart upon your work, but never on its reward.”
Bhagavad Gita
Every technology wave creates its own antipatterns. Cloud computing gave us "lift and shift." Microservices gave us distributed monoliths. Kubernetes gave us clusters running three pods.
AI is no different — except the antipatterns are forming faster than the best practices, and the consequences are harder to unwind. ThoughtWorks' Technology Radar Vol. 33 explicitly flagged several of these. The Stack Overflow 2025 survey revealed that developer sentiment toward AI tools has dropped from 70%+ to 60%, even as adoption climbs to 84%.
Something isn't working. Here are five patterns I've seen repeatedly in 2026 — in my own work, in teams I've worked with, and across the industry. You're probably doing at least two of them.
Shadow IT used to mean someone spinning up a Heroku app or paying for Notion on a personal credit card. Annoying but manageable. You could find it, inventory it, bring it under governance.
AI-accelerated shadow IT is different. It's a developer who builds an internal tool powered by GPT-5.3 Codex over a weekend, feeds it customer data through the API, and deploys it on a personal cloud account. It's a product manager who connects a client's Salesforce instance to an AI agent via Zapier. It's a support team that built an entire ticket triage system using Claude and a Google Sheet.
None of these went through security review. None have data processing agreements. None show up in your architecture diagrams.
The problem isn't that people are building with AI — it's that AI makes building so fast that governance can't keep up. A developer who would have taken three months to build an internal tool (and would have gone through procurement, security, and architecture review along the way) can now ship it in a weekend, skip every gate, and have it in production before Monday standup.
What this actually costs you: Data leaking into third-party model providers without DPAs. Unvetted AI tools making decisions that affect customers. Shadow services that become critical to business operations but exist on someone's personal account. When that developer leaves, so does the institutional knowledge — and the AWS credentials.
What to do instead: Don't ban AI tools — you'll lose that war. Create a fast-track approval process specifically for AI-powered internal tools. Define a "sandbox tier" with pre-approved models, data classifications, and deployment targets. Make the compliant path faster than the shadow path. If your governance process takes four weeks and building it yourself takes four hours, people will choose four hours every time.
The Model Context Protocol became the standard for connecting AI agents to external tools in 2025. By early 2026, virtually every major vendor added MCP support. The protocol itself is well-designed — it's the implementations that are the problem.
The antipattern: take your existing REST API, wrap every endpoint as an MCP tool, ship it. Your API has 47 endpoints? Congratulations, your MCP server now exposes 47 tools to every agent that connects.
This is the equivalent of handing someone a toolbox with 47 screwdrivers and no instructions. An AI agent presented with 47 tools will either pick the wrong one, call three when it needs one, or hallucinate parameters because the tool description was copy-pasted from the API docs.
Why teams fall for it: It's easy. You can auto-generate MCP tool definitions from an OpenAPI spec in minutes. It feels productive. You get to tell management that your platform is "MCP-ready." And for simple demos with a handful of tools, it actually works — which makes the approach feel validated right up until it doesn't.
The real cost: Agents perform worse with more tools. Every additional tool in the context increases the probability of incorrect tool selection. Your 47-tool MCP server doesn't just bloat the context window — it actively degrades agent performance. Beyond that, most REST API error responses are designed for human developers reading JSON. An agent that receives {"error": "Invalid request", "code": 422} has no useful recovery path.
What to do instead: Design your MCP surface for agents, not humans. This means:
createUser, updateUser, getUserById, listUsers, and deleteUser. It needs manageUser with a clear action parameter.{"error": "user_already_exists", "suggestion": "Use manageUser with action 'get' to retrieve the existing user", "recoverable": true}.// Bad: Auto-generated from OpenAPI spec
const tools = openApiSpec.paths.flatMap(path =>
Object.entries(path.methods).map(([method, spec]) => ({
name: `${method}_${spec.operationId}`,
description: spec.summary, // "Creates a user" — useless for an agent
parameters: spec.requestBody?.schema,
}))
);
// Result: 47 tools, confused agents, bad outcomes
// Good: Designed for agent consumption
const tools = [
{
name: "manage_user",
description:
"Create, update, retrieve, or deactivate a user account. Use this tool whenever the task involves user account operations. For new users, 'email' and 'name' are required. For existing users, provide 'userId'.",
parameters: {
action: { enum: ["create", "get", "update", "deactivate"] },
userId: { type: "string", description: "Required for get/update/deactivate" },
email: { type: "string", description: "Required for create" },
name: { type: "string", description: "Required for create" },
updates: { type: "object", description: "Fields to update (for update action only)" },
},
},
// 4-5 more high-level tools, each with clear guidance
];The MCP spec is good. The lazy implementations are the problem.

This is the one that keeps me up at night.
Letting AI implement code within well-defined boundaries is productive. Letting AI define those boundaries is dangerous. But that's exactly what's happening — teams are prompting models to make architectural decisions that will constrain their systems for years.
"Should we use PostgreSQL or MongoDB for this?" "Design the microservice boundaries for our e-commerce platform." "What state management approach should we use?" "Create the database schema for our application."
These aren't implementation questions. They're architecture questions. They require understanding your team's expertise, your operational constraints, your growth trajectory, your compliance requirements, and a dozen other context-dependent factors that no model has access to.
Why teams fall for it: Because the answers sound incredibly convincing. Ask Claude or GPT-5.3 to design your microservice architecture and you'll get a beautifully structured response with clear reasoning, tradeoff analysis, and a diagram. It looks like expert advice. It reads like a senior architect wrote it. And sometimes it's even correct — for the median case. But you're not the median case. Nobody is.
The real cost: Architectural decisions are high-leverage and hard to reverse. A bad function can be rewritten in an hour. A bad service boundary takes months to untangle. A bad database choice can require a full migration. When the AI recommends event sourcing because it's architecturally elegant, but your team has zero experience with it and your timeline is three months, you've optimized for impressiveness over deliverability.
I've seen a team spend two months implementing an AI-recommended CQRS pattern for an internal CRUD app that serves 50 users. The model recommended it because the prompt mentioned "scalability" — which the team included because it seemed like something you should care about, not because they had any scaling concerns.
What to do instead: Use AI for implementation research, not implementation decisions. The distinction:
Confine AI to the space between your architectural decisions. Define the interfaces, the service boundaries, the data model, and the technology choices yourself. Then let AI fill in implementation details within those boundaries. That's where it excels.

Open-source maintainers are drowning, and AI is making it worse.
The pattern: a developer sees an open issue, prompts an AI to generate a fix, submits a PR without deeply understanding the codebase or the fix. The code passes CI. The PR description is well-written (also AI-generated). The implementation looks reasonable at first glance. Maintainers, already stretched thin, merge it.
Three weeks later, someone discovers the fix introduced a subtle regression because the AI didn't understand an undocumented invariant in the codebase. Or the fix works but uses a pattern inconsistent with the rest of the project, creating confusion for future contributors. Or the fix is technically correct but solves the wrong problem — the issue description was ambiguous, and the AI picked the wrong interpretation.
This isn't hypothetical. Major open-source projects reported a surge in AI-generated contributions throughout 2025, and maintainers are struggling to distinguish thoughtful contributions from vibe-coded drive-bys. Some projects have started requiring contributors to demonstrate understanding of their changes beyond what CI can verify.
Why it keeps happening: The incentives are misaligned. Contributors get the dopamine hit of a merged PR (and a green square on their GitHub profile). AI makes it trivially easy to generate plausible-looking fixes. And many contributors genuinely believe they're helping — they see an open issue, they have a tool that can generate a fix, so they submit it. The intent isn't malicious. The outcome still hurts.
The real cost: Maintainer burnout accelerates. Review burden increases because reviewers can't trust that the contributor understands their own code. Codebase consistency degrades as AI-generated patches introduce conflicting patterns. And worst of all, the fixes that actually require human understanding get delayed because maintainers are spending review cycles on AI-generated noise.
What to do instead:
"What if anyone in the company could query the database using natural language?"
It sounds transformative. No more waiting for the data team to write queries. No more SQL training for product managers. Just ask a question, get an answer. Every enterprise AI vendor pitched this in 2024. Many organizations bought in.
Here's what actually happened: text-to-SQL works great for simple queries. "How many users signed up last month?" Nailed it. "What's the average order value by region?" No problem. Demo-quality queries that make executives nod approvingly.
Then someone asks: "Show me customers who downgraded their plan but increased usage in the last quarter, excluding those on legacy plans that were migrated from the old billing system." The model generates a query that looks right, runs without errors, and returns wrong results — because "legacy plans migrated from the old billing system" isn't a column in any table. It's tribal knowledge encoded in a combination of a plan_type field, a migration_date that's null for non-migrated accounts, and a billing_version flag that the data team added during a migration three years ago.
Why teams fall for it: The demos are genuinely impressive. Simple-to-medium queries work well enough to create confidence. And the business case is compelling — if you could eliminate the bottleneck of waiting for analyst-written queries, you'd accelerate decision-making across the organization.
The real cost: Wrong answers delivered with confidence are worse than no answers. When a product manager runs a text-to-SQL query and gets a result, they trust it. They put it in a slide deck. They make decisions based on it. Nobody questions the number because the tool returned it authoritatively. At least when they asked the data team, there was a human who could say "that number looks off — let me check the edge cases."
Beyond accuracy, there's the security surface. Text-to-SQL systems need read access to your database. The more tables you expose, the more useful the system — and the larger the attack surface. Natural language is inherently ambiguous, and adversarial prompts can coerce models into generating queries that access data the user shouldn't see.
What to do instead: Text-to-SQL works — within constraints. The successful implementations I've seen share three characteristics:
active_customers_current_quarter is something a model can work with. users with 47 columns and three boolean flags that encode plan status is not.The text-to-SQL dream isn't dead. But the "point it at your production database and let anyone ask anything" version of it is.

All five antipatterns share a common root: treating AI capabilities as a substitute for human judgment instead of an amplifier of it.
AI-accelerated shadow IT happens when governance can't keep pace with AI-enabled building. Naive MCP conversions happen when teams optimize for "AI-ready" checkboxes over actual agent usability. AI-as-architect happens when convenience overrides the need for context-dependent reasoning. Vibe-coded open source happens when contribution friction drops below the comprehension threshold. Text-to-SQL fails when organizations mistake "the model can generate SQL" for "the model understands our data."
In every case, the fix isn't less AI — it's more intentionality about where AI adds value and where it creates risk. The teams that will build the most impressive things with AI in 2026 aren't the ones using it everywhere. They're the ones using it deliberately — with clear boundaries, human oversight at the decision points that matter, and the discipline to say "this is a problem that requires human judgment" even when the AI offers a confident answer.
The antipatterns are easy to fall into because the AI makes them feel productive. Shipping faster. Deploying faster. Answering faster. But speed without direction is just velocity toward the wrong destination.
The question isn't whether your team is using AI. It's whether your team is thinking about where AI ends and human judgment begins — and whether that boundary is in the right place.

Developers spent decades wishing for tools that write code. Now they have them. Why does freedom feel like loss?

The era of prompting your way through codebases is hitting a wall. Comprehension debt — the hidden cost of code you ship but don't understand — is the new technical debt.

OpenAI pulled GPT-4o after it became dangerously agreeable. The incident exposes a fundamental tension in how we train AI systems — and it won't be the last recall.