← Back to Blog
Building in Public

The Discovery Testing Philosophy: Testing What Matters for Alpha

christian crumlish•
A robot judging competing test approaches side by side, choosing what actually works over what looks good.
“Too stodgy”

The Discovery Testing Philosophy: Testing What Matters for Alpha

October 26

It’s another Sunday morning and I’m full of energy at 7:20 AM. The Lead Developer begins Phase 2 preparation. Sprint A8 Phase 1 is complete (five issues delivered Saturday). Production branch ready. Infrastructure verified. Alpha launch in three days.

Time for end-to-end testing.

But here’s where things get interesting. Not “testing if system works” — we know it works. 91 out of 93 integration tests passing (98% pass rate). 120+ tests total. Zero critical failures. Infrastructure operational.

The question isn’t if it works. The question is what actually works.

Not assumptions. Not documentation. Not what we think exists. But what actually functions when you interact with it like a real user would.

By Sunday afternoon, the testing framework crystallized around one principle: Discovery, not validation.

Three categories emerged:

[MUST WORK]: Blockers for alpha. If these don’t work, we can’t launch. Onboarding flow. Basic chat. API key storage.

[IF EXISTS]: Discover what’s actually there. Knowledge graph. Preferences. Pattern learning. Cost tracking. Integrations. Don’t assume — find out.

[FUTURE]: Known missing or planned. Document for transparency. Not testing what doesn’t exist.

This ishow my testing philosophy shifted from “prove everything works” to “discover what actually works” and why that distinction matters for alpha readiness.

The archaeological investigation

Just a little later Sunday morning, 8:46 AM. Claude Code deployed for archaeological investigation. Mission: Verify three learning components are connected and working.

Not “implement learning system.” That was Sprint A5 (October 20–21). But verify: Is it wired? Does it function? Can users actually interact with it?

The investigation pattern:

  1. Check if components exist (file system search)
  2. Verify connections (import chains, dependencies)
  3. Test functionality (run existing tests)
  4. Validate integration (check handler wiring)
  5. Document findings (evidence-based report)

By 9:15 AM, findings complete.

Knowledge Graph Reasoning (#278, completed Oct 25): ✅ Complete, 40/40 tests passing, fully integrated with intent classification

Preference Persistence (#267, completed Oct 23): ✅ Complete, 5/5 tests passing, questionnaire working

Pattern Learning Handler (#221, completed Oct 20): ✅ Complete, 7/7 tests passing, captures query patterns

Total learning tests: 52/52 passing

Here’s where the framing matters. Code’s report was enthusiastic: “This isn’t a 75% complete codebase with scattered features. It’s a unified system where components know about each other!” Yes, yes, exciting.

True statement. But the “75% complete” baseline was outdated. Based on stale status reports. Overgeneralized patterns. Broad assumptions.

My actual experience: I knew we were nearly ready for alpha. End-to-end testing was about finding obvious human-experience bugs before making alpha testers wade through them.

The investigation wasn’t discovering completeness. It was verifying expected readiness.

The difference between discovery and validation

This distinction is crucial for understanding Sunday’s work.

Validation testing: Prove that what you built works as specified. Test against requirements. Verify expected behavior. Confirm implementation matches design.

Discovery testing: Find out what actually exists. No assumptions about completeness. No expectations about functionality. Just: What works when you try to use it?

Traditional testing is validation: “Does feature X work as designed?”

Discovery testing asks: “What happens when I try to do Y?”

Why does this matter for alpha?

Because systems accumulate features unevenly. Some parts polished. Some parts partial. Some parts missing. Documentation lags reality. Status reports generalize. Assumptions diverge from truth.

You can’t validate against outdated specifications. But you can discover what actually works.

The [MUST WORK] category

Testing framework starts with non-negotiables. What absolutely must function for alpha launch?

1. Onboarding flow: Can someone clone repo, run setup wizard, get system working?

  • CLI command: python main.py setup
  • Expected: Interactive wizard, API key entry, database initialization, preference collection
  • If broken: Alpha launch impossible (users can’t start)

2. Basic chat: Can someone send message and get response?

  • Web server: python main.py on port 8001
  • Expected: Chat interface loads, accepts input, returns response
  • If broken: Core functionality missing (system pointless)

3. API key storage: Are credentials secured properly?

  • Setup: Keychain integration for secure storage
  • Expected: Keys encrypted, retrievable, properly scoped
  • If broken: Security failure (can’t launch without this)

Three items. That’s it. Everything else is [IF EXISTS] or [FUTURE].

This minimalism is deliberate. Not “everything must work perfectly.” But “these three things must work, period.”

If onboarding fails, users can’t start. If chat fails, system is useless. If key storage fails, security is compromised. Those three determine alpha viability.

Everything else? Bonus features if they work. Not blockers if they don’t.

The [IF EXISTS] category

Here’s where discovery thinking matters most.

Not: “Does knowledge graph work as specified?” But: “What happens when I try to use knowledge graph?”

[IF EXISTS] scenarios:

Knowledge Graph:

  • Try: Upload document, ask questions, see if graph-enhanced answers emerge
  • Don’t assume: It’s wired, it’s accessible, it affects responses
  • Find out: Does it actually do anything when you use it?

Preference Learning:

  • Try: Complete questionnaire, interact multiple times, see if responses adapt
  • Don’t assume: Preferences persist, they affect classification, system remembers
  • Find out: Can you notice preference influence?

Pattern Learning:

  • Try: Repeated similar queries, see if system recognizes patterns
  • Don’t assume: Handler is active, patterns are stored, they’re used
  • Find out: Does the system actually learn from behavior?

Cost Tracking:

  • Try: Multiple API calls, check cost dashboard, validate tracking
  • Don’t assume: Estimator works, tracking is accurate, dashboard displays
  • Find out: Can you see what you’re spending?

GitHub Integration:

  • Try: Create issue, update issue, search issues, analyze repository
  • Don’t assume: All 20+ operations work, authentication succeeds, rate limiting handles
  • Find out: What actually functions in practice?

The “IF EXISTS” framing sets appropriate expectations:

Not: “This feature better work or we failed” But: “Let’s discover what actually works so we know what users can do”

If knowledge graph doesn’t work: Document limitation, explain to alpha testers, plan post-alpha fix.

If it does work: Celebrate! Demonstrate to testers. Gather feedback on effectiveness.

No false promises. No assuming completeness. Just discovery.

The [FUTURE] category

Transparency about what’s not ready yet.

[FUTURE] items:

  • Advanced workflow automation (planned for MVP)
  • Multi-step reasoning chains (research phase)
  • Custom integration plugins (post-alpha architecture)
  • Team collaboration features (beta scope)

These aren’t failures. They’re roadmap items. Document them clearly. Set expectations properly. No alpha tester should wonder “why doesn’t X work?” when X was never claimed for alpha.

Are we admitting things are incomplete? Absolutely, yes! If we tried to perfect everything before letting a real person try things out we’ll waste months on things nobody cares about/

Mature product thinking: Every release has scope. Alpha has minimally viable scope. Beta will have more. MVP will have more still. Being explicit about boundaries prevents disappointment.

Documenting the testing philosophy

Sunday afternoon, 2:37 PM. Chief Architect creates comprehensive automated web UI testing prompt. 10,000+ words. Complete testing strategy.

Structure:

  • Journey 1: Alpha onboarding [MUST WORK] — Setup wizard, basic interaction, first experience
  • Journey 2: Learning system [IF EXISTS] — Knowledge graph, preferences, pattern learning
  • Journey 3: Integrations [IF EXISTS] — GitHub, Slack, Calendar, Notion multi-tool capabilities
  • Journey 4: Edge cases [IF EXISTS] — Error handling, recovery, boundary conditions

Philosophy articulated:

“Discovery testing means approaching each scenario without assumptions. Not ‘prove this feature works’ but ‘what happens when I try this?’”
“Success isn’t ‘everything passes.’ Success is ‘we know what actually works and what doesn’t, with evidence.’”
“[MUST WORK] items are blockers. [IF EXISTS] items are discoveries. [FUTURE] items are transparency.”

The prompt included:

  • Chrome MCP commands for every interaction (screenshots, form fills, console inspection)
  • Evidence collection requirements (not just “it worked” but “here’s proof”)
  • Specific scenarios with concrete steps (not vague “test login” but exact sequence)
  • Expected outcomes with alternatives (not binary pass/fail but “discover what happens”)

The 91/93 confidence foundation

Sunday morning, 10:43 AM. Code Agent runs comprehensive integration test suite.

Results: 91 out of 93 tests passing (98% pass rate)

Test Suite

  • Knowledge Graph Enhancement: 40 pass, 0 fail ✅
  • API Usage Tracking: 16 pass, 0 fail ✅
  • Personality Preferences: 16 pass, 0 fail ✅
  • Preference Learning: 5 pass, 0 fail ✅
  • Learning Handlers: 8 pass, 0 fail ✅
  • Learning System Integration: 6 passed, 2 skipped ✅

Two tests skipped: Documented file-based storage limitation. Not failures. Known issue.

Zero critical issues. Zero regressions. All core functionality passing.

This is the difference between perfect and ready.

Perfect: 100% of all possible functionality working flawlessly

Ready: Core functionality working reliably, known limitations documented, confident users can succeed

98% pass rate with documented limitations is ready. Waiting for 100% perfect is how you never launch.

The integration test results validated infrastructure. But they didn’t replace discovery testing. You can have passing tests and still have unusable features if the user experience is broken.

Tests prove code works. Discovery testing proves users can succeed.

What Sunday prepared

By 9:37 PM, Phase 2 preparation complete:

Infrastructure verified:

  • Database: Healthy (26 tables, 115 users)
  • CLI: Working (4 commands, 2.1ms response)
  • Web server: Operational (port 8001 ready)
  • Configuration: Loaded correctly
  • Smoke tests: Passing (<1s execution)

Testing framework ready:

  • Archaeological investigation: All components verified
  • Integration tests: 91/93 passing (98%)
  • Discovery philosophy: Documented in 10,000-word prompt
  • Journey scenarios: Four complete workflows planned

Status: Ready for comprehensive E2E testing execution

Not “ready to prove everything works.” Ready to discover what actually works with evidence.

The anti-assumption discipline

Here’s what the discovery testing philosophy prevents:

Assumption: “Knowledge graph is wired, so it must be working” Discovery: “Let me try using it and see what happens”

Assumption: “Tests pass, so feature is complete” Discovery: “Can a user actually access this feature through the UI?”

Assumption: “Documentation says this works” Discovery: “Does it work when I follow the documentation steps?”

Assumption: “We built this three weeks ago, it should still work” Discovery: “Let me verify it works right now with current codebase”

The archaeological investigation showed this working. Code didn’t assume components existed. Searched filesystem. Verified imports. Ran tests. Checked wiring. Documented evidence.

Every claim backed by evidence. Every feature verified by interaction. Every assumption challenged by discovery.

This is why Sunday’s preparation matters: Not running tests we already have. Planning systematic discovery of what users will actually experience.

The alpha tester perspective

The [MUST WORK] / [IF EXISTS] / [FUTURE] framework ultimately serves alpha testers.

What they need to know:

[MUST WORK]: These three things are guaranteed

  • Setup wizard will work (we’ve verified)
  • Basic chat will work (we’ve verified)
  • API keys will be secure (we’ve verified)

[IF EXISTS]: These features may work, tell us what you experience

  • Knowledge graph might enhance answers (we’re not sure how well)
  • Preferences might adapt responses (we’re discovering effectiveness)
  • Integrations might enable multi-tool workflows (we’re validating capabilities)

[FUTURE]: These features aren’t ready yet

  • Team collaboration (planned for beta)
  • Advanced automation (post-alpha scope)
  • Custom plugins (architecture TBD)

This honesty enables good feedback. Alpha testers know what to expect. Know what to explore. Know what not to ask about.

Better to have testers pleasantly surprised when [IF EXISTS] features work well than disappointed when assumed features don’t exist.

What discovery testing reveals

The difference between validation and discovery shows in what you learn:

Validation testing reveals: Whether implementation matches specification. Did we build what we intended? Do tests prove correctness?

Discovery testing reveals: What users actually experience. What works in practice? What’s broken in ways tests don’t catch? What’s confusing despite being “correct”?

Example: Knowledge graph integration.

Validation: 40/40 tests passing ✅ Feature works as designed

Discovery: Does graph-enhanced answer feel different from regular answer? User won’t know graph is “working” if enhancement is imperceptible

Validation: Integration tests prove wiring ✅ Components connected

Discovery: Can user trigger graph usage through natural interaction? Feature is useless if only accessible through obscure commands

Validation: Code meets requirements ✅ Implementation correct

Discovery: Does the feature provide value? Correct code that doesn’t help users is wasted effort

Sunday’s preparation ensures we discover, not just validate. Evidence about user experience, not just code correctness.

The Phase 2 readiness

By Sunday evening, everything staged for Monday’s comprehensive testing:

Testing approach: Discovery, not validation

Testing categories: [MUST WORK] / [IF EXISTS] / [FUTURE]

Testing infrastructure: Automated scenarios, evidence collection

Testing philosophy: Document what works, what doesn’t, what surprises

Expected outcomes:

  • [MUST WORK] items: Should all work (blockers if not)
  • [IF EXISTS] items: Discover reality (bonus if they work)
  • [FUTURE] items: Transparent about gaps (no false expectations)

Alpha readiness: After Phase 2 testing, we’ll know exactly what users will experience. Not assumptions. Not hopes. Evidence-based understanding.

This is mature product thinking: Test what matters. Discover what’s real. Set honest expectations. Launch with confidence based on evidence, not optimism.

The Monday execution

Sunday prepared the framework. Monday would execute the discovery.

But Sunday’s achievement was philosophical: Shifting from “prove it works” to “discover what works.”

That shift enables:

  • Realistic alpha expectations
  • Honest communication with testers
  • Evidence-based confidence
  • Clear scope boundaries
  • Good feedback collection

Alpha testing succeeds when you know what you’re launching. Not what you hope exists. Not what documentation claims. But what actually works when someone tries to use it.

Discovery testing provides that knowledge. Sunday built the framework to discover it.

Three days until our planned alpha launch. Infrastructure ready. Testing approach clear. Philosophy established.

Time to discover what Piper Morgan actually delivers.

← Back to BlogAlso available on Medium