# Data profile — the export as it came out of the pipeline

Generated by `python -m pso profile` 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.

## 1. Shape

315,269 records × 14 raw columns (plus `ts` and the 7 decoded property columns). The loader asserts a fixed schema, one timestamp format, no empty required field and a known event vocabulary; it did not raise. Sections 2–9 count raw rows, duplicates included; sections 10–15 are per pair on first occurrences, which duplicates do not affect.

## 2. Schema, nulls, distinct values

| column | dtype | nulls | null_% | distinct (null counted) |
|---|---|---|---|---|
| event_id | String | 0 | 0 | 312,148 |
| tasker_id | String | 0 | 0 | 30,025 |
| project_id | String | 0 | 0 | 12 |
| project_name | String | 0 | 0 | 12 |
| event_name | String | 0 | 0 | 17 |
| event_ts | String | 0 | 0 | 305,733 |
| device | String | 189,801 | 60.2 | 10 |
| tasker_tenure | String | 0 | 0 | 2 |
| prior_projects_completed | Int64 | 0 | 0 | 11 |
| country | String | 0 | 0 | 9 |
| concurrent_psos | Int64 | 0 | 0 | 5 |
| assessment_est_minutes | Int64 | 0 | 0 | 9 |
| likeness_variant | String | 243,274 | 77.16 | 3 |
| properties | String | 189,993 | 60.26 | 10,026 |

## 3. Duplicate rows (what R0 and R1 would tag)

| drop_reason | rows |
|---|---|
| (kept) | 312,148 |
| duplicate_row | 3,121 |

## 4. Timestamps

| fact | value |
|---|---|
| format (asserted by the loader) | YYYY-MM-DDTHH:MM:SSZ (UTC, whole seconds) |
| min | 2026-06-01 00:06:38+00:00 |
| max | 2026-08-31 23:59:48+00:00 |
| rows before window start | 0 |
| rows on/after extraction date | 0 |
| file sorted by timestamp | yes |

## 5. Categorical values (raw)

### event_name

| value | count |
|---|---|
| pso_allocated | 54,473 |
| email_sent | 53,635 |
| email_delivered | 51,594 |
| email_opened | 30,301 |
| email_clicked | 22,805 |
| pso_accepted | 21,468 |
| confidentiality_agreement_signed | 19,664 |
| assessment_started | 18,369 |
| assessment_attempted | 9,749 |
| assessment_passed | 6,361 |
| contract_started | 5,996 |
| pso_completed | 5,569 |
| contract_finished | 5,568 |
| first_task_claimed | 3,613 |
| first_task_submitted | 3,128 |
| likeness_agreement_signed | 2,638 |
| likeness_agreement_declined | 338 |

### device

| value | count |
|---|---|
|  | 189,801 |
| mobile | 41,389 |
| desktop | 36,587 |
| iOS | 13,369 |
| Mobile | 11,183 |
| Android | 8,932 |
| Desktop | 5,485 |
| web | 3,633 |
| tablet | 2,924 |
| iPad | 1,966 |

### tasker_tenure

| value | count |
|---|---|
| new | 164,162 |
| returning | 151,107 |

### country

| value | count |
|---|---|
| US | 134,499 |
| PH | 24,014 |
| CA | 23,928 |
| BR | 22,798 |
| GB | 22,707 |
| IN | 22,676 |
| DE | 22,304 |
| KE | 21,528 |
| NG | 20,815 |

### likeness_variant

| value | count |
|---|---|
|  | 243,274 |
| late | 36,329 |
| early | 35,666 |

## 6. Numeric columns (row-weighted, raw)

| column | min | p10 | p50 | p90 | max | distinct |
|---|---|---|---|---|---|---|
| prior_projects_completed | 0 | 0 | 0 | 4 | 10 | 11 |
| concurrent_psos | 1 | 1 | 1 | 2 | 5 | 5 |
| assessment_est_minutes | 15 | 20 | 30 | 55 | 60 | 9 |

## 7. Projects

| project_id | project | rows | pairs | taskers | pairs_with_device | est_min_values | est_min | first_allocation | last_allocation | pilot |
|---|---|---|---|---|---|---|---|---|---|---|
| prj_1000 | Juniper | 38,446 | 6,401 | 6,401 | 3,883 | 1 | 20 | 2026-06-01 | 2026-08-31 | no |
| prj_1037 | Cobalt | 31,497 | 5,443 | 5,443 | 3,324 | 1 | 45 | 2026-06-01 | 2026-08-31 | no |
| prj_1074 | Meridian | 29,038 | 4,907 | 4,907 | 2,963 | 1 | 15 | 2026-06-01 | 2026-08-31 | no |
| prj_1111 | Halcyon | 25,758 | 4,483 | 4,483 | 2,701 | 1 | 60 | 2026-06-01 | 2026-08-31 | no |
| prj_1148 | Quartz | 33,710 | 5,600 | 5,600 | 0 | 1 | 30 | 2026-06-11 | 2026-08-31 | no |
| prj_1185 | Tundra | 21,784 | 3,875 | 3,875 | 2,287 | 1 | 50 | 2026-06-19 | 2026-08-31 | no |
| prj_1222 | Sequoia | 27,295 | 4,650 | 4,650 | 2,729 | 1 | 25 | 2026-06-26 | 2026-08-31 | no |
| prj_1259 | Beacon | 15,583 | 2,776 | 2,776 | 1,663 | 1 | 40 | 2026-07-06 | 2026-08-31 | no |
| prj_1296 | Granite | 20,163 | 3,453 | 3,453 | 2,038 | 1 | 20 | 2026-07-16 | 2026-08-31 | no |
| prj_1333 | Lumen | 24,218 | 4,217 | 4,217 | 2,488 | 1 | 45 | 2026-07-01 | 2026-08-31 | yes |
| prj_1370 | Vesper | 23,854 | 4,035 | 4,035 | 2,371 | 1 | 30 | 2026-07-01 | 2026-08-31 | yes |
| prj_1407 | Orchid | 23,923 | 4,095 | 4,095 | 2,440 | 1 | 55 | 2026-07-01 | 2026-08-31 | yes |

## 8. Taskers and pairs (events per pair counts raw rows, duplicates included)

| fact | value |
|---|---|
| distinct taskers | 30,025 |
| distinct (tasker, project) pairs | 53,935 |
| events per pair: min / p50 / p90 / max | 1 / 4 / 12 / 18 |
| projects per tasker: distribution | 1: 15,681, 2: 7,918, 3: 3,896, 4: 1,945, 5: 560, 6: 25 |
| taskers in more than one project | 14,344 |

## 9. `properties` keys by event (non-null counts)

| event_name | rows | with_properties | template | cta | source | session_seconds | questions_answered | score | placement |
|---|---|---|---|---|---|---|---|---|---|
| assessment_passed | 6,361 | 6,361 | 0 | 0 | 0 | 0 | 0 | 6,361 | 0 |
| assessment_started | 18,369 | 18,369 | 0 | 0 | 0 | 18,369 | 18,369 | 0 | 0 |
| email_clicked | 22,805 | 22,805 | 0 | 22,805 | 0 | 0 | 0 | 0 | 0 |
| email_sent | 53,635 | 53,635 | 53,635 | 0 | 0 | 0 | 0 | 0 | 0 |
| likeness_agreement_signed | 2,638 | 2,638 | 0 | 0 | 0 | 0 | 0 | 0 | 2,638 |
| pso_accepted | 21,468 | 21,468 | 0 | 0 | 21,468 | 0 | 0 | 0 | 0 |

## 10. Event order — consecutive events, first occurrences per pair

| earlier | later | pairs_with_both | later_before_earlier | later_without_earlier | earlier_is_optional |
|---|---|---|---|---|---|
| pso_allocated | email_sent | 53,082 | 0 | 0 | no |
| email_sent | email_delivered | 51,123 | 0 | 0 | no |
| email_delivered | email_opened | 29,984 | 0 | 0 | no |
| email_opened | email_clicked | 21,323 | 0 | 1,272 | yes |
| email_clicked | pso_accepted | 19,541 | 0 | 1,701 | yes |
| pso_accepted | confidentiality_agreement_signed | 19,483 | 0 | 0 | no |
| confidentiality_agreement_signed | assessment_started | 16,720 | 0 | 0 | no |
| assessment_started | assessment_attempted | 9,653 | 0 | 0 | no |
| assessment_attempted | assessment_passed | 6,300 | 0 | 0 | no |
| assessment_passed | contract_started | 5,929 | 0 | 0 | no |
| contract_started | contract_finished | 5,503 | 0 | 0 | no |
| contract_finished | pso_completed | 5,503 | 0 | 0 | no |
| pso_completed | first_task_claimed | 3,574 | 0 | 0 | no |
| first_task_claimed | first_task_submitted | 3,093 | 0 | 0 | no |

## 11. Pairs reaching each event (PRELIMINARY — nothing excluded)

| event | pairs_with_event | %_of_pairs |
|---|---|---|
| pso_allocated | 53,935 | 100 |
| email_sent | 53,082 | 98.4 |
| email_delivered | 51,123 | 94.8 |
| email_opened | 29,984 | 55.6 |
| email_clicked | 22,595 | 41.9 |
| pso_accepted | 21,242 | 39.4 |
| confidentiality_agreement_signed | 19,483 | 36.1 |
| assessment_started | 16,720 | 31 |
| assessment_attempted | 9,653 | 17.9 |
| assessment_passed | 6,300 | 11.7 |
| contract_started | 5,929 | 11 |
| contract_finished | 5,503 | 10.2 |
| pso_completed | 5,503 | 10.2 |
| first_task_claimed | 3,574 | 6.6 |
| first_task_submitted | 3,093 | 5.7 |
| likeness_agreement_signed | 2,615 | 4.8 |
| likeness_agreement_declined | 335 | 0.6 |

## 12. Latency between consecutive events (hours, first occurrences)

| from | to | pairs | p10_h | p50_h | p90_h | max_h | zero_or_negative |
|---|---|---|---|---|---|---|---|
| pso_allocated | email_sent | 53,082 | 0.048 | 0.176 | 0.302 | 0.333 | 0 |
| email_sent | email_delivered | 51,123 | 0.003 | 0.013 | 0.022 | 0.025 | 0 |
| email_delivered | email_opened | 29,984 | 0.741 | 3.919 | 21.042 | 742.056 | 0 |
| email_opened | email_clicked | 21,323 | 0.009 | 0.033 | 0.12 | 1.532 | 0 |
| email_clicked | pso_accepted | 19,541 | 0.023 | 0.068 | 0.188 | 1.686 | 0 |
| pso_accepted | confidentiality_agreement_signed | 19,483 | 0.037 | 0.138 | 0.48 | 8.151 | 0 |
| confidentiality_agreement_signed | assessment_started | 16,720 | 0.401 | 2.825 | 19.304 | 629.524 | 0 |
| assessment_started | assessment_attempted | 9,653 | 0.239 | 0.532 | 95.674 | 288.484 | 0 |
| assessment_attempted | assessment_passed | 6,300 | 10.044 | 31.83 | 54.533 | 59.996 | 0 |
| assessment_passed | contract_started | 5,929 | 0.914 | 5.408 | 26.671 | 321.921 | 0 |
| contract_started | contract_finished | 5,503 | 0.031 | 0.097 | 0.271 | 1.309 | 0 |
| contract_finished | pso_completed | 5,503 | 0.005 | 0.017 | 0.03 | 0.033 | 0 |
| pso_completed | first_task_claimed | 3,574 | 22.962 | 69.22 | 210.297 | 1,121.628 | 0 |
| first_task_claimed | first_task_submitted | 3,093 | 0.599 | 1.479 | 3.676 | 15.091 | 0 |

## 13. Likeness pilot

| project_name | arm | pairs | signed | declined | placement_labels |
|---|---|---|---|---|---|
| Lumen | early | 2,090 | 693 | 95 | after_accept |
| Lumen | late | 2,127 | 202 | 24 | with_contract |
| Orchid | early | 1,996 | 665 | 91 | after_accept |
| Orchid | late | 2,099 | 177 | 15 | with_contract |
| Vesper | early | 2,001 | 659 | 97 | after_accept |
| Vesper | late | 2,034 | 219 | 13 | with_contract |

Position of the signed likeness event relative to its neighbours:

| arm | signed_pairs | after | share_after | before | share_before_or_end |
|---|---|---|---|---|---|
| early | 2,017 | pso_accepted | 100 | confidentiality_agreement_signed | 100 |
| late | 598 | assessment_passed | 100 | contract_started | 100 |

Non-pilot pairs with any likeness event: 0.

## 14. Censoring signal (PRELIMINARY)

Pairs allocated in June: 11,817; allocated 2026-08-25..31: 5,001. Share of each group that has each event:

| event | allocated_in_june_% | allocated_aug25_31_% |
|---|---|---|
| pso_allocated | 100 | 100 |
| email_sent | 98.5 | 98.3 |
| email_delivered | 94.9 | 94.5 |
| email_opened | 59.9 | 55.2 |
| email_clicked | 42.6 | 39.9 |
| pso_accepted | 39.9 | 37.3 |
| confidentiality_agreement_signed | 37.3 | 34.2 |
| assessment_started | 32 | 28.1 |
| assessment_attempted | 19.9 | 13.2 |
| assessment_passed | 13.2 | 6.9 |
| contract_started | 12.6 | 5.9 |
| contract_finished | 11.6 | 5.5 |
| pso_completed | 11.6 | 5.5 |
| first_task_claimed | 7.8 | 1.4 |
| first_task_submitted | 6.7 | 1.2 |

## 15. Order checks the stage mapping relies on

Computed after R1 (duplicate rows removed), because that is the input the stage mapping runs on. All four must be 0 for the stage mapping (the sub-step tables in `07`; `lookups.stages` in `dashboard/data.js`) to hold:

| check | count |
|---|---|
| events in a pair after its likeness decline | 0 |
| later-before-earlier over every ordered pair of non-optional events | 0 |
| later-without-earlier over every ordered pair of non-optional events | 0 |
| pairs where `pso_completed` and `contract_finished` disagree | 0 |

Informational: 0 events share a timestamp with another event of the same pair — the only case where "first in time" falls back to file order. Before R1 the count is 6,242, because every duplicate row ties with its copy.
