@mailwoman/neural 4.10.0 → 4.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +102 -0
  2. package/out/anchor-inference.d.ts +1 -1
  3. package/out/anchor-inference.js +1 -1
  4. package/out/browser.d.ts +1 -0
  5. package/out/browser.d.ts.map +1 -1
  6. package/out/browser.js +5 -0
  7. package/out/browser.js.map +1 -1
  8. package/out/case-normalize.d.ts +34 -0
  9. package/out/case-normalize.d.ts.map +1 -0
  10. package/out/case-normalize.js +50 -0
  11. package/out/case-normalize.js.map +1 -0
  12. package/out/classifier.d.ts +25 -3
  13. package/out/classifier.d.ts.map +1 -1
  14. package/out/classifier.js +123 -23
  15. package/out/classifier.js.map +1 -1
  16. package/out/index.d.ts +2 -0
  17. package/out/index.d.ts.map +1 -1
  18. package/out/index.js +2 -0
  19. package/out/index.js.map +1 -1
  20. package/out/labels.d.ts +1 -1
  21. package/out/labels.js +1 -1
  22. package/out/onnx-runner.d.ts +7 -0
  23. package/out/onnx-runner.d.ts.map +1 -1
  24. package/out/onnx-runner.js +10 -0
  25. package/out/onnx-runner.js.map +1 -1
  26. package/out/postcode-repair.d.ts +17 -0
  27. package/out/postcode-repair.d.ts.map +1 -1
  28. package/out/postcode-repair.js +48 -0
  29. package/out/postcode-repair.js.map +1 -1
  30. package/out/scorer.d.ts +105 -0
  31. package/out/scorer.d.ts.map +1 -0
  32. package/out/scorer.js +286 -0
  33. package/out/scorer.js.map +1 -0
  34. package/out/soft-features.d.ts +67 -0
  35. package/out/soft-features.d.ts.map +1 -0
  36. package/out/soft-features.js +49 -0
  37. package/out/soft-features.js.map +1 -0
  38. package/out/span-bridge.d.ts +4 -4
  39. package/out/span-bridge.js +4 -4
  40. package/out/span-proposer-lexicon.d.ts +3 -3
  41. package/out/span-proposer-lexicon.js +3 -3
  42. package/out/street-morphology-prior.d.ts +4 -4
  43. package/out/street-morphology-prior.js +3 -3
  44. package/out/unit-repair.js +1 -1
  45. package/out/unit-repair.js.map +1 -1
  46. package/out/weights.d.ts +109 -0
  47. package/out/weights.d.ts.map +1 -1
  48. package/out/weights.js +157 -1
  49. package/out/weights.js.map +1 -1
  50. package/out/word-consistency.d.ts +60 -0
  51. package/out/word-consistency.d.ts.map +1 -0
  52. package/out/word-consistency.js +140 -0
  53. package/out/word-consistency.js.map +1 -0
  54. package/package.json +5 -3
package/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # @mailwoman/neural
2
+
3
+ **Neural address classifier** — SentencePiece tokenizer, ONNX runtime inference,
4
+ and decoder wiring for the Mailwoman address parser.
5
+
6
+ This is the engine that runs the trained transformer model (shipped separately
7
+ as `@mailwoman/neural-weights-en-us` and `@mailwoman/neural-weights-fr-fr`).
8
+ It handles tokenization, ONNX session management, soft-feature injection (anchor,
9
+ gazetteer), Viterbi decoding, and the `ProposalClassifier` / `ProductionScorer`
10
+ high-level APIs.
11
+
12
+ ```ts
13
+ import { createScorer, loadTokenizer, loadModel } from "@mailwoman/neural"
14
+
15
+ // Load a weights bundle (model.onnx + tokenizer.model + model-card.json)
16
+ const scorer = await createScorer({
17
+ weightsPath: "path/to/neural-weights-en-us",
18
+ })
19
+ const result = scorer.score(tokens)
20
+
21
+ // Or at a lower level
22
+ const tokenizer = await loadTokenizer("path/to/tokenizer.model")
23
+ const session = await loadModel("path/to/model.onnx")
24
+ ```
25
+
26
+ ## What's inside
27
+
28
+ | Module | Purpose |
29
+ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
30
+ | **`tokenizer.ts`** | SentencePiece unigram tokenizer (loads `.model` file) |
31
+ | **`onnx-runner.ts`** | ONNX Runtime Web inference session (WebGPU / WASM backends) |
32
+ | **`classifier.ts`** | `NeuralAddressClassifier` — tokenize → run → decode |
33
+ | **`scorer.ts`** | `createScorer` / `ProductionScorer` — canonical entry point that reads `requires` from `model-card.json` and fails closed |
34
+ | **`anchor-inference.ts`** | Postcode anchor feature injection (soft channel, not override) |
35
+ | **`gazetteer-inference.ts`** | Gazetteer lexicon soft-feature injection |
36
+ | **`viterbi.ts`** | Viterbi decoder (linear-chain CRF) with BIO transition masks |
37
+ | **`labels.ts`** | Label index ↔ `ComponentTag` mapping |
38
+ | **`weights.ts`** | Weight loading from `@mailwoman/neural-weights-*` bundles |
39
+ | **`soft-features.ts`** | Soft-feature vector construction (anchor + gazetteer channels) |
40
+ | **`postcode-anchor.ts`** | Postcode extraction and anchor coordinate resolution |
41
+ | **`postcode-binary-resolver.ts`** | Sorted-binary postcode lookup (browser) |
42
+ | **`query-shape-prior.ts`** | Query-shape-based emission priors |
43
+ | **`span-proposal-prior.ts`** | Phrase-grouper-based span proposal priors |
44
+ | **`span-proposer-lexicon.ts`** | Lexicon-based span proposals |
45
+ | **`proposal-classifier.ts`** | Proposal-level classification wrapper |
46
+ | **`case-normalize.ts`** | All-caps case normalization before the model |
47
+
48
+ ## Key exports
49
+
50
+ ```ts
51
+ // Canonical entry point — respects model-card.json "requires" contract
52
+ export { createScorer, ProductionScorer, type Scorer } from "./scorer.js"
53
+
54
+ // Tokenizer (SentencePiece unigram, byte_fallback)
55
+ export { loadTokenizer, Tokenizer, tokenizeToIds } from "./tokenizer.js"
56
+
57
+ // ONNX inference
58
+ export { loadModel, createOrtSession, OnnxRunner } from "./onnx-runner.js"
59
+
60
+ // Neural classifier
61
+ export { NeuralAddressClassifier } from "./classifier.js"
62
+
63
+ // Decoder (Viterbi + BIO masks + argmax)
64
+ export { viterbi, softmax, perTokenArgmax, buildBioTransitionMask } from "./viterbi.js"
65
+
66
+ // Label mapping
67
+ export { labelIndexToClassification, classificationToLabelIndices } from "./labels.js"
68
+
69
+ // Weight loading
70
+ export { loadFromWeights, type WeightsBundle } from "./weights.js"
71
+
72
+ // Anchor + gazetteer features (soft channels, never overrides)
73
+ export { AnchorInference, type AnchorResult } from "./anchor-inference.js"
74
+ export { GazetteerInference } from "./gazetteer-inference.js"
75
+
76
+ // Postcode lookup
77
+ export { extractPostcodeAnchors } from "./postcode-anchor.js"
78
+ export { PostcodeBinaryResolver } from "./postcode-binary-resolver.js"
79
+
80
+ // Case normalization
81
+ export { normalizeCase, type CaseNormalizeResult } from "./case-normalize.js"
82
+ ```
83
+
84
+ ## Ship-config contract
85
+
86
+ The `ProductionScorer` reads `model-card.json`'s `requires` block and
87
+ **fails closed** if a declared channel isn't fed. Do not hand-wire ONNX
88
+ sessions with zero-filled anchor inputs — anchor-off is out-of-distribution
89
+ for the shipped model.
90
+
91
+ ## Related
92
+
93
+ - [`@mailwoman/neural-weights-en-us`](../neural-weights-en-us) — trained model bundle (en-US)
94
+ - [`@mailwoman/neural-weights-fr-fr`](../neural-weights-fr-fr) — trained model bundle (fr-FR)
95
+ - [`@mailwoman/core`](../core) — pipeline coordinator, types, decoder
96
+ - [Neural Classification concepts](https://mailwoman.sister.software/articles/concepts/neural-classification/)
97
+ - [ONNX Runtime concepts](https://mailwoman.sister.software/articles/concepts/onnx-runtime/)
98
+ - [What Mailwoman Is](https://mailwoman.sister.software/articles/concepts/what-mailwoman-is/)
99
+
100
+ ## License
101
+
102
+ [AGPL-3.0-only](https://www.gnu.org/licenses/agpl-3.0.html)
@@ -10,7 +10,7 @@
10
10
  * lookup the model trained against (`scripts/build-pilot-anchor-lookup.py`), so the feature
11
11
  * layout matches byte-for-byte.
12
12
  *
13
- * The layout is LOAD-BEARING and cross-language: a wrong locale order or centroid scale feeds the
13
+ * The layout is ESSENTIAL and cross-language: a wrong locale order or centroid scale feeds the
14
14
  * model garbage. `anchor-inference.test.ts` pins both `LOCALE_ORDER` and the vector to values
15
15
  * emitted by the Python `anchor_feature_vector` — any drift fails the test.
16
16
  */
@@ -10,7 +10,7 @@
10
10
  * lookup the model trained against (`scripts/build-pilot-anchor-lookup.py`), so the feature
11
11
  * layout matches byte-for-byte.
12
12
  *
13
- * The layout is LOAD-BEARING and cross-language: a wrong locale order or centroid scale feeds the
13
+ * The layout is ESSENTIAL and cross-language: a wrong locale order or centroid scale feeds the
14
14
  * model garbage. `anchor-inference.test.ts` pins both `LOCALE_ORDER` and the vector to values
15
15
  * emitted by the Python `anchor_feature_vector` — any drift fails the test.
16
16
  */
package/out/browser.d.ts CHANGED
@@ -15,5 +15,6 @@ export * from "./tokenizer.js";
15
15
  export * from "./anchor-inference.js";
16
16
  export * from "./postcode-binary-resolver.js";
17
17
  export * from "./gazetteer-inference.js";
18
+ export * from "./soft-features.js";
18
19
  export type { InferResult } from "./onnx-runner.js";
19
20
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAG9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAK7C,cAAc,0BAA0B,CAAA;AAGxC,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAG9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAK7C,cAAc,0BAA0B,CAAA;AAKxC,cAAc,oBAAoB,CAAA;AAGlC,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
package/out/browser.js CHANGED
@@ -21,4 +21,9 @@ export * from "./postcode-binary-resolver.js";
21
21
  // model and feeds the clue at inference (gazetteer-trained models REQUIRE it; zero-filled clues are
22
22
  // the measured train/inference mismatch — see CONTRIBUTING_MODEL_WORK.mdx "zero-fill trap").
23
23
  export * from "./gazetteer-inference.js";
24
+ // Browser-safe soft-feature choreography (#718): the pure `buildSoftFeatures` that composes the
25
+ // anchor + gazetteer channels (+ near-postcode suppression). No `fs`. The Node-only `./scorer` (which
26
+ // constructs the OnnxRunner + reads the card/lookup/lexicon from disk) is deliberately NOT re-exported
27
+ // here.
28
+ export * from "./soft-features.js";
24
29
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,sGAAsG;AACtG,sEAAsE;AACtE,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,oGAAoG;AACpG,oGAAoG;AACpG,oGAAoG;AACpG,6FAA6F;AAC7F,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,sGAAsG;AACtG,sEAAsE;AACtE,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,oGAAoG;AACpG,oGAAoG;AACpG,oGAAoG;AACpG,6FAA6F;AAC7F,cAAc,0BAA0B,CAAA;AACxC,gGAAgG;AAChG,sGAAsG;AACtG,uGAAuG;AACvG,QAAQ;AACR,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * #690: input case-normalization for the neural parser. ALL-CAPS registry/compliance data (`214
7
+ * JONES RD, ELKHART, TX 75839`) is partly out-of-domain for a model trained on mixed-case text —
8
+ * it drops/mis-bounds tokens (`PALESTINE` → locality `ALESTINE`). Title-casing an all-caps input
9
+ * before the model recovers it (measured: TX HHSC locality 90.1% → 99.7%,
10
+ * `docs/articles/evals/2026-06-17-geocoder-vs-provided-coords.md`).
11
+ *
12
+ * Detection is deliberately STRICT — only a fully-shouting input qualifies — so mixed-case input is
13
+ * never touched (the caller's byte-stable path). Distinct from the identifier-casing all-caps
14
+ * idiom in `core/identifiers.ts` (`smartSnakeCase`/`smartCamelCase`): those skip _case
15
+ * conversion_ when a name is already uppercase; this _applies_ a title-case to address TEXT for
16
+ * the model.
17
+ */
18
+ /**
19
+ * True when `text` is PURE-ASCII ALL-CAPS: it has cased ASCII letters and ZERO lowercase, and NO
20
+ * non-ASCII characters. The pure-ASCII requirement is deliberate — title-casing accented/non-Latin
21
+ * text is locale-sensitive and can change length (`ß`→`SS`, Turkish dotted/dotless I), which would
22
+ * break the token-offset invariant the caller relies on. So this fix targets ASCII registry data
23
+ * only; accented or non-Latin input falls back to the model's current behavior. The 3-letter floor
24
+ * avoids treating a digit/punctuation-only or tiny-token input as a whole shouting address.
25
+ */
26
+ export declare function isAllCapsInput(text: string): boolean;
27
+ /**
28
+ * Title-case each ASCII alphabetic run (`PALESTINE` → `Palestine`). Length-preserving — token
29
+ * offsets unchanged.
30
+ */
31
+ export declare function titleCaseInput(text: string): string;
32
+ /** Title-case the input iff it is all-caps; otherwise return it unchanged. The parser's #690 hook. */
33
+ export declare function normalizeInputCase(text: string): string;
34
+ //# sourceMappingURL=case-normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case-normalize.d.ts","sourceRoot":"","sources":["../case-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CASpD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * #690: input case-normalization for the neural parser. ALL-CAPS registry/compliance data (`214
7
+ * JONES RD, ELKHART, TX 75839`) is partly out-of-domain for a model trained on mixed-case text —
8
+ * it drops/mis-bounds tokens (`PALESTINE` → locality `ALESTINE`). Title-casing an all-caps input
9
+ * before the model recovers it (measured: TX HHSC locality 90.1% → 99.7%,
10
+ * `docs/articles/evals/2026-06-17-geocoder-vs-provided-coords.md`).
11
+ *
12
+ * Detection is deliberately STRICT — only a fully-shouting input qualifies — so mixed-case input is
13
+ * never touched (the caller's byte-stable path). Distinct from the identifier-casing all-caps
14
+ * idiom in `core/identifiers.ts` (`smartSnakeCase`/`smartCamelCase`): those skip _case
15
+ * conversion_ when a name is already uppercase; this _applies_ a title-case to address TEXT for
16
+ * the model.
17
+ */
18
+ /**
19
+ * True when `text` is PURE-ASCII ALL-CAPS: it has cased ASCII letters and ZERO lowercase, and NO
20
+ * non-ASCII characters. The pure-ASCII requirement is deliberate — title-casing accented/non-Latin
21
+ * text is locale-sensitive and can change length (`ß`→`SS`, Turkish dotted/dotless I), which would
22
+ * break the token-offset invariant the caller relies on. So this fix targets ASCII registry data
23
+ * only; accented or non-Latin input falls back to the model's current behavior. The 3-letter floor
24
+ * avoids treating a digit/punctuation-only or tiny-token input as a whole shouting address.
25
+ */
26
+ export function isAllCapsInput(text) {
27
+ let upper = 0;
28
+ for (let i = 0; i < text.length; i++) {
29
+ const c = text.charCodeAt(i);
30
+ if (c > 127)
31
+ return false; // any non-ASCII (accented/non-Latin) → leave it alone
32
+ if (c >= 97 && c <= 122)
33
+ return false; // any [a-z] → mixed case, leave it alone
34
+ if (c >= 65 && c <= 90)
35
+ upper++;
36
+ }
37
+ return upper >= 3;
38
+ }
39
+ /**
40
+ * Title-case each ASCII alphabetic run (`PALESTINE` → `Palestine`). Length-preserving — token
41
+ * offsets unchanged.
42
+ */
43
+ export function titleCaseInput(text) {
44
+ return text.replace(/[A-Za-z]+/g, (w) => w[0].toUpperCase() + w.slice(1).toLowerCase());
45
+ }
46
+ /** Title-case the input iff it is all-caps; otherwise return it unchanged. The parser's #690 hook. */
47
+ export function normalizeInputCase(text) {
48
+ return isAllCapsInput(text) ? titleCaseInput(text) : text;
49
+ }
50
+ //# sourceMappingURL=case-normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case-normalize.js","sourceRoot":"","sources":["../case-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC,GAAG,GAAG;YAAE,OAAO,KAAK,CAAA,CAAC,sDAAsD;QAChF,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG;YAAE,OAAO,KAAK,CAAA,CAAC,yCAAyC;QAC/E,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IACD,OAAO,KAAK,IAAI,CAAC,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;AACzF,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC9C,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1D,CAAC"}
@@ -12,9 +12,9 @@
12
12
  import { type SystemCode } from "@mailwoman/codex";
13
13
  import { decodeAsXml, type AddressTree, type Calibrator, type ComponentTag } from "@mailwoman/core/decoder";
14
14
  import { type SpanProposerLexicon } from "@mailwoman/core/pipeline";
15
- import { type AnchorLookup } from "./anchor-inference.js";
15
+ import type { AnchorLookup } from "./anchor-inference.js";
16
16
  import { type FstMatcherLike } from "./fst-prior.js";
17
- import { type GazetteerLexicon } from "./gazetteer-inference.js";
17
+ import type { GazetteerLexicon } from "./gazetteer-inference.js";
18
18
  import type { InferResult } from "./onnx-runner.js";
19
19
  import { type QueryShapeLike } from "./query-shape-prior.js";
20
20
  import { type SpanProposalPriorOpts } from "./span-proposal-prior.js";
@@ -83,7 +83,7 @@ export interface NeuralAddressClassifierConfig {
83
83
  * adjacent to a postcode-anchor hit (needs both `gazetteerLexicon` and `postcodeAnchorLookup`).
84
84
  * Targets the region-clue→postcode CRF interference (~3pp US postcode).
85
85
  *
86
- * PAIRING IS LOAD-BEARING: set this IFF the model was TRAINED with the matching train-time
86
+ * PAIRING IS ESSENTIAL: set this IFF the model was TRAINED with the matching train-time
87
87
  * choreography (`data.gazetteer_choreography`). The 2026-06-10 diagnostic showed the harm is
88
88
  * WEIGHT-BAKED — applying this at inference on a model trained _without_ train-choreography does
89
89
  * NOT recover postcode and adds train/inference skew. Only enable for a consolidation-era model
@@ -119,6 +119,13 @@ export interface NeuralAddressClassifierConfig {
119
119
  * (the pre-2026-06-12 byte-stable default).
120
120
  */
121
121
  spanProposer?: SpanProposerConfig | false;
122
+ /**
123
+ * Per-word BIO consistency repair (#727 + the admin-token fragmentation class). Default off →
124
+ * byte-identical. When true, every `▁`-delimited word's pieces are forced to ONE tag by a
125
+ * confidence-weighted vote over the post-prior emissions (see word-consistency.ts). Per-parse
126
+ * `ParseOptions.enforceWordConsistency` overrides this default.
127
+ */
128
+ enforceWordConsistency?: boolean;
122
129
  }
123
130
  /**
124
131
  * Config for the Stage 2.7 span-proposer integration (see
@@ -236,6 +243,11 @@ export interface ParseOpts {
236
243
  * v0.7 gate confirms it. See `./postcode-repair.ts`.
237
244
  */
238
245
  postcodeRepair?: boolean;
246
+ /**
247
+ * Per-word BIO consistency repair (#727 + the admin-token fragmentation class). Overrides the
248
+ * classifier's `enforceWordConsistency` config default for this parse. See word-consistency.ts.
249
+ */
250
+ enforceWordConsistency?: boolean;
239
251
  /**
240
252
  * When true, run the deterministic secondary-unit regex repair pass on the decoded label sequence
241
253
  * before tree-building. Detects designator-shaped substrings ("Apt 4B", "Ste 12", "Unit 9400",
@@ -244,6 +256,16 @@ export interface ParseOpts {
244
256
  * v0.7.2 arena re-run quantifies its delta. See `./unit-repair.ts`.
245
257
  */
246
258
  unitRepair?: boolean;
259
+ /**
260
+ * When true AND the input is detected ALL-CAPS (registry/compliance data like `214 JONES RD,
261
+ * ELKHART, TX 75839`), title-case the input before the model sees it. The model trains on
262
+ * mixed-case text, so all-caps is partly OOD — it drops/mis-bounds tokens (#690: `PALESTINE` →
263
+ * locality `ALESTINE`; all-caps locality 3/5 vs title-case 5/5). Detection-gated, so MIXED-case
264
+ * input is untouched (byte-stable). Off by default. On all-caps input the output values are
265
+ * title-cased (the SHOUTING is normalized away — better, and the resolver name-matches
266
+ * case-insensitively regardless).
267
+ */
268
+ normalizeCase?: boolean;
247
269
  /**
248
270
  * Optional span-confidence calibrator (task #59). When provided, each decoded span's `conf=` is
249
271
  * mapped through it (isotonic lookup table → calibrated probability of correctness). OPT-IN —
@@ -1 +1 @@
1
- {"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../classifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../classifier.ts"],"names":[],"mappings":"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"}
package/out/classifier.js CHANGED
@@ -13,12 +13,12 @@ import { conventionsForSystem } from "@mailwoman/codex";
13
13
  import { buildAddressTree, decodeAsJson, decodeAsTuples, decodeAsXml, } from "@mailwoman/core/decoder";
14
14
  import { proposeSpans } from "@mailwoman/core/pipeline";
15
15
  import { detectAddressSystem } from "./address-system.js";
16
- import { buildAnchorFeatures } from "./anchor-inference.js";
16
+ import { normalizeInputCase } from "./case-normalize.js";
17
17
  import { buildFstEmissionPriors } from "./fst-prior.js";
18
- import { buildGazetteerFeatures, suppressGazetteerNearPostcode } from "./gazetteer-inference.js";
19
18
  import { STAGE2_BIO_LABELS } from "./labels.js";
20
- import { repairPostcodeLabels } from "./postcode-repair.js";
19
+ import { repairLeadingHouseNumber, repairPostcodeLabels } from "./postcode-repair.js";
21
20
  import { addEmissionMatrix, buildEmissionPriors } from "./query-shape-prior.js";
21
+ import { buildSoftFeatures } from "./soft-features.js";
22
22
  import { bridgePunctuationGaps } from "./span-bridge.js";
23
23
  import { buildSpanProposalPriors } from "./span-proposal-prior.js";
24
24
  import { buildCodexSpanLexicon } from "./span-proposer-lexicon.js";
@@ -26,6 +26,7 @@ import { buildStreetMorphologyEmissionPriors } from "./street-morphology-prior.j
26
26
  import { MailwomanTokenizer } from "./tokenizer.js";
27
27
  import { repairUnitLabels } from "./unit-repair.js";
28
28
  import { buildBioEndMask, buildBioStartMask, buildBioTransitionMask, softmax, viterbi } from "./viterbi.js";
29
+ import { enforceWordConsistency } from "./word-consistency.js";
29
30
  export class NeuralAddressClassifier {
30
31
  cfg;
31
32
  labels;
@@ -75,9 +76,13 @@ export class NeuralAddressClassifier {
75
76
  // + node:fs) and throws cleanly in a browser if called. Without the directive, webpack
76
77
  // pulls onnx-runner / weights into the browser chunk graph + then chokes on the Node-only
77
78
  // builtins they reference.
78
- const [{ OnnxRunner }, { resolveWeights, readLabelsFromModelCard, readCrfTransitions }] = await Promise.all([
79
+ const [{ OnnxRunner }, { resolveWeights, readLabelsFromModelCard, readCrfTransitions, readRequiredChannels }, { parseAnchorLookup }, { parseGazetteerLexicon }, { PostcodeBinaryResolver }, fs,] = await Promise.all([
79
80
  import(/* webpackIgnore: true */ "./onnx-runner.js"),
80
81
  import(/* webpackIgnore: true */ "./weights.js"),
82
+ import(/* webpackIgnore: true */ "./anchor-inference.js"),
83
+ import(/* webpackIgnore: true */ "./gazetteer-inference.js"),
84
+ import(/* webpackIgnore: true */ "./postcode-binary-resolver.js"),
85
+ import(/* webpackIgnore: true */ "node:fs"),
81
86
  ]);
82
87
  const resolved = resolveWeights(opts);
83
88
  const labels = readLabelsFromModelCard(resolved.modelCardPath);
@@ -86,6 +91,53 @@ export class NeuralAddressClassifier {
86
91
  MailwomanTokenizer.loadFromFile(resolved.tokenizerPath),
87
92
  OnnxRunner.create(resolved.modelPath),
88
93
  ]);
94
+ // --- Soft-feed (#718 D1): feed the channels the SHIPPED model was trained against ----------
95
+ // The anchor-trained en-us model goes OOD when scored anchor-OFF (the #566/#685 crater: country
96
+ // ~0, region 71, locality 57 vs the server-tier 68/90/77). The browser loader already feeds the
97
+ // channels from URLs; this is the Node-side mirror so EVERY consumer (ResolveRouter,
98
+ // GeocodeRouter, geocode.tsx, the CLI) transparently gains them with no callsite change.
99
+ //
100
+ // SOFT: each channel is best-effort. A caller-passed `postcodeAnchorLookup` always wins. When
101
+ // the model-card declares a channel REQUIRED but the package didn't ship its data, we warn ONCE
102
+ // (mirroring neural-web's `warnOnUnfedTrainedChannels`) and run that channel OFF — never crash.
103
+ const declared = readRequiredChannels(resolved.modelCardPath);
104
+ let postcodeAnchorLookup = opts.postcodeAnchorLookup;
105
+ if (!postcodeAnchorLookup && resolved.anchorLookupPath) {
106
+ try {
107
+ postcodeAnchorLookup = resolved.anchorLookupPath.binary
108
+ ? new PostcodeBinaryResolver(new Uint8Array(fs.readFileSync(resolved.anchorLookupPath.path))).toAnchorLookup()
109
+ : parseAnchorLookup(JSON.parse(fs.readFileSync(resolved.anchorLookupPath.path, "utf8")));
110
+ }
111
+ catch (err) {
112
+ warnUnfedChannel("anchor", `failed to parse ${resolved.anchorLookupPath.path}: ${err.message}`);
113
+ }
114
+ }
115
+ if (declared?.anchor?.required && !(postcodeAnchorLookup && postcodeAnchorLookup.size > 0)) {
116
+ warnUnfedChannel("anchor", resolved.anchorLookupPath
117
+ ? `parsed lookup at ${resolved.anchorLookupPath.path} is empty`
118
+ : `no postcode-<cc>.bin / anchor-lookup.json found in the weights package`);
119
+ }
120
+ let gazetteerLexicon;
121
+ if (resolved.gazetteerLexiconPath) {
122
+ try {
123
+ gazetteerLexicon = parseGazetteerLexicon(JSON.parse(fs.readFileSync(resolved.gazetteerLexiconPath, "utf8")));
124
+ }
125
+ catch (err) {
126
+ warnUnfedChannel("gazetteer", `failed to parse ${resolved.gazetteerLexiconPath}: ${err.message}`);
127
+ }
128
+ }
129
+ // Pocket tier is anchor-only: `resolveWeights` already withholds the gazetteer path, so a
130
+ // declared-required gazetteer is EXPECTED to be unfed there — don't warn. Otherwise warn.
131
+ if (declared?.gazetteer?.required && !gazetteerLexicon && opts.tier !== "pocket") {
132
+ warnUnfedChannel("gazetteer", resolved.gazetteerLexiconPath
133
+ ? `lexicon at ${resolved.gazetteerLexiconPath} could not be parsed`
134
+ : `no anchor-lexicon-v1.json found in the weights package`);
135
+ }
136
+ // Near-postcode gazetteer choreography + conventions mode: drive them off the card's declared
137
+ // SHIP-CONFIG (mirrors createScorer / the browser loader defaults), inert when the source
138
+ // channel is absent. Byte-stable for a non-anchor card (no `requires` → all undefined/false).
139
+ const suppressGazetteerNearPostcode = declared?.suppress_gazetteer_near_postcode ?? false;
140
+ const addressSystemConventions = declared?.conventions?.required ? (declared.conventions.mode ?? "auto") : undefined;
89
141
  return new NeuralAddressClassifier({
90
142
  tokenizer,
91
143
  runner,
@@ -93,15 +145,23 @@ export class NeuralAddressClassifier {
93
145
  transitions: crf?.transitions,
94
146
  startTransitions: crf?.startTransitions,
95
147
  endTransitions: crf?.endTransitions,
96
- ...(opts.postcodeAnchorLookup ? { postcodeAnchorLookup: opts.postcodeAnchorLookup } : {}),
148
+ ...(postcodeAnchorLookup ? { postcodeAnchorLookup } : {}),
149
+ ...(gazetteerLexicon ? { gazetteerLexicon } : {}),
150
+ ...(suppressGazetteerNearPostcode ? { suppressGazetteerNearPostcode } : {}),
151
+ ...(addressSystemConventions ? { addressSystemConventions: addressSystemConventions } : {}),
97
152
  });
98
153
  }
99
154
  /** Tokenize → infer → Viterbi (or argmax) → decoder tree. */
100
155
  async parse(text, opts) {
101
156
  if (text.length === 0)
102
157
  return { raw: text, roots: [] };
103
- const { tokens } = await this.#decode(text, opts);
104
- return buildAddressTree(text, tokens, opts?.calibrate ? { calibrate: opts.calibrate } : undefined);
158
+ // #690: title-case all-caps ASCII input so the mixed-case-trained model doesn't go OOD.
159
+ // Detection-gated (mixed-case + non-ASCII untouched), opt-in. ASCII title-case is char-for-char
160
+ // length-preserving, so token offsets are unaffected; the tree is built from the normalized text
161
+ // (values come out title-cased — the SHOUTING is gone, the resolver name-matches case-insensitively).
162
+ const modelText = opts?.normalizeCase ? normalizeInputCase(text) : text;
163
+ const { tokens } = await this.#decode(modelText, opts);
164
+ return buildAddressTree(modelText, tokens, opts?.calibrate ? { calibrate: opts.calibrate } : undefined);
105
165
  }
106
166
  /**
107
167
  * Like `parse`, but also returns the raw per-token logits and piece offsets needed for per-span
@@ -129,26 +189,31 @@ export class NeuralAddressClassifier {
129
189
  */
130
190
  async #decode(text, opts) {
131
191
  const { pieces, ids } = this.cfg.tokenizer.encode(text);
132
- // Postcode-anchor channel (#239/#240): build per-piece anchor features from the same lookup the
133
- // model trained on, fed alongside the ids. No-op when no lookup is configured.
134
- const anchor = this.cfg.postcodeAnchorLookup
135
- ? buildAnchorFeatures(text, pieces, this.cfg.postcodeAnchorLookup)
136
- : undefined;
137
- const gazetteer = this.cfg.gazetteerLexicon
138
- ? buildGazetteerFeatures(text, pieces, this.cfg.gazetteerLexicon)
139
- : undefined;
140
- const gazFed = gazetteer && anchor && this.cfg.suppressGazetteerNearPostcode
141
- ? suppressGazetteerNearPostcode(gazetteer, anchor.confidence)
142
- : gazetteer;
143
- const { logits, localeLogits } = await this.cfg.runner.infer(ids, anchor, gazFed);
192
+ // Soft-feature channels (#718): the postcode-anchor (#239/#240) + gazetteer-anchor (#464) clues
193
+ // the model conditions on alongside the ids, plus the near-postcode gazetteer choreography. The
194
+ // build + choreography is the single PURE `buildSoftFeatures` (soft-features.ts) — both this
195
+ // decode path and the ProductionScorer feed channels identically, so there is exactly one
196
+ // choreography. Each channel is undefined when its source is unconfigured (no-op).
197
+ const soft = buildSoftFeatures(text, pieces, {
198
+ postcodeAnchorLookup: this.cfg.postcodeAnchorLookup,
199
+ gazetteerLexicon: this.cfg.gazetteerLexicon,
200
+ suppressGazetteerNearPostcode: this.cfg.suppressGazetteerNearPostcode,
201
+ });
202
+ const { logits, localeLogits } = await this.cfg.runner.infer(ids, soft.anchor, soft.gazetteer);
144
203
  this.assertEmissionWidth(logits);
145
204
  // Address-system conventions (#511 Tier A): resolve which system's rules apply — caller-pinned
146
205
  // system, or the model's own locale-head detection under a high confidence bar. Null = no
147
206
  // constraints; the parse below is byte-identical to the pre-conventions path.
148
207
  const conventionsOpt = opts?.addressSystemConventions ?? this.cfg.addressSystemConventions;
149
- const conventions = conventionsOpt === undefined
208
+ // The resolved system code, captured so the US-only leading-house-number repair below can gate on
209
+ // it (see repairLeadingHouseNumber). null when conventions are off → no system, no repair
210
+ // (byte-stable). "auto" reads the model's locale head; a pinned SystemCode wins.
211
+ const detectedSystem = conventionsOpt === undefined
150
212
  ? null
151
- : conventionsForSystem(conventionsOpt === "auto" ? (detectAddressSystem(localeLogits)?.system ?? null) : conventionsOpt);
213
+ : conventionsOpt === "auto"
214
+ ? (detectAddressSystem(localeLogits)?.system ?? null)
215
+ : conventionsOpt;
216
+ const conventions = conventionsForSystem(detectedSystem);
152
217
  let emissions = opts?.queryShape
153
218
  ? addEmissionMatrix(logits, buildEmissionPriors(opts.queryShape, pieces, this.labels, {
154
219
  biasScale: opts.queryShapeBiasScale ?? 1.0,
@@ -191,7 +256,7 @@ export class NeuralAddressClassifier {
191
256
  emissions = emissions.map((row) => row.map((v, idx) => (forbidden.has(idx) ? -1e9 : v)));
192
257
  }
193
258
  }
194
- const labelIndices = this.decodeMode === "viterbi"
259
+ let labelIndices = this.decodeMode === "viterbi"
195
260
  ? viterbi({
196
261
  emissions,
197
262
  transitions: this.transitions,
@@ -199,6 +264,16 @@ export class NeuralAddressClassifier {
199
264
  endTransitions: this.endTransitions,
200
265
  }).path
201
266
  : emissions.map((row) => argmaxSoftmax(row).idx);
267
+ // Per-word BIO consistency repair (#727 + the admin-token fragmentation class). Opt-in — default
268
+ // OFF → byte-identical. Heals words whose pieces disagree (e.g. `VERMONT`→VER[loc]+MONT[region],
269
+ // `Lozère`→Loz[loc]+ère[region]) via a confidence-weighted vote over the post-prior emissions; a
270
+ // word whose pieces already agree is untouched. See word-consistency.ts.
271
+ let healedConfidence = null;
272
+ if (opts?.enforceWordConsistency ?? this.cfg.enforceWordConsistency ?? false) {
273
+ const wc = enforceWordConsistency(pieces, emissions, this.labels, labelIndices);
274
+ labelIndices = wc.labelIndices;
275
+ healedConfidence = wc.healedConfidence;
276
+ }
202
277
  let tokens = pieces.map((p, i) => {
203
278
  const idx = labelIndices[i];
204
279
  const probs = softmax(logits[i]);
@@ -207,7 +282,9 @@ export class NeuralAddressClassifier {
207
282
  start: p.start,
208
283
  end: p.end,
209
284
  label: (this.labels[idx] ?? "O"),
210
- confidence: probs[idx],
285
+ // Healed words carry the vote's mean p(type) (length-invariant); unchanged pieces keep
286
+ // the model's per-piece softmax confidence.
287
+ confidence: healedConfidence?.get(i) ?? probs[idx],
211
288
  };
212
289
  });
213
290
  // Postcode repair runs when the caller asks for it OR the detected system declares a postcode
@@ -216,6 +293,12 @@ export class NeuralAddressClassifier {
216
293
  if (opts?.postcodeRepair || conventions?.postcodePattern) {
217
294
  tokens = repairPostcodeLabels(text, tokens).tokens;
218
295
  }
296
+ // US leading-house-number repair (#723): the model labels a big rural house number as a ZIP
297
+ // ("24588 Outback Trl" → [postcode], no house_number). US-GATED — a leading 5-digit before a
298
+ // street is a POSTCODE in reversed-order FR (the #560 shard), so only when the detected system is US.
299
+ if (detectedSystem === "us") {
300
+ tokens = repairLeadingHouseNumber(text, tokens).tokens;
301
+ }
219
302
  if (opts?.unitRepair) {
220
303
  tokens = repairUnitLabels(text, tokens).tokens;
221
304
  }
@@ -260,6 +343,23 @@ export class NeuralAddressClassifier {
260
343
  }
261
344
  }
262
345
  }
346
+ /**
347
+ * Loud-degrade warning for the `loadFromWeights` soft-feed (#718 D1) — the Node mirror of
348
+ * neural-web's `warnOnUnfedTrainedChannels`. Fired ONCE per channel per process: a model-card that
349
+ * declares a channel REQUIRED, paired with a package that didn't ship (or could not parse) its
350
+ * data, runs that channel OFF. Structural fallback (the parse still works), loud console (a
351
+ * silently anchor-OFF anchor-trained model is the #566/#685 OOD crater this fix exists to
352
+ * surface).
353
+ */
354
+ const warnedUnfedChannels = new Set();
355
+ function warnUnfedChannel(channel, detail) {
356
+ if (warnedUnfedChannels.has(channel))
357
+ return;
358
+ warnedUnfedChannels.add(channel);
359
+ console.error(`[mailwoman/neural] loadFromWeights: model-card declares the ${channel} channel REQUIRED but ${detail} — ` +
360
+ `running ${channel}-OFF, parses degraded (train/inference mismatch). Ship the ${channel} artifact in the ` +
361
+ `weights package (postcode-<cc>.bin / anchor-lexicon-v1.json), or pass an explicit lookup.`);
362
+ }
263
363
  function argmaxSoftmax(row) {
264
364
  let maxIdx = 0;
265
365
  let maxVal = row[0];
@@ -1 +1 @@
1
- {"version":3,"file":"classifier.js","sourceRoot":"","sources":["../classifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"classifier.js","sourceRoot":"","sources":["../classifier.ts"],"names":[],"mappings":"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"}