@mailwoman/resolver-wof-sqlite 8.0.0 → 8.1.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 (38) hide show
  1. package/candidate-lookup.ts +13 -1
  2. package/coverage-manifest-schema.ts +210 -0
  3. package/fst-builder.ts +39 -7
  4. package/fst-types.ts +20 -0
  5. package/index.ts +9 -0
  6. package/interpolation.ts +26 -0
  7. package/out/candidate-lookup.d.ts +7 -0
  8. package/out/candidate-lookup.d.ts.map +1 -1
  9. package/out/candidate-lookup.js +11 -0
  10. package/out/candidate-lookup.js.map +1 -1
  11. package/out/coverage-manifest-schema.d.ts +81 -0
  12. package/out/coverage-manifest-schema.d.ts.map +1 -0
  13. package/out/coverage-manifest-schema.js +145 -0
  14. package/out/coverage-manifest-schema.js.map +1 -0
  15. package/out/fst-builder.d.ts.map +1 -1
  16. package/out/fst-builder.js +29 -6
  17. package/out/fst-builder.js.map +1 -1
  18. package/out/fst-types.d.ts +20 -0
  19. package/out/fst-types.d.ts.map +1 -1
  20. package/out/index.d.ts +2 -0
  21. package/out/index.d.ts.map +1 -1
  22. package/out/index.js +1 -0
  23. package/out/index.js.map +1 -1
  24. package/out/interpolation.d.ts +6 -0
  25. package/out/interpolation.d.ts.map +1 -1
  26. package/out/interpolation.js +21 -0
  27. package/out/interpolation.js.map +1 -1
  28. package/out/street-morphology-fst-loader.d.ts +51 -0
  29. package/out/street-morphology-fst-loader.d.ts.map +1 -0
  30. package/out/street-morphology-fst-loader.js +53 -0
  31. package/out/street-morphology-fst-loader.js.map +1 -0
  32. package/out/street-segment-schema.d.ts +23 -0
  33. package/out/street-segment-schema.d.ts.map +1 -1
  34. package/out/street-segment-schema.js +15 -0
  35. package/out/street-segment-schema.js.map +1 -1
  36. package/package.json +13 -5
  37. package/street-morphology-fst-loader.ts +87 -0
  38. package/street-segment-schema.ts +36 -0
@@ -25,10 +25,11 @@
25
25
 
26
26
  import { DatabaseSync } from "node:sqlite"
27
27
 
28
- import { expandPlacetypeFilter } from "@mailwoman/resolver"
28
+ import { expandPlacetypeFilter, type GazetteerArtifactCoverage } from "@mailwoman/resolver"
29
29
 
30
30
  import { CANDIDATE_FTS_TABLE } from "./candidate-fts.ts"
31
31
  import type { CandidateTable, CountryCodeTable, PlacetypeCodeTable } from "./candidate-schema.ts"
32
+ import { readGazetteerCoverageManifest } from "./coverage-manifest-schema.ts"
32
33
  import { haversineKm } from "./geo.ts"
33
34
  import { trigramJaccard } from "./lookup.ts"
34
35
  import { POSTAL_CITY_CANDIDATE_TABLE, type PostalCityCandidateTable } from "./postal-city-candidate-schema.ts"
@@ -212,6 +213,12 @@ export class WOFCandidateTableLookup implements PlaceLookup {
212
213
  * country-agnostic retry. Prepared only alongside `#ftsProbe`.
213
214
  */
214
215
  readonly #nameKeyExistsProbe: ReturnType<DatabaseSync["prepare"]> | undefined
216
+ /**
217
+ * Facts this candidate DB declares about itself — the coverage manifest (`country_coverage` + `country_bbox`) the
218
+ * gazetteer build emits, read once at open. `undefined` when the artifact predates the manifest, so every consumer
219
+ * (the hard-country coverage gate, guard-B plausibility) falls back to its code constants byte-identically.
220
+ */
221
+ readonly artifactCoverage: GazetteerArtifactCoverage | undefined
215
222
 
216
223
  constructor(opts: WOFCandidateTableLookupOpts) {
217
224
  if (opts.database) {
@@ -255,6 +262,11 @@ export class WOFCandidateTableLookup implements PlaceLookup {
255
262
  )
256
263
  this.#nameKeyExistsProbe = this.#db.prepare("SELECT 1 FROM candidate WHERE name_key = ? LIMIT 1")
257
264
  }
265
+
266
+ // Coverage manifest (survey candidate #2): the artifact's own coverage facts, existence-gated like
267
+ // the probes above — a candidate.db built before the manifest reads `undefined` and consumers keep
268
+ // their code-constant fallbacks byte-identically.
269
+ this.artifactCoverage = readGazetteerCoverageManifest(this.#db)
258
270
  }
259
271
 
260
272
  /** Does this query want a locality-tier place? Postal-city aliases (#741) are all localities. */
@@ -0,0 +1,210 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * Typed schema + read/write helpers for the candidate gazetteer's COVERAGE MANIFEST — the two
7
+ * country-keyed tables through which the artifact declares facts about ITSELF, so those facts are
8
+ * updated at gazetteer REBUILD, not by a hand-edited code PR after someone remembers:
9
+ *
10
+ * - `country_coverage`: the hard-country-filter coverage record (#743/#194) — per-country
11
+ * promote-gate verdicts + the measured hard-resolve rates that used to live in a code comment on
12
+ * `HARD_PLACE_COUNTRY_SAFELIST`. Presence = measured; `hard_filter_safe = 0` = measured and
13
+ * FAILED the gate (FI 69.5%, PL 77.8%) — distinguishable from a country never measured at all
14
+ * (the meaning-of-zero rule, `docs/articles/plan/reference/layer-contract.mdx`).
15
+ * - `country_bbox`: the coarse guard-B plausibility boxes that used to live in
16
+ * `resolver/plausibility.ts`'s `COUNTRY_BBOX`. An absent row fails open (never trips the guard),
17
+ * exactly like an absent key in the constant.
18
+ *
19
+ * Emission happens at build time (`mailwoman/gazetteer-pipeline/coverage-manifest.ts` owns the
20
+ * measured record and calls {@link writeGazetteerCoverageManifest} before the DB is sealed — never
21
+ * patch a shipped DB, rebuild). The read happens at open time ({@link WOFCandidateTableLookup}
22
+ * calls {@link readGazetteerCoverageManifest} in its constructor); an artifact that predates the
23
+ * manifest returns `undefined` and every consumer falls back to the code constants byte-identically.
24
+ */
25
+
26
+ import type { DatabaseSync } from "node:sqlite"
27
+
28
+ import {
29
+ hardCountrySafelistFromCoverage,
30
+ type CountryBBoxFact,
31
+ type CountryCoverageFact,
32
+ type GazetteerArtifactCoverage,
33
+ } from "@mailwoman/core/resolver"
34
+ import { sql, type Kysely } from "kysely"
35
+
36
+ import { hasTable } from "./sqlite-utils.ts"
37
+
38
+ /** One country's hard-filter coverage measurement — the storage form of {@link CountryCoverageFact}. */
39
+ export interface CountryCoverageTable {
40
+ /** ISO 3166-1 alpha-2, uppercase (PK). */
41
+ country: string
42
+ /** 0/1 — the promote-gate verdict (a verdict column, NOT re-derived from the rate; see the fact type's docstring). */
43
+ hard_filter_safe: number
44
+ /** Measured hard-resolve rate 0..1 on the panel named in `source`; NULL when the receipt recorded none. */
45
+ hard_resolve_rate: number | null
46
+ /** Panel size behind `hard_resolve_rate`; NULL when unrecorded. */
47
+ sample_size: number | null
48
+ /** ISO-8601 date of the measurement / promote gate. */
49
+ measured_at: string
50
+ /** The receipt: which panel/gate produced this row. */
51
+ source: string
52
+ }
53
+
54
+ /** One country's coarse guard-B bounding box — the storage form of {@link CountryBBoxFact}. */
55
+ export interface CountryBBoxTable {
56
+ /** ISO 3166-1 alpha-2, uppercase (PK). */
57
+ country: string
58
+ lat_min: number
59
+ lat_max: number
60
+ lon_min: number
61
+ lon_max: number
62
+ /** Provenance of the box (harness + date). */
63
+ source: string
64
+ }
65
+
66
+ /** The coverage-manifest schema for `new DatabaseClient<GazetteerCoverageDatabase>(...)`. */
67
+ export interface GazetteerCoverageDatabase {
68
+ country_coverage: CountryCoverageTable
69
+ country_bbox: CountryBBoxTable
70
+ }
71
+
72
+ /** Table names the lookup probes (existence-gated, so a candidate.db built before the manifest is byte-stable). */
73
+ export const COUNTRY_COVERAGE_TABLE = "country_coverage"
74
+ export const COUNTRY_BBOX_TABLE = "country_bbox"
75
+
76
+ /** Create `country_coverage` — a handful of small PK-probed rows, the WITHOUT ROWID sweet spot. */
77
+ export async function createCountryCoverageTable(db: Kysely<GazetteerCoverageDatabase>): Promise<void> {
78
+ await db.schema
79
+ .createTable(COUNTRY_COVERAGE_TABLE)
80
+ .ifNotExists()
81
+ .addColumn("country", "text", (c) => c.primaryKey())
82
+ .addColumn("hard_filter_safe", "integer", (c) => c.notNull())
83
+ .addColumn("hard_resolve_rate", "real")
84
+ .addColumn("sample_size", "integer")
85
+ .addColumn("measured_at", "text", (c) => c.notNull())
86
+ .addColumn("source", "text", (c) => c.notNull())
87
+ // `WITHOUT ROWID` has no first-class builder; the raw modifier is the idiomatic fallback.
88
+ .modifyEnd(sql`without rowid`)
89
+ .execute()
90
+ }
91
+
92
+ /** Create `country_bbox` — same shape discipline as {@link createCountryCoverageTable}. */
93
+ export async function createCountryBBoxTable(db: Kysely<GazetteerCoverageDatabase>): Promise<void> {
94
+ await db.schema
95
+ .createTable(COUNTRY_BBOX_TABLE)
96
+ .ifNotExists()
97
+ .addColumn("country", "text", (c) => c.primaryKey())
98
+ .addColumn("lat_min", "real", (c) => c.notNull())
99
+ .addColumn("lat_max", "real", (c) => c.notNull())
100
+ .addColumn("lon_min", "real", (c) => c.notNull())
101
+ .addColumn("lon_max", "real", (c) => c.notNull())
102
+ .addColumn("source", "text", (c) => c.notNull())
103
+ .modifyEnd(sql`without rowid`)
104
+ .execute()
105
+ }
106
+
107
+ /**
108
+ * Write the coverage manifest into a candidate DB UNDER CONSTRUCTION (pre-seal — a shipped DB is never patched, rebuild
109
+ * instead). Creates both tables and inserts the facts; call exactly once, from the gazetteer build.
110
+ */
111
+ export async function writeGazetteerCoverageManifest(
112
+ db: Kysely<GazetteerCoverageDatabase>,
113
+ facts: { coverage: readonly CountryCoverageFact[]; bboxes: readonly CountryBBoxFact[] }
114
+ ): Promise<void> {
115
+ await createCountryCoverageTable(db)
116
+ await createCountryBBoxTable(db)
117
+
118
+ if (facts.coverage.length > 0) {
119
+ await db
120
+ .insertInto(COUNTRY_COVERAGE_TABLE)
121
+ .values(
122
+ facts.coverage.map((f) => ({
123
+ country: f.country.toUpperCase(),
124
+ hard_filter_safe: f.hardFilterSafe ? 1 : 0,
125
+ hard_resolve_rate: f.hardResolveRate ?? null,
126
+ sample_size: f.sampleSize ?? null,
127
+ measured_at: f.measuredAt,
128
+ source: f.source,
129
+ }))
130
+ )
131
+ .execute()
132
+ }
133
+
134
+ if (facts.bboxes.length > 0) {
135
+ await db
136
+ .insertInto(COUNTRY_BBOX_TABLE)
137
+ .values(
138
+ facts.bboxes.map((f) => ({
139
+ country: f.country.toUpperCase(),
140
+ lat_min: f.latMin,
141
+ lat_max: f.latMax,
142
+ lon_min: f.lonMin,
143
+ lon_max: f.lonMax,
144
+ source: f.source,
145
+ }))
146
+ )
147
+ .execute()
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Read the coverage manifest from an OPEN candidate DB, or `undefined` when the artifact predates it (neither table
153
+ * present) — the signal for consumers to fall back to the code constants byte-identically. Synchronous raw reads on
154
+ * purpose: this runs inside {@link WOFCandidateTableLookup}'s synchronous constructor (the sync-reader carve-out in
155
+ * `AGENTS.md`), and the tables are a few dozen rows read once per open.
156
+ */
157
+ export function readGazetteerCoverageManifest(db: DatabaseSync): GazetteerArtifactCoverage | undefined {
158
+ const hasCoverage = hasTable(db, COUNTRY_COVERAGE_TABLE)
159
+ const hasBBox = hasTable(db, COUNTRY_BBOX_TABLE)
160
+
161
+ if (!hasCoverage && !hasBBox) return undefined
162
+
163
+ const countryCoverage = new Map<string, CountryCoverageFact>()
164
+
165
+ if (hasCoverage) {
166
+ const rows = db
167
+ .prepare(
168
+ `SELECT country, hard_filter_safe, hard_resolve_rate, sample_size, measured_at, source FROM ${COUNTRY_COVERAGE_TABLE}`
169
+ )
170
+ .all() as unknown as CountryCoverageTable[]
171
+
172
+ for (const row of rows) {
173
+ const country = String(row.country).toUpperCase()
174
+ countryCoverage.set(country, {
175
+ country,
176
+ hardFilterSafe: Number(row.hard_filter_safe) !== 0,
177
+ ...(row.hard_resolve_rate === null ? {} : { hardResolveRate: Number(row.hard_resolve_rate) }),
178
+ ...(row.sample_size === null ? {} : { sampleSize: Number(row.sample_size) }),
179
+ measuredAt: String(row.measured_at),
180
+ source: String(row.source),
181
+ })
182
+ }
183
+ }
184
+
185
+ const countryBBoxes = new Map<string, CountryBBoxFact>()
186
+
187
+ if (hasBBox) {
188
+ const rows = db
189
+ .prepare(`SELECT country, lat_min, lat_max, lon_min, lon_max, source FROM ${COUNTRY_BBOX_TABLE}`)
190
+ .all() as unknown as CountryBBoxTable[]
191
+
192
+ for (const row of rows) {
193
+ const country = String(row.country).toUpperCase()
194
+ countryBBoxes.set(country, {
195
+ country,
196
+ latMin: Number(row.lat_min),
197
+ latMax: Number(row.lat_max),
198
+ lonMin: Number(row.lon_min),
199
+ lonMax: Number(row.lon_max),
200
+ source: String(row.source),
201
+ })
202
+ }
203
+ }
204
+
205
+ return {
206
+ countryCoverage,
207
+ countryBBoxes,
208
+ hardCountrySafelist: hardCountrySafelistFromCoverage(countryCoverage.values()),
209
+ }
210
+ }
package/fst-builder.ts CHANGED
@@ -206,8 +206,30 @@ export function buildFSTFromWOF(opts: BuildFSTOpts): {
206
206
  progress("trie", "Building trie")
207
207
  const nodes: FSTNode[] = [{ edges: new Map(), places: [] }]
208
208
 
209
- function insertName(tokens: string[], entry: PlaceEntry): void {
210
- if (tokens.length === 0) return
209
+ // Degenerate-surface curation (see BuildFSTOpts.excludeSurfaces). Applied to the WHOLE normalized
210
+ // surface only — a multi-token name containing a function word ("los angeles") is never affected.
211
+ const excludeSurfaces = opts.excludeSurfaces
212
+ const excludeAllTokensOf = opts.excludeAllTokensOf
213
+ let excludedCount = 0
214
+
215
+ function isDegenerate(tokens: string[]): boolean {
216
+ if (tokens.length === 0) return false
217
+
218
+ if (excludeSurfaces?.has(tokens.join(" "))) return true
219
+
220
+ if (excludeAllTokensOf !== undefined && tokens.every((t) => excludeAllTokensOf.has(t))) return true
221
+
222
+ return false
223
+ }
224
+
225
+ function insertName(tokens: string[], entry: PlaceEntry): boolean {
226
+ if (tokens.length === 0) return false
227
+
228
+ if (isDegenerate(tokens)) {
229
+ excludedCount++
230
+
231
+ return false
232
+ }
211
233
  let stateID = 0
212
234
 
213
235
  for (const t of tokens) {
@@ -227,6 +249,8 @@ export function buildFSTFromWOF(opts: BuildFSTOpts): {
227
249
  if (!existing.some((p) => p.wofID === entry.wofID && p.placetype === entry.placetype)) {
228
250
  existing.push(entry)
229
251
  }
252
+
253
+ return true
230
254
  }
231
255
 
232
256
  let insertCount = 0
@@ -245,8 +269,10 @@ export function buildFSTFromWOF(opts: BuildFSTOpts): {
245
269
 
246
270
  // Insert the primary name from spr.
247
271
  const primaryTokens = normalizeTokens(row.name)
248
- insertName(primaryTokens, entry)
249
- insertCount++
272
+
273
+ if (insertName(primaryTokens, entry)) {
274
+ insertCount++
275
+ }
250
276
 
251
277
  // Insert alt names from the names table.
252
278
  const altNames = namesByPlace.get(row.id) ?? []
@@ -255,15 +281,18 @@ export function buildFSTFromWOF(opts: BuildFSTOpts): {
255
281
  if (altName === row.name) continue
256
282
  const altTokens = normalizeTokens(altName)
257
283
 
258
- if (altTokens.length > 0 && altTokens.join(" ") !== primaryTokens.join(" ")) {
259
- insertName(altTokens, entry)
284
+ if (altTokens.length > 0 && altTokens.join(" ") !== primaryTokens.join(" ") && insertName(altTokens, entry)) {
260
285
  insertCount++
261
286
  }
262
287
  }
263
288
  }
264
289
 
265
290
  db.close()
266
- progress("done", `Built trie: ${nodes.length} states, ${insertCount} name insertions`)
291
+ progress(
292
+ "done",
293
+ `Built trie: ${nodes.length} states, ${insertCount} name insertions` +
294
+ (excludedCount > 0 ? ` (${excludedCount} degenerate surfaces excluded)` : "")
295
+ )
267
296
 
268
297
  const edgeCount = nodes.reduce((sum, n) => sum + n.edges.size, 0)
269
298
  const matcher = FSTMatcher.fromNodes(nodes)
@@ -276,6 +305,9 @@ export function buildFSTFromWOF(opts: BuildFSTOpts): {
276
305
  nameInsertions: insertCount,
277
306
  importanceMatches: importanceMap.size,
278
307
  sourceDB: opts.dbPath,
308
+ ...(excludeSurfaces !== undefined || excludeAllTokensOf !== undefined
309
+ ? { exclusionPolicy: opts.exclusionPolicy ?? "unspecified", excludedInsertions: excludedCount }
310
+ : {}),
279
311
  }
280
312
 
281
313
  return {
package/fst-types.ts CHANGED
@@ -60,6 +60,10 @@ export interface FSTProvenance {
60
60
  importanceMatches: number
61
61
  sourceDB?: string
62
62
  modelCardVersion?: string
63
+ /** Degenerate-surface curation policy applied at build time (absent = uncurated build). */
64
+ exclusionPolicy?: string
65
+ /** Name insertions refused by the curation policy. */
66
+ excludedInsertions?: number
63
67
  }
64
68
 
65
69
  export interface BuildFSTOpts {
@@ -67,6 +71,22 @@ export interface BuildFSTOpts {
67
71
  countries?: string[]
68
72
  placetypes?: PlacetypeID[]
69
73
  languages?: string[]
74
+ /**
75
+ * Degenerate-surface curation (build-time; the ASR-contextual-biasing "prune the bias list" discipline). A name whose
76
+ * FULL normalized token sequence joins to a member of this set is never inserted — the surface carries no
77
+ * discriminative value as a bias key (bare function words: "la"; bare street-type words: "boulevard"). The FST is a
78
+ * bias list, not the gazetteer of record — the resolver's candidate tables are untouched, so excluded places stay
79
+ * findable; they just stop nudging the decoder on degenerate keys. Keys must be `normalizeTokens(...).join(" ")`.
80
+ */
81
+ excludeSurfaces?: ReadonlySet<string>
82
+ /**
83
+ * Compositional clause of the same policy: refuse a name whose EVERY normalized token is a member (e.g. "de la") — a
84
+ * surface made entirely of function words cannot be discriminative. Source this from stopwords only, never
85
+ * street-type words ("Avenue Road" is a real name; "de la" is not).
86
+ */
87
+ excludeAllTokensOf?: ReadonlySet<string>
88
+ /** Recorded verbatim into provenance when either exclusion set is supplied. */
89
+ exclusionPolicy?: string
70
90
  onProgress?: (phase: string, detail?: string) => void
71
91
  }
72
92
 
package/index.ts CHANGED
@@ -23,6 +23,15 @@ export { WOFSqlitePlaceLookup, type RankingWeights, type WOFSqlitePlaceLookupOpt
23
23
 
24
24
  export { CANDIDATE_FTS_TABLE, createCandidateFTS } from "./candidate-fts.ts"
25
25
  export { WOFCandidateTableLookup, type WOFCandidateTableLookupOpts } from "./candidate-lookup.ts"
26
+ export {
27
+ COUNTRY_BBOX_TABLE,
28
+ COUNTRY_COVERAGE_TABLE,
29
+ createCountryBBoxTable,
30
+ createCountryCoverageTable,
31
+ readGazetteerCoverageManifest,
32
+ writeGazetteerCoverageManifest,
33
+ } from "./coverage-manifest-schema.ts"
34
+ export type { CountryBBoxTable, CountryCoverageTable, GazetteerCoverageDatabase } from "./coverage-manifest-schema.ts"
26
35
  export { SQLiteStreetNameLookup, type SQLiteStreetNameLookupOpts } from "./street-name-lookup.ts"
27
36
 
28
37
  export { GEONAMES_ID_BASE, ingestGeonamesAliases, type GeonamesIngestProgress } from "./geonames-aliases.ts"
package/interpolation.ts CHANGED
@@ -97,6 +97,7 @@ export class StreetInterpolator implements InterpolationLookup {
97
97
  readonly #ownsDB: boolean
98
98
  readonly #byPostcode: ReturnType<DatabaseSync["prepare"]> | undefined
99
99
  readonly #byStreet: ReturnType<DatabaseSync["prepare"]> | undefined
100
+ readonly #radiusCalibration: number | undefined
100
101
 
101
102
  constructor(opts: { dbPath?: string; database?: DatabaseSync }) {
102
103
  if (opts.database) {
@@ -122,6 +123,31 @@ export class StreetInterpolator implements InterpolationLookup {
122
123
  WHERE street_norm = ? AND min_hn <= ? AND max_hn >= ?`
123
124
  )
124
125
  }
126
+
127
+ // #374 doctrine: the conformal radius multiplier is a property of the calibration set the ARTIFACT was
128
+ // built against, so it ships in the shard's `interp_calibration` metadata table (street-segment-schema.ts)
129
+ // and is read here, once, at open time — sync raw `.prepare()` per the sync-by-interface doctrine
130
+ // (AGENTS.md). Shards predating the table (the pre-2026-07 fleet) yield `undefined`; callers then fall
131
+ // back to their in-code table, byte-identically.
132
+ if (hasTable(this.#db, "interp_calibration")) {
133
+ const row = this.#db.prepare("SELECT radius_multiplier FROM interp_calibration LIMIT 1").get() as
134
+ | { radius_multiplier: unknown }
135
+ | undefined
136
+ const value = row?.radius_multiplier
137
+
138
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
139
+ this.#radiusCalibration = value
140
+ }
141
+ }
142
+ }
143
+
144
+ /**
145
+ * The artifact's own conformal radius multiplier (#374), read from the shard's `interp_calibration` metadata table at
146
+ * construction. `undefined` = the shard predates the table (or carries no valid row) — the resolver then applies no
147
+ * artifact default and callers may supply a legacy fallback.
148
+ */
149
+ get radiusCalibration(): number | undefined {
150
+ return this.#radiusCalibration
125
151
  }
126
152
 
127
153
  find(query: InterpolationQuery): InterpolatedHit | null {
@@ -23,6 +23,7 @@
23
23
  * `bbox` field on {@link FindPlaceQuery}).
24
24
  */
25
25
  import { DatabaseSync } from "node:sqlite";
26
+ import { type GazetteerArtifactCoverage } from "@mailwoman/resolver";
26
27
  import type { CandidateTable } from "./candidate-schema.ts";
27
28
  import type { FindPlaceQuery, PlaceCandidate, PlaceLookup } from "./types.ts";
28
29
  export interface WOFCandidateTableLookupOpts {
@@ -68,6 +69,12 @@ export declare function rankByPrimaryPreference<R extends Pick<CandidateRow, "ne
68
69
  */
69
70
  export declare class WOFCandidateTableLookup implements PlaceLookup {
70
71
  #private;
72
+ /**
73
+ * Facts this candidate DB declares about itself — the coverage manifest (`country_coverage` + `country_bbox`) the
74
+ * gazetteer build emits, read once at open. `undefined` when the artifact predates the manifest, so every consumer
75
+ * (the hard-country coverage gate, guard-B plausibility) falls back to its code constants byte-identically.
76
+ */
77
+ readonly artifactCoverage: GazetteerArtifactCoverage | undefined;
71
78
  constructor(opts: WOFCandidateTableLookupOpts);
72
79
  findPlace(query: FindPlaceQuery): Promise<PlaceCandidate[]>;
73
80
  close(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"candidate-lookup.d.ts","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK1C,OAAO,KAAK,EAAE,cAAc,EAAwC,MAAM,uBAAuB,CAAA;AAMjG,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAA;AAE3F,MAAM,WAAW,2BAA2B;IAC3C,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,YAAY,CAAA;CACvB;AAED;;;GAGG;AACH,KAAK,YAAY,GAAG,IAAI,CACvB,cAAc,EACZ,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,cAAc,GACd,UAAU,GACV,WAAW,GACX,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,UAAU,GACV,YAAY,CACd,CAAA;AAwCD,wHAAwH;AACxH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;;;;;OAOG;IACH,OAAO,EAAE,OAAO,CAAA;CAChB,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC,EAC7G,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,SAA2B,GAC9B,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CA+BrB;AAqBD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,WAAW;;gBA0B9C,IAAI,EAAE,2BAA2B;IAoDvC,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAuQjE,KAAK,IAAI,IAAI;CAKb"}
1
+ {"version":3,"file":"candidate-lookup.d.ts","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAG3F,OAAO,KAAK,EAAE,cAAc,EAAwC,MAAM,uBAAuB,CAAA;AAOjG,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAA;AAE3F,MAAM,WAAW,2BAA2B;IAC3C,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,YAAY,CAAA;CACvB;AAED;;;GAGG;AACH,KAAK,YAAY,GAAG,IAAI,CACvB,cAAc,EACZ,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,cAAc,GACd,UAAU,GACV,WAAW,GACX,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,UAAU,GACV,YAAY,CACd,CAAA;AAwCD,wHAAwH;AACxH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;;;;;OAOG;IACH,OAAO,EAAE,OAAO,CAAA;CAChB,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC,EAC7G,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,SAA2B,GAC9B,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CA+BrB;AAqBD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,WAAW;;IAyB1D;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,GAAG,SAAS,CAAA;gBAEpD,IAAI,EAAE,2BAA2B;IAyDvC,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAuQjE,KAAK,IAAI,IAAI;CAKb"}
@@ -25,6 +25,7 @@
25
25
  import { DatabaseSync } from "node:sqlite";
26
26
  import { expandPlacetypeFilter } from "@mailwoman/resolver";
27
27
  import { CANDIDATE_FTS_TABLE } from "./candidate-fts.js";
28
+ import { readGazetteerCoverageManifest } from "./coverage-manifest-schema.js";
28
29
  import { haversineKm } from "./geo.js";
29
30
  import { trigramJaccard } from "./lookup.js";
30
31
  import { POSTAL_CITY_CANDIDATE_TABLE } from "./postal-city-candidate-schema.js";
@@ -141,6 +142,12 @@ export class WOFCandidateTableLookup {
141
142
  * country-agnostic retry. Prepared only alongside `#ftsProbe`.
142
143
  */
143
144
  #nameKeyExistsProbe;
145
+ /**
146
+ * Facts this candidate DB declares about itself — the coverage manifest (`country_coverage` + `country_bbox`) the
147
+ * gazetteer build emits, read once at open. `undefined` when the artifact predates the manifest, so every consumer
148
+ * (the hard-country coverage gate, guard-B plausibility) falls back to its code constants byte-identically.
149
+ */
150
+ artifactCoverage;
144
151
  constructor(opts) {
145
152
  if (opts.database) {
146
153
  this.#db = opts.database;
@@ -177,6 +184,10 @@ export class WOFCandidateTableLookup {
177
184
  this.#ftsProbe = this.#db.prepare(`SELECT name_key FROM ${CANDIDATE_FTS_TABLE} WHERE ${CANDIDATE_FTS_TABLE} MATCH ? ORDER BY bm25(${CANDIDATE_FTS_TABLE}) LIMIT ?`);
178
185
  this.#nameKeyExistsProbe = this.#db.prepare("SELECT 1 FROM candidate WHERE name_key = ? LIMIT 1");
179
186
  }
187
+ // Coverage manifest (survey candidate #2): the artifact's own coverage facts, existence-gated like
188
+ // the probes above — a candidate.db built before the manifest reads `undefined` and consumers keep
189
+ // their code-constant fallbacks byte-identically.
190
+ this.artifactCoverage = readGazetteerCoverageManifest(this.#db);
180
191
  }
181
192
  /** Does this query want a locality-tier place? Postal-city aliases (#741) are all localities. */
182
193
  #wantsLocality(placetype) {
@@ -1 +1 @@
1
- {"version":3,"file":"candidate-lookup.js","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"candidate-lookup.js","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * Typed schema + read/write helpers for the candidate gazetteer's COVERAGE MANIFEST — the two
7
+ * country-keyed tables through which the artifact declares facts about ITSELF, so those facts are
8
+ * updated at gazetteer REBUILD, not by a hand-edited code PR after someone remembers:
9
+ *
10
+ * - `country_coverage`: the hard-country-filter coverage record (#743/#194) — per-country
11
+ * promote-gate verdicts + the measured hard-resolve rates that used to live in a code comment on
12
+ * `HARD_PLACE_COUNTRY_SAFELIST`. Presence = measured; `hard_filter_safe = 0` = measured and
13
+ * FAILED the gate (FI 69.5%, PL 77.8%) — distinguishable from a country never measured at all
14
+ * (the meaning-of-zero rule, `docs/articles/plan/reference/layer-contract.mdx`).
15
+ * - `country_bbox`: the coarse guard-B plausibility boxes that used to live in
16
+ * `resolver/plausibility.ts`'s `COUNTRY_BBOX`. An absent row fails open (never trips the guard),
17
+ * exactly like an absent key in the constant.
18
+ *
19
+ * Emission happens at build time (`mailwoman/gazetteer-pipeline/coverage-manifest.ts` owns the
20
+ * measured record and calls {@link writeGazetteerCoverageManifest} before the DB is sealed — never
21
+ * patch a shipped DB, rebuild). The read happens at open time ({@link WOFCandidateTableLookup}
22
+ * calls {@link readGazetteerCoverageManifest} in its constructor); an artifact that predates the
23
+ * manifest returns `undefined` and every consumer falls back to the code constants byte-identically.
24
+ */
25
+ import type { DatabaseSync } from "node:sqlite";
26
+ import { type CountryBBoxFact, type CountryCoverageFact, type GazetteerArtifactCoverage } from "@mailwoman/core/resolver";
27
+ import { type Kysely } from "kysely";
28
+ /** One country's hard-filter coverage measurement — the storage form of {@link CountryCoverageFact}. */
29
+ export interface CountryCoverageTable {
30
+ /** ISO 3166-1 alpha-2, uppercase (PK). */
31
+ country: string;
32
+ /** 0/1 — the promote-gate verdict (a verdict column, NOT re-derived from the rate; see the fact type's docstring). */
33
+ hard_filter_safe: number;
34
+ /** Measured hard-resolve rate 0..1 on the panel named in `source`; NULL when the receipt recorded none. */
35
+ hard_resolve_rate: number | null;
36
+ /** Panel size behind `hard_resolve_rate`; NULL when unrecorded. */
37
+ sample_size: number | null;
38
+ /** ISO-8601 date of the measurement / promote gate. */
39
+ measured_at: string;
40
+ /** The receipt: which panel/gate produced this row. */
41
+ source: string;
42
+ }
43
+ /** One country's coarse guard-B bounding box — the storage form of {@link CountryBBoxFact}. */
44
+ export interface CountryBBoxTable {
45
+ /** ISO 3166-1 alpha-2, uppercase (PK). */
46
+ country: string;
47
+ lat_min: number;
48
+ lat_max: number;
49
+ lon_min: number;
50
+ lon_max: number;
51
+ /** Provenance of the box (harness + date). */
52
+ source: string;
53
+ }
54
+ /** The coverage-manifest schema for `new DatabaseClient<GazetteerCoverageDatabase>(...)`. */
55
+ export interface GazetteerCoverageDatabase {
56
+ country_coverage: CountryCoverageTable;
57
+ country_bbox: CountryBBoxTable;
58
+ }
59
+ /** Table names the lookup probes (existence-gated, so a candidate.db built before the manifest is byte-stable). */
60
+ export declare const COUNTRY_COVERAGE_TABLE = "country_coverage";
61
+ export declare const COUNTRY_BBOX_TABLE = "country_bbox";
62
+ /** Create `country_coverage` — a handful of small PK-probed rows, the WITHOUT ROWID sweet spot. */
63
+ export declare function createCountryCoverageTable(db: Kysely<GazetteerCoverageDatabase>): Promise<void>;
64
+ /** Create `country_bbox` — same shape discipline as {@link createCountryCoverageTable}. */
65
+ export declare function createCountryBBoxTable(db: Kysely<GazetteerCoverageDatabase>): Promise<void>;
66
+ /**
67
+ * Write the coverage manifest into a candidate DB UNDER CONSTRUCTION (pre-seal — a shipped DB is never patched, rebuild
68
+ * instead). Creates both tables and inserts the facts; call exactly once, from the gazetteer build.
69
+ */
70
+ export declare function writeGazetteerCoverageManifest(db: Kysely<GazetteerCoverageDatabase>, facts: {
71
+ coverage: readonly CountryCoverageFact[];
72
+ bboxes: readonly CountryBBoxFact[];
73
+ }): Promise<void>;
74
+ /**
75
+ * Read the coverage manifest from an OPEN candidate DB, or `undefined` when the artifact predates it (neither table
76
+ * present) — the signal for consumers to fall back to the code constants byte-identically. Synchronous raw reads on
77
+ * purpose: this runs inside {@link WOFCandidateTableLookup}'s synchronous constructor (the sync-reader carve-out in
78
+ * `AGENTS.md`), and the tables are a few dozen rows read once per open.
79
+ */
80
+ export declare function readGazetteerCoverageManifest(db: DatabaseSync): GazetteerArtifactCoverage | undefined;
81
+ //# sourceMappingURL=coverage-manifest-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-manifest-schema.d.ts","sourceRoot":"","sources":["../coverage-manifest-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,EAEN,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAIzC,wGAAwG;AACxG,MAAM,WAAW,oBAAoB;IACpC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,sHAAsH;IACtH,gBAAgB,EAAE,MAAM,CAAA;IACxB,2GAA2G;IAC3G,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,mEAAmE;IACnE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAA;CACd;AAED,+FAA+F;AAC/F,MAAM,WAAW,gBAAgB;IAChC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAA;CACd;AAED,6FAA6F;AAC7F,MAAM,WAAW,yBAAyB;IACzC,gBAAgB,EAAE,oBAAoB,CAAA;IACtC,YAAY,EAAE,gBAAgB,CAAA;CAC9B;AAED,mHAAmH;AACnH,eAAO,MAAM,sBAAsB,qBAAqB,CAAA;AACxD,eAAO,MAAM,kBAAkB,iBAAiB,CAAA;AAEhD,mGAAmG;AACnG,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,MAAM,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAarG;AAED,2FAA2F;AAC3F,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAYjG;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CACnD,EAAE,EAAE,MAAM,CAAC,yBAAyB,CAAC,EACrC,KAAK,EAAE;IAAE,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;CAAE,GACrF,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,YAAY,GAAG,yBAAyB,GAAG,SAAS,CAqDrG"}