AI · 2 MIN READ · May 15, 2026

Building Planck #3: The 20/80 Split: Why the Future Is Mostly Local

Alex de Sousa

Alex de Sousa

BEAM engineer since 2012, Elixir alchemist since 2015, and open source author. Writing about Elixir, OTP, and software engineering.

SERIES
  1. 2Building Planck #2: Specialized Teams vs General Agents
  2. 3Building Planck #3: The 20/80 Split: Why the Future Is Mostly Local
  3. 4Building Planck #4: Introducing Planck, an Agent Harness in Elixir

We fixed the context. Now look at our bill.

We have optimized teams of agents working. Quality is good, but it’s getting expensive fast. Faced with that cost, we try to drop to cheaper frontier models at the expense of quality. But that’s the wrong approach.

The question isn’t which frontier model to use. It’s: which steps actually need one?

Most of them don’t.

The Specification Problem

There is one thing frontier models are genuinely exceptional at: turning ambiguous intent into a precise, unambiguous specification.

“Clean up the auth module.” “Improve the performance of this query.” “Write a blog post about AI.” These are underspecified requests. We need some brainstorming, follow-up questions and judgment to get there. Frontier models excel at this.

Once the specification is clear, execution doesn’t need a high level of intelligence. It just needs a model that knows how to follow instructions.

The expensive part of a workflow is knowing what to do. Doing it is mostly mechanical.

This realization changes the architecture.

The 20/80 Split

The numbers echo the Pareto principle[1]: a small fraction of inputs drives the majority of outcomes. Specification is that fraction.

flowchart TB U["User request"] --> O subgraph F["☁️ Frontier (20%)"] O["Orchestrator"] end O -->|"precise spec"| W1 O -->|"precise spec"| W2 O -->|"precise spec"| W3 subgraph L["🏠 Local (80%)"] W1["Worker"] W2["Worker"] W3["Worker"] end W1 & W2 & W3 -->|"results"| O O --> R["Response"]

The orchestrator runs once to reason and specify. Workers run constantly to execute. Cost follows the split.

flowchart TB U["User request"] --> O subgraph F["☁️ Frontier (20%)"] O["Orchestrator"] end O -->|"precise spec"| W1 O -->|"precise spec"| W2 O -->|"precise spec"| W3 subgraph L["🏠 Local (80%)"] W1["Worker"] W2["Worker"] W3["Worker"] end W1 & W2 & W3 -->|"results"| O O --> R["Response"]

The orchestrator is expensive, but runs less frequently. It runs at the start of a task, at the end, and occasionally mid-task to course-correct.

The workers run constantly and they’re cheap.

A well-written spec changes what local models can do. The same model that produces mediocre results on "refactor the auth module" will reliably handle:

Extract the session handling from `user_controller.ex` into a new `Session` module,
preserving the existing public interface.

The model didn’t get smarter. The input did.

Running Local in Practice

I run local models on a Framework Desktop at home. Though it started as a hobby, these models became part of my workflows.

I still use frontier models for specifications. They’re awesome at that job. But my local models can follow these specifications almost flawlessly, for next to nothing.

This is why Planck supports both frontier and local models natively. I’ve seen the 20/80 split match frontier-only quality in my own AI teams. I’ve gotten good quality at a fraction of the cost.

Owning the Loop

Cost isn’t the only reason to run local though.

Some of the models I run locally are also decent at specifications for certain tasks. They’re slow, but they get the job done with the right context. That lets some workflows run entirely local.

When we call a frontier model API, our data leaves our machine. Code, context, conversation history… all sent to a third party. Their pricing decisions affect our workflow. Their model updates can change our agent’s behavior overnight. Their rate limits cap our throughput.

When we run local, data stays on our hardware. The pricing is predictable as electricity is the main cost. Models don’t change unless we update them. Throughput is bounded by our machine, not a provider queue.

Depending on the hardware, it could even be environmentally friendly.[2][3][4]

Conclusion

The previous post gave us the team model. This post adds the cost dimension: not every step needs a frontier model, and knowing which steps do is most of the architectural work.

Planck supports this natively. Each agent in a team configures its own model provider independently. The orchestrator can call a frontier API while workers call a local endpoint. The team doesn’t need to change.

In the next post, we introduce Planck properly: what it is, how it works, and how context, specialization, and model routing come together in a single system.

Frontier for thinking. Local for doing.

References

  1. Pareto Principle
  2. Framework Desktop: A Deep Dive Into Power & Thermals
  3. Minimum Power Draw – Idle (Framework Community)
  4. Framework Sustainability
ABOUT THE AUTHOR
Alex de Sousa

Alex de Sousa

BEAM engineer since 2012, Elixir alchemist since 2015, and open source author. Writing about Elixir, OTP, and software engineering.

MORE POSTS