/John Overton

The Missing Dependency: Why Human Context is the Package AI Can't Install

Your project compiles. The tests pass. The AI generated clean, functional code across dozens of files. Everything looks right. But something is off, and you can't quite put your finger on it until a real user sits down and the whole thing falls apart.

The problem isn't the code. The problem is a missing dependency. Not one you'll find in a package.json or a requirements.txt, but one that's just as critical: human context. And unlike every other dependency in your stack, no AI agent is going to install it for you.

The Dependency Nobody Declares

Every software project has a dependency tree. Frameworks, libraries, runtimes, build tools. We obsess over managing these. We lock versions, audit vulnerabilities, and automate updates. But the most important dependency in any AI-assisted project never gets declared anywhere, because it lives in the head of the person building the thing.

Human context is understanding what you're building, who it's for, why it needs to work a certain way, and what happens when it doesn't. It's architecture, security, user experience, edge cases, deployment constraints, and business logic. The AI can't know what you don't tell it, and it definitely can't know what you don't know yourself.

I keep seeing the same pattern play out. Someone fires up an AI coding agent, describes what they want in broad strokes, and gets back something that technically runs. It compiles. It renders. It does... something. But it doesn't do the right thing, because the person asking didn't fully understand the problem they were solving. And that gap between “it works” and “it works correctly” is where most AI-assisted projects quietly fall apart.

It Starts With a Plan, But Not Just Any Plan

Everyone talks about planning. “Plan before you build.” Sure. But there's a difference between a plan that says “build a dashboard with charts” and a plan that says “build a dashboard where operations managers can see real-time vehicle utilization by route, filterable by date range, with role-based access so dispatchers only see their assigned regions.”

The second plan gives an AI agent something to work with. The first one gives it permission to guess. And AI is very good at guessing confidently.

This is where the missing dependency shows up first. The plan has to be informed by someone who understands the domain, the end user, the constraints, and the tradeoffs. You can use AI to help refine the plan, absolutely. But the seed of that plan, the “why” behind the “what,” has to come from a human who has real operational understanding of the problem space.

Think of it like this: you wouldn't start a project without installing your database driver. You'd get a runtime error the moment you tried to connect. Human context works the same way. Skip it, and you'll get runtime errors too. They'll just show up later, as confused users, broken workflows, and features that technically function but practically fail.

The AI is Guessing. On Everything.

Here's something people don't think about enough. When you tell an AI to build a feature, it's making hundreds of micro-decisions you never specified. Should this button be disabled after submission? Should this list be sortable? Can the user drag and drop items to reorder them? What happens when the network request fails? What gets validated on the client versus the server? How should this behave on mobile versus desktop?

The AI will answer all of these questions for you. It just won't answer them correctly, because it doesn't know your users, your product requirements, or your business logic. It's filling in blanks with reasonable defaults, and reasonable defaults are not the same as correct behavior.

You have to be specific. You have to be deliberate. Not just about the big picture, but about the details that seem small until they aren't. “I want this button here, and when clicked it should do X. If the user doesn't have permission, disable it and show a tooltip explaining why. Here's the error handling. These are the test cases. This is the expected output. This is how it should be secured.” That level of specificity is what turns AI from a guess machine into a precision tool.

This is also why tools like Cursor have taken off the way they have while platforms like Lovable and Replit's agent mode struggle with anything beyond a prototype. Cursor works because it feeds context directly from your codebase into the model. Developers already understand the concepts, the architecture, and the intent. They can quickly provide the context the AI needs, and that's what makes it so powerful. The tools that try to abstract away the need for human context are the ones that hit a wall the fastest, because you can't abstract away understanding. The AI's ability to read and interpret code does not mean it magically understands the full context of the functionality. Reading code and understanding intent are two very different things.

Context is Finite. Build Accordingly.

There's a practical constraint that makes human context even more important: AI output has hard limits. An AI model is not going to produce 100,000 tokens of detailed project plan in a single pass. At best, you'll get around 2,000 tokens of useful planning output at a time. That's roughly three to five solid feature descriptions.

That means you have to build methodically. You can't dump your entire vision into a prompt and expect a comprehensive blueprint to come back. You have to iterate. Break the work into pieces. Define each piece with enough specificity that the AI can execute on it without filling in critical gaps on its own. Each feature description needs to cover what the UI should look like, what the interactions should be, how errors should be handled, what the tests should verify, and how the feature fits into the broader system.

This is also why the “just let AI agents run autonomously” narrative is misleading. Anthropic recently made headlines when researcher Nicholas Carlini tasked 16 Claude agents with building a C compiler in Rust. Over about 2,000 sessions and $20,000 in API costs, the agents produced a 100,000-line compiler that could build the Linux kernel across multiple architectures. It's an impressive demonstration, and the coordination between agents was genuinely clever.

But look at what made it work. Carlini didn't just say “build a C compiler” and walk away. He built an elaborate testing harness. He used GCC as an oracle to verify correctness. He wrote custom test suites and designed feedback loops so the agents could tell whether they were making progress. The agents were also running on a model that had been trained on vast amounts of existing compiler source code, including open source C compilers like chibicc. The existing GCC torture test suite, with its decades of accumulated edge cases, served as the guardrails.

The context was massive, carefully structured, and provided by a human who understood compilers, testing methodology, and how to decompose a monolithic problem into parallelizable tasks. That's not “AI building from scratch.” That's a deeply knowledgeable human constructing the right environment for AI to operate in. The missing dependency was installed before the agents ever started.

You can't just put 10 agents together and say “build me an app that simulates a rocket going into space” and expect to come back to a clone of Kerbal Space Program. The vision, the decomposition, the acceptance criteria, and the verification, all of that has to come from someone who understands what “done” looks like. You have to spell it out, piece by piece, because that's how the work actually gets done.

You Can Build Without Knowing. You Can't Maintain Without Knowing.

Here's the thing that trips people up. You can absolutely build a working application without deeply understanding the underlying code. AI will generate it, you'll deploy it, and for a while everything looks fine.

Then something breaks. Or a requirement changes. Or a user reports an edge case you never considered. And now you're staring at a codebase you don't understand, asking the AI to fix something, and neither of you has enough context to do it cleanly.

This is where the failure loops start. You describe the bug. The AI patches it. The patch breaks something else. You describe the new break. The AI patches that. Each iteration drifts further from a coherent architecture because nobody in the loop, human or AI, has a clear mental model of the whole system. It's dependency hell, except the missing package is your own understanding.

I've lived this. I've watched it happen. And the difference between a productive AI-assisted session and a frustrating spiral almost always comes down to whether the human understands not just that something is broken, but why it's broken.

Why “Why” Matters More Than “What”

When you can articulate why something isn't working, you give the AI surgical precision. “The button doesn't render after creating a new task because the React root isn't re-initializing after the autosave triggers a DOM replacement.” That's a prompt that leads to a real fix.

Compare that to “the buttons don't work.” That's a prompt that leads to a dozen attempts, each one thrashing in a different direction, because the AI has no anchor point for what's actually going wrong.

The same principle applies to feature requests, architecture decisions, and security considerations. When you understand the why, you can communicate it. When you can communicate it, the AI can act on it. When you skip that understanding, you're hoping the AI fills in the gaps correctly. Sometimes it does. Often it doesn't. And you won't know the difference until it's a problem.

This is the core of what makes human context a true dependency rather than a nice-to-have. Without it, every interaction with the AI is a partial prompt. You're passing incomplete arguments to a function and hoping the defaults are reasonable. Sometimes they are. But you're building on luck, not understanding.

Installing the Dependency

So how do you actually install this missing dependency? It's not as simple as running a command, but there are practical habits that make a real difference.

Document as you build. Every time the AI implements something, have it create or update documentation about what it did and why. This creates a feedback loop where future prompts have better context, and future debugging starts from a place of understanding rather than guesswork. Your documentation becomes the README for your own project's decision history.

Understand your architecture before you generate code. You don't need to be an expert in every framework, but you need to know why you chose Next.js over plain React, why your data layer works the way it does, and what the boundaries are between your components. The AI will happily generate code that violates every architectural decision you've made if you don't tell it not to.

Own the debugging process. When something breaks, resist the urge to immediately paste the error into the AI and say “fix this.” Take a minute. Read the error. Think about what changed. Formulate a hypothesis. Then bring the AI in with that context. The difference in output quality is night and day.

Treat the AI as a collaborator, not a black box. Review what it generates. Ask it to explain its decisions. Push back when something doesn't feel right. The more you engage with the output, the more your own understanding deepens, and the better your future prompts become. That's the feedback loop that separates people who build with AI from people who just generate with AI.

The Human Advantage

The irony of AI-assisted development is that it makes human expertise more valuable, not less. Anyone can prompt an AI to generate a CRUD app. The advantage goes to the person who understands what the end user actually needs, how the system should behave under load, what happens when the database connection drops, and why that one edge case matters more than it looks like it does.

Product thinking, operational knowledge, domain expertise. These aren't nice-to-haves in the age of AI-assisted development. They're the entire ballgame. The AI handles the syntax. You handle the substance.

The best engineers I know who work with AI aren't the ones who write the most clever prompts. They're the ones who deeply understand the systems they're building and can translate that understanding into context the AI can use. They know what good looks like, so they can evaluate what the AI gives them. They know what should happen, so they can catch what shouldn't.

The Bottom Line

AI has dramatically lowered the barrier to building software. But it hasn't lowered the barrier to building software well. That still requires a human who understands the problem, the user, and the system. It requires someone who can plan with purpose, debug with understanding, and maintain with intention.

The gap between a project that ships and a project that lasts isn't the AI. It's the missing dependency. It's the human context that no package manager will ever resolve for you. And the sooner we stop treating AI as a replacement for understanding and start treating it as an amplifier of understanding, the better our software is going to be.

Install the dependency. Understand what you're building. The AI will take it from there.