@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.js","sourceRoot":"","sources":["../scorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * The SOFT-FEATURE channels (#718) — the per-piece anchor + gazetteer clues the model conditions on
7
+ * alongside `input_ids`. This module is the single, PURE, browser-safe home for the channel
8
+ * choreography that used to live inline in `NeuralAddressClassifier.#decode`: build the postcode
9
+ * anchor, build the gazetteer clue, and (when paired with the matching train-time half) suppress
10
+ * the gazetteer clue adjacent to a postcode-anchor hit.
11
+ *
12
+ * It is the essential contract surface for the ProductionScorer (#718): the scorer asserts which
13
+ * channels are fed, this function decides HOW they are fed. Keeping it a pure function means both
14
+ * the classifier and any harness build features identically — there is exactly one choreography.
15
+ *
16
+ * No `fs`, no Node builtins: the caller hands in the already-parsed lookup/lexicon (mirrors
17
+ * `anchor-inference.ts` / `gazetteer-inference.ts`, which are themselves pure for the same
18
+ * reason).
19
+ */
20
+ import { type AnchorLookup } from "./anchor-inference.js";
21
+ import { type GazetteerLexicon } from "./gazetteer-inference.js";
22
+ import type { TokenizedPiece } from "./tokenizer.js";
23
+ /** A built soft-feature channel: per-piece feature rows + per-piece confidence. */
24
+ export interface SoftFeatureChannel {
25
+ features: number[][];
26
+ confidence: number[];
27
+ }
28
+ /** The soft-feature channels fed to the runner. Each is present only when its source is configured. */
29
+ export interface SoftFeatures {
30
+ /** Postcode-anchor channel (#239/#240) — present iff `postcodeAnchorLookup` was supplied. */
31
+ anchor?: SoftFeatureChannel;
32
+ /**
33
+ * Gazetteer-anchor channel (#464) — present iff `gazetteerLexicon` was supplied. Already
34
+ * choreographed: when `suppressGazetteerNearPostcode` is set AND an anchor channel exists, the
35
+ * clue is zeroed adjacent to postcode-anchor hits before it's returned here.
36
+ */
37
+ gazetteer?: SoftFeatureChannel;
38
+ }
39
+ /** Sources + choreography for {@link buildSoftFeatures}. Mirrors the classifier's config fields. */
40
+ export interface SoftFeatureSources {
41
+ /** Postcode→anchor lookup (#239/#240). Omit to skip the anchor channel. */
42
+ postcodeAnchorLookup?: AnchorLookup;
43
+ /** Gazetteer-anchor lexicon (#464). Omit to skip the gazetteer channel. */
44
+ gazetteerLexicon?: GazetteerLexicon;
45
+ /**
46
+ * Channel choreography (#464, v0.9.13 postcode fix): zero the gazetteer clue on pieces adjacent
47
+ * to a postcode-anchor hit. Needs BOTH a `gazetteerLexicon` and a `postcodeAnchorLookup` to take
48
+ * effect (the suppression is keyed off the anchor's confidence). PAIRING IS ESSENTIAL — enable
49
+ * this IFF the model was trained with the matching train-time choreography. See
50
+ * `suppressGazetteerNearPostcode` in `gazetteer-inference.ts`.
51
+ */
52
+ suppressGazetteerNearPostcode?: boolean;
53
+ }
54
+ /**
55
+ * Build the soft-feature channels for `text`/`pieces` from the configured sources — the EXACT
56
+ * choreography previously inlined in `NeuralAddressClassifier.#decode`:
57
+ *
58
+ * 1. Anchor channel from `postcodeAnchorLookup` (no-op when unset).
59
+ * 2. Gazetteer channel from `gazetteerLexicon` (no-op when unset).
60
+ * 3. If both channels exist AND `suppressGazetteerNearPostcode`, zero the gazetteer clue adjacent to
61
+ * postcode-anchor hits.
62
+ *
63
+ * Pure + byte-stable: the returned channels are identical to the pre-#718 inline path, so wiring
64
+ * this into `#decode` is a behavior-preserving refactor.
65
+ */
66
+ export declare function buildSoftFeatures(text: string, pieces: ReadonlyArray<TokenizedPiece>, sources: SoftFeatureSources): SoftFeatures;
67
+ //# sourceMappingURL=soft-features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soft-features.d.ts","sourceRoot":"","sources":["../soft-features.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAyD,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AACvH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,uGAAuG;AACvG,MAAM,WAAW,YAAY;IAC5B,6FAA6F;IAC7F,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAA;CAC9B;AAED,oGAAoG;AACpG,MAAM,WAAW,kBAAkB;IAClC,2EAA2E;IAC3E,oBAAoB,CAAC,EAAE,YAAY,CAAA;IACnC,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;;;;;;OAMG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAA;CACvC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,EACrC,OAAO,EAAE,kBAAkB,GACzB,YAAY,CAgBd"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * The SOFT-FEATURE channels (#718) — the per-piece anchor + gazetteer clues the model conditions on
7
+ * alongside `input_ids`. This module is the single, PURE, browser-safe home for the channel
8
+ * choreography that used to live inline in `NeuralAddressClassifier.#decode`: build the postcode
9
+ * anchor, build the gazetteer clue, and (when paired with the matching train-time half) suppress
10
+ * the gazetteer clue adjacent to a postcode-anchor hit.
11
+ *
12
+ * It is the essential contract surface for the ProductionScorer (#718): the scorer asserts which
13
+ * channels are fed, this function decides HOW they are fed. Keeping it a pure function means both
14
+ * the classifier and any harness build features identically — there is exactly one choreography.
15
+ *
16
+ * No `fs`, no Node builtins: the caller hands in the already-parsed lookup/lexicon (mirrors
17
+ * `anchor-inference.ts` / `gazetteer-inference.ts`, which are themselves pure for the same
18
+ * reason).
19
+ */
20
+ import { buildAnchorFeatures } from "./anchor-inference.js";
21
+ import { buildGazetteerFeatures, suppressGazetteerNearPostcode } from "./gazetteer-inference.js";
22
+ /**
23
+ * Build the soft-feature channels for `text`/`pieces` from the configured sources — the EXACT
24
+ * choreography previously inlined in `NeuralAddressClassifier.#decode`:
25
+ *
26
+ * 1. Anchor channel from `postcodeAnchorLookup` (no-op when unset).
27
+ * 2. Gazetteer channel from `gazetteerLexicon` (no-op when unset).
28
+ * 3. If both channels exist AND `suppressGazetteerNearPostcode`, zero the gazetteer clue adjacent to
29
+ * postcode-anchor hits.
30
+ *
31
+ * Pure + byte-stable: the returned channels are identical to the pre-#718 inline path, so wiring
32
+ * this into `#decode` is a behavior-preserving refactor.
33
+ */
34
+ export function buildSoftFeatures(text, pieces, sources) {
35
+ const anchor = sources.postcodeAnchorLookup
36
+ ? buildAnchorFeatures(text, pieces, sources.postcodeAnchorLookup)
37
+ : undefined;
38
+ const gazetteer = sources.gazetteerLexicon
39
+ ? buildGazetteerFeatures(text, pieces, sources.gazetteerLexicon)
40
+ : undefined;
41
+ const gazFed = gazetteer && anchor && sources.suppressGazetteerNearPostcode
42
+ ? suppressGazetteerNearPostcode(gazetteer, anchor.confidence)
43
+ : gazetteer;
44
+ return {
45
+ ...(anchor ? { anchor } : {}),
46
+ ...(gazFed ? { gazetteer: gazFed } : {}),
47
+ };
48
+ }
49
+ //# sourceMappingURL=soft-features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soft-features.js","sourceRoot":"","sources":["../soft-features.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,mBAAmB,EAAqB,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAyB,MAAM,0BAA0B,CAAA;AAqCvH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAChC,IAAY,EACZ,MAAqC,EACrC,OAA2B;IAE3B,MAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB;QAC1C,CAAC,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC;QACjE,CAAC,CAAC,SAAS,CAAA;IACZ,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB;QACzC,CAAC,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC;QAChE,CAAC,CAAC,SAAS,CAAA;IACZ,MAAM,MAAM,GACX,SAAS,IAAI,MAAM,IAAI,OAAO,CAAC,6BAA6B;QAC3D,CAAC,CAAC,6BAA6B,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC;QAC7D,CAAC,CAAC,SAAS,CAAA;IAEb,OAAO;QACN,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAA;AACF,CAAC"}
@@ -15,10 +15,10 @@
15
15
  *
16
16
  * The fix is deterministic: AFTER decode, merge adjacent same-label spans whose gap consists only
17
17
  * of punctuation/whitespace, contains at least one non-space character, and is short (≤ 3 chars).
18
- * The non-space requirement is load-bearing — space-only gaps ("Saint Paul" as two locality
19
- * spans) are NOT bridged, because a space between two same-tag spans is often a real boundary
20
- * (the Saint-Albans fragmentation wants this fix too, but it must come with its own evidence;
21
- * this pass stays conservative by construction).
18
+ * The non-space requirement is essential — space-only gaps ("Saint Paul" as two locality spans)
19
+ * are NOT bridged, because a space between two same-tag spans is often a real boundary (the
20
+ * Saint-Albans fragmentation wants this fix too, but it must come with its own evidence; this
21
+ * pass stays conservative by construction).
22
22
  *
23
23
  * Runs beside the postcode/unit repair passes in the classifier, before tree-building.
24
24
  */
@@ -15,10 +15,10 @@
15
15
  *
16
16
  * The fix is deterministic: AFTER decode, merge adjacent same-label spans whose gap consists only
17
17
  * of punctuation/whitespace, contains at least one non-space character, and is short (≤ 3 chars).
18
- * The non-space requirement is load-bearing — space-only gaps ("Saint Paul" as two locality
19
- * spans) are NOT bridged, because a space between two same-tag spans is often a real boundary
20
- * (the Saint-Albans fragmentation wants this fix too, but it must come with its own evidence;
21
- * this pass stays conservative by construction).
18
+ * The non-space requirement is essential — space-only gaps ("Saint Paul" as two locality spans)
19
+ * are NOT bridged, because a space between two same-tag spans is often a real boundary (the
20
+ * Saint-Albans fragmentation wants this fix too, but it must come with its own evidence; this
21
+ * pass stays conservative by construction).
22
22
  *
23
23
  * Runs beside the postcode/unit repair passes in the classifier, before tree-building.
24
24
  */
@@ -10,9 +10,9 @@
10
10
  * delivery-service types. Which systems are loaded conditions the proposer's locale-dependent
11
11
  * readings (the AU/NZ `Flat 2/14` split exists only when those tables are present).
12
12
  *
13
- * No entry here is hand-invented (the no-load-bearing-trivia rule): every token/pattern derives
14
- * from a codex table row. AU `MS` (Mail Service) and the identifier-less counter types (CARE PO,
15
- * CMA, CPA, Counter Delivery, Poste Restante) are excluded from the mid-text SCAN regex — a bare
13
+ * No entry here is hand-invented (the provenance-first rule): every token/pattern derives from a
14
+ * codex table row. AU `MS` (Mail Service) and the identifier-less counter types (CARE PO, CMA,
15
+ * CPA, Counter Delivery, Poste Restante) are excluded from the mid-text SCAN regex — a bare
16
16
  * two-letter designator with no required number is exactly the false-positive shape ("Ms Smith")
17
17
  * the AU matcher special-cases; the scan keeps only number-carrying forms.
18
18
  */
@@ -10,9 +10,9 @@
10
10
  * delivery-service types. Which systems are loaded conditions the proposer's locale-dependent
11
11
  * readings (the AU/NZ `Flat 2/14` split exists only when those tables are present).
12
12
  *
13
- * No entry here is hand-invented (the no-load-bearing-trivia rule): every token/pattern derives
14
- * from a codex table row. AU `MS` (Mail Service) and the identifier-less counter types (CARE PO,
15
- * CMA, CPA, Counter Delivery, Poste Restante) are excluded from the mid-text SCAN regex — a bare
13
+ * No entry here is hand-invented (the provenance-first rule): every token/pattern derives from a
14
+ * codex table row. AU `MS` (Mail Service) and the identifier-less counter types (CARE PO, CMA,
15
+ * CPA, Counter Delivery, Poste Restante) are excluded from the mid-text SCAN regex — a bare
16
16
  * two-letter designator with no required number is exactly the false-positive shape ("Ms Smith")
17
17
  * the AU matcher special-cases; the scan keeps only number-carrying forms.
18
18
  */
@@ -13,9 +13,9 @@
13
13
  * - **Affix-token (the matched span):** toward `B/I-street_prefix` AND `B/I-street_suffix` (position
14
14
  * unknown — let the model + context disambiguate).
15
15
  * - **Adjacent token (one before AND one after each match):** toward `B/I-street`, AWAY from
16
- * `B/I-dependent_locality`. The negative bias on `dependent_locality` is the load-bearing
17
- * piece — it closes the inference-time vacuum that caused v0.6.1's 1066 dep_locality
18
- * hallucinations (see [[project-v061-failure-mechanism]]).
16
+ * `B/I-dependent_locality`. The negative bias on `dependent_locality` is the essential piece
17
+ * — it closes the inference-time vacuum that caused v0.6.1's 1066 dep_locality hallucinations
18
+ * (see [[project-v061-failure-mechanism]]).
19
19
  *
20
20
  * The morphology FST itself is built by `resolver-wof-sqlite/street-morphology-fst-builder.ts` and
21
21
  * ships as a separate binary (`fst-street-morphology.bin`) loaded into a second `FstMatcher`
@@ -40,7 +40,7 @@ export interface StreetMorphologyPriorOpts {
40
40
  maxNeighbourStreetBias?: number;
41
41
  /**
42
42
  * Magnitude of the negative bias applied to `dependent_locality` BIO labels on the adjacent
43
- * tokens. Default 2.0. This is the load-bearing piece.
43
+ * tokens. Default 2.0. This is the essential piece.
44
44
  */
45
45
  dependentLocalityPenalty?: number;
46
46
  }
@@ -13,9 +13,9 @@
13
13
  * - **Affix-token (the matched span):** toward `B/I-street_prefix` AND `B/I-street_suffix` (position
14
14
  * unknown — let the model + context disambiguate).
15
15
  * - **Adjacent token (one before AND one after each match):** toward `B/I-street`, AWAY from
16
- * `B/I-dependent_locality`. The negative bias on `dependent_locality` is the load-bearing
17
- * piece — it closes the inference-time vacuum that caused v0.6.1's 1066 dep_locality
18
- * hallucinations (see [[project-v061-failure-mechanism]]).
16
+ * `B/I-dependent_locality`. The negative bias on `dependent_locality` is the essential piece
17
+ * — it closes the inference-time vacuum that caused v0.6.1's 1066 dep_locality hallucinations
18
+ * (see [[project-v061-failure-mechanism]]).
19
19
  *
20
20
  * The morphology FST itself is built by `resolver-wof-sqlite/street-morphology-fst-builder.ts` and
21
21
  * ships as a separate binary (`fst-street-morphology.bin`) loaded into a second `FstMatcher`
@@ -38,7 +38,7 @@ const UNIT_DESIGNATORS = "APARTMENT|APT|SUITE|STE|UNIT|ROOM|RM|FLOOR|FLR|FL|BUIL
38
38
  const UNIT_PATTERNS = [
39
39
  // Designator + optional "#"/"No." + identifier, e.g. "Apt 4B", "Ste 12", "STE D",
40
40
  // "Unit 9400", "Suite 100", "Rm 5", "Flat 2", "Apartment #3", "Bldg C".
41
- // The `\b` after the designator is load-bearing: it stops "Unit" matching inside
41
+ // The `\b` after the designator is essential: it stops "Unit" matching inside
42
42
  // "United", "Fl" inside "Florida", etc. The trailing `\b` on the identifier stops
43
43
  // "Apt Main" capturing the "M" of "Main" (single-letter ident only fires on a
44
44
  // standalone token like "STE D").
@@ -1 +1 @@
1
- {"version":3,"file":"unit-repair.js","sourceRoot":"","sources":["../unit-repair.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unit-repair.js","sourceRoot":"","sources":["../unit-repair.ts"],"names":[],"mappings":"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"}
package/out/weights.d.ts CHANGED
@@ -36,6 +36,12 @@ export interface ResolveWeightsOpts {
36
36
  * checkpoint via explicit paths.
37
37
  */
38
38
  modelCardPath?: string;
39
+ /**
40
+ * Serving tier (#718 D1). `"server"` (default) = anchor + gazetteer channels; `"pocket"` =
41
+ * anchor-only (skip the gazetteer lexicon even when shipped). Selects which soft-feature sibling
42
+ * artifacts {@link resolveWeights} surfaces — the loader feeds only the resolved channels.
43
+ */
44
+ tier?: "server" | "pocket";
39
45
  }
40
46
  export interface ResolvedWeights {
41
47
  modelPath: string;
@@ -52,6 +58,26 @@ export interface ResolvedWeights {
52
58
  * exist (pre-v0.6.0 bundles or CE-only training).
53
59
  */
54
60
  crfTransitionsPath?: string;
61
+ /**
62
+ * Path to the postcode→anchor source shipped beside the resolved model (#718 D1) — the soft-feed
63
+ * `loadFromWeights` reads to feed the anchor channel without a callsite change. Prefer the
64
+ * compact PCB1 binary (`postcode-<cc>.bin`, decoded via
65
+ * `PostcodeBinaryResolver.toAnchorLookup()`), else a JSON anchor lookup (`anchor-lookup.json`,
66
+ * parsed via `parseAnchorLookup`). `undefined` when the package ships neither (a plain/pre-#718
67
+ * bundle) — the loader then runs anchor-OFF. The `binary` flag tells the loader which parser to
68
+ * use.
69
+ */
70
+ anchorLookupPath?: {
71
+ path: string;
72
+ binary: boolean;
73
+ };
74
+ /**
75
+ * Path to the gazetteer-anchor lexicon (`anchor-lexicon-v1.json`, #464) shipped beside the
76
+ * resolved model. `undefined` when the package doesn't ship it, OR when `opts.tier === "pocket"`
77
+ * (pocket is anchor-only — the gazetteer channel is deliberately skipped). Read by the
78
+ * `loadFromWeights` soft-feed via `parseGazetteerLexicon`.
79
+ */
80
+ gazetteerLexiconPath?: string;
55
81
  /** "explicit" if both paths came from opts; "package:<name>" if resolved via require.resolve. */
56
82
  source: string;
57
83
  }
@@ -68,6 +94,89 @@ export declare function resolveWeights(opts: ResolveWeightsOpts): ResolvedWeight
68
94
  * and should be loud, not silently re-defaulted.
69
95
  */
70
96
  export declare function readLabelsFromModelCard(modelCardPath: string | undefined): readonly string[] | undefined;
97
+ /**
98
+ * The structured `requires` block of a `model-card.json` (#718) — the declared SHIP-CONFIG the
99
+ * model was trained against. The ProductionScorer reads this and FAILS CLOSED when a declared
100
+ * channel isn't actually fed (silent OOD is the #566/#685 trap). Each channel is optional; a
101
+ * missing channel means "not declared" (treated as not-required).
102
+ */
103
+ export interface RequiredChannels {
104
+ /** Postcode-anchor channel (#239/#240). */
105
+ anchor?: {
106
+ required: boolean;
107
+ };
108
+ /** Gazetteer-anchor channel (#464). */
109
+ gazetteer?: {
110
+ required: boolean;
111
+ };
112
+ /** Address-system conventions (#511 Tier A). `mode` mirrors `ParseOpts.addressSystemConventions`. */
113
+ conventions?: {
114
+ required: boolean;
115
+ mode?: "auto" | string;
116
+ };
117
+ /** Punctuation-gap span bridge (v4.4.0 corrective). */
118
+ bridge?: {
119
+ required: boolean;
120
+ };
121
+ /** Near-postcode gazetteer choreography (#464, v0.9.13). */
122
+ suppress_gazetteer_near_postcode?: boolean;
123
+ }
124
+ /**
125
+ * Read the structured `requires` block from a `model-card.json` (#718). DEFENSIVE: returns
126
+ * `undefined` when the card is absent, unreadable, or has no `requires` field (callers then INFER
127
+ * the required channels from the ONNX graph — see `inferRequiredChannelsFromInputs`). Throws ONLY
128
+ * when the field is PRESENT but corrupt (not an object, or a channel entry with a non-boolean
129
+ * `required`) — a malformed declared contract is a loud artifact bug, not a silent re-default.
130
+ */
131
+ export declare function readRequiredChannels(modelCardPath: string | undefined): RequiredChannels | undefined;
132
+ /**
133
+ * Back-compat inference of the required soft-feature channels from an ONNX model's declared input
134
+ * names (#718). A model that exports `anchor_features` / `gazetteer_features` declared those
135
+ * channels mandatory at train time — feeding zeros is the channel-off identity, but a model TRAINED
136
+ * with the channel is OOD when scored without it. Cards without a `requires` block (every pre-#718
137
+ * bundle) route through here so the fail-closed guard still protects them. Conventions/bridge are
138
+ * NOT graph-observable (no dedicated input), so they're left undeclared here — only the card
139
+ * declares them.
140
+ */
141
+ export declare function inferRequiredChannelsFromInputs(inputNames: readonly string[]): RequiredChannels;
142
+ /**
143
+ * One tag's certified capability under a (tier × address-system) cell of the capability manifest
144
+ * (#718/#719). `maskOffF1` is the model's measured per-tag exact-match F1 with the conventions mask
145
+ * OFF; `maskOnF1` is the same with the mask ON — recorded ONLY for tags some codex `forbiddenTags`
146
+ * row suppresses, because that's the only place the loader's delta-gate consults it.
147
+ */
148
+ export interface TagCapability {
149
+ /** Measured per-tag F1 (percent) with the conventions mask OFF — the model's real capability. */
150
+ maskOffF1: number;
151
+ /** Measured per-tag F1 (percent) with the mask ON. Present only for codex-forbidden tags. */
152
+ maskOnF1?: number;
153
+ }
154
+ /**
155
+ * The `capabilities` block of a `model-card.json` (#718/#719): per serving TIER (`server` =
156
+ * anchor+gazetteer; `pocket` = anchor-only) × per codex address-system × per tag, the model's
157
+ * certified per-tag capability. The `createScorer` loader reads this to FAIL CLOSED when a
158
+ * conventions mask would forbid a tag the model is certified to emit — the structural fix that
159
+ * makes the D2/#719 bug-class (a mask destroying a demonstrated capability) impossible.
160
+ *
161
+ * Shape: `capabilities[tier][system][tag] = { maskOffF1, maskOnF1? }`. A `$comment` provenance key
162
+ * may sit alongside the tier keys and is ignored by readers.
163
+ */
164
+ export type CapabilityManifest = Record<string, Record<string, Record<string, TagCapability>>>;
165
+ /**
166
+ * Read the `capabilities` block from a `model-card.json` (#718/#719). DEFENSIVE, mirroring
167
+ * `readRequiredChannels`: returns `undefined` when the card is absent, unreadable, or has no
168
+ * `capabilities` field (a pre-#718 card → the loader's delta-gate is skipped, back-compat). Throws
169
+ * ONLY when the field is PRESENT but not an object — a corrupt declared contract is a loud artifact
170
+ * bug, not a silent skip. Tier/system/tag sub-shapes are read leniently (a malformed cell simply
171
+ * yields no capability claim — `undefined` from `lookupTagCapability`).
172
+ */
173
+ export declare function readCapabilityManifest(modelCardPath: string | undefined): CapabilityManifest | undefined;
174
+ /**
175
+ * Resolve `capabilities[tier][system][tag]` to a `TagCapability`, returning `undefined` for any
176
+ * missing/malformed cell (a tag the model is NOT certified for — the loader treats that as legal:
177
+ * the model can't emit it, so a mask can't destroy it). Skips the `$comment` provenance key.
178
+ */
179
+ export declare function lookupTagCapability(manifest: CapabilityManifest | undefined, tier: string, system: string, tag: string): TagCapability | undefined;
71
180
  export interface CrfTransitions {
72
181
  transitions: number[][];
73
182
  startTransitions: number[];
@@ -1 +1 @@
1
- {"version":3,"file":"weights.d.ts","sourceRoot":"","sources":["../weights.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAQH,MAAM,WAAW,kBAAkB;IAClC,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,eAAe,CAkDxE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAwBxG;AAED,MAAM,WAAW,cAAc;IAC9B,WAAW,EAAE,MAAM,EAAE,EAAE,CAAA;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAA;CACxB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CA0B1F"}
1
+ {"version":3,"file":"weights.d.ts","sourceRoot":"","sources":["../weights.ts"],"names":[],"mappings":"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"}
package/out/weights.js CHANGED
@@ -66,7 +66,42 @@ export function resolveWeights(opts) {
66
66
  const modelCardPath = existsSync(modelCardCandidate) ? modelCardCandidate : undefined;
67
67
  const crfCandidate = resolve(packageDir, "crf-transitions.json");
68
68
  const crfTransitionsPath = existsSync(crfCandidate) ? crfCandidate : undefined;
69
- return { modelPath, tokenizerPath, modelCardPath, crfTransitionsPath, source: `package:${packageName}` };
69
+ // Soft-feature sibling artifacts (#718 D1): the anchor + gazetteer sources the package ships so
70
+ // `loadFromWeights` can feed the channels the model was trained against — without a callsite
71
+ // change. Resolved package-dir-relative via the same `existsSync → undefined` pattern as the CRF
72
+ // transitions above. The locale tag's region subtag (`en-us` → `us`) names the PCB1 binary.
73
+ const country = locale.split("-")[1] ?? "";
74
+ const anchorLookupPath = resolveAnchorLookupSibling(packageDir, country);
75
+ // Tier `"pocket"` is anchor-only — never surface the gazetteer lexicon (the loader then skips it).
76
+ const gazetteerCandidate = resolve(packageDir, "anchor-lexicon-v1.json");
77
+ const gazetteerLexiconPath = opts.tier === "pocket" ? undefined : existsSync(gazetteerCandidate) ? gazetteerCandidate : undefined;
78
+ return {
79
+ modelPath,
80
+ tokenizerPath,
81
+ modelCardPath,
82
+ crfTransitionsPath,
83
+ ...(anchorLookupPath ? { anchorLookupPath } : {}),
84
+ ...(gazetteerLexiconPath ? { gazetteerLexiconPath } : {}),
85
+ source: `package:${packageName}`,
86
+ };
87
+ }
88
+ /**
89
+ * Locate the package's postcode→anchor source for the soft-feed (#718 D1), preferring the compact
90
+ * PCB1 binary (`postcode-<cc>.bin`, ~0.66 MB) over the much larger JSON lookup
91
+ * (`anchor-lookup.json`, the 3.2 MB pilot dump). Returns the path + a `binary` flag so the loader
92
+ * picks the right parser (`PostcodeBinaryResolver.toAnchorLookup()` vs `parseAnchorLookup`).
93
+ * `undefined` when neither ships.
94
+ */
95
+ function resolveAnchorLookupSibling(packageDir, country) {
96
+ if (country) {
97
+ const binary = resolve(packageDir, `postcode-${country}.bin`);
98
+ if (existsSync(binary))
99
+ return { path: binary, binary: true };
100
+ }
101
+ const json = resolve(packageDir, "anchor-lookup.json");
102
+ if (existsSync(json))
103
+ return { path: json, binary: false };
104
+ return undefined;
70
105
  }
71
106
  /**
72
107
  * Read the `labels` array from a `model-card.json` file. Returns `undefined` when the file is
@@ -107,6 +142,127 @@ export function readLabelsFromModelCard(modelCardPath) {
107
142
  }
108
143
  return Object.freeze(labels.slice());
109
144
  }
145
+ /**
146
+ * Read the structured `requires` block from a `model-card.json` (#718). DEFENSIVE: returns
147
+ * `undefined` when the card is absent, unreadable, or has no `requires` field (callers then INFER
148
+ * the required channels from the ONNX graph — see `inferRequiredChannelsFromInputs`). Throws ONLY
149
+ * when the field is PRESENT but corrupt (not an object, or a channel entry with a non-boolean
150
+ * `required`) — a malformed declared contract is a loud artifact bug, not a silent re-default.
151
+ */
152
+ export function readRequiredChannels(modelCardPath) {
153
+ if (!modelCardPath || !existsSync(modelCardPath))
154
+ return undefined;
155
+ let raw;
156
+ try {
157
+ raw = readFileSync(modelCardPath, "utf8");
158
+ }
159
+ catch {
160
+ return undefined;
161
+ }
162
+ let parsed;
163
+ try {
164
+ parsed = JSON.parse(raw);
165
+ }
166
+ catch {
167
+ return undefined;
168
+ }
169
+ if (typeof parsed !== "object" || parsed === null)
170
+ return undefined;
171
+ const requires = parsed.requires;
172
+ if (requires === undefined)
173
+ return undefined;
174
+ if (typeof requires !== "object" || requires === null || Array.isArray(requires)) {
175
+ throw new Error(`model-card.json at ${modelCardPath} has a malformed \`requires\` field — ` +
176
+ `expected an object, got ${JSON.stringify(requires)}.`);
177
+ }
178
+ const obj = requires;
179
+ // Channel entries must be `{ required: boolean, ... }`; a present-but-shapeless entry is corrupt.
180
+ for (const channel of ["anchor", "gazetteer", "conventions", "bridge"]) {
181
+ const entry = obj[channel];
182
+ if (entry === undefined)
183
+ continue;
184
+ if (typeof entry !== "object" ||
185
+ entry === null ||
186
+ typeof entry.required !== "boolean") {
187
+ throw new Error(`model-card.json at ${modelCardPath} has a malformed \`requires.${channel}\` entry — ` +
188
+ `expected { required: boolean }, got ${JSON.stringify(entry)}.`);
189
+ }
190
+ }
191
+ if (obj.suppress_gazetteer_near_postcode !== undefined && typeof obj.suppress_gazetteer_near_postcode !== "boolean") {
192
+ throw new Error(`model-card.json at ${modelCardPath} has a malformed \`requires.suppress_gazetteer_near_postcode\` ` +
193
+ `field — expected a boolean, got ${JSON.stringify(obj.suppress_gazetteer_near_postcode)}.`);
194
+ }
195
+ return requires;
196
+ }
197
+ /**
198
+ * Back-compat inference of the required soft-feature channels from an ONNX model's declared input
199
+ * names (#718). A model that exports `anchor_features` / `gazetteer_features` declared those
200
+ * channels mandatory at train time — feeding zeros is the channel-off identity, but a model TRAINED
201
+ * with the channel is OOD when scored without it. Cards without a `requires` block (every pre-#718
202
+ * bundle) route through here so the fail-closed guard still protects them. Conventions/bridge are
203
+ * NOT graph-observable (no dedicated input), so they're left undeclared here — only the card
204
+ * declares them.
205
+ */
206
+ export function inferRequiredChannelsFromInputs(inputNames) {
207
+ const names = new Set(inputNames);
208
+ return {
209
+ ...(names.has("anchor_features") ? { anchor: { required: true } } : {}),
210
+ ...(names.has("gazetteer_features") ? { gazetteer: { required: true } } : {}),
211
+ };
212
+ }
213
+ /**
214
+ * Read the `capabilities` block from a `model-card.json` (#718/#719). DEFENSIVE, mirroring
215
+ * `readRequiredChannels`: returns `undefined` when the card is absent, unreadable, or has no
216
+ * `capabilities` field (a pre-#718 card → the loader's delta-gate is skipped, back-compat). Throws
217
+ * ONLY when the field is PRESENT but not an object — a corrupt declared contract is a loud artifact
218
+ * bug, not a silent skip. Tier/system/tag sub-shapes are read leniently (a malformed cell simply
219
+ * yields no capability claim — `undefined` from `lookupTagCapability`).
220
+ */
221
+ export function readCapabilityManifest(modelCardPath) {
222
+ if (!modelCardPath || !existsSync(modelCardPath))
223
+ return undefined;
224
+ let raw;
225
+ try {
226
+ raw = readFileSync(modelCardPath, "utf8");
227
+ }
228
+ catch {
229
+ return undefined;
230
+ }
231
+ let parsed;
232
+ try {
233
+ parsed = JSON.parse(raw);
234
+ }
235
+ catch {
236
+ return undefined;
237
+ }
238
+ if (typeof parsed !== "object" || parsed === null)
239
+ return undefined;
240
+ const capabilities = parsed.capabilities;
241
+ if (capabilities === undefined)
242
+ return undefined;
243
+ if (typeof capabilities !== "object" || capabilities === null || Array.isArray(capabilities)) {
244
+ throw new Error(`model-card.json at ${modelCardPath} has a malformed \`capabilities\` field — ` +
245
+ `expected an object, got ${JSON.stringify(capabilities)}.`);
246
+ }
247
+ return capabilities;
248
+ }
249
+ /**
250
+ * Resolve `capabilities[tier][system][tag]` to a `TagCapability`, returning `undefined` for any
251
+ * missing/malformed cell (a tag the model is NOT certified for — the loader treats that as legal:
252
+ * the model can't emit it, so a mask can't destroy it). Skips the `$comment` provenance key.
253
+ */
254
+ export function lookupTagCapability(manifest, tier, system, tag) {
255
+ const tierCell = manifest?.[tier];
256
+ if (!tierCell || typeof tierCell !== "object")
257
+ return undefined;
258
+ const systemCell = tierCell[system];
259
+ if (!systemCell || typeof systemCell !== "object")
260
+ return undefined;
261
+ const cap = systemCell[tag];
262
+ if (!cap || typeof cap !== "object" || typeof cap.maskOffF1 !== "number")
263
+ return undefined;
264
+ return cap;
265
+ }
110
266
  /**
111
267
  * Read learned CRF transition parameters from `crf-transitions.json`. Returns `undefined` when the
112
268
  * file is missing or malformed — callers fall back to the structural BIO mask only.
@@ -1 +1 @@
1
- {"version":3,"file":"weights.js","sourceRoot":"","sources":["../weights.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"weights.js","sourceRoot":"","sources":["../weights.ts"],"names":[],"mappings":"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"}