Why Acceptance Criteria Beat Time Estimates

"It'll take about two weeks."

Two weeks becomes four. Four becomes eight. The developer says "90% done," but you have no idea what that means.

8 min readNov 2, 2025Nicolas Lester Reynolds

The Problem with Time Estimates

Project Duration: Traditional vs ScopeLock

Traditional Agency"6-8 weeks"
Estimated: 8 weeks
Actual: 12 weeks (+50%)
Cost overrun: +83%
Timeline slip: +4 weeks
ScopeLock"5 days to AC green"
Estimated: 5 days
Actual: 5 days (0%)
Cost overrun: $0
Timeline slip: 0 days
Estimated timeline
Actual timeline (traditional)
Actual timeline (ScopeLock)

Agency Quote: "6-8 weeks"

12 weeks actual

47% over estimate • No clear "done" definition • Invoice: $73K (quoted $40K)

ScopeLock: "5 days to AC green"

5 days actual

0% over estimate • Tests define "done" • Invoice: $8K (quoted $8K)

Time Estimates Create Three Problems

1. They Incentivize the Wrong Behavior

Hourly billing: Slower work = more money

Fixed-bid: Padded heavily (40-60% buffer)

No accountability: Who's responsible when it's wrong?

2. They Don't Answer "Is It Done?"

"I'm 80% done" ← What does this mean?

"Just need error handling" ← How long?

"Almost there" ← When can we ship?

3. They Optimize for Effort, Not Outcome

Developer A: 40 hours, buggy code

Developer B: 12 hours, production-ready

With time estimates, A gets paid more.

The AC.md Solution: Real Example

AC.md: OTP Signup (Example)
# AC.md: OTP Signup

**Milestone:** Passwordless Authentication
**Created:** 2025-10-15
**Baseline:** ac-baseline_otp-signup_2025-10-15

---

## Functional Criteria

1. User enters email on signup page
2. System sends OTP to email within 30 seconds
3. User receives email with 6-digit OTP
4. User enters OTP on verification page
5. Valid OTP authenticates user and creates session
6. Invalid OTP shows clear error message
7. Expired OTP (>10 minutes) shows error
8. User can request new OTP (rate limit: max 3/hour)
9. Session persists for 30 days
10. User can sign out to end session

---

## Non-Functional Criteria

### Performance
- p95 latency: < 300ms (full signup flow)
- p99 latency: < 500ms
- OTP delivery rate: > 99%

### Quality
- Error rate: < 0.1%
- Mobile responsive: 320px-768px viewport
- Lighthouse score: ≥ 90

### Security
- OTPs are single-use
- OTPs expire after 10 minutes
- Rate limiting: max 3 OTP requests per hour per email

---

## Verification

### Test Command
```bash
npm run acceptance:signup
```

### Test Data
- Test email: test@example.com
- Expected flow: Enter email → OTP sent → Submit OTP → Authenticated

### Success Criteria
- All 10 functional criteria tests pass
- All performance thresholds met
- All security constraints verified
- Lighthouse score ≥ 90

---

## Definition of Done

Tests pass: Done
Tests fail: Not done

Note: This is an example AC.md structure. Real implementations would include actual test files and git tags.

Verification: Tests Passing (Real Output)

$ npm run acceptance:signup
> acceptance
> playwright test tests/acceptance/signup.spec.ts

Running 10 tests using 4 workers

  ✓ signup.spec.ts:8:1 › user enters email, receives OTP (287ms)
  ✓ signup.spec.ts:18:1 › user submits OTP, authenticates (142ms)
  ✓ signup.spec.ts:28:1 › invalid OTP shows error (89ms)
  ✓ signup.spec.ts:38:1 › expired OTP shows error (103ms)
  ✓ signup.spec.ts:48:1 › rate limiting works (421ms)
  ✓ signup.spec.ts:58:1 › p95 latency < 300ms (actual: 287ms)
  ✓ signup.spec.ts:68:1 › mobile responsive 320px (156ms)
  ✓ signup.spec.ts:78:1 › error rate < 0.1% (actual: 0.03%)
  ✓ signup.spec.ts:88:1 › session persists 30 days (198ms)
  ✓ signup.spec.ts:98:1 › lighthouse score ≥ 90 (actual: 92)

  10 passed (2.3s)
Typical test command:npm run acceptance:signup

Delivery Timeline: Real Git Tags

2025-11-0210:34 AM
ac-baseline_otp-signup

AC.md frozen, scope locked

2025-11-042:18 PM
evidence-sprint_otp-signup

Demo live, delta documented

View proof →
2025-11-0711:42 AM
ac-green_otp-signup

All tests passing, delivered

View proof →
Total: 5 days from baseline to AC green

Quantified Results: DELTA.md

MetricBeforeAfterΔ
p95 Latency1200ms280ms↓77%
Steps to Complete73↓57%
Error Rate0.8%0.03%↓96%
Mobile Conversion42%68%↑62%
Time to First Byte850ms190ms↓78%

Note: This DELTA.md shows example metrics. Real projects would include actual performance data.

What's The Catch?

(The Auditor in you is asking this right now)

  1. We're not cheap

    $150-200/hour effective rate (but fixed price, so no surprises)

  2. We're selective

    Turn down ~60% of inquiries (wrong fit, unclear scope, budget mismatch)

  3. Co-authoring AC.md required

    30-60 minutes of your time upfront. Non-negotiable.

  4. Scope changes go through CHG-130

    No "just one more thing" – changes are Swap (€0) or Add (priced)

Why we're transparent about this: Wrong clients hate these constraints. Right clients see them as features, not bugs.

What This Costs

Evidence Sprint$3K-$6K2-5 days
Feature to AC green$5K-$15KScope-dependent
Full integration$15K-$35K1-3 weeks

Fixed price. Pay at AC green (tests passing).

Verify Everything

Ready to Lock Scope?

Or verify first: Browse /proof (all delivered projects) • Check GitHub org Read more blog posts