Input robustness — absorbing the mess users actually type
The addresses in a test fixture are clean. The addresses a geocoder receives are
not. They arrive in all caps from a compliance export, comma-crushed from a
spreadsheet paste, missing a letter because someone typed fast, with Ave where
the fixture said Avenue. A parser that only holds up on the tidy form is a
demo. Holding up on the mess is the product.
So the question that matters isn't "does it parseaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates. 1600 Pennsylvania Avenue NW, Washington, DC 20500?" Of course it does. It's "does 1600 PENNSYLVANIA AVE NW,WASHINGTON DC land on the same rooftoprooftopGeocoding precision at the building or parcel level — coordinates within a few metres — the highest tier of the geocode cascade. Sourced from address-point and situs data.?" This page is how Mailwoman answers
that: three layerslayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. that absorb surface noise before it can move the coordinate,
and the gates that verify each layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. holds.
The absorption stack
Robustness here comes in three layerslayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6., deliberately ordered from the cheapest and most certain transforms to the most learned, each catching what the one before it shouldn't.
Layer 1 — deterministic normalization
The first pass is pure code, no modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.', in @mailwoman/normalize.
It does the transforms that are always safe because they have a single correct
answer: Unicode NFC, so a composed é and a decomposed é stop being different
strings; punctuation folding; whitespace collapse, where a run of spaces becomes
one and a trailing ./,/;/: is trimmed off the tail (normalize/whitespace.ts).
That last one earns its keep: a stray period glued onto the final tokentokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words.
(…Washington DC.) used to drop the streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous. from address_point to admin,
and trimming it is free.
Every transform is offset-mapped. The normalized string carries a map back to the raw character positions, so a spanspanA contiguous range of characters or tokens in the input string, tagged with an address component type (street, locality, postcode, etc.). Parsed addresses are represented as collections of spans, possibly nested in a tree. the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' finds in the clean text still points at the right bytes of what the user typed. Robustness that corrupted the offsets would be worse than none.
One thing this layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. deliberately does not do at runtime: expand
abbreviations. normalize/abbreviations.ts can turn Rd into Road and Ave
into Avenue, and it's fully built, but it's opt-in, and the runtime pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-gate → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package.
leaves it off (normalize/compute.ts). That's a choice, not an oversight.
Abbreviation is the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.''s job. Hard-coding Ave → Avenue in front of the parser
would be the sieve regrowing: a rule seizing a decision the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' is supposed to
own, and one it can't unlearn if the rule turns out wrong for a localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for.. See
What Mailwoman is on why knowledge stays out of the
learner's front door.
Layer 2 — model-side case normalization
Some noise is too localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for.-sensitive for LayerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. 1 but too systematic to leave to the
corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus. alone. Casing is the case in point. A modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' trained on mixed-case text is
partly out of domain on a fully-shouting compliance record, where it drops and
mis-bounds tokenstokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words. (214 JONES RD, ELKHART, TX 75839 mangles into a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. of
ALESTINE). So neural/case-normalize.ts title-cases an all-caps input before the
modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' sees it (#690), and restores the trained mixed-case shape of an all-lowercase
input (#829). Both are on by default.
The detection is strict on purpose: only a fully-shouting or fully-whispering input
qualifies, so ordinary mixed-case text is never touched and its byte path stays
identical. It's also offset-stable, and it has to be. It targets pure-ASCII input,
because title-casing accented or non-Latin text can change length (ß→SS, the
Turkish dotted and dotless I) and break the very offset invariant LayerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. 1 worked
to preserve. The measured payoff was concrete: TX HHSC localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. recallrecallOf the spans whose gold label is a given tag, the fraction the model found. High recall means few misses. Paired with precision to compute F1. went from
90.1% to 99.7%.
Layer 3 — trained-in variation
The last layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. isn't a pass at all. It's the corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus.. The parser learns to shrug off
surface variation because the trainingtrainingThe process of adjusting a model's parameters so its predictions match labeled examples, by repeatedly measuring error and nudging the weights to reduce it. Distinct from inference, when the trained model is run on new input. data contains it: casing permutations
(corpus/src/shard-recipes/intersection.ts, locale.ts), abbreviation variants in
both directions (street-affix.ts, the unit.ts designatorsdesignatorThe closed-vocabulary leading word of a secondary-address phrase — 'Apt', 'Suite', 'Floor', 'PO Box', 'Level' — paired with an identifier to form a complete subpremise. from #454,
fr-bare-street.ts). This is where Ave and Avenue both become the same streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.
to the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.'. No rule rewrote one into the other; the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' saw both forms
in trainingtrainingThe process of adjusting a model's parameters so its predictions match labeled examples, by repeatedly measuring error and nudging the weights to reduce it. Distinct from inference, when the trained model is run on new input. and learned they point at the same place.
This is the layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. that makes LayerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. 1's abstention safe. Because the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' trains on
both forms, normalize/ can leave abbreviations alone and trust the learner to
handle them. The three layerslayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. are a division of labor: deterministic code takes the
transforms with one right answer, the corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus. takes the ones whose answer depends on
context, and case normalization bridges the systematic gap between them.
The gates
Absorption you can't measure is absorption you can't trust. Three gates watch these layerslayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6., and they grade different things on purpose.
Metamorphic INV/DIR/BAND — the un-gameable layer
The one that matters most is mailwoman eval gauntlet --layer metamorphic
(mailwoman/eval-harness/gauntlet/metamorphic.ts), layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. 2 of
the Gauntlet. It asserts relations between outputs rather
than stored expected values, which is exactly why a curated corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus. can't breed false
confidence in it. It also grades the assembled geocode, coordinate and tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous., not
parseaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates. F1, because a robustness bug that leaves the tags intact but moves the pin is
still a bug that ships a wrong answer.
Three relation families, split by what a perturbation is allowed to do to the answer:
- INV (invariance, ≤1m). A labelcomponent tagOne of the 33 labels in Mailwoman's address schema — street, locality, region, postcode, house_number, unit, po_box, country, venue, intersection, and others. Each parsed span carries exactly one component tag.-preserving perturbation of a base address
(lowercase it, uppercase it, double the spaces, append a stray dot, tighten the
space after a comma, swap an expanded suffix for its abbreviation) must not move the
coordinate more than a metre (
INV_EPSILON_KM = 0.001) or change the resolution tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous.. Same address, same answer. Theabbrevcase inverts thenormalize/abbreviation table (Avenue→Ave), and it holds because the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' trains on both forms, so the coordinate has no excuse to budge. - DIR (directional, ≤5km). Drop the postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. and the result must still land within 5km of the with-postcode anchoranchor inferenceA technique where structured knowledge (postcode locations, gazetteer place names) is injected into the model as soft input features — not as deterministic overrides. The model still decides the final labels, but the anchor signal biases it toward correct admin tags.. This is the #251 failure class, a parser that falls apart the moment a user omits the ZIP, frozen here as a standing property.
- BAND (tolerance, ≤5km). A corrupting perturbation (a single-character transpose or substitution, an ordinal or house-number spelled out) is allowed to shift the parseaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates., so demanding byte-identical output would be the wrong contract. It still has to land within a tolerance band of the clean coordinate. This is the family that catches the classes the pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-gate → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package. never trained on.
When a perturbation deterministically fails, it doesn't get swept under the rug and it
doesn't block the build either. It goes in KNOWN_INV_XFAIL or KNOWN_BAND_XFAIL with
a tracked note: visible, non-blockingblockingThe first stage of entity resolution: generate candidate record pairs using cheap, high-recall keys (geo cell, canonical address, phone) instead of comparing every record to every other (O(n²)). The matcher only scores pairs that survive blocking., so the gate fails only on new regressions. The
bookkeeping cuts the other way too: an xfail that starts passing gets flagged for
removal, so the list can't rot into the PeliasPeliasAn open-source geocoder, Mailwoman's spiritual predecessor. pass-list trap it was built to avoid.
Casing and spacing are green, cleared by the two normalizer levers above (#829's
lowercase restore and the trailing-punctuation trim) with no retraining. The EN suffix
abbreviations hold. The tracked xfails record the rest: the FR Boulevard→Bd
swap drops from a rooftoprooftopGeocoding precision at the building or parcel level — coordinates within a few metres — the highest tier of the geocode cascade. Sourced from address-point and situs data. to admin tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous. (the streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. stores the expanded type,
so the abbreviation misses the point-tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous. name match, a resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon. gap rather than a modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.'
one), house-number spelling misses the band outright, and a single-char typo in a
localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. or streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. can lose the pin. Those last are measured with the anchor and
gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. channels off, which is the harness default; the gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. soft-feed is exactly
what would recover a typo'd Amsterdam in ship-config, so read them as the anchor-off
floor, not a verdict on production.
Golden graceful/* slices — labeled adversarial cases
The golden setgolden setA hand-labeled evaluation dataset of US, French, and adversarial addresses used as ground truth for evals. (data/eval/golden/v0.1.2) carries a small hand-labeled adversarial
track under graceful/*: typos (Pensylvania, Portlnad, Fransisco), mis-casing,
mis-punctuation, whitespace abuse. Around ten of these are single-character typo
cases. They're a stress test with expected components attached, not a coordinate
gate: the parseaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates. should survive with lower confidence, and the labelscomponent tagOne of the 33 labels in Mailwoman's address schema — street, locality, region, postcode, house_number, unit, po_box, country, venue, intersection, and others. Each parsed span carries exactly one component tag. say what
"survive" means.
perturb-golden.ts — the one-off arena
scripts/eval/perturb-golden.ts takes golden rows and applies rule-defeating
perturbations (strip the delimiters, lowercase everything, glue the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. to the
postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. as OR97214) while keeping the component labelscomponent tagOne of the 33 labels in Mailwoman's address schema — street, locality, region, postcode, house_number, unit, po_box, country, venue, intersection, and others. Each parsed span carries exactly one component tag. intact. It exists to show
that a contextual modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' degrades more gracefully than a delimiter-hungry rule parser.
It's a generator you run when you want that arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins., not a standing gate.
The coverage matrix
Put the perturbation classes against the layerslayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. that absorb them and the gates that watch them, and the full picture falls out, thin spots included.
| Class | normalize/ (runtime) | Trained (corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus. aug) | Gated |
|---|---|---|---|
| Casing | yes (case-normalizenormalizeStage 1 of the runtime pipeline: deterministic input preprocessing (Unicode NFC, punctuation normalization, whitespace collapse). Returns a NormalizedInput with an offsetMap that maps normalized positions back to the raw input. #690/#829, modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.'-side) | yes | INV[lower/upper] green |
| Spacing | yes (whitespace.ts) | incidental | INV[ws], INV[comma-tight] green |
| Abbreviation swap (Road↔Rd) | capable but OFF at runtime (deliberate) | yes | INV[abbrev]: EN suffixes green; FR Bd tracked-xfail (resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon. name-match gap) |
| Number spelling (5th↔Fifth, 100↔One Hundred) | no | no | BAND[num-ordinal] green; BAND[num-house] tracked-xfail (untrained) |
| Typos (single-char edit) | no | no | BAND[typo-sub]: most bases green; tracked-xfail where a typo'd localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy./streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. loses the pin (anchor-off) |
| Transpositions | no | no | BAND[transpose]: same anchor-off gaps as typo-sub |
The top two rows are the settled ones: casing and spacing are absorbed at runtime,
reinforced in the corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus., and held green by a standing invariant. The bottom four used
to be blind spots. They run through the metamorphic gate now, and the surprise was that
several of them already hold. The EN suffix abbreviations pass the strict metre
invariant. Ordinal streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. spelling (5th↔Fifth) stays inside the tolerance band even
though nothing trains it. The gaps came out smaller than feared, and they're
named in the xfail maps rather than hiding: a French streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-type abbreviation the
resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon. can't match at rooftoprooftopGeocoding precision at the building or parcel level — coordinates within a few metres — the highest tier of the geocode cascade. Sourced from address-point and situs data. tiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous., house-number spelling, and single-character typos
that lose a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. or streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. when the anchor and gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. channels are off. Each one
is a tracked, watched line item instead of a silent hole, which is the whole point of
running them.
See also
- Eval discipline — the full Gauntlet, and why the coordinate is graded, not the name string
- What Mailwoman is — why knowledge stays outside the learner, the principle behind LayerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. 1's abstention
- The pipeline contract — where the normalizenormalizeStage 1 of the runtime pipeline: deterministic input preprocessing (Unicode NFC, punctuation normalization, whitespace collapse). Returns a NormalizedInput with an offsetMap that maps normalized positions back to the raw input. stagestageOne of the dataflow stages in the runtime pipeline (normalize, locale gate, kind classify, phrase group, token classify, sequence correct, reconcile, resolve). Distinct from tier (model vocabulary) and phase (plan milestone). plugs into the runtime pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-gate → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package.