Benchmark result

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 →
Source: RSD-15K held-out set, attempt class.
Live analysis
Input ⌘+Enter to analyse
Example passages written for this demo. The measured result is the RSD-15K benchmark above.
Synthetic text only0 / 600
Clinician-facing output. Nothing here is shown to a young person, and no reply is generated.
Signal output
V
Surfacing tier · signal codes · combination rules
Cultural context · member response · recommended action
Clinical signal surfacing

The words distress
is written in, and what
only shows up in combination.

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.

47
Signals · 6 dimensions
VASL-VLAP-TAX-001 v1.0
SHA-02
Coded suicidal ideation
Critical differentiator
VASL-VLAP-TAX-001
Benchmark
VLAP
0.83
MIT / Child Mind Institute / Crisis Text Line lexicon
0.65
71-term keyword rule
0.56
Suicide-attempt severity, held-out corpus of real first-person posts (RSD-15K).
Live from a text

One reply. Three people see three different things.

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.

Without this, the page shows the written scenarios above and nothing else.
Methods and ongoing studies
SDOH-aware calibration

The covariates are the easy half. The scoring is the invention.

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.

Pre-registered before any model was fit
evaluation split n = 2,126 admissions · 1,898 patient clusters · 720 outcome-positive · clustered SE on SUBJECT_ID
1 · Calibration differs by stratum

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.

Stratumn in stratumLRT χ²(2)pIntercept shiftStanding
substance_adverse80820.204.1×10−5+0.600The credible finding
social_support_absent2286.620.037+0.378Consistent, weaker
employment_adverse5370.390.82+0.147Clean null
housing_adverse2826.451.8×10−6+3.076Reported, 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.

2 · What the calibration layer is buying

Expected calibration error on the base score, inside each stratum against its complement. This is the degradation the layer exists to remove.

ECE, base score · complement against stratum
0
0.02
0.04
0.06
0.0301
0.0248
0.0639 substance_adversen = 808 · roughly doubles
0.0228 employment_adversen = 537 · p = 0.82 · the null
Not adverseAdverse
Pre-registered · held-out split
StratumECE, not adverseECE, adverseReading
substance_adverse0.03010.0639Roughly doubles, on 808 records
social_support_absent0.02630.0800Same direction, thinner cell
employment_adverse0.02480.0228Identical either side: what a null looks like
housing_adverse0.02270.4506n = 28. Reported, not relied on
3 · The parity constraint, and the test that was not sufficient

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.

Max pairwise sensitivity gap · race strata · n = 2,055 fit / n = 2,085 evaluated over εwithin ε
0.10
0.15
0.20
ε = 0.05
Withdrawal fires
0.1944Violated
0.0454Feasible
0.0822Violated
One set of coefficients · not refit
Unconstrained

Nearly 4× the tolerance.

Constrained, in sample

Below the line. This is where the module marked the coefficients promotable.

The same coefficients, out of sample

Back above the line. Same hospital, same period, split by patient.

The withdrawal fires. That is the point. An earlier configuration of this same run (fitting and evaluating on the pooled 4,140 records) returned CALIBRATION_INFEASIBLE at a gap of 0.244 → 0.058. The state is sensitive to the fit set at this sample size, so neither run is the behaviour of the estimator. What generalises is the finding above: in-sample feasibility did not survive the split.
Accuracy cost of the constraint: 29.92 log-likelihood
Pre-registered · held-out split
4 · What the layer refuses to use

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.

preferred_language english_proficiency housing_stability food_security social_isolation insurance_status area_deprivation_index primary_care_engagement prior_bh_utilization
solid: populated and identifieddashed: held constant at 0.0, β not identifiedstruck: removed from the vector

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.

5 · Not demonstrated

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 interaction term: not demonstrated, and not absent

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.

What this cohort does and does not support
  • Beyond this cohort: the taxonomy’s own validation scope. No signal has been clinically validated. The signals named as differentiators carry annotation, not a powered study.
  • Concurrent, not predictive. The SDOH label and the outcome come from the same admission. Nothing here is a forecast.
  • No adolescents. The source is 16+ and neonates, so this cohort contains nobody in the 15 to 26 band Vasl serves. It demonstrates a mechanism, not a population.
  • One Boston tertiary academic hospital, ICU-weighted, 2001 to 2012, and no geography at any level: the dataset is de-identified in a way that makes an area-deprivation join impossible in principle, not merely unsourced.
  • Only 3 of the 8 components of the SDOH vector could be populated; the other five were held constant and verified constant, so their coefficients are not identified.
  • Aggregate statistics only. No record-level data and no note text is rendered anywhere on this page.
All figures on this panel are pre-registered and held-out · not clinically validated