# Funnel numbers — primary rules, both lenses, sensitivity

Generated by `python -m pso build` from `data/raw/pso_funnel_events.csv` (sha256 `0d7f8ca86978e06923e8e659d4841a7aca909f92227e094144505964a12ba5e7`, 37,899,350 bytes) with polars 2.0.0 on CPython 3.12.3. Do not edit by hand: every number here is regenerated by the command, and the output is deterministic, so `git diff` after regenerating shows exactly what changed.

## Definitions (A8, A13, A6, A18)

- **Stage**: `reached` = pairs with the stage's reached-event; `completed` = pairs with its
  completed-event; `lost = reached − completed`; `completion = completed / reached`.
  Opened and clicked are sub-steps reported as "has the event" and never produce a loss (R7).
- **Lens `all`**: every allocated pair (R4). **Lens `accepted`**: pairs with `pso_accepted`;
  its Invitation stage is reported but not ranked.
- **Mature**: allocated on or before `2026-08-31 23:59:59 − W days`, W = 14 (R3).
  Rates and the ranking use mature pairs; counts over all pairs are shown beside them, marked
  censored.
- **Time-in-step**: for completed pairs, hours from the reached-event to the completed-event
  (first occurrences); **lower** median and p90 — `sorted[floor(q·(n−1))]`. The dashboard's JS
  implements the same rule, and its self-test against the embedded headline enforces it.
- **Ranking**: stages by `lost`, descending; the longer median time-in-step ranks first on a tie.
- **Likeness split**: `lost` within a stage is split into pairs that declined the likeness
  agreement and the rest. A decline is counted on the stage the pair reached and did not
  complete; that this is the stage where the decline sits is a property of the data (`05` §13,
  §15), not enforced by the code.
- **Finished PSO** = `pso_completed`; **outcome** = `first_task_submitted`, reported, not ranked.
- **Sensitivity verdict**: *robust* when the top-ranked stage under each lens is unchanged and
  the mature finished-PSO rate moves by less than 1 percentage point; *moved* otherwise.
  *Headline identical* means nothing in the headline differs at all; *robust — cannot move the
  headline answer* marks a run whose swapped rule cannot reach either verdict input (only the
  maturity window, the invitation anchor and the pilot filter change which pairs are counted).
  The "what it moves" column shows the figures each alternative does change.

## Pairs in scope

| all | mature | accepted | accepted_mature |
|---|---|---|---|
| 53,935 | 43,646 | 21,242 | 17,295 |

Rows by rule outcome: (kept): 312,148, duplicate_row: 3,121. Pairs dropped by definitions: R5 pilot projects: 0, R4 never emailed: 0.

## Lens `all` — stages (mature pairs; all-pairs counts beside)

| stage | reached | completed | lost | completion_% | median_h | p90_h | declined_likeness | other_lost | reached_all_pairs (censored) | completed_all_pairs |
|---|---|---|---|---|---|---|---|---|---|---|
| Invitation | 43,646 | 17,295 | 26,351 | 39.6 | 4.901 | 31.487 | 0 | 26,351 | 53,935 | 21,242 |
| Confidentiality agreement | 17,295 | 15,848 | 1,447 | 91.6 | 0.138 | 0.482 | 232 | 1,215 | 21,242 | 19,483 |
| Qualification assessment | 15,848 | 5,349 | 10,499 | 33.8 | 44.467 | 163.27 | 0 | 10,499 | 19,483 | 6,300 |
| Work contract | 5,349 | 4,707 | 642 | 88 | 5.536 | 27.047 | 36 | 606 | 6,300 | 5,503 |

### Lens `all` — ranking by pairs lost

| rank | stage | lost | median_h |
|---|---|---|---|
| 1 | invitation | 26,351 | 4.901 |
| 2 | assessment | 10,499 | 44.467 |
| 3 | confidentiality | 1,447 | 0.138 |
| 4 | contract | 642 | 5.536 |

### Lens `all` — finished PSO and outcome

| scope | pairs | finished | finished_% | first_task_submitted | outcome_% | median_h_alloc_to_finished |
|---|---|---|---|---|---|---|
| mature pairs | 43,646 | 4,707 | 10.78 | 2,790 | 6.39 | 64.12 |
| all pairs (censored) | 53,935 | 5,503 | 10.2 | 3,093 | 5.73 | 63.311 |

### Lens `all` — sub-steps (mature pairs)

| stage | event | pairs | from | median_h | p90_h |
|---|---|---|---|---|---|
| invitation | pso_allocated | 43,646 |  |  |  |
| invitation | email_sent | 42,974 | pso_allocated | 0.176 | 0.301 |
| invitation | email_delivered | 41,387 | email_sent | 0.013 | 0.022 |
| invitation | email_opened (optional) | 24,096 | email_delivered | 3.985 | 21.483 |
| invitation | email_clicked (optional) | 18,381 | email_opened | 0.033 | 0.121 |
| invitation | pso_accepted | 17,295 | email_clicked | 0.068 | 0.188 |
| confidentiality | pso_accepted | 17,295 |  |  |  |
| confidentiality | confidentiality_agreement_signed | 15,848 | pso_accepted | 0.138 | 0.482 |
| assessment | confidentiality_agreement_signed | 15,848 |  |  |  |
| assessment | assessment_started | 13,623 | confidentiality_agreement_signed | 2.84 | 19.669 |
| assessment | assessment_attempted | 8,061 | assessment_started | 0.541 | 109.794 |
| assessment | assessment_passed | 5,349 | assessment_attempted | 31.895 | 54.572 |
| contract | assessment_passed | 5,349 |  |  |  |
| contract | contract_started | 5,074 | assessment_passed | 5.442 | 26.934 |
| contract | contract_finished | 4,707 | contract_started | 0.097 | 0.274 |

## Lens `accepted` — stages (mature pairs; all-pairs counts beside)

| stage | reached | completed | lost | completion_% | median_h | p90_h | declined_likeness | other_lost | reached_all_pairs (censored) | completed_all_pairs |
|---|---|---|---|---|---|---|---|---|---|---|
| Invitation | 17,295 | 17,295 | 0 | 100 | 4.901 | 31.487 | 0 | 0 | 21,242 | 21,242 |
| Confidentiality agreement | 17,295 | 15,848 | 1,447 | 91.6 | 0.138 | 0.482 | 232 | 1,215 | 21,242 | 19,483 |
| Qualification assessment | 15,848 | 5,349 | 10,499 | 33.8 | 44.467 | 163.27 | 0 | 10,499 | 19,483 | 6,300 |
| Work contract | 5,349 | 4,707 | 642 | 88 | 5.536 | 27.047 | 36 | 606 | 6,300 | 5,503 |

### Lens `accepted` — ranking by pairs lost

| rank | stage | lost | median_h |
|---|---|---|---|
| 1 | assessment | 10,499 | 44.467 |
| 2 | confidentiality | 1,447 | 0.138 |
| 3 | contract | 642 | 5.536 |

### Lens `accepted` — finished PSO and outcome

| scope | pairs | finished | finished_% | first_task_submitted | outcome_% | median_h_alloc_to_finished |
|---|---|---|---|---|---|---|
| mature pairs | 17,295 | 4,707 | 27.22 | 2,790 | 16.13 | 64.12 |
| all pairs (censored) | 21,242 | 5,503 | 25.91 | 3,093 | 14.56 | 63.311 |

### Lens `accepted` — sub-steps (mature pairs)

| stage | event | pairs | from | median_h | p90_h |
|---|---|---|---|---|---|
| invitation | pso_allocated | 17,295 |  |  |  |
| invitation | email_sent | 17,295 | pso_allocated | 0.175 | 0.3 |
| invitation | email_delivered | 17,295 | email_sent | 0.013 | 0.022 |
| invitation | email_opened (optional) | 15,179 | email_delivered | 3.976 | 21.764 |
| invitation | email_clicked (optional) | 15,884 | email_opened | 0.033 | 0.122 |
| invitation | pso_accepted | 17,295 | email_clicked | 0.068 | 0.188 |
| confidentiality | pso_accepted | 17,295 |  |  |  |
| confidentiality | confidentiality_agreement_signed | 15,848 | pso_accepted | 0.138 | 0.482 |
| assessment | confidentiality_agreement_signed | 15,848 |  |  |  |
| assessment | assessment_started | 13,623 | confidentiality_agreement_signed | 2.84 | 19.669 |
| assessment | assessment_attempted | 8,061 | assessment_started | 0.541 | 109.794 |
| assessment | assessment_passed | 5,349 | assessment_attempted | 31.895 | 54.572 |
| contract | assessment_passed | 5,349 |  |  |  |
| contract | contract_started | 5,074 | assessment_passed | 5.442 | 26.934 |
| contract | contract_finished | 4,707 | contract_started | 0.097 | 0.274 |

## Likeness pilot cells (counts only; the comparison and intervals are in `08`)

| project | arm | allocated (mature) | finished (mature) | finished_% | declined (mature) | allocated_all | finished_all |
|---|---|---|---|---|---|---|---|
| Lumen | early | 1,601 | 105 | 6.56 | 76 | 2,090 | 132 |
| Lumen | late | 1,627 | 155 | 9.53 | 18 | 2,127 | 179 |
| Orchid | early | 1,501 | 145 | 9.66 | 72 | 1,996 | 179 |
| Orchid | late | 1,594 | 132 | 8.28 | 10 | 2,099 | 153 |
| Vesper | early | 1,570 | 143 | 9.11 | 84 | 2,001 | 169 |
| Vesper | late | 1,553 | 160 | 10.3 | 8 | 2,034 | 194 |

## Sensitivity — one alternative at a time

| run | pairs | mature | top stage (all) | top stage (accepted) | finished_% (mature) | delta_pp | verdict | what it moves |
|---|---|---|---|---|---|---|---|---|
| primary | 53,935 | 43,646 | invitation | assessment | 10.78 | 0 | — | — |
| R1 keep duplicates | 53,935 | 43,646 | invitation | assessment | 10.78 | 0 | headline identical | rows kept 315,269 vs 312,148; every pair-level figure identical |
| R2a case-fold only | 53,935 | 43,646 | invitation | assessment | 10.78 | 0 | headline identical | device values 3 → 7 (a dimension no headline figure reads) |
| R3 W = 7 days | 53,935 | 48,934 | invitation | assessment | 10.69 | -0.1 | robust | mature pairs 43,646 → 48,934 |
| R3 W = 21 days | 53,935 | 38,278 | invitation | assessment | 10.91 | 0.13 | robust | mature pairs 43,646 → 38,278 |
| R4 email_sent anchor | 53,082 | 42,974 | invitation | assessment | 10.95 | 0.17 | robust | pairs 53,935 → 53,082 (never-emailed pairs dropped) |
| R5 exclude pilot projects | 41,588 | 34,200 | invitation | assessment | 11.31 | 0.52 | robust | pairs 53,935 → 41,588 (pilot projects dropped) |
| R6 last session | 53,935 | 43,646 | invitation | assessment | 10.78 | 0 | robust — cannot move the headline answer | started → attempted median 0.541 → 0.499 h, p90 109.794 → 1.041 h |
| R7 impute opened | 53,935 | 43,646 | invitation | assessment | 10.78 | 0 | robust — cannot move the headline answer | opened pairs 24,096 → 25,368; opened → clicked median 0.033 → 0.030 h |
