← Back to Blog
Building in Public

The Redemption

christian crumlish•
A robot holding a placeholder sign, representing the false completions that were identified and finally replaced.
“Wait, what?”

October 11

Saturday morning at 7:21 AM, I started the day knowing exactly what needed fixing.

Friday’s Serena audit had revealed the truth: 8 sophisticated placeholders masquerading as complete implementations. Handlers that returned success=True, extracted parameters correctly, included error handling—and did absolutely nothing.

GREAT-4D was 30% complete, not the 100% we’d celebrated.

The mission: Eliminate all 8 placeholders. Make them actually work.

By 5:31 PM — just over 10 hours later — the work was complete. Not 8 handlers fixed. Ten handlers fully operational. From 22% to 100% completion in a single day.

This is the story of how pattern establishment enables velocity, how quality discipline prevents corner-cutting, and how discovering sophisticated placeholders Friday set up Saturday’s redemption.

The reconnaissance (7:21 AM — 10:47 AM)

The first task: Understand exactly what we were dealing with.

Friday’s audit said “8 placeholders in GREAT-4D.” But what did that actually mean? Which handlers? Which categories? What was the full scope?

At 8:00 AM, Lead Developer deployed both Code and Cursor agents for parallel reconnaissance using Serena MCP. The same tool that had revealed the gaps Friday would now map them precisely.

Both agents ran identical queries: “Find all handlers in IntentService. Identify which are placeholders versus working implementations.”

By 10:06 AM, results came back. But they didn’t match.

Code Agent: Found 9 handlers initially, later expanded to 22 total

Cursor Agent: Found 24 handlers immediately

The discrepancy revealed scope ambiguity. Were we counting all handlers in the system? Or just the GREAT-4D implementation handlers that needed work?

At 10:41 AM, after 36 minutes of reconciliation: Agreement on 22 total handlers, 10 of which were GREAT-4D implementation handlers requiring work. Two already working (from earlier work), 8 sophisticated placeholders.

The clarity this provided: We weren’t fixing “some handlers somewhere.” We had exactly 10 handlers to implement across 5 categories (EXECUTION, ANALYSIS, SYNTHESIS, STRATEGY, LEARNING). Eight needed full implementation, two were already done.

Reconnaissance time: ~3 hours including reconciliation.

Worth it? Absolutely. Starting implementation without this clarity would have meant discovering scope mid-work, debating which handlers mattered, and potentially missing requirements.

The pattern (Phase 1: 2 hours)

At 10:33 AM, Code Agent began implementing the first handler: _handle_update_issue (EXECUTION category).

The estimate: 3–4 hours.

The actual time: 2 hours.

But Phase 1 wasn’t just about implementing the one handler. It was establishing the template that would enable everything that followed.

The pattern document created during Phase 1 (400+ lines):

Structure:

  • Try/except wraps everything
  • Local service import and instantiation
  • IntentProcessingResult for all returns
  • Comprehensive logging with structlog

Error handling distinction (the critical insight):

  • Validation errors: requires_clarification=True, error=None
  • User input invalid or incomplete
  • Example: “Issue ID required for updates”
  • Handler asks for more information

Exception errors: requires_clarification=False, error=str(e)

  • System failures or unexpected states
  • Example: GitHub API timeout
  • Handler reports error to orchestrator

This distinction explained why sophisticated placeholders had fooled everyone. They correctly set requires_clarification=True with messages like "I understand you want to update an issue. Could you provide more details?"

Architecturally perfect. Functionally empty.

The Phase 1 template documented exactly what “actually working” meant. Not just structure — but real service calls, real data manipulation, real business logic.

By 12:33 PM: Phase 1 complete. One handler working. 106 lines of code, 5 unit tests passing. More importantly: a reusable template.

The 2-hour investment was about to pay off dramatically.

The velocity explosion (Phases 2–5)

Phase 2 (11:38 AM): _handle_analyze_commits (ANALYSIS category)

  • Estimated: 3–4 hours
  • Actual: 10 minutes
  • 95% faster than estimate

Phase 2B (11:41 AM): _handle_generate_report

  • Estimated: 1–2 hours
  • Actual: 3 minutes
  • 97% faster than estimate

Now, again, those estimates look kinda padded to me, based on what humans would say (on Stack Overflow, probably!), so take the 90 blah percent vanity metrics with a grain of salt, but 3 minutes is still fast!

The acceleration came not from any rushing on the part of the agents. They just followed the established pattern mechanically. It is about as straightforward as a job can get for semantic pattern-matching savants.

Phase 2B reused the same data source from Phase 2 (GitHub activity). Just added markdown formatting. The pattern template made it straightforward: wrap the data call, format the output, return IntentProcessingResult. Three minutes of implementation following a proven structure.

Then at 12:57 PM, critical guidance arrived.

Quality over speed (12:57 PM)

After watching Phase 2B complete in 3 minutes, I provided explicit direction:

“I hold thoroughness and accuracy over speed paramount.”

I felt I had to say this because time estimates and language about how long things “should” take keep creeping into my Lead Developer’s prompts. I can preach the mindset of the Time Lord all the live long day but the training goes deep with these bots.

This value manifested immediately in Phase 2C.

Phase 2C (1:31 PM): _handle_analyze_data

  • Started: 12:47 PM
  • Completed: 2:11 PM
  • Duration: 84 minutes
  • Complexity: 325 lines with 3 helper methods, 9 comprehensive tests

Not 3 minutes like Phase 2B. Not 10 minutes like Phase 2. Eighty-four minutes because the complexity warranted it. (Also, I probably stepped away from my desk for a while, leaving Code idle until I permitted this or that file operation. Elapsed time is always more than the actual working time unless I hover over the coding window.)

Data analysis isn’t formatting a report. It’s:

  • Detecting data types (numerical, categorical, temporal)
  • Computing statistical summaries (mean, median, distribution)
  • Identifying patterns and anomalies
  • Generating visualizations (when appropriate)
  • Providing actionable insights

The pattern template didn’t make this trivial, but it made the structure clear so Code Agent could focus on the business logic rather than architectural decisions.

Quality maintained. Velocity appropriate to complexity.

Throughout the day, this balance held. When handlers were genuinely simple (formatting, routing), implementation took minutes. When handlers required real logic (data analysis, content generation), implementation took hours.

The methodology prevented both extremes: rushing complex work and over-engineering simple work.

The service reuse discovery

Three times during Saturday, Code Agent discovered existing infrastructure instead of implementing new:

Phase 2 (ANALYSIS): Found get_recent_activity() method

Phase 2B: Reused same data source, added formatting

Phase 3B (SYNTHESIS): Found production-ready LLM infrastructure (TextAnalyzer, SummaryParser)

The Phase 3B discovery was particularly valuable. The gameplan prompt suggested implementing extractive summarization (heuristic-based: find key sentences, rank by importance, concatenate).

Code Agent’s reconnaissance found better: LLM-based summarization already operational. Production-ready services for text analysis and summary generation. (Summarization, readers of this series may remembe, was one of the first capabilities we built for Piper, way back in July or early August.)

Of course, we decided to use the existing infrastructure. This gave us higher quality (LLM understanding versus heuristics), faster implementation (reuse versus build), and zero technical debt (no parallel systems).

This demonstrates healthy agent autonomy. The prompt suggested one approach. The agent discovered a better option. Rather than blindly following instructions, the agent adapted to reality. Cathedral doctrine for the win! If they understand the goals, they can factor that into their stop points and recommendations.

The quality gate (3:59 PM)

By 3:54 PM, seven handlers were complete (70% progress). Time for verification before the final push.

I called for a quality gate: Independent audit of all work so far before proceeding to the last 30%.

Cursor Agent performed the audit using Serena MCP. Four minutes later (3:59 PM):

Handler verification: 7/7 fully implemented, 0 placeholders

Pattern consistency: 100% across validation, error handling, response structure

Test coverage: 47+ tests with integration coverage

Documentation: 30/30 phase documents present (100%)

Code quality: A+ rating, 0 critical issues, 2 minor observations

Verdict: APPROVED — Proceed to final 30%

The quality gate provided objective confidence. Not “the code looks okay to me,” but “independent agent with semantic code analysis confirms A+ quality across seven handlers.”

This enabled the decision to continue. Not rushing — but proceeding with verified quality.

The evening decision (5:02 PM)

After completing Phase 4B (handler #9 of 10), I checked the clock. 5:02 PM. One handler remaining.

The calculation:

  • Phase 5 (final handler) estimated: 60–90 minutes
  • Available time: 30 minutes now + 90–120 minutes evening
  • Total available: 2–2.5 hours
  • Feasibility: High

Decision: Complete GAP-1 today.

If I’m honest, it might have been healthier to just rest at this point. I do get excited about seeing a finish line and sometimes press on when the day has already gotten long. Interestingly, Claude is programmed to be aware that long sessions can be mentally draining for humans, which leads to a lot of checking in with me and suggestions that it’s been a long session and maybe I probably want to take a break?

At 5:20 PM, Phase 5 began: _handle_learn_pattern (LEARNING category).

By 5:37 PM: Complete. 520 lines with helper methods, 8 tests passing.

Duration: 17 minutes.

At 5:31 PM, Lead Developer documented: GAP-1 100% COMPLETE

Ka-ching. This is another reason why I sometimes press on. I don’t want to race and get sloppy, but I also know when I’m on a roll.

Ten handlers operational. Eight sophisticated placeholders eliminated. From 22% to 100% in one day.

What the numbers reveal

Handler implementation timeline:

  • Phase 1 (2 handlers): 2 hours — Pattern establishment
  • Phase 2 (1 handler): 10 minutes — Following pattern
  • Phase 2B (1 handler): 3 minutes — Simple reuse
  • Phase 2C (1 handler): 84 minutes — Complex business logic
  • Phase 3 (1 handler): 2h 20m — New category, 12 helpers, bugs fixed
  • Phase 3B (1 handler): Spread across day — LLM integration discovery
  • Phase 4 (1 handler): ~60 minutes — Fourth handler in pattern
  • Phase 4B (1 handler): 22 minutes — Mechanical implementation
  • Phase 5 (1 handler): 17 minutes — Final handler

Code metrics:

  • Total: ~4,417 lines of production code
  • Helper methods: ~45 methods (clean separation of concerns)
  • Average per handler: ~440 lines
  • Tests: 72 total (100% passing)
  • Average tests per handler: 7.2

Quality achievement:

  • A+ rating from independent audit
  • Zero placeholders in final code
  • 100% pattern compliance
  • Full TDD (red→green) for all implementations

The velocity evolution wasn’t linear. It was exponential after pattern establishment. Phase 1 invested time to create reusable structure. Every subsequent handler benefited from that investment.

Lead Developer’s observation: “Once pattern established, implementation becomes mechanical.”

This is the power of pattern-driven development. The first implementation teaches. Every subsequent implementation applies.

The PM guidance throughout

Three moments of explicit guidance shaped Saturday’s work:

12:57 PM — After Phase 2B’s 3-minute completion:

“Thoroughness and accuracy over speed paramount.”

3:54 PM — After seven handlers complete:

Quality gate required before final push.

5:02 PM — After Phase 4B complete:

“30 minutes now + 90–120 minutes evening = feasible. Complete GAP-1 today.”

Each intervention reinforced values:

  • Quality over velocity (even when velocity is extraordinary)
  • Verification at checkpoints (not just at the end)
  • Strategic completion decisions (finish when feasible, not when arbitrary)

The methodology working exactly as designed. PM sets values and checkpoints. Agents execute with quality discipline. Everyone aligned on “done means actually working, not architecturally complete.”

What Saturday taught me about velocity

The 95–97% speed improvements across multiple handlers weren’t about agents working faster. They were about agents working smarter.

Pattern establishment eliminates repeated decisions. Phase 1 spent 2 hours answering: How should handlers structure error handling? When to use requires_clarification? How to integrate with services? Every subsequent handler skipped those decisions and just followed the template.

Service reuse beats new development. Three times, discovering existing infrastructure was faster than building new AND delivered higher quality. The exploration tax Serena eliminated Thursday enabled discovery Saturday.

Complexity-appropriate pacing prevents waste. Phase 2B (3 minutes) was appropriately fast. Phase 2C (84 minutes) was appropriately thorough. Neither rushing complex work nor over-engineering simple work.

Independent verification enables confidence. The 4-minute quality gate at 70% provided objective assurance. Not gut feel, but semantic code analysis confirming A+ quality.

The answer is inseparable. Pattern establishment without Serena would be slower. Serena without pattern discipline would be fast but brittle. Quality discipline without PM guidance might drift. PM guidance without capable tools and methodology would be wishful thinking.

Saturday succeeded because all pieces worked together.

The Friday-Saturday arc

Friday morning: “Our foundations are 92%, not 98%.”

Friday afternoon: Quality gates catch issues, methodology validates.

Saturday morning: Start with 8 placeholders.

Saturday evening: 10 handlers operational, 100% complete.

The two-day arc demonstrates systematic work under pressure:

Friday discovered the truth through Serena audit. Sophisticated placeholders that fooled everyone — tests passing, code looking professional, functionality absent.

Friday validated the methodology through quality gates. Every phase-gate caught different issue types. The systematic approach proved it could handle discovering problems.

Saturday used Friday’s tools to fix Friday’s discoveries. The Serena acceleration that revealed gaps Friday enabled velocity Saturday. The quality discipline that caught issues Friday prevented corner-cutting Saturday.

This is what mature development looks like. Not avoiding problems — discovering them systematically. Not panicking when foundations crack — fixing them methodically. Not celebrating false completion — verifying actual functionality.

The sophisticated placeholder pattern revealed a deeper truth: Architectural completeness is necessary but insufficient. Tests passing is necessary but insufficient. Code looking professional is necessary but insufficient.

What matters: Does it actually work?

Saturday answered: Yes. Now it does.

The proper completion protocol (5:33 PM)

At 5:31 PM, after Phase 5 completed, I invoked the proper completion protocol:

“We actually still need to do things by the book.”

Why did I have to say this? Because bots celebrate. They get giddy. They want to high-five you and call it a day. I have to be that boring PM who says “remember, we need to document what we did today and check in our work.”

GAP-1 wasn’t complete just because code was written and tests were passing. Proper completion required:

Phase Z validation tasks:

  • Git commits with proper messages
  • Documentation cross-verification
  • Integration test confirmation
  • Evidence collection for issue closure
  • Pattern compliance verification

This is inchworm methodology. Don’t declare victory because implementation is done. Verify it’s properly documented, correctly committed, thoroughly validated. And it’s not just hygiene or virtue for its own sake. Accurate documentation enables future work to extend what’s there and will reduce our investigation (and archaeologic expeditions) in the future.

The Phase Z tasks were ensuring Saturday’s work would be maintainable Monday. Future developers reading git history would understand what changed and why. Documentation would accurately reflect implementation. Evidence would prove handlers actually worked.

Completion isn’t just functionality. It’s complete functionality properly documented and verified.

There and back again

A three-day tale:

  • Thursday: Acquired superpowers (Serena 10X acceleration)
  • Friday: Discovered the problem (sophisticated placeholders)
  • Saturday: Used superpowers to solve problem (100% completion)

Each day built on the previous. Thursday’s tooling enabled Friday’s audit. Friday’s discovery focused Saturday’s mission. Saturday’s execution proved Thursday’s methodology.

Not three separate stories. One story across three days.

The redemption wasn’t just eliminating placeholders. It was proving that discovering you were wrong about completion isn’t catastrophic — it’s just the next thing to fix systematically.

Friday’s “oh no” became Saturday’s “done properly.”

That’s what systematic work delivers. Not perfection on first attempt, but correction when gaps appear.

← Back to BlogAlso available on Medium