Skip to main content

What is Outcome-Driven Development?

Outcome-driven development is a methodology where you define what success looks like, generate tests as hypotheses, and observe real outcomes at every stage. Unlike traditional approaches that focus on implementation details, ODD keeps you anchored to measurable results. The key insight: tests produce outcomes, but they are experimental outcomes whose validity is bounded by the test context.

The Progression: From Intent to Outcomes

1. Start with a Goal

A goal is intent, direction, and preference. No outcomes yet - only what you want to achieve.
At this stage, you have expressed direction but haven’t defined what success means or observed any results.

2. Define Criteria

Criteria translate intent into what winning would look like. They set expectations but still aren’t outcomes. In our framework, there are two types of criteria:
  • Success Criteria: Measurable conditions that define success.
  • Constraints: Conditions that define failure.

Success Criteria

Defined in goal.py, each SuccessCriterion represents a measurable condition:

Constraints

Also in goal.py, Constraint defines boundaries the agent must respect: Criteria are expectations - measurable thresholds that define success and failure.

3. Generate Tests

Tests are hypotheses about outcomes. Each test implicitly says:
“If the system behaves correctly, outcome X should occur under condition Y.”
Tests are measurement instruments, not outcomes themselves. They encode your assumptions about what correct behavior looks like.

4. Run Tests → Observe Outcomes

When you run tests, you finally have outcomes. But be precise about what kind: These are observed outcomes in a controlled environment. Why these are outcomes: Something actually happened. The system interacted with inputs. Effects were observed, not imagined. Why they’re limited: They don’t yet tell you whether users trust the agent, whether it reduces real workload, or whether edge cases in the wild dominate behavior.

Outcome Structure

Defined in decision.py, the Outcome class captures everything about an execution result:
The framework tracks what should happen (criteria/constraints) and what actually happened (outcomes), then evaluates the gap.

The Feedback Loop

Outcome-driven development depends on closing the loop: Outcomes inform updates at every level:
  • Update the system - Fix bugs, improve prompts, add guardrails
  • Adjust criteria - Thresholds may be too strict or too lenient
  • Revisit the goal - Sometimes the original intent was not accurate or not up to date. Developer need to revisit and update the goal accoding to the outcomes. However, the framework should not be able to change the original goal to ensure the goal is consistent and respected.

The Outcome Taxonomy

All results are outcomes - they differ by context and validity, not by kind.

Test Outcomes

Controlled environment. Known inputs. Repeatable conditions.
  • High internal validity
  • Limited external validity
  • Fast feedback loop
  • Low cost to observe

Operational Outcomes

Real users in limited deployment. Shadow mode or pilot groups.
  • Moderate internal validity
  • Growing external validity
  • Reveals integration issues
  • Surface unexpected edge cases

Real-World Outcomes

Full production. Business metrics. User trust.
  • Full external validity
  • Highest signal quality
  • Slowest feedback loop
  • Highest cost to observe

Example: Support Agent Development

Phase 1: Define

Goal:
Success Criteria:
Constraints:

Phase 2: Test Outcomes

Run automated tests against synthetic tickets. Each test produces an Outcome:
Aggregate results across test suite: Weighted score: 78% (below 90% threshold) Insight: Resolution and escalation need work. The HybridJudge recommends REPLAN - adjust prompts, add examples.

Phase 3: Operational Outcomes

Deploy to 5% of traffic in shadow mode: Insight: Real traffic reveals edge cases tests missed. Update test suite.

Phase 4: Real-World Outcomes

Full production deployment:

Best Practices

Weight Criteria Carefully

Higher weights on critical criteria ensure the 90% threshold reflects true success

Use Hard Constraints for Safety

Cost limits, PII protection, and scope boundaries should be hard constraints

Let llm_judge Handle Nuance

Use llm_judge metric for quality criteria that can’t be measured programmatically

Trust the Judgment Actions

ACCEPT, RETRY, REPLAN, ESCALATE - let the HybridJudge guide the response

Next Steps

Goals and Outcomes

See the canonical goal model used by Hive runtime and evaluation

Evolution

Understand how outcome gaps drive iterative agent improvement

Agent Architecture

Learn about nodes, edges, and the agent graph structure

Build Your First Agent

Create your first outcome-driven agent