Skip to content

New reading notes on system design, software architecture, and AI engineering. Explore reading

← Writing

Your AI App Doesn’t Need More AI — It Needs Better Engineering

The product is the system.

The hardest part of an AI application is engineering everything around the model so that the system remains useful when the model fails.

Published
27 August 2026
Category
Engineering
Reading time
13 min
Views
0 views

The easiest way to make an AI application look impressive is to add another model.

Add an agent.

Add memory.

Add RAG.

Add a multi-agent workflow.

Add autonomous tool calling.

Add another model provider.

The demo gets better.

The architecture often gets worse.

And that is the uncomfortable truth about building AI products in 2026:

The hardest part of an AI application is increasingly not getting a model to do something. It is engineering everything around the model so that the system remains useful when the model is wrong, slow, expensive, inconsistent, unavailable, or simply confused.

The industry is already moving in this direction. Recent engineering work around production agents emphasizes scoped tools, measurable success criteria, evaluations, approval gates, cost controls, observability, and reliability rather than model capability alone.

The model is only one component.

The product is the system.

The AI Demo Trap

Imagine you're building an AI career platform.

The first version is simple:

User enters a job
 

 
LLM analyzes it
 

 
LLM generates a resume
 

 
User downloads it

It works.

You show it to someone.

They say:

"Wow. This is AI-powered."

So you improve it.

You add:

  • Job Search Agent
  • Resume Agent
  • Career Agent
  • Research Agent
  • Interview Agent
  • Memory Agent

Now it looks even more impressive.

But then reality arrives.

A user searches 500 opportunities.

The same job appears three times.

The salary is extracted incorrectly.

The AI recommends a job that doesn't match the user's experience.

A resume contains a skill the user never claimed.

An API times out halfway through a workflow.

The model provider changes.

A prompt update makes yesterday's output worse.

The user doesn't know why the AI made a recommendation.

The system costs ten times more than expected.

And suddenly the problem isn't:

"How do we make the AI smarter?"

It's:

"Why did we build the rest of the system so poorly?"

AI Is Not the Architecture

This is perhaps the most important distinction.

An AI application is not:

Frontend

LLM

Database

A serious AI application looks more like:

                    ┌───────────────┐
                    │    User       │
                    └───────┬───────┘

                    ┌───────────────┐
                    │   Product UI  │
                    └───────┬───────┘

                    ┌───────────────┐
                    │ Domain Logic  │
                    └───────┬───────┘

                    ┌───────────────┐
                    │ Workflow      │
                    │ Engine        │
                    └───────┬───────┘

              ┌─────────────┴─────────────┐
              ↓                           ↓
       ┌─────────────┐             ┌─────────────┐
       │ Deterministic│             │ AI Systems  │
       │ Services     │             │             │
       └──────┬──────┘             └──────┬──────┘
              │                           │
              │                    ┌──────┴──────┐
              │                    │ Models      │
              │                    │ Tools       │
              │                    │ Memory      │
              │                    │ Retrieval   │
              │                    └─────────────┘

       ┌──────┴──────────────────────────┐
       │ Database / Cache / Events       │
       └─────────────────────────────────┘

The LLM is sitting inside the system.

It isn't the system.

That distinction changes how you build everything.

The Most Important Engineering Principle

Use AI where uncertainty exists. Use software where certainty exists.

If the task is:

"Calculate whether this user applied to this job."

Don't ask an LLM.

Use code.

If the task is:

"Extract the likely technical requirements from this messy job description."

AI is useful.

If the task is:

"Move an application from Interviewing to Offer."

Don't let a language model invent the state transition.

Use a workflow engine.

If the task is:

"What skills does this job appear to require?"

AI can help.

If the task is:

"Can this user claim five years of experience when their profile says two?"

Use deterministic validation and explicit user data.

The best AI systems aren't necessarily the ones that use AI everywhere.

They're the ones that know where not to use it.

Don't Build an Agent. Build a System That Can Use Agents.

The word agent has become one of the most overloaded words in software engineering.

An agent can sound like:

"An autonomous AI employee that thinks and does everything."

But production systems need something more precise.

An agent needs:

  • Goal
  • Tools
  • Context
  • Permissions
  • Constraints
  • State
  • Evaluation
  • Exit Conditions

Without these, you don't have an autonomous system.

You have a model with a very large hammer.

Modern guidance on production agents increasingly emphasizes exactly these boundaries: scoped tools, explicit success criteria, evaluations, approval gates, loop limits, and cost tracking.

The Workflow Is More Important Than the Agent

Suppose CareerOS has a Resume Agent.

You could simply tell it:

"Create the best resume for this job."

That's easy.

But a better system is:

Job Selected

Extract Requirements

Retrieve User Experience

Retrieve Relevant Projects

Determine Matching Evidence

Identify Gaps

Generate Resume Draft

Validate Claims

ATS Analysis

Quality Review

User Approval

Version Saved

The agent might participate in several steps.

But the workflow owns the process.

That is a much safer abstraction.

AI Should Not Own Your Business Logic

This is where AI applications become fragile.

Imagine this:

if (aiDecision === 'apply') {
  submitApplication();
}

That looks clever.

It's also terrifying.

What happens if the model returns:

"Definitely apply!"

instead of:

apply

What if it misunderstands the job?

What if the user hasn't approved it?

What if the application requires a document that doesn't exist?

What if the site changed?

The better architecture is:

AI Recommendation

Structured Result

Business Rules

User Approval

Workflow Transition

Action

The AI can recommend.

The system decides whether that recommendation is valid.

Structured Outputs Matter

AI should rarely be allowed to return arbitrary prose when your application needs to make decisions.

Instead of:

"This looks like a pretty good opportunity..."

your system should receive something conceptually like:

{
  "score": 87,
  "recommendation": "approve",
  "strengths": ["React", "Node.js", "TypeScript"],
  "gaps": ["AWS"],
  "confidence": 0.91
}

Now your software can reason about the result.

You can validate it.

Store it.

Compare it.

Audit it.

Test it.

Version it.

And replace the underlying model later without rewriting the entire product.

Your Database Is Part of the AI System

Many developers think:

"The AI is smart because the model is smart."

Not necessarily.

A model with poor context is still poor.

The quality of the information you provide matters enormously.

Consider a career platform.

The model should know:

  • User Profile
  • Skills
  • Experience
  • Projects
  • Achievements
  • Previous Applications
  • Resume Versions
  • Career Goals
  • Learning History
  • Preferences
  • Application Outcomes

That's not merely "memory."

That's product data.

And it needs proper engineering.

You need:

  • schemas
  • relationships
  • versioning
  • validation
  • permissions
  • audit history
  • retention policies
  • indexing
  • migrations

Your AI is only as useful as the system that supplies its context.

Context Engineering Is Software Engineering

One of the biggest shifts happening in AI development is that the engineering problem is moving from:

"How do I prompt the model?"

toward:

"What information, tools, constraints, and state should the model have at this moment?"

That's a very different problem.

Imagine an agent researching a job.

Don't dump your entire database into its context.

Give it:

  • Current Job
  • Relevant User Skills
  • Relevant Experience
  • Relevant Projects
  • Career Goal
  • Evaluation Rules
  • Allowed Tools

That is context engineering.

And good context is not accidental.

It is designed.

The AI Should Have Permissions

This is another area where "autonomous AI" sounds much easier than it actually is.

Imagine an agent with access to:

  • Database
  • Email
  • LinkedIn
  • Resume
  • Browser
  • Payments
  • GitHub
  • Calendar

What happens if it makes a mistake?

A production AI system needs permission boundaries.

Think:

Research Agent

READ ONLY
 
Resume Agent

READ + CREATE DRAFT
 
Application Agent

CREATE ACTION

REQUIRES APPROVAL
 
Payment Agent

REQUIRES EXPLICIT APPROVAL

The principle is simple:

The more irreversible the action, the stronger the approval boundary should be.

AI can research automatically.

AI can draft automatically.

AI can recommend automatically.

But actions with significant consequences should have explicit authorization.

The Best Automation Is Not Full Autonomy

There's a strange assumption in AI product development:

"If the user has to click anything, we failed."

I don't believe that.

A better goal is:

Automate everything that is safe to automate. Put humans at the points where judgment matters.

For CareerOS:

Discover opportunities

Automatic
 
Analyze

Automatic
 
Score

Automatic
 
Recommend

Automatic
 
Generate resume

Automatic
 
Review claims

Automatic
 
Approve

Human
 
Apply

Human / controlled automation
 
Track

Automatic

That's not a failure of autonomy.

That's good product engineering.

Reliability Is a Feature

AI systems fail differently from traditional software.

A normal function might be:

Input → Output

and the output is deterministic.

AI introduces:

Input ↓ Model ↓ Probabilistic Output

That means your engineering system needs additional safety mechanisms.

For example:

  • Timeouts
  • Retries
  • Fallbacks
  • Validation
  • Schema checks
  • Confidence thresholds
  • Human approval
  • Idempotency
  • Rate limits
  • Circuit breakers
  • Observability

Production AI infrastructure increasingly treats latency, reliability, capacity, cost, rollout safety, and fault isolation as first-class engineering concerns.

The model may fail.

Your application shouldn't collapse with it.

Design for Model Failure

Ask this question for every AI feature:

"What happens when the model is wrong?"

Not:

"What happens when the model works?"

Suppose your AI job analyzer fails.

Can the user still view the job?

Yes.

Suppose the AI resume generator times out.

Can the user continue?

Yes.

Suppose the AI provider goes down.

Can existing applications still be tracked?

Yes.

Suppose the AI gives an invalid structured response.

Does it enter your database?

No.

This is called graceful degradation.

Your AI should be a capability.

It should not become your single point of failure.

Observability Becomes Even More Important

Traditional software monitoring asks:

"Is the service running?"

AI systems need additional questions:

Which model?

  • Which prompt version?
  • Which tools?
  • How many tokens?
  • How much did it cost?
  • How long did it take?
  • What was the input?
  • What was the structured output?
  • Did validation pass?
  • Did the user accept the result?
  • Did the workflow succeed?
  • Did the user correct it?

You need traces.

Metrics.

Logs.

Evaluations.

And feedback loops.

This is particularly important because an AI system can be technically "healthy" while producing increasingly poor results.

A 200 response from your API doesn't mean the AI did its job.

Test the System, Not Just the Code

Traditional tests might say:

expect(result).toBe(...)

AI applications need another layer.

Suppose your Job Analyzer should identify:

React TypeScript Node.js

You don't necessarily need an exact wording match.

You need to evaluate whether the output satisfies the intended criteria.

That means building evaluations.

Think:

Golden Dataset

Run Agent

Evaluate Output

Score

Compare Against Previous Version

Then when you change:

Prompt v12

to:

Prompt v13

you can answer:

Did the system actually improve?

Without evaluations, you're guessing.

Version Everything That Matters

Your code has Git.

Your database has migrations.

Your API has versions.

Your AI system should have versions too.

For example:

  • Prompt Version
  • Model Version
  • Agent Version
  • Workflow Version
  • Evaluation Version
  • Knowledge Version

Then an AI decision can be traced to:

Agent: JobAnalyzer v4

Model: X

Prompt: v17

Workflow: CareerOpportunity v3

That is incredibly valuable when something goes wrong.

Cost Is an Engineering Constraint

A demo with 100 requests is easy.

A SaaS with 100,000 users is different.

Suppose one workflow does:

Research

  • Analysis
  • Scoring
  • Resume
  • Review
  • Cover Letter

and every step invokes an expensive model.

Your feature might work perfectly.

And still destroy your margins.

So AI architecture should consider:

  • Caching
  • Model routing
  • Token budgets
  • Context limits
  • Batching
  • Async processing
  • Cheap models for simple tasks
  • Expensive models for difficult tasks
  • Rate limiting
  • Usage quotas

AI infrastructure can also benefit from centralized model access so credentials, spend, routing, and provider reliability can be managed consistently rather than scattered throughout application code.

Don't Build Multi-Agent Systems Because They Sound Cool

This is another trap.

You don't automatically need:

Manager Agent

Research Agent

Planning Agent

Execution Agent

Reviewer Agent

Critic Agent

Supervisor Agent

Sometimes you need one model call.

Sometimes you need a deterministic workflow.

Sometimes you need one agent.

Sometimes you need multiple agents.

The architecture should follow the problem.

Not the trend.

Vercel's recent guidance similarly argues for a problem-first approach: define the task and success criteria first, then choose the architecture required to solve it.

Better Engineering Makes AI More Powerful

Here's the paradox.

Adding engineering constraints doesn't make your AI less powerful.

It makes it more useful.

Consider two systems.

System A
GPT
 
- Huge Prompt
- Tools
  System B
  Domain Model
- Workflow Engine
- Structured Outputs
- Validated Tools
- Context Retrieval
- Memory
- Permissions
- Evaluations
- Observability
- Human Approval
- Model Gateway

System B may use the exact same model.

But users will experience it as a much smarter product.

Why?

Because intelligence isn't just the model.

It's:

Model capability × Context × Tools × Workflow × Data × Feedback × Engineering

This Is Especially Important With AI Coding Agents

The same principle applies to building software with Claude Code, Codex, or other coding agents.

It's tempting to think:

"If the model can write code, I don't need to spend much time designing the system."

It's almost the opposite.

When AI can produce code faster, architecture becomes more important.

Why?

Because the bottleneck moves.

Before:

Idea ↓ Human writes code ↓ Software

Now:

Idea ↓ Specification ↓ AI ↓ Huge amount of code ↓ Software

If the specification and architecture are weak, AI simply lets you produce bad software faster.

Recent engineering experience with coding agents reinforces this: AI-assisted development can dramatically increase velocity, but teams still need strong engineering practices, maintainability, testing, observability, and human technical judgment.

The New Bottleneck Is Not Code

It's clarity.

When code becomes cheap, these become expensive:

  • Good product decisions
  • Good architecture
  • Good requirements
  • Good abstractions
  • Good data models
  • Good evaluations
  • Good feedback loops
  • Good engineering judgment

That's why documentation matters.

That's why architecture matters.

That's why tests matter.

That's why design systems matter.

That's why workflows matter.

AI doesn't eliminate software engineering.

It makes software engineering more important at a higher level.

The Real AI-Native Engineering Stack

I think the future stack looks something like this:

                PRODUCT


              DOMAIN MODEL


             WORKFLOW ENGINE

          ┌────────┴────────┐
          ▼                 ▼
    DETERMINISTIC        AI SYSTEM
     SERVICES                │
          │          ┌───────┼────────┐
          │          ▼       ▼        ▼
          │       Models   Tools    Memory
          │          │
          └──────────┬┘

                VALIDATION


                PERMISSIONS


                 APPROVAL


                  ACTION


              OBSERVABILITY


                 FEEDBACK

                     └──────→ EVALUATIONS

That's an AI product.

Not:

UI → GPT → Done

Build Boring Infrastructure

This might be the least exciting advice in an AI article.

It might also be the most valuable.

Build:

  • queues
  • retries
  • indexes
  • migrations
  • authentication
  • authorization
  • caching
  • logging
  • monitoring
  • tests
  • CI/CD
  • rate limiting
  • error handling
  • versioning
  • backups

None of these will impress someone in a 30-second demo.

But they're what allow the demo to become a product.

Your Competitive Advantage Might Not Be Your Model

Models will improve.

Prices will change.

Providers will compete.

A capability that costs $1 today might cost $0.01 tomorrow.

A model that is best today might be obsolete next year.

So don't build your moat around:

"We use Model X."

Build it around:

  • Your Data
  • Your Workflows
  • Your Domain Knowledge
  • Your UX
  • Your Integrations
  • Your Evaluation System
  • Your Feedback Loops
  • Your Product Understanding

The model should be replaceable.

Your product shouldn't be.

The Question I Ask Before Adding AI

Before adding an AI feature, ask:

  1. Does this problem actually require AI?

If not, write deterministic software.

  1. What does success look like?

Define it before building.

  1. What information does the model need?

Design the context.

  1. What tools does it actually need?

Give it the minimum necessary permissions.

  1. What happens when it is wrong?

Design the failure path.

  1. Can the output be validated?

If yes, validate it.

  1. Does a human need to approve it?

If the action matters, probably.

  1. How will we evaluate it?

Build the evaluation before blindly shipping.

  1. How much will it cost?

Model calls are infrastructure.

  1. Can we replace the model later?

If not, you've probably coupled your product too tightly to the provider.

The Future Isn't "AI Replaces Engineering"

It's More Interesting Than That.

AI is changing the role of the software engineer.

The engineer increasingly becomes the person who designs:

Systems

Constraints

Interfaces

Workflows

Feedback Loops

Evaluation

Architecture

Automation

And AI becomes increasingly capable of executing inside that environment.

A useful way to think about it is:

Humans define the system. AI operates within the system. Engineering makes the system trustworthy.

That's already visible in modern agentic engineering practice: the emphasis is shifting toward giving agents good environments, explicit intent, feedback mechanisms, and maintainability guardrails rather than simply asking models to generate more code.

So, Does Your AI App Need More AI?

Maybe.

But that's probably not the first question you should ask.

Ask:

Is the product well engineered enough to make the AI useful?

Because a mediocre model inside an excellent system can create a surprisingly good product.

But an excellent model inside a badly engineered system can create a very impressive demo—and a very frustrating application.

The next time you're tempted to add another agent, another model, or another AI feature, stop for a moment.

Look at the architecture.

Look at the workflow.

Look at the data.

Look at the failure modes.

Look at your evaluations.

Look at your observability.

Then ask:

"Do I actually need more AI—or do I need to build a better system around the AI I already have?"

Very often, the answer is the second one.

And that's where AI engineering starts becoming real software engineering.

Get told when I publish

One email per new article or case study. No newsletter, no schedule, unsubscribe in one click.

Open to full-time remote roles and freelance work.