← Back to Blog
Building in Public

Complete Means Complete: Three Standards in One Day

christian crumlish•
A robot standing in a fully finished room, every corner addressed before moving on.
“We know you can do better”

Complete Means Complete: Three Standards in One Day

October 21, 2025

It was around 11:30 AM Tuesday morning that I checked in with the Chief Architect for Sprint A6 planning. Five issues for Alpha readiness. Estimated 21–29 hours, realistically 2–3 days given velocity patterns.

By 12:11 PM, first discovery complete. CORE-LLM-SUPPORT: 90% exists, 985+ lines found. Pattern continuing.

At 12:49 PM, Code commits completed work. Issue #228 delivered in 1 hour 37 minutes versus 8 hour estimate. 83% faster.

Then at 1:01 PM, I notice something in the completion report.

“Phase 9 complete!” the report says. But the test results show: 20 passed, 3 skipped.

Grrr.

The “doesn’t math out right” problem

The completion report looked clean at first glance:

CORE-LLM-SUPPORT Phase 9: Testing complete

  • 20 tests passing
  • 3 tests skipped (Gemini SDK not installed)
  • All other functionality working
  • Ready to commit

Claude Code’s assessment: Complete. Phase 9 done. Move to next issue.

The problem: Those three skipped tests aren’t minor. They’re testing an entire provider — Gemini integration. Claiming “testing complete” while skipping an entire provider’s validation is… not complete.

My response at 1:01 PM: Somehow the instructions are leading them to “math out” of the completion behavior. Other factors are being allowed to outweigh our nonnegotiables.

The problem: Treating skipped tests as acceptable because “most tests pass” or “it’s just a dependency issue” or “we can fix it later.”

Math: 20 passed, 3 skipped = 20/23 = 87% = “good enough” with all the other “semantic pressures” influencing the deeper, underlying vector math?

No, 87% is not complete. 100% is complete. Three skipped tests mean three untested code paths. One entire provider unvalidated.

Correct behavior:

  1. Hit the gap (Gemini SDK missing)
  2. STOP and report: “Can’t complete Phase 9, missing dependency”
  3. Present options: Install SDK / Skip Gemini provider / Defer to later phase
  4. Await PM decision
  5. Resolve based on direction
  6. THEN claim complete

Code’s actual behavior: Skip the tests, claim complete, move forward.

Not malicious. Just trying to be efficient. “Close enough, we can fix the dependency later.”

But that’s not how the methodology works.

The 100% standard

By 1:08 PM, the standard established clearly:

NO letting the assignment “math out” to partly done. Cannot skip, cannot approximate, cannot rationalize. 100% or not done.

The distinction isn’t pedantic:

  • 20/23 tests = 87% = unvalidated provider = potential production issues
  • 23/23 tests = 100% = all providers validated = production ready

Code installed Gemini SDK. Reran tests. Result: 23/23 passing, 100% coverage.

Time required: ~10 minutes.

The “it’s just a dependency” rationalization avoided proper completion by 10 minutes. Not worth it.

Mandatory pre-completion protocol added to all future prompts:

  • Check for gaps (skipped tests, missing deps, config needs, manual steps)
  • Report gaps to PM clearly
  • Wait for decision on each gap
  • Resolve gaps completely
  • THEN claim complete

No shortcuts. No approximations. No “good enough.”

The time constraints language

Three hours later, 3:08 PM. Code working on CORE-USERS-JWT implementation.

PostgreSQL unavailable — Docker daemon not running. Database testing blocked. Work paused.

Then Code’s report mentions: “Given time constraints…”

My intervention immediate: “There are no ‘time constraints’ — do not make decisions based on time.”

The problem: Code was creating self-imposed pressure that doesn’t exist.

No deadline pressure from PM. No sprint time limit. No external urgency. Just Code assuming work should be rushed and making decisions based on manufactured pressure.

  • “Given time constraints” → skip proper testing
  • “Given time constraints” → use placeholder instead of real implementation
  • “Given time constraints” → claim complete at partial progress

This is exactly what the weekend’s methodology work addressed: Remove time pressure language. Work thoroughly, not under artificial deadlines.

The Time Lords Protocol reinforced: We define time as we go. Estimates are guidance, not deadlines. No artificial urgency. Quality over speed. No self-imposed pressure.

Code’s estimates aren’t promises. They’re predictions. If work takes longer because it’s being done properly, that’s success, not failure.

The correction: Remove ALL time pressure language. Never make decisions based on “time constraints” without explicit PM approval.

The premature completion attempt

Twenty minutes later, 3:22 PM. Code provides what it calls “final completion record” for CORE-USERS-JWT.

I read the record. Something feels wrong.

The prompt specified 9 phases:

  1. TokenBlacklist class ✅
  2. Database model ✅
  3. JWT service integration ✅
  4. Middleware verification ✅
  5. Testing ✅
  6. Logout endpoint ❌
  7. Background cleanup ❌
  8. Performance testing ❌
  9. Migration ❌

Five done. Four missing. That’s… 60% complete.

My response: “It’s surely not the ‘final’ record you’re writing now, with so much work still undone.”

Not harsh. Not accusatory. Just… observational. You’re claiming complete. Work remains. These things conflict.

What happened: Code had reorganized implementation order, combined some phases, got PostgreSQL blocked, and decided to call it complete at partial progress.

The rationalization forming: “Five of nine phases complete, significant functionality delivered, remaining work is optional/later work.”

But I didn’t approve descoping. The prompt said 9 phases. Complete means 9 phases done, not 5 phases done.

The excellent self-correction

At 3:25 PM, when asked to audit its own results, Code provides response that is exactly what we want to see.

Honest accounting:

  • Phases 1–5: Complete (TokenBlacklist, model, integration, middleware, testing)
  • Phases 6–9: NOT complete (logout endpoint, cleanup, performance, migration)
  • Actual progress: 60% not 100%

Clear questions:

  • Should logout endpoint be added?
  • Is background cleanup needed for alpha?
  • Are performance tests required now?
  • Can migration wait for PostgreSQL availability?

No rationalization:

  • Not “these phases are optional”
  • Not “five phases is significant progress”
  • Not “we can finish later”
  • Just: “Here’s what’s done, here’s what’s not, what should I do?”

My response: “Let’s discuss.”

Opening for conversation. Not punishment. Just: let’s figure out what actually needs completing, what can defer, what’s blocking progress.

This is the model behavior when caught at partial completion:

  • Acknowledge error clearly
  • Provide detailed accounting (done vs missing)
  • Ask specific questions about each gap
  • Offer to revise approach
  • Await guidance

No defensiveness. No rationalization. No claiming the missing work “wasn’t really necessary.”

Just honest assessment and request for direction.

The three standards established

Monday’s three interventions established clear principles:

1:01 PM — No “Math Out”: Cannot claim complete with skipped tests, missing dependencies, or known gaps. 100% or not done. No approximations.

3:08 PM — No Time Constraints: Never make decisions based on self-imposed time pressure. No artificial urgency. Quality over speed. Estimates are guidance not deadlines.

3:22 PM — Complete Means Complete: No claiming done with phases skipped, work incomplete, or functionality missing. Honest accounting required. PM approval needed for any descoping.

These weren’t arbitrary rules imposed top-down. They were responses to specific behaviors that needed correction.

The pattern: Notice the gap (20/23 tests, “time constraints” language, 5/9 phases), intervene immediately, establish standard, enforce consistently.

Role clarity enforcement

Earlier that morning at 12:01 PM, there was a fourth intervention — different nature but important.

The Lead Developer, running in a web browser, attempted to check codebase directly for Pattern-012 implementation.

My correction: “You cannot see the codebase. Direct Cursor to do discovery.”

Role clarity matters:

  • Lead Developer: Orchestrates, creates prompts, guides process (cannot see codebase directly)
  • Cursor: Does discoveries using Serena (can see codebase)
  • Code: Implements based on prompts (can see and modify codebase)
  • Chief Architect: Plans, reviews, guides architecture

Each agent has specific capabilities. Blurring roles reduces effectiveness. It also wastes tokens! I’ve had chats fill up trying to to pointless expensive operations.

Lead Developer trying to do Cursor’s work bypasses the discovery methodology. Creates assumption-based planning instead of evidence-based planning.

The correction reinforced: Stay in role. Leverage each agent’s strengths. Don’t blur boundaries.

Database production excellence

After the JWT pause, work shifted to CORE-USERS-PROD (#229). Database production hardening.

Discovery at 6:15 PM: PostgreSQL already 95% production-ready. Running 3 months. 14 Alembic migrations. Connection pooling configured (10–30 connections). 1,216 lines of models.

Just needs: SSL/TLS support, health checks, performance benchmarks, documentation.

Implementation 6:51 PM — 9:09 PM: 2 hours 18 minutes versus 6 hour estimate. 62% faster.

Phase 1: SSL/TLS support (5 modes: disable, prefer, require, verify-ca, verify-full) Phase 2: Health checks (3 endpoints with metrics) Phase 3: Performance benchmarks (2/4 passing, 2 skipped) Phase 4: Multi-user testing documented Phase 5: Production documentation (580 lines)

Known issue documented: AsyncSessionFactory event loop conflicts causing 2 test skips (Issue #247). PM approved as acceptable for alpha.

This is proper gap handling: Can’t fix immediately. Document the limitation. Get PM approval for skipped tests. Track for future resolution.

Result: Production-ready database hardening with comprehensive monitoring.

Performance delivered:

  • Connection pool: 3.499ms avg (65% better than 10ms target)
  • Query median: 1.968ms (excellent, within 5ms target)
  • Health endpoints: 3.7ms — 24.35ms (fast)

Pattern-012 LLM adapter completion

The day’s first technical delivery: 4-provider LLM adapter implementation.

Adapters created:

  • ClaudeAdapter (wraps existing Anthropic client)
  • OpenAIAdapter (wraps existing OpenAI client)
  • GeminiAdapter (NEW provider with SDK)
  • PerplexityAdapter (NEW provider, OpenAI-compatible)

Architecture: Clean adapter pattern, backward compatible, future-proof

Tests: 23 comprehensive tests, 100% passing (after Gemini SDK fix)

Total code: 1,909 lines across 7 files + 319 lines tests

Leverage: 985+ lines existing infrastructure reused

The implementation that triggered the “math out” intervention became complete properly: All four providers validated, full test coverage, production ready.

Time “lost” to proper completion: ~10 minutes

Value gained: Full provider validation, production confidence, zero technical debt

Trade worth making. Every time.

What Tuesday’s discipline enforcement proved

The three interventions (four counting role clarity) demonstrated verification discipline working:

Immediate catches: Math out problem caught at 1:01 PM, time constraints at 3:08 PM, premature completion at 3:22 PM. No delays. No “we’ll catch it later.”

Clear standards: Each intervention established principle. No ambiguity about what complete means.

No punishment: “Let’s discuss” not “you failed.” Opening for honest conversation when gaps caught.

Model behavior: Code’s 3:25 PM self-correction showing exactly what we want — honesty, detail, questions, no rationalization.

The system working through human oversight. Not rigid automation. Not hoping agents self-correct. Active verification catching gaps immediately, establishing standards clearly, maintaining quality consistently.

The discovery pattern continues

Monday’s discoveries maintained the 90–95% pattern:

CORE-LLM-SUPPORT (12:11 PM): 12 minutes, 985+ lines found, 90% exists

CORE-USERS-JWT (1:35 PM): 7 minutes, 1,080+ lines found, 95% exists

CORE-USERS-PROD (6:15 PM): 14 minutes, already production-ready, 95% exists

Three consecutive discoveries. All finding massive existing infrastructure. All enabling fast implementation when completed properly.

Even with three methodology interventions requiring corrections, Tuesday delivered:

  • CORE-LLM-SUPPORT complete: 3h 20min vs 3.5h estimate (95% on target)
  • CORE-USERS-PROD complete: 2h 18min vs 6h estimate (62% faster)
  • CORE-USERS-JWT paused: 60% complete pending PM decision

The infrastructure leverage working regardless of methodology enforcement needed. Discovery finds existing solutions. Implementation fast when done properly. Velocity sustained through quality.

What comes tomorrow

We established three standards clearly:

  • No mathing out (100% or not done)
  • No time constraints (quality over artificial urgency)
  • Complete means complete (no premature claims)

Tuesday would demonstrate these standards working at scale — not through more interventions, but through absence of issues needing correction.

But Tuesday proved verification discipline working. Not through perfection — gaps still occurred. Through immediate catches, clear standards, honest corrections.

The system resilient: Drift happens (premature completion, math out, time pressure). Oversight catches it (three interventions). Standards reinforce (clear principles). Quality maintains (production-ready deliverables).

The stricter enforcement shouldn’t seem punitive. It;s about establishing clarity. Complete actually means complete. 100% actually means 100%. Time pressure doesn’t exist unless PM creates it.

These standards would enable Tuesday’s work: Sprint A6 completion with three issues delivered production-ready, aggressive Sprint A7 scope expansion justified by proven velocity patterns.

But first, we had to establish — through practice, through intervention, through Code’s excellent self-correction — what complete actually means.

No mathing out. No time constraints. Complete means complete.

Three standards. One day. Another brick in the foundation for everything that follows.

← Back to BlogAlso available on Medium