If it hurts to delete, I waited too long. Every time I’ve hesitated, it was because I was proud of some clever scaffolding—a retrieval shim I tuned for days, a critic agent that “felt” essential, a prompt chain I could recite from memory. Then a new model landed and made the whole thing unnecessary. When I kept it anyway, we paid for it in latency, token spend, and headspace.
Concrete example: our LLC Agreement Scorer started with hand-rolled clause extractors, a re-ranker, and a style linter to paper over model gaps. When the newer model got good at long-context reasoning, a single pass with lighter tooling hit the same quality on our golden tasks. We ran it behind a flag, watched the metrics hold, and ripped the stack out. Instantly fewer moving parts, simpler debugging, and we shipped a “what-if clause” view that same week because we weren’t babysitting brittle glue.
Same story on a fire-safety packet demo: I built a drafter, a checker, and a formatter agent. The checker felt “responsible,” but the new model plus tighter instructions made it a no-op. Keeping it looked like diligence; in reality, it was nostalgia. Delete, breathe, move on.