CASCADE seal 74a18ebf30d05515 · measured, then frozen
Appendix A · Screening Method and reproducibility ← Back to the findings

One sweep, every tier. Measured, then sealed.

A matte aluminium balance with two pans at exactly the same height; the right pan is the tool's deep ruby.

This page shows what the screening numbers are made of: which pairs, which tiers, which thresholds, and where each figure refuses to be quoted. Every claim lives in the source at a path your reviewers can open, and every step reruns on your machine.

Written pairs, declared nature by nature

The measured half rests on pairs we wrote and we declare: match pairs a screening system should catch (transliterations, token order, initials, typos, diacritics, particles, phonetic spellings) and non-match pairs it should ignore, including the hard kind: siblings, shared given names, near strings. The record carries the count of every nature, so you can see exactly what the set does and does not contain.

Authored pairs are a limit, and the page that shows their figures says so on each fiche: they prove what a tier does on declared deformations, not on your alert history. The command that replaces them with your history is one line, and it never sends a byte.

Verify the record

The public record is sealed. Recompute the fingerprint with the repository's own tool; it answers in one line.

run it yourself
npm run sceller -- releve-public.jsonsays: already sealed, and the seal matches

Where it livessrc/measure.ts:197 · src/measure.ts:123

The synthetic half, apart by construction

Fabricated variants (typos in four kinds, reversed order, initials, stripped diacritics, doubled letters, transliterations and their alternatives) are labelled synthetic, nature by nature, and measured in their own tables. They never enter a measured rate: on some cells the fabricated set reads far friendlier than the written pairs, and a blend would flatter the tool exactly there.

The separation is not discipline, it is construction: the record holds two blocks with two provenances, and the code that could merge them does not exist. The synthetic generator itself lives behind a declared seam, so the measure runs and says absent when it is not there, rather than inventing an empty half.

Verify the separation

Open the record: the two blocks carry their provenance in the data itself.

run it yourself
python3 -c "import json; d=json.load(open('releve-public.json')); print(d['authored']['provenance'], '/', d['synthetic']['provenance'])"prints: authored / synthetic

Where it livessrc/measure.ts:6 · src/measure.ts:127 · src/measure.ts:133

Wilson everywhere, and refusals where n is small

Every rate on the red pages travels with its Wilson interval at 95 percent and its n. Below twenty observations a rate is not quoted as a number: the interval spans too much of the scale to separate anything, and a figure that looks like a measurement would be the worst way to say so.

The same refusal guards recall on your own history: with fewer than five confirmed matches in your export, the tool says recall cannot be bounded and shows the synthetic tables apart, instead of printing a recall that rests on almost nothing.

Verify the refusals

Both thresholds live in code, not in prose, and the suite exercises them.

run it yourself
npm testruns the interval and refusal cases with the rest of the suite

Where it livessrc/interval.ts:102 · src/optimise.ts:183 · src/your-alerts.ts:161

One threshold grid, inclusive, shared by every tier

Each tier returns a score in [0, 1], deterministic, with no network and no state. The sweep walks one shared grid from 0.50 to 1.00 in steps of 0.01, and a pair counts as an alert when its score is at or above the threshold: inclusive, so the strictest cell of the grid still means something for a tier that answers exactly 1.

The grid is computed once and rounded to the cent, so two lots that rebuild it get the same numbers; a score outside [0, 1] is refused with the tier's name rather than clamped into a rate.

Verify the grid

The grid and the score guard are code with witnesses.

run it yourself
npm testthe matcher contract cases pin the grid and the bound

Where it livessrc/matcher.ts:43 · src/matcher.ts:46 · src/measure.ts:106