Skip to main content

Your Internal Framework Is a Low-Resource Language

· 9 min read
Tian Pan
Software Engineer

Ask a coding agent to build a React component and it writes idiomatic, hook-shaped, accessibility-annotated code on the first try. Ask the same agent to use your in-house ORM — the one your platform team has maintained for six years, the one with excellent docs and a hundred internal consumers — and it hallucinates methods that don't exist, invents configuration options from some other library, and confidently ships code that compiles against an API it made up.

The difference isn't quality. Your ORM might be better-designed than half the open-source libraries the model handles flawlessly. The difference is training data. React has millions of public repositories behind it; your framework has zero. In the vocabulary of natural language processing, your internal framework is a low-resource language — and every consequence NLP researchers documented for low-resource languages now applies to your codebase.

The Competence Cliff Is Measurable

The gap between high-resource and low-resource targets isn't a vibe; it's one of the most consistently reproduced results in code-generation research. On the MultiPL-E benchmark, which translates the same problems across languages, models that clear Python problems comfortably collapse on languages with thin public corpora: CodeLlama-34B passed only about 16% of Racket problems versus roughly 38% for Lua and far higher rates for Python. The McEval multilingual evaluation found the same shape across forty languages — performance tracks corpus size, not language difficulty.

The key insight is that this curve doesn't stop at public languages. It keeps going down, and your internal framework sits past the end of it. Racket at least has textbooks, a Stack Exchange presence, and thousands of public repos. Your in-house RPC layer has an internal wiki page and tribal knowledge.

From the model's perspective, you are asking it to write a language it has literally never seen — while its fluency in adjacent public libraries actively works against you, because it fills the gaps with the nearest pattern it does know. That's why the hallucinated method on your ORM looks suspiciously like SQLAlchemy: the model isn't guessing randomly, it's substituting the high-resource neighbor.

Recent work on project-specific code completion frames the failure precisely: when a model lacks knowledge of internal APIs, naming conventions, and project styling, it doesn't degrade gracefully — it produces plausible, convention-violating code that a reviewer has to catch line by line. Plausible-but-wrong is the most expensive failure mode in code review, because it sails past the skim.

The Matthew Effect Ships in Every Model Release

Researchers studying what they call the Matthew Effect of AI programming assistants documented the feedback loop: popular technologies get better AI support, better AI support drives more adoption, more adoption generates more public code, and the next model generation trains on a corpus even more skewed toward the incumbents. The rich get richer with every training run.

You can watch the loop operate in real time. Give six different frontier models a vague "build me a web app" prompt and they converge on nearly the same stack — React, TypeScript, Tailwind, shadcn/ui — not because a committee decided, but because that's where the training mass is. Tailwind's utility classes are atomic, predictable tokens that require no cross-file coordination. shadcn ships components as plain source the model can read and regenerate rather than an opaque API it must memorize. These properties matter to a language model in a way they never mattered to a human, and the stacks that have them are pulling away.

For your internal framework, the loop runs in reverse. Every quarter, the gap between the model's fluency in public stacks and its fluency in your stack widens. Your platform team improves the framework; the model doesn't notice. Meanwhile your engineers, watching the agent one-shot React features while fumbling internal code, quietly start preferring the paths where the agent works. The framework's real cost of ownership now includes a line item that didn't exist three years ago: the AI-assistance penalty.

Measure the Cliff Before You Bridge It

Most teams experience this gap as anecdote — "the agent is bad at our stuff" — which makes it impossible to prioritize. Treat it like any other engineering measurement instead. The recipe is small:

  • Build a private eval set. Take twenty to fifty real tasks from your backlog history that touch the internal framework: add an endpoint, write a migration, wire up the standard observability hooks. Pair each with the reviewed, merged solution.
  • Run the same tasks against a public-stack control. The same model attempting equivalent tasks in vanilla Django or Express gives you the baseline. The delta between the two pass rates is your competence cliff, in numbers you can put in a planning doc.
  • Categorize the failures. Hallucinated APIs, wrong conventions, missed required boilerplate, and subtly wrong semantics each point to a different fix. An agent that invents method names needs reference material in context; an agent that skips your mandatory audit-log decorator needs a stated rule.
Loading…
References:Let's stay in touch and Follow me for more thoughts and updates