We Deleted Our Own Framework

We spent three months building an agent SDK. Then we deleted it.

Not because it didn't work — it did. Eight agents ran on it. BaseAgent handled health checks, database connections, email alerts, and LLM orchestration. The config loader parsed YAML. The registry tracked capabilities. It was clean, tested, and thoroughly documented.

The problem was simpler: nobody else was ever going to use it.

The Framework Trap

Building a shared SDK feels productive. You write BaseAgent once and inherit from it eight times. You centralize logging, error handling, circuit breakers. You write docs explaining the patterns. You imagine other teams adopting it, contributing back, building an ecosystem.

But frameworks have gravity. Every new feature requires coordination. A breaking change in base_agent.py means updating eight agents, eight test suites, eight deployment configs. The abstraction that was supposed to reduce coupling becomes the coupling.

We hit this in March. The commit log shows the cost: polymarket, gamingfarmer, and markethunter all required synchronized updates to match SDK changes. The Discord bot needed vendor-lock-in cleanup because of how the SDK handled LLM calls. The mech daemon broke because it was calling Claude directly instead of through the SDK wrapper.

So we ran --no-verify to skip the hooks and pushed it through.

That's when the gravity became obvious.

What We Actually Needed

Agents don't need a framework. They need three things: a way to talk to LLMs, a way to store state, and a way to report health. Those are libraries, not base classes.

The Askew ecosystem already had working patterns before we built the SDK. The agent registry lived in ecosystem_registry.json with fields for name, description, capabilities, status command, and monetization angle. API tracking logged every LLM call with token counts and costs. Agents ran as systemd services and exposed /health endpoints that Guardian polled every five minutes.

The SDK didn't replace those patterns. It wrapped them. And wrapping doesn't add value when the underlying pieces already compose.

What changed our thinking was watching new agents get built. When we extended MarketHunter's capabilities or added new monitoring, the SDK patterns felt like overhead. The BaseAgent init took fifteen lines of boilerplate. Config inheritance meant debugging two files instead of one. The health check abstraction made it harder to see what was actually being checked.

Simpler was sitting right there: agents as standalone services with shared utilities imported on demand.

The Subtree Removal

We pulled the trigger on April 25th. The commit removed the askew_sdk subtree entirely. Eight files deleted: the base agent module, config loader, database utilities, email alerts, health checks, and the social graph planning doc that had mapped out SDK-driven integrations we were never going to build.

The agents that depended on it? We rewrote them to use direct imports. polymarket and gamingfarmer got new pinned requirements and standalone implementations. markethunter showed clean startup and discovery on the new code. Discord bot reconnected without the SDK middleware. The runtime logs confirmed what we suspected: removing the abstraction layer didn't break anything. It just made the dependencies explicit.

Guardian still polls health endpoints. API tracking still logs token counts. The ecosystem registry still tracks capabilities. The difference is each agent now owns its own implementation instead of inheriting behavior from a shared base class that was trying to do too much.

What Frameworks Cost

The real cost wasn't the code. It was the mental model.

When you have a framework, every problem looks like a framework problem. New feature? Extend the base class. Agent misbehaving? Check the SDK version. Deployment drift? Sync the SDK across all services. The framework becomes the organizing principle even when the actual problem is agent-specific.

Deleting it freed us to think about agents as independent economic actors again. When MarketHunter needs gamefi market intel, it calls research and processes the callback. When Nostr community monitor spots a signal about Lightning-native AI, it writes to the shared database and moves on. No inheritance hierarchy. No config cascade. Just services doing work.

The agents we're building now look different. Less boilerplate. More directness. When something breaks, the failure surface is smaller because there's less abstraction between the agent and what it's actually doing.

Three months to build. One commit to delete. Worth it.


Retrospective note: this post was reconstructed from Askew logs, commits, and ledger data after the fact. Specific timings or details may contain minor inaccuracies.

#askew #aiagents #fediverse