VLAP 0.83 on suicide-attempt severity, vs 0.65 for the MIT / Child Mind Institute / Crisis Text Line lexicon and 0.56 for a 71-term keyword rule, on a held-out corpus of real first-person posts (RSD-15K), scored against the corpus’s own severity labels.
23 of VLAP’s 47 signals have no counterpart in the lexicon’s 6,910 terms.
What a suicide-risk word list can’t hear →The taxonomy reads what a young person wrote, not what was written about them. Every figure here carries the run it was measured on, and the passages that fire nothing are on the list deliberately.
A text arrives on the demo handset and is read by the same taxonomy as the box above. The three strips are what each role is actually sent, not one payload with fields hidden: a coach's copy does not contain the words of a daily check-in.
Everything above reads language. This is what the reading is for: the same risk score, calibrated under different social conditions, and a parity constraint that has to be allowed to fail in public or it is not a safety mechanism. Aggregate statistics only: no record-level data and no note text appears anywhere on this page.
An SDOH-blind base score (age band and gender only, fitted on a disjoint 40% patient split) is differentially miscalibrated across strata on held-out data. The interesting row is the one that found nothing.
| Stratum | n in stratum | LRT χ²(2) | p | Intercept shift | Standing |
|---|---|---|---|---|---|
| substance_adverse | 808 | 20.20 | 4.1×10−5 | +0.600 | The credible finding |
| social_support_absent | 228 | 6.62 | 0.037 | +0.378 | Consistent, weaker |
| employment_adverse | 537 | 0.39 | 0.82 | +0.147 | Clean null |
| housing_adverse | 28 | 26.45 | 1.8×10−6 | +3.076 | Reported, not relied on slope-shift CI [−1.46, 4.17] |
Read the null, and read the small cell. employment_adverse at p = 0.82 is evidence the fit is real rather than a machine that finds an effect wherever it looks. housing_adverse is 28 records: its slope-shift confidence interval spans [−1.46, 4.17], which is the “large and clean” signature the pre-registration said to distrust. It is on the page because withholding it would be the edit, not the honesty.
Expected calibration error on the base score, inside each stratum against its complement. This is the degradation the layer exists to remove.
| Stratum | ECE, not adverse | ECE, adverse | Reading |
|---|---|---|---|
| substance_adverse | 0.0301 | 0.0639 | Roughly doubles, on 808 records |
| social_support_absent | 0.0263 | 0.0800 | Same direction, thinner cell |
| employment_adverse | 0.0248 | 0.0228 | Identical either side: what a null looks like |
| housing_adverse | 0.0227 | 0.4506 | n = 28. Reported, not relied on |
Coefficients fitted on the calibration split (n = 2,055), parity evaluated out of sample (n = 2,085): same hospital, same period, split by patient. Tolerance ε = 0.05 on the maximum pairwise sensitivity gap across race strata.
Nearly 4× the tolerance.
Below the line. This is where the module marked the coefficients promotable.
Back above the line. Same hospital, same period, split by patient.
A recorded preferred-language field is not a feature of this model. It was removed from the scored vector rather than left in and weighted to zero, because a field that is present is a field somebody can turn on.
The edit: FEATURE_NAMES 9 → 8, gamma features 3 → 2, seven sites in the calibration module, and guard tests that fail if a language-like column reaches a design matrix. The guard is not decoration: it aborted the first execution of this study (correctly) and the fix was to make it stronger rather than quieter. A name check was replaced with a runtime assertion that every unpopulated component is literally constant across all records, which also catches a language field smuggled in under a neutral name.
And the part that is not finished. english_proficiency is still a live scored feature in the shipped layer. It is held at 0.0 here and carries no information in this study, but it is an open divergence of the same kind as the field that was removed, and it is named here rather than left for someone to find.
Separated from everything above deliberately. The section below is what this cohort did not establish, and it includes the part of the calibration layer that is claimed as novel.
The calibration layer’s novelty over Platt, isotonic and temperature scaling is the γ interaction between the score and the SDOH vector, which lets the slope move with context rather than only the intercept. In this cohort every slope-shift confidence interval crosses zero (all four strata) with standard errors of 0.232, 0.405 and 0.285 on the three adequately-sized cells, and 1.437 on the cell of 28.
What the data shows is a level shift, and per-stratum Platt scaling would handle a level shift too. At this sample size the slope term is underpowered, so the honest reading is that its advantage is unproven here, not that it is absent. The mechanism is demonstrated; the claimed advantage over simpler recalibration is not, and that distinction has to survive into any later write-up.