@mailwoman/neural 4.9.0 → 4.11.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 (42) hide show
  1. package/README.md +102 -0
  2. package/out/browser.d.ts +1 -0
  3. package/out/browser.d.ts.map +1 -1
  4. package/out/browser.js +5 -0
  5. package/out/browser.js.map +1 -1
  6. package/out/case-normalize.d.ts +34 -0
  7. package/out/case-normalize.d.ts.map +1 -0
  8. package/out/case-normalize.js +50 -0
  9. package/out/case-normalize.js.map +1 -0
  10. package/out/classifier.d.ts +24 -2
  11. package/out/classifier.d.ts.map +1 -1
  12. package/out/classifier.js +123 -23
  13. package/out/classifier.js.map +1 -1
  14. package/out/index.d.ts +2 -0
  15. package/out/index.d.ts.map +1 -1
  16. package/out/index.js +2 -0
  17. package/out/index.js.map +1 -1
  18. package/out/onnx-runner.d.ts +7 -0
  19. package/out/onnx-runner.d.ts.map +1 -1
  20. package/out/onnx-runner.js +10 -0
  21. package/out/onnx-runner.js.map +1 -1
  22. package/out/postcode-repair.d.ts +17 -0
  23. package/out/postcode-repair.d.ts.map +1 -1
  24. package/out/postcode-repair.js +48 -0
  25. package/out/postcode-repair.js.map +1 -1
  26. package/out/scorer.d.ts +105 -0
  27. package/out/scorer.d.ts.map +1 -0
  28. package/out/scorer.js +286 -0
  29. package/out/scorer.js.map +1 -0
  30. package/out/soft-features.d.ts +67 -0
  31. package/out/soft-features.d.ts.map +1 -0
  32. package/out/soft-features.js +49 -0
  33. package/out/soft-features.js.map +1 -0
  34. package/out/weights.d.ts +109 -0
  35. package/out/weights.d.ts.map +1 -1
  36. package/out/weights.js +157 -1
  37. package/out/weights.js.map +1 -1
  38. package/out/word-consistency.d.ts +60 -0
  39. package/out/word-consistency.d.ts.map +1 -0
  40. package/out/word-consistency.js +140 -0
  41. package/out/word-consistency.js.map +1 -0
  42. package/package.json +5 -3
package/out/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE/E,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EACN,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,OAAO,EACP,OAAO,GACP,MAAM,cAAc,CAAA;AAErB,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE/E,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EACN,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,OAAO,EACP,OAAO,GACP,MAAM,cAAc,CAAA;AAErB,cAAc,cAAc,CAAA"}
@@ -68,5 +68,12 @@ export declare class OnnxRunner {
68
68
  features: ReadonlyArray<ReadonlyArray<number>>;
69
69
  confidence: ReadonlyArray<number>;
70
70
  }): Promise<InferResult>;
71
+ /**
72
+ * The model's declared input names (loads the session if not already loaded). Used by the
73
+ * ProductionScorer (#718) back-compat path: when a model-card has no `requires` block, the
74
+ * required soft-feature channels are INFERRED from the graph — a model exporting
75
+ * `anchor_features` / `gazetteer_features` declared those channels mandatory at train time.
76
+ */
77
+ inputNames(): Promise<readonly string[]>;
71
78
  }
72
79
  //# sourceMappingURL=onnx-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"onnx-runner.d.ts","sourceRoot":"","sources":["../onnx-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,MAAM,WAAW,cAAc;IAC9B,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,8FAA8F;AAC9F,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC,MAAM,WAAW,WAAW;IAC3B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,EAAE,EAAE,CAAA;IAClB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,qBAAa,UAAU;IAMrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAN5B,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,WAAW,CAA6C;IAChE,SAAgB,WAAW,EAAE,MAAM,CAAA;IAEnC,OAAO;IAQP,oEAAoE;WACvD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IAMtF,6CAA6C;WAChC,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;YAMhF,aAAa;IAgB3B;;;;;;;;;;;OAWG;IACG,KAAK,CACV,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,EAC9F,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,GAC/F,OAAO,CAAC,WAAW,CAAC;CAiFvB"}
1
+ {"version":3,"file":"onnx-runner.d.ts","sourceRoot":"","sources":["../onnx-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,MAAM,WAAW,cAAc;IAC9B,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,8FAA8F;AAC9F,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC,MAAM,WAAW,WAAW;IAC3B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,EAAE,EAAE,CAAA;IAClB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,qBAAa,UAAU;IAMrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAN5B,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,WAAW,CAA6C;IAChE,SAAgB,WAAW,EAAE,MAAM,CAAA;IAEnC,OAAO;IAQP,oEAAoE;WACvD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IAMtF,6CAA6C;WAChC,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;YAMhF,aAAa;IAgB3B;;;;;;;;;;;OAWG;IACG,KAAK,CACV,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,EAC9F,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,GAC/F,OAAO,CAAC,WAAW,CAAC;IAkFvB;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;CAI9C"}
@@ -153,5 +153,15 @@ export class OnnxRunner {
153
153
  const localeLogits = localeTensor ? Array.from(localeTensor.data) : undefined;
154
154
  return { logits, numLabels, ...(localeLogits ? { localeLogits } : {}) };
155
155
  }
156
+ /**
157
+ * The model's declared input names (loads the session if not already loaded). Used by the
158
+ * ProductionScorer (#718) back-compat path: when a model-card has no `requires` block, the
159
+ * required soft-feature channels are INFERRED from the graph — a model exporting
160
+ * `anchor_features` / `gazetteer_features` declared those channels mandatory at train time.
161
+ */
162
+ async inputNames() {
163
+ const session = await this.ensureSession();
164
+ return session.inputNames;
165
+ }
156
166
  }
157
167
  //# sourceMappingURL=onnx-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"onnx-runner.js","sourceRoot":"","sources":["../onnx-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"onnx-runner.js","sourceRoot":"","sources":["../onnx-runner.ts"],"names":[],"mappings":"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"}
@@ -62,4 +62,21 @@ export interface RepairResult {
62
62
  * token array (inputs are not mutated) plus a change count.
63
63
  */
64
64
  export declare function repairPostcodeLabels(text: string, input: readonly DecoderToken[]): RepairResult;
65
+ /**
66
+ * US leading-house-number repair (#723, admin-tail diagnostic). The model reads a big rural house
67
+ * number as a ZIP and labels it `postcode` ("24588 Outback Trl, Hermosa SD" → [postcode] "24588",
68
+ * no house_number) — so the situs key loses its number and the row falls back to the admin centroid
69
+ * (~3.8pts of the 12% US admin tail).
70
+ *
71
+ * When a bare 5-digit `postcode` span LEADS the address, no `house_number` was decoded, and a
72
+ * `street` follows it, relabel that span to `house_number`. A trailing postcode (if any) is
73
+ * untouched.
74
+ *
75
+ * **US ONLY — the caller MUST gate this on the detected address system === "us".** A leading
76
+ * 5-digit before a street is a _postcode_ in reversed-order FR ("75008 Rue de la Paix", the #560
77
+ * shard), so applying it outside US would re-break FR reversed-order house numbers. The "a street
78
+ * follows" check is a second guard (FR/DE postcode-first puts a LOCALITY after the leading 5-digit,
79
+ * "08523 Plauen"), but the locale gate is the load-bearing one.
80
+ */
81
+ export declare function repairLeadingHouseNumber(text: string, input: readonly DecoderToken[]): RepairResult;
65
82
  //# sourceMappingURL=postcode-repair.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"postcode-repair.d.ts","sourceRoot":"","sources":["../postcode-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,+EAA+E;IAC/E,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;IACzB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAiB7F,CAAA;AA0BD,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAkB5D;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,CAmE/F"}
1
+ {"version":3,"file":"postcode-repair.d.ts","sourceRoot":"","sources":["../postcode-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,+EAA+E;IAC/E,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;IACzB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAiB7F,CAAA;AA0BD,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAkB5D;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,CAmE/F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,CA0BnG"}
@@ -168,4 +168,52 @@ export function repairPostcodeLabels(text, input) {
168
168
  }
169
169
  return { tokens, changed };
170
170
  }
171
+ /**
172
+ * US leading-house-number repair (#723, admin-tail diagnostic). The model reads a big rural house
173
+ * number as a ZIP and labels it `postcode` ("24588 Outback Trl, Hermosa SD" → [postcode] "24588",
174
+ * no house_number) — so the situs key loses its number and the row falls back to the admin centroid
175
+ * (~3.8pts of the 12% US admin tail).
176
+ *
177
+ * When a bare 5-digit `postcode` span LEADS the address, no `house_number` was decoded, and a
178
+ * `street` follows it, relabel that span to `house_number`. A trailing postcode (if any) is
179
+ * untouched.
180
+ *
181
+ * **US ONLY — the caller MUST gate this on the detected address system === "us".** A leading
182
+ * 5-digit before a street is a _postcode_ in reversed-order FR ("75008 Rue de la Paix", the #560
183
+ * shard), so applying it outside US would re-break FR reversed-order house numbers. The "a street
184
+ * follows" check is a second guard (FR/DE postcode-first puts a LOCALITY after the leading 5-digit,
185
+ * "08523 Plauen"), but the locale gate is the load-bearing one.
186
+ */
187
+ export function repairLeadingHouseNumber(text, input) {
188
+ const tokens = input.map((t) => ({ ...t }));
189
+ // The model already placed a house number — leave the postcode alone.
190
+ if (tokens.some((t) => tagOf(t.label) === "house_number"))
191
+ return { tokens, changed: 0 };
192
+ // The first contiguous postcode run.
193
+ const first = tokens.findIndex((t) => isPostcodeLabel(t.label));
194
+ if (first === -1)
195
+ return { tokens, changed: 0 };
196
+ const run = [first];
197
+ for (let i = first + 1; i < tokens.length && isPostcodeLabel(tokens[i].label); i++)
198
+ run.push(i);
199
+ // It must be a bare 5-digit (the rural-house-number-as-ZIP shape) — not ZIP+4 or alphanumeric.
200
+ const spanEnd = tokens[run[run.length - 1]].end;
201
+ if (!/^\d{5}$/.test(text.slice(tokens[first].start, spanEnd).trim()))
202
+ return { tokens, changed: 0 };
203
+ // A street must FOLLOW the leading number (the house-number position). Rejects the postcode-first
204
+ // "5-digit + locality" shape; the US gate already rejects FR reversed-order.
205
+ const street = tokens.find((t) => tagOf(t.label) === "street");
206
+ if (!street || street.start < spanEnd)
207
+ return { tokens, changed: 0 };
208
+ // Relabel the leading postcode run → house_number.
209
+ let changed = 0;
210
+ run.forEach((i, k) => {
211
+ const label = (k === 0 ? "B-house_number" : "I-house_number");
212
+ if (tokens[i].label !== label) {
213
+ tokens[i].label = label;
214
+ changed++;
215
+ }
216
+ });
217
+ return { tokens, changed };
218
+ }
171
219
  //# sourceMappingURL=postcode-repair.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postcode-repair.js","sourceRoot":"","sources":["../postcode-repair.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postcode-repair.js","sourceRoot":"","sources":["../postcode-repair.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * The canonical ProductionScorer (#718) — the ONE place that constructs a `NeuralAddressClassifier`
7
+ * the way the SHIPPED model expects to be fed. Every eval, harness, and (eventually) the serving
8
+ * path should route through here instead of re-deriving the anchor/gazetteer/conventions feed
9
+ * from per-script flags. The history this closes: the #566/#685 trap — a model TRAINED with a
10
+ * channel, scored WITHOUT it, silently goes out-of-distribution and the eval grades a handicapped
11
+ * model. The flat per-script construction (`score-country-homograph.ts`, `per-locale-f1.ts`) each
12
+ * re-invented the feed and each could silently drop a channel.
13
+ *
14
+ * The fix: the model-card declares its required channels (`requires` block — see
15
+ * `readRequiredChannels`), and `createScorer` FAILS CLOSED when a declared channel isn't actually
16
+ * fed. Deliberate ablations are still legal — pass an explicit `override` and the scorer warns
17
+ * loudly instead of throwing (silent OOD is the bug, not the ablation).
18
+ *
19
+ * **Node-only.** Reads the model card, anchor lookup, and gazetteer lexicon from disk and
20
+ * constructs the `OnnxRunner` (onnxruntime-node). Subpath `./scorer`; never import from the
21
+ * browser bundle.
22
+ */
23
+ import { NeuralAddressClassifier } from "./classifier.js";
24
+ /**
25
+ * Delta threshold for the capability-manifest gate (#718/#719): a conventions row may forbid a tag
26
+ * only if the mask does NOT provably destroy a real capability — i.e. `maskOffF1 − maskOnF1 ≤ 5pp`.
27
+ * A DELTA, not an absolute floor: a tag the model emits at 0.80 is protected if the mask drops it
28
+ * to 0.0, but a tag the mask leaves intact (small/zero delta) is legal regardless of its absolute
29
+ * F1.
30
+ */
31
+ export declare const CAPABILITY_DELTA_THRESHOLD = 0.05;
32
+ /** Default postcode→anchor lookup (the pilot lookup the shipped en-us model trained against). */
33
+ export declare const DEFAULT_ANCHOR_LOOKUP = "/mnt/playpen/mailwoman-data/anchor/pilot-anchor-lookup.json";
34
+ /** Default gazetteer-anchor lexicon (codex-generated, repo-relative). */
35
+ export declare const DEFAULT_GAZETTEER_LEXICON = "data/gazetteer/anchor-lexicon-v1.json";
36
+ /**
37
+ * Per-channel overrides for a deliberate, DECLARED ablation. Setting any of these to a value
38
+ * diverts the scorer from the model-card's declared SHIP-CONFIG; the scorer honors it but emits a
39
+ * loud `console.error` warning (a stated ablation is legal — silent OOD is not, #566/#685).
40
+ */
41
+ export interface ScorerOverrides {
42
+ /** `false` to ablate the anchor channel even when the card declares it required. */
43
+ anchor?: boolean;
44
+ /** `false` to ablate the gazetteer channel even when the card declares it required. */
45
+ gazetteer?: boolean;
46
+ /**
47
+ * Pin / disable the conventions mode (`"auto"` | a `SystemCode` | `false` to disable) regardless
48
+ * of the card's declaration.
49
+ */
50
+ conventions?: "auto" | string | false;
51
+ /** Override the bridge declaration. */
52
+ bridge?: boolean;
53
+ /** Override the near-postcode gazetteer choreography. */
54
+ suppressGazetteerNearPostcode?: boolean;
55
+ }
56
+ export interface CreateScorerOpts {
57
+ /** Path to the `model.onnx`. */
58
+ modelPath: string;
59
+ /** Path to the `tokenizer.model`. */
60
+ tokenizerPath: string;
61
+ /** Path to the `model-card.json` (label vocab + the `requires` ship-config). */
62
+ modelCardPath: string;
63
+ /**
64
+ * Postcode→anchor lookup path. Default {@link DEFAULT_ANCHOR_LOOKUP} when it exists, else the
65
+ * soft-feed sibling shipped in the `@mailwoman/neural-weights-<locale>` package (#718 D1).
66
+ */
67
+ anchorLookupPath?: string;
68
+ /**
69
+ * Gazetteer-anchor lexicon path. Default {@link DEFAULT_GAZETTEER_LEXICON} when it exists, else
70
+ * the soft-feed sibling shipped in the weights package (#718 D1).
71
+ */
72
+ gazetteerLexiconPath?: string;
73
+ /**
74
+ * Locale tag (e.g. `"en-us"`) used to resolve the weights-package soft-feed siblings when the
75
+ * default `/mnt` / repo-relative paths are absent (#718 D1). Only consulted for that fallback;
76
+ * the model/tokenizer/card are always explicit on this path.
77
+ */
78
+ locale?: string;
79
+ /**
80
+ * Fail CLOSED (throw) when the model-card declares a channel required but it isn't actually fed.
81
+ * Default `true`. Set `false` only for throwaway debugging — a below-config scorer is the trap
82
+ * this module exists to catch.
83
+ */
84
+ strict?: boolean;
85
+ /**
86
+ * Serving tier whose certified capabilities the load-time delta-gate (#718/#719) reads from the
87
+ * card's `capabilities` block: `"server"` (anchor+gazetteer — the production default) or
88
+ * `"pocket"` (anchor-only). Default `"server"`. A tier the card doesn't certify → the gate has no
89
+ * capability claims to consult and is a no-op (legal).
90
+ */
91
+ tier?: string;
92
+ /** Deliberate, DECLARED ablations (warn-not-throw). See {@link ScorerOverrides}. */
93
+ overrides?: ScorerOverrides;
94
+ }
95
+ /**
96
+ * Construct a `NeuralAddressClassifier` wired to the model-card's declared SHIP-CONFIG (anchor +
97
+ * gazetteer + conventions + bridge + near-postcode suppression), failing closed in `strict` mode
98
+ * when a declared channel can't actually be fed.
99
+ *
100
+ * Resolution of "what's required": the card's `requires` block when present; otherwise INFERRED
101
+ * from the ONNX graph's input names (back-compat for every pre-#718 bundle). Explicit `overrides`
102
+ * divert from the declaration with a loud warning rather than a throw.
103
+ */
104
+ export declare function createScorer(opts: CreateScorerOpts): Promise<NeuralAddressClassifier>;
105
+ //# sourceMappingURL=scorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAezD;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,OAAO,CAAA;AAE9C,iGAAiG;AACjG,eAAO,MAAM,qBAAqB,gEAAgE,CAAA;AAElG,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,0CAA0C,CAAA;AAuChF;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,uFAAuF;IACvF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;IACrC,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,yDAAyD;IACzD,6BAA6B,CAAC,EAAE,OAAO,CAAA;CACvC;AAED,MAAM,WAAW,gBAAgB;IAChC,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAA;IACrB,gFAAgF;IAChF,aAAa,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oFAAoF;IACpF,SAAS,CAAC,EAAE,eAAe,CAAA;CAC3B;AAgFD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAsI3F"}
package/out/scorer.js ADDED
@@ -0,0 +1,286 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * The canonical ProductionScorer (#718) — the ONE place that constructs a `NeuralAddressClassifier`
7
+ * the way the SHIPPED model expects to be fed. Every eval, harness, and (eventually) the serving
8
+ * path should route through here instead of re-deriving the anchor/gazetteer/conventions feed
9
+ * from per-script flags. The history this closes: the #566/#685 trap — a model TRAINED with a
10
+ * channel, scored WITHOUT it, silently goes out-of-distribution and the eval grades a handicapped
11
+ * model. The flat per-script construction (`score-country-homograph.ts`, `per-locale-f1.ts`) each
12
+ * re-invented the feed and each could silently drop a channel.
13
+ *
14
+ * The fix: the model-card declares its required channels (`requires` block — see
15
+ * `readRequiredChannels`), and `createScorer` FAILS CLOSED when a declared channel isn't actually
16
+ * fed. Deliberate ablations are still legal — pass an explicit `override` and the scorer warns
17
+ * loudly instead of throwing (silent OOD is the bug, not the ablation).
18
+ *
19
+ * **Node-only.** Reads the model card, anchor lookup, and gazetteer lexicon from disk and
20
+ * constructs the `OnnxRunner` (onnxruntime-node). Subpath `./scorer`; never import from the
21
+ * browser bundle.
22
+ */
23
+ import { existsSync, readFileSync } from "node:fs";
24
+ import { ADDRESS_SYSTEM_CONVENTIONS } from "@mailwoman/codex";
25
+ import { parseAnchorLookup } from "./anchor-inference.js";
26
+ import { NeuralAddressClassifier } from "./classifier.js";
27
+ import { parseGazetteerLexicon } from "./gazetteer-inference.js";
28
+ import { OnnxRunner } from "./onnx-runner.js";
29
+ import { PostcodeBinaryResolver } from "./postcode-binary-resolver.js";
30
+ import { MailwomanTokenizer } from "./tokenizer.js";
31
+ import { inferRequiredChannelsFromInputs, lookupTagCapability, readCapabilityManifest, readLabelsFromModelCard, readRequiredChannels, resolveWeights, } from "./weights.js";
32
+ /**
33
+ * Delta threshold for the capability-manifest gate (#718/#719): a conventions row may forbid a tag
34
+ * only if the mask does NOT provably destroy a real capability — i.e. `maskOffF1 − maskOnF1 ≤ 5pp`.
35
+ * A DELTA, not an absolute floor: a tag the model emits at 0.80 is protected if the mask drops it
36
+ * to 0.0, but a tag the mask leaves intact (small/zero delta) is legal regardless of its absolute
37
+ * F1.
38
+ */
39
+ export const CAPABILITY_DELTA_THRESHOLD = 0.05;
40
+ /** Default postcode→anchor lookup (the pilot lookup the shipped en-us model trained against). */
41
+ export const DEFAULT_ANCHOR_LOOKUP = "/mnt/playpen/mailwoman-data/anchor/pilot-anchor-lookup.json";
42
+ /** Default gazetteer-anchor lexicon (codex-generated, repo-relative). */
43
+ export const DEFAULT_GAZETTEER_LEXICON = "data/gazetteer/anchor-lexicon-v1.json";
44
+ /**
45
+ * Resolve the anchor lookup source the scorer feeds when the caller passes no `anchorLookupPath`
46
+ * (#718 D1): prefer the operator's local pilot JSON (the eval's historical default — unchanged when
47
+ * present), else fall back to the soft-feed sibling the weights package SHIPS (`postcode-<cc>.bin`
48
+ * / `anchor-lookup.json`), so eval + serving read the SAME artifact. Returns `undefined` when
49
+ * neither exists (the scorer then fails closed on a declared-required anchor, as before).
50
+ */
51
+ function defaultAnchorSource(locale) {
52
+ if (existsSync(DEFAULT_ANCHOR_LOOKUP))
53
+ return { path: DEFAULT_ANCHOR_LOOKUP, binary: false };
54
+ try {
55
+ return resolveWeights({ locale }).anchorLookupPath;
56
+ }
57
+ catch {
58
+ return undefined;
59
+ }
60
+ }
61
+ /**
62
+ * Resolve the gazetteer lexicon path the scorer feeds when the caller passes no
63
+ * `gazetteerLexiconPath` (#718 D1): prefer the repo-relative codex lexicon (the eval default —
64
+ * unchanged when present), else the soft-feed sibling shipped in the weights package.
65
+ */
66
+ function defaultGazetteerLexicon(locale) {
67
+ if (existsSync(DEFAULT_GAZETTEER_LEXICON))
68
+ return DEFAULT_GAZETTEER_LEXICON;
69
+ try {
70
+ return resolveWeights({ locale }).gazetteerLexiconPath;
71
+ }
72
+ catch {
73
+ return undefined;
74
+ }
75
+ }
76
+ /** Load an `AnchorLookup` from either a PCB1 binary or a JSON pilot lookup (#718 D1). */
77
+ function loadAnchorLookup(source) {
78
+ return source.binary
79
+ ? new PostcodeBinaryResolver(new Uint8Array(readFileSync(source.path))).toAnchorLookup()
80
+ : parseAnchorLookup(JSON.parse(readFileSync(source.path, "utf8")));
81
+ }
82
+ /** A loud, descriptive fail-closed error for a declared-but-unfed channel. */
83
+ class UnfedChannelError extends Error {
84
+ constructor(message) {
85
+ super(message);
86
+ this.name = "UnfedChannelError";
87
+ }
88
+ }
89
+ /**
90
+ * A loud, descriptive fail-closed error for a conventions mask that would destroy a CERTIFIED
91
+ * capability (#718/#719). Thrown by {@link assertConventionsRespectCapabilities} — the structural
92
+ * guard that makes the D2/#719 bug-class (a `forbiddenTags` row suppressing a tag the model
93
+ * demonstrably emits) impossible to ship.
94
+ */
95
+ class CapabilityViolationError extends Error {
96
+ constructor(message) {
97
+ super(message);
98
+ this.name = "CapabilityViolationError";
99
+ }
100
+ }
101
+ /**
102
+ * The load-time delta-gate (#718/#719). Iterate the codex `ADDRESS_SYSTEM_CONVENTIONS`; for every
103
+ * `forbiddenTags` entry, look up the loaded tier's certified capability for that (system, tag). The
104
+ * forbid is ILLEGAL — the mask provably destroys a real capability — when the model is certified to
105
+ * emit the tag (`maskOffF1` present) and the mask measurably drops it:
106
+ *
107
+ * ```
108
+ * maskOffF1 − (maskOnF1 ?? 0) > CAPABILITY_DELTA_THRESHOLD
109
+ * ```
110
+ *
111
+ * A forbidden tag with NO capability entry (model not certified there), or one whose `maskOnF1`
112
+ * shows the mask leaves it intact (small/zero/negative delta), is LEGAL. When `maskOnF1` is ABSENT
113
+ * for a certified tag, the mask's effect was never measured — and since the mask is a hard −1e9
114
+ * emission ban, we conservatively assume full destruction (delta = maskOffF1 − 0). That's the #719
115
+ * shape: FR `street_prefix` certified at maskOff 80.0, no benign mask-on measurement → forbidding
116
+ * it is rejected at load time.
117
+ *
118
+ * Back-compat: a card with no `capabilities` block (pre-#718) has no claims to consult, so the gate
119
+ * is a one-time-warn no-op and the model still loads.
120
+ */
121
+ let warnedNoCapabilities = false;
122
+ function assertConventionsRespectCapabilities(modelCardPath, tier, strict) {
123
+ const manifest = readCapabilityManifest(modelCardPath);
124
+ if (!manifest) {
125
+ // No certified capabilities → nothing to protect. Old cards still load (warn ONCE per process).
126
+ if (!warnedNoCapabilities) {
127
+ warnedNoCapabilities = true;
128
+ console.error(`[createScorer] model-card has no \`capabilities\` block — the conventions capability-gate ` +
129
+ `(#718/#719) is SKIPPED. Regenerate the card via scripts/eval/gen-capability-manifest.ts to ` +
130
+ `certify per-tag capability and enable the gate.`);
131
+ }
132
+ return;
133
+ }
134
+ for (const [system, conventions] of Object.entries(ADDRESS_SYSTEM_CONVENTIONS)) {
135
+ for (const tag of conventions?.forbiddenTags ?? []) {
136
+ const cap = lookupTagCapability(manifest, tier, system, tag);
137
+ if (!cap)
138
+ continue; // model not certified to emit this tag here → the mask can't destroy it.
139
+ const delta = cap.maskOffF1 - (cap.maskOnF1 ?? 0);
140
+ if (delta > CAPABILITY_DELTA_THRESHOLD) {
141
+ const maskOn = cap.maskOnF1 === undefined ? "unmeasured (assumed 0 — hard −1e9 ban)" : String(cap.maskOnF1);
142
+ fail(strict, `conventions forbids \`${tag}\` for system \`${system}\` but the model is certified to emit it ` +
143
+ `(tier \`${tier}\`: maskOff F1 ${cap.maskOffF1} vs maskOn ${maskOn}; Δ=${delta.toFixed(2)} > ` +
144
+ `${CAPABILITY_DELTA_THRESHOLD}); this mask would destroy a real capability — #718/#719. ` +
145
+ `Either remove \`${tag}\` from the codex forbiddenTags for \`${system}\`, or re-certify the ` +
146
+ `model and prove the mask is benign (record a maskOnF1 within ${CAPABILITY_DELTA_THRESHOLD} of maskOff).`, CapabilityViolationError);
147
+ }
148
+ }
149
+ }
150
+ }
151
+ /**
152
+ * Construct a `NeuralAddressClassifier` wired to the model-card's declared SHIP-CONFIG (anchor +
153
+ * gazetteer + conventions + bridge + near-postcode suppression), failing closed in `strict` mode
154
+ * when a declared channel can't actually be fed.
155
+ *
156
+ * Resolution of "what's required": the card's `requires` block when present; otherwise INFERRED
157
+ * from the ONNX graph's input names (back-compat for every pre-#718 bundle). Explicit `overrides`
158
+ * divert from the declaration with a loud warning rather than a throw.
159
+ */
160
+ export async function createScorer(opts) {
161
+ const strict = opts.strict ?? true;
162
+ const overrides = opts.overrides ?? {};
163
+ if (!existsSync(opts.modelPath))
164
+ throw new Error(`createScorer: modelPath does not exist: ${opts.modelPath}`);
165
+ if (!existsSync(opts.tokenizerPath)) {
166
+ throw new Error(`createScorer: tokenizerPath does not exist: ${opts.tokenizerPath}`);
167
+ }
168
+ if (!existsSync(opts.modelCardPath)) {
169
+ throw new Error(`createScorer: modelCardPath does not exist: ${opts.modelCardPath}`);
170
+ }
171
+ const labels = readLabelsFromModelCard(opts.modelCardPath);
172
+ const [tokenizer, runner] = await Promise.all([
173
+ MailwomanTokenizer.loadFromFile(opts.tokenizerPath),
174
+ OnnxRunner.create(opts.modelPath),
175
+ ]);
176
+ // What the model DECLARES it needs. Card `requires` block is authoritative; older cards (no block)
177
+ // fall back to the ONNX graph's declared inputs — a model exporting anchor_features/gazetteer_features
178
+ // trained with those channels mandatory. Conventions/bridge are card-only (not graph-observable).
179
+ const declared = readRequiredChannels(opts.modelCardPath) ?? inferRequiredChannelsFromInputs(await runner.inputNames());
180
+ // --- Capability-manifest delta-gate (#718/#719) -----------------------------------------------
181
+ // BEFORE wiring the conventions mask, prove the shipped codex `forbiddenTags` don't destroy a tag
182
+ // this model is CERTIFIED to emit (per the card's `capabilities` block for the loaded tier). This
183
+ // is a property of the model-card + codex pairing, independent of any per-instance `overrides` —
184
+ // an ablation scorer still loads the same shipped conventions table production will use, so the
185
+ // gate runs unconditionally. Makes the D2/#719 bug-class structurally impossible to ship.
186
+ assertConventionsRespectCapabilities(opts.modelCardPath, opts.tier ?? "server", strict);
187
+ // --- Anchor channel ---------------------------------------------------------------------------
188
+ // Caller-pinned path wins (explicit `--anchor-lookup`, always JSON); else fall back to the
189
+ // operator pilot JSON or, failing that, the weights-package soft-feed sibling (PCB1 or JSON, #718).
190
+ const anchorSource = opts.anchorLookupPath
191
+ ? { path: opts.anchorLookupPath, binary: false }
192
+ : defaultAnchorSource(opts.locale);
193
+ const anchorRequired = declared.anchor?.required ?? false;
194
+ let postcodeAnchorLookup;
195
+ if (overrides.anchor === false) {
196
+ if (anchorRequired) {
197
+ console.error(`[createScorer] OVERRIDE: anchor channel ABLATED (override anchor:false) but the model-card ` +
198
+ `declares it REQUIRED. Deliberate OOD — the model was TRAINED with the anchor channel.`);
199
+ }
200
+ }
201
+ else {
202
+ postcodeAnchorLookup = anchorSource && existsSync(anchorSource.path) ? loadAnchorLookup(anchorSource) : undefined;
203
+ // Fail closed: declared-required but the lookup is missing or parsed empty → the model would be
204
+ // fed zeros (the anchor-off identity) and silently go OOD. That's the #566/#685 trap.
205
+ if (anchorRequired && !(postcodeAnchorLookup && postcodeAnchorLookup.size > 0)) {
206
+ const reason = postcodeAnchorLookup
207
+ ? `parsed lookup is EMPTY (size 0)`
208
+ : `lookup not found (tried ${anchorSource?.path ?? DEFAULT_ANCHOR_LOOKUP} + weights-package sibling)`;
209
+ fail(strict, `anchor channel is declared REQUIRED by the model-card but cannot be fed: ${reason}. ` +
210
+ `Provide a valid --anchor-lookup, or pass overrides.anchor=false for a deliberate ablation.`);
211
+ }
212
+ }
213
+ // --- Gazetteer channel ------------------------------------------------------------------------
214
+ const gazetteerLexiconPath = opts.gazetteerLexiconPath ?? defaultGazetteerLexicon(opts.locale);
215
+ const gazetteerRequired = declared.gazetteer?.required ?? false;
216
+ let gazetteerLexicon;
217
+ if (overrides.gazetteer === false) {
218
+ if (gazetteerRequired) {
219
+ console.error(`[createScorer] OVERRIDE: gazetteer channel ABLATED (override gazetteer:false) but the ` +
220
+ `model-card declares it REQUIRED. Deliberate OOD — the model was TRAINED with the gazetteer clue.`);
221
+ }
222
+ }
223
+ else {
224
+ gazetteerLexicon =
225
+ gazetteerLexiconPath && existsSync(gazetteerLexiconPath)
226
+ ? parseGazetteerLexicon(JSON.parse(readFileSync(gazetteerLexiconPath, "utf8")))
227
+ : undefined;
228
+ if (gazetteerRequired && !gazetteerLexicon) {
229
+ fail(strict, `gazetteer channel is declared REQUIRED by the model-card but the lexicon file was not found ` +
230
+ `at ${gazetteerLexiconPath ?? DEFAULT_GAZETTEER_LEXICON}. Provide a valid --gazetteer-lexicon, or pass ` +
231
+ `overrides.gazetteer=false for a deliberate ablation.`);
232
+ }
233
+ }
234
+ // --- Conventions mode -------------------------------------------------------------------------
235
+ const conventionsRequired = declared.conventions?.required ?? false;
236
+ const declaredConventionsMode = declared.conventions?.mode ?? "auto";
237
+ let addressSystemConventions;
238
+ if (overrides.conventions !== undefined) {
239
+ if (overrides.conventions === false) {
240
+ addressSystemConventions = undefined;
241
+ if (conventionsRequired) {
242
+ console.error(`[createScorer] OVERRIDE: conventions DISABLED (override conventions:false) but the ` +
243
+ `model-card declares them REQUIRED (mode "${declaredConventionsMode}").`);
244
+ }
245
+ }
246
+ else {
247
+ addressSystemConventions = overrides.conventions;
248
+ if (overrides.conventions !== declaredConventionsMode) {
249
+ console.error(`[createScorer] OVERRIDE: conventions mode set to "${overrides.conventions}" (model-card ` +
250
+ `declares "${declaredConventionsMode}").`);
251
+ }
252
+ }
253
+ }
254
+ else {
255
+ // Declaration drives it: required → the declared mode; not required → leave undefined (byte-stable).
256
+ addressSystemConventions = conventionsRequired ? declaredConventionsMode : undefined;
257
+ if (conventionsRequired && !addressSystemConventions) {
258
+ fail(strict, `conventions are declared REQUIRED by the model-card but no mode could be resolved.`);
259
+ }
260
+ }
261
+ // --- Bridge + near-postcode choreography ------------------------------------------------------
262
+ const bridgePunctuationGaps = overrides.bridge ?? declared.bridge?.required ?? false;
263
+ const suppressGazetteerNearPostcode = overrides.suppressGazetteerNearPostcode ?? declared.suppress_gazetteer_near_postcode ?? false;
264
+ return new NeuralAddressClassifier({
265
+ tokenizer,
266
+ runner,
267
+ ...(labels ? { labels } : {}),
268
+ ...(postcodeAnchorLookup ? { postcodeAnchorLookup } : {}),
269
+ ...(gazetteerLexicon ? { gazetteerLexicon } : {}),
270
+ suppressGazetteerNearPostcode,
271
+ ...(addressSystemConventions ? { addressSystemConventions: addressSystemConventions } : {}),
272
+ bridgePunctuationGaps,
273
+ });
274
+ }
275
+ /**
276
+ * Throw in strict mode; otherwise warn loudly and continue (deliberate below-config debugging).
277
+ * `ErrorClass` defaults to {@link UnfedChannelError} (the channel-feed traps); the capability-gate
278
+ * passes {@link CapabilityViolationError} so the two fail-closed families are distinguishable.
279
+ */
280
+ function fail(strict, message, ErrorClass = UnfedChannelError) {
281
+ const full = `[createScorer] ${message}`;
282
+ if (strict)
283
+ throw new ErrorClass(full);
284
+ console.error(`${full}\n[createScorer] strict=false — continuing despite the violation.`);
285
+ }
286
+ //# sourceMappingURL=scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.js","sourceRoot":"","sources":["../scorer.ts"],"names":[],"mappings":"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"}