← Back to Blog
Building in Public

The Day Everything Went Right: When Fast Means Unbroken

christian crumlish•
A robot snapping a plugin module cleanly into place, where speed and zero breakage arrive together at last.
“Mornin’ boss!”

The Day Everything Went Right: When Fast Means Unbroken

October 3

At 4:50 PM on Friday, my Lead Developer — Claude Sonnet 4.5, if we’re being formal — sent me the completion summary for GREAT-3B. The numbers looked almost suspicious: 48 tests passing, zero breaking changes, about 90 minutes of actual implementation time spread across two programming agents working in careful sequence.

It seemed almost too easy.

“This is starting to feel eerie,” I’d noted earlier in the day, watching yet another phase complete ahead of estimate without drama. Not “we got lucky” eerie. More like “we’ve built something that actually works the way it’s supposed to” eerie.

Which, if you’ve shipped software for decades as I have, you know is the weird kind of smooth.

What GREAT-3B actually did

GREAT-3B took Piper Morgan’s plugin system from “four hardcoded imports” to “dynamic discovery and configuration-controlled loading.” The kind of change that usually means: breaking half your tests, discovering assumptions you didn’t know you’d made, and spending Friday afternoon figuring out why plugins load in dev but not production.

Instead, we got:

  • Complete filesystem discovery scanning for available plugins
  • Config-driven selective loading (disable plugins without touching code)
  • Smart handling of module re-imports in test environments
  • All four existing plugins (Slack, GitHub, Notion, Calendar) working identically
  • 14 new tests added to the existing 34
  • Zero regressions

The technical achievement isn’t the interesting part. What’s interesting is why it went so smoothly. Like those scenes in thrillers where someone mentions how quiet it’s gotten and another person nervously says it feels “too quiet.”

The foundation that wasn’t visible until we needed it

The work on GREAT-3A — which I wrote about earlier this week — had put all four plugins onto a standard interface. That sounds like typical refactoring work until you realize what it meant for Friday: when we needed to dynamically load plugins, every plugin already spoke the same language. No special cases. No “this one’s different because reasons.”

Strategy!

Chief Architect (Claude Opus 4.1, our strategic planner) made the GREAT-3A decision to keep plugins distributed in their integration directories rather than centralizing them. At the time, that seemed like a minor architectural choice. Friday morning at 1:05 PM, when I asked the Lead Developer “where should plugins live?”, the answer was already proven in production: right where they are.

That’s what building on solid foundations actually looks like — not gold-plating for the future, just making decisions that don’t create problems later.

Phase −1: The reconnaisance nobody sees

At 1:07 PM we added a “Phase −1” to the plan. Before even investigating the challenge (Phase 0), let alone implementing anything (Phase 1 through n), verify what’s actually there.

The programming agents (Code and Cursor, both running Claude Sonnet 4.5 although Cursor has its own special ways under the hood) spent 42 minutes between them just checking:

  • Where are the plugin files actually located?
  • How does the current static import pattern work?
  • What does the registry already have that we can use?
  • What’s the test baseline we need to maintain?

Presumably human developers can sometimes just, well, remember how the system works and what was built, but the truth is that in today’s complex computer systems, you really can’t assume anything is working the way the spec says without actually looking.

They found that PluginRegistry already had methods for getting plugins, listing them, filtering by capability. The interface from GREAT-3A already included initialization and shutdown lifecycle hooks. Even the auto-registration pattern—where importing a plugin file automatically registers it—would work with dynamic imports using Python's importlib.

In other words, most of the infrastructure was already there. We just needed discovery and configuration.

That’s 42 minutes that didn’t show up in the “implementation time” metrics. It’s also why the implementation didn’t hit any surprises.

There are so many bromides from traditional crafts that apply here, with perhaps the most ancient of them being: “measure twice, cut once.”

The Chief Architect’s invisible guardrails

At 2:17 PM, Lead Developer presented a choice: put plugin configuration in a separate config/plugins.yaml file (clean, standard) or embed it in the existing config/PIPER.user.md (maintaining Wednesday's "single config file" unification).

Chief Architect recommended Option B without hesitation: “Maintains GREAT-3A’s config unification. Single file for all configuration. Architectural consistency.”

That one decision meant we didn’t spend Friday debugging why some configuration lived in YAML and some in Markdown, or why plugin settings seemed to ignore the main config file. It meant the configuration system worked because it used the same pattern everything else already used.

None of those nightmares we ran into at AOL in the latters days of AIM (AOL Instant Messenger), where the code was like nine-dimensional spaghetti after ten plus years of architectural bolt-ons.

These aren’t the decisions that show up in blog posts about architecture. They’re the decisions that mean blog posts don’t need to be written about why things broke.

When parallel becomes sequential

The phase structure showed something interesting about coordination:

Phase 0 (Investigation): Both agents worked simultaneously — Code analyzing the auto-registration pattern and config structure, Cursor examining the web app loading flow. 28 minutes + 14 minutes of parallel investigation.

Phases 1–4 (Implementation): Strictly sequential. Code built discovery (Phase 1), then Cursor built dynamic loading using that discovery (Phase 2), then Code built config integration (Phase 3), then Cursor updated the web app to use it all (Phase 4).

Sometimes I can let the agents run in parallel. One writes code, the other tests. Or they can work on different layers of a system. But other times it’s best to set up a relay race.

Each phase depended on the previous phase being actually done. Not “mostly done” or “we’ll fix it later” but done-done: tested, documented, committed.

With the help of the Lead Developer, I managed those handoffs in real-time, deploying agents with specific prompts that said “here’s what Phase N created, here’s what Phase N+1 needs to build on it.” No agents waiting idle for work. No agents blocked on unclear dependencies. Just: investigation → foundation → integration → application → validation.

The whole implementation sequence took 76 minutes of agent time across both programmers.

The measurement theater problem

At 2:54 PM, Lead Developer added a note to its session log based on my observations:

Methodological Observation: Agent prompts and templates contain time estimates that create false precision and expectations. Current pattern: Prompts say “Estimated: 45 minutes”, agents report “28 minutes (38% faster than estimated)”, creates unnecessary time accounting overhead.
Recommendation: Remove all time references. Focus on deliverables and success criteria only. What matters is quality and completeness, not speed metrics.

This is the kind of observation you only make when things are going well. When you’re firefighting, nobody stops to question whether time estimates are useful. But when a phase finishes “38% faster than estimated,” what does that number actually mean?

Nothing, it turns out. Or rather, it measures the wrong thing.

The time that mattered wasn’t “how fast did we implement Phase 2.” It was “how much time did we not spend on Friday debugging why plugin loading broke in production.”

What “fast” actually means here

The omnibus log* for October 3 shows total elapsed time of about 4 hours from “Lead Developer starts” to “GREAT-3B complete.” But that includes:

  • Strategic decision discussions with Chief Architect
  • Me being unavailable for an hour for an all hands meeting.
  • Documentation updates and git commits
  • Creating the comprehensive handoff materials

The actual building — writing code, updating tests, integrating components — was 76 minutes across two agents working in sequence.

But calling this “fast” misses the point. We didn’t speed up the development process. We stopped creating problems that needed fixing later.

Here’s what we didn’t do Friday:

  • Debug why tests passed locally but failed in CI
  • Investigate why disabling a plugin broke unrelated features
  • Fix imports that worked yesterday but mysteriously stopped working
  • Refactor code written too quickly to be maintainable
  • Write apologetic commit messages about “temporary fixes”

None of that is “fast.” It’s just unbroken.

(* I’ve started having my doc assistant digest all the agent logs for a work session into a single “omnibus” timeline, to show the consolidated dance and remove redundancy)

The eeriness of drama-free work

We didn’t miss anything. Friday’s work succeeded because:

  • Wednesday’s GREAT-3A work had already unified the plugin interfaces
  • Phase −1 verified assumptions instead of making them
  • Chief Architect made architectural decisions that prevented future problems
  • Lead Developer orchestrated careful sequential dependencies
  • Both programming agents had clear success criteria for each phase

The “eerie calm” isn’t luck. It’s what systematic work actually looks like when methodology isn’t fighting against itself.

What this taught us about technical debt you don’t create

Technical debt is usually described as the cost of going fast now and paying later. But there’s an invisible category: the technical debt you don’t create by working carefully upfront.

That debt doesn’t show up in any metrics. You can’t measure the bugs you didn’t have to fix or the refactoring you didn’t need to do. The only evidence is days like Friday where major changes just… work.

In a way this reminds me of the often invisible glue work product managers (and many UX leaders) provide to teams, solving issues, making connections, anticipating issues, coming up with plans. When done well, many problems never materialize, robbing us of the heroic satisfaction of dragonslaying in favor of ho-hum competence.

The Lead Developer’s time estimation observation points at something deeper: we’re measuring the wrong things. “How fast did we ship?” is less interesting than “How often do we have to go back and fix what we shipped?”

Friday’s 76 minutes of implementation didn’t need a follow-up Saturday of debugging because the investigation, planning, and architectural decisions happened first. The methodology didn’t skip steps to save time — it did the work in the right order so that time spent stayed spent.

The foundation for what comes next

GREAT-3B is complete. The plugin system can now discover available plugins, load only enabled ones, handle missing plugins gracefully, and let operators control the whole thing through configuration without touching code.

More importantly: it’s boring. No clever hacks. No special cases. No “this works but I’m not sure why” code. Just a straightforward implementation of discovery, loading, and configuration that does exactly what it claims to do.

Which means GREAT-3C — in which we will document the wrapper pattern documented as intentional architecture, make a developer guide complete with examples, create a test a template plugin, ensure all 4 existing plugins have version metadata, make an architecture diagram to show plugin-router relationship, and document the migration path documented for future — can build on this without first having to fix Friday’s shortcuts.

That’s what drama-free development actually purchases: tomorrow’s problems don’t include cleaning up yesterday’s messes.

← Back to BlogAlso available on Medium