# The Value Model: a lean, two-stream utility model

This is the specification the engine (`scripts/roi_engine.py`) implements. It is deliberately
small. Every figure traces back to one defensible idea: the economic value of a selection or
promotion process comes from how much better it predicts performance than what the
organization does today. That gain in predictive validity is the only parameter in the model
with strong meta-analytic grounding, so the model leans on it and keeps everything else
conservative and transparent.

## What changed, and why

An earlier version of this skill estimated value across five overlapping domains (turnover,
failed hires, internal mobility, productivity, and an overall ROI), with roughly thirty
parameters, many of them invented "impact rates" with no external source. That model was hard
to defend: it used absolute validity rather than the gain over the current process, it
multiplied long chains of soft assumptions together, and its domains double counted the same
value. This version replaces all of that with two clean streams.

## The unit of analysis: segments

A **segment** is one decision population, for example external hiring for a role family, or
internal promotion into leadership. Each segment is modeled on its own and the results are
summed. The same engine handles hiring and promotion or succession; only the labels differ
(`decision_type` is "hiring" or "promotion"). Most business cases have one or two segments.

## Stream 1: performance value (primary)

This is the Brogden-Cronbach-Gleser selection-utility result, in **incremental** form:

```
performance_value = N * delta_r * SD_y * Z_x * T
```

| Term | Meaning | Source / default |
|---|---|---|
| N | decisions per year in this segment | user input |
| delta_r | R_proposed minus R_current, floored at 0 | Sackett et al. 2022 (combined per battery) |
| SD_y | dollar value of one standard deviation of performance | 0.40 x salary (Schmidt-Hunter), held flat |
| Z_x | mean standardised predictor score of those selected | phi(c)/SR, computed exactly from SR |
| T | expected tenure in years | user input or default 3 |

Key points:

- **It is the GAIN, not the level.** delta_r is the difference between the proposed battery and
  the current process. If the current process is already strong, the gain (and the value) is
  smaller. This is the single most important defensibility property of the model.
- **SD_y is conservative and fixed.** 0.40 of salary is the low end of the standard Schmidt and
  Hunter range. It is held flat across all three scenarios so the scenario spread reflects only
  genuine validity uncertainty, not an inflated performance-variability assumption.
- **It is undiscounted.** No net present value adjustment is applied (a deliberate decision).
  The figure is framed as the value one year of decisions produces over the tenure of the
  people selected, set against one year of program cost. The methodology section states this
  plainly.

## Stream 2: retention value (secondary, conditional)

Shown **only when the user supplies a turnover rate** for the segment. It is pure cost
avoidance: when better selection improves fit, a share of the people who would have left
voluntarily stay, and the organization avoids the cost of replacing them.

```
expected_departures = N * (1 - (1 - VTR)^T)
retention_value     = expected_departures * reduction_fraction * cost_per_departure
```

| Term | Meaning | Source / default |
|---|---|---|
| VTR | annual voluntary turnover rate | user input (this is the trigger) |
| reduction_fraction | relative reduction in voluntary turnover from better fit | 5% / 10% / 15% by scenario |
| cost_per_departure | cost to replace one voluntary leaver | user figure, or default 0.50 x salary |

Key points:

- **No double counting.** The performance stream values the output of the people selected over
  their tenure. The retention stream values replacement cost avoided. These are different
  dollars, so they are additive.
- **It is secondary.** It is always presented as a smaller, supporting figure beneath the
  performance value, never as the headline.
- **reduction_fraction is the softest parameter in the model**, which is exactly why the
  scenarios flex it (see utility_analysis_math.md for the evidence basis).

## Combining the two streams

For each segment and each scenario:

```
segment_total = performance_value + retention_value   (retention 0 if not supplied)
```

Across segments:

```
total_value(scenario) = sum of segment_total over all segments
benefit_cost_ratio(scenario) = total_value(scenario) / annual_budget
```

The benefit-cost ratio (value per dollar invested) is the headline.

## Scenarios

Three scenarios express genuine uncertainty, one lever per stream:

| Scenario | Performance lever (proposed validity) | Retention lever (turnover reduction) |
|---|---|---|
| Conservative | R_proposed x 0.85 | 5% |
| Expected | R_proposed x 1.00 | 10% |
| Strong | R_proposed x 1.10 (cap 0.60) | 15% |

R_current is held at its point estimate in all scenarios (the user is telling us what they do
today, so it is the least uncertain quantity). SD_y is flat. The selection ratio is a fixed
input, not a scenario lever. See utility_analysis_math.md for the rationale.

## Inputs

**Quick mode (4 inputs):** decisions per year, average salary, current vs proposed process,
annual budget. Everything else defaults (selection ratio 0.20, tenure 3 years, SD_y 0.40).
Retention is omitted because no turnover rate is supplied.

**Refined mode:** adds selection ratio, tenure, voluntary turnover rate (turns on the retention
stream), cost per departure, and a manager/IC or role split via multiple segments.

## Defaults summary

| Default | Value | Note |
|---|---|---|
| SD_y multiplier | 0.40 of salary | Schmidt-Hunter low end; flat across scenarios |
| Selection ratio | 0.20 | overridable |
| Tenure | 3 years | overridable |
| Current process (if unstated) | unstructured interview (r = 0.19) | overridable; a stronger baseline lowers the estimate |
| Cost per departure | 0.50 of salary | only used if a turnover rate is supplied |
| Turnover reduction band | 5% / 10% / 15% | conservative; flexed by scenario |
| Validity band | 0.85 / 1.00 / 1.10, cap 0.60 | applied to the proposed battery only |
| NPV | off | undiscounted by design |

## What the model never does

- It never evaluates, scores, or ranks a candidate. It models a process, not a person.
- It never produces a hire or no-hire recommendation.
- It never claims a precise outcome. Every figure is a calibrated estimate with a stated range
  and a verbatim disclaimer.
