mailwoman 10.2.2 → 10.4.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 (629) hide show
  1. package/README.md +4 -4
  2. package/cli/commands/corpus/golden/relabel.tsx +2 -2
  3. package/cli/commands/corpus/migrate/overlays.tsx +2 -2
  4. package/cli/commands/corpus/overlay-manifest.tsx +6 -0
  5. package/cli/commands/corpus/split-slice.tsx +1 -1
  6. package/cli/commands/corpus/upload.tsx +1 -1
  7. package/cli/commands/data/bom.tsx +1 -1
  8. package/cli/commands/data/inventory.tsx +4 -4
  9. package/cli/commands/data/pull.tsx +3 -3
  10. package/cli/commands/eval/oracle-k.tsx +1 -1
  11. package/cli/commands/gazetteer/anchor-lexicon.tsx +2 -2
  12. package/cli/commands/gazetteer/build/coastal.tsx +2 -2
  13. package/cli/commands/gazetteer/build/poi/index.tsx +1 -1
  14. package/cli/commands/gazetteer/build/venue-heads.tsx +1 -1
  15. package/cli/commands/gazetteer/census.tsx +1 -1
  16. package/cli/commands/gazetteer/inspect/graph.tsx +1 -1
  17. package/cli/commands/gazetteer/inspect/mermaid.tsx +5 -4
  18. package/cli/commands/gazetteer/inspect/sync/index.tsx +1 -1
  19. package/cli/commands/gazetteer/overture-ingest.tsx +1 -4
  20. package/cli/commands/gazetteer/postcode/intl.tsx +2 -2
  21. package/cli/commands/poi.tsx +1 -1
  22. package/cli/commands/registry/run.tsx +2 -2
  23. package/cli/commands/serve.tsx +5 -5
  24. package/cli/commands/situs/build.tsx +1 -1
  25. package/cli/commands/tiger/fetch.tsx +1 -1
  26. package/cli/debug-view/DebugFrame.tsx +1 -1
  27. package/cli/debug-view/output-lines.ts +1 -1
  28. package/cli/debug-view/trace-rows.ts +4 -4
  29. package/cli/doctor/checks.ts +1 -1
  30. package/cli/doctor/runner.ts +1 -1
  31. package/cli/kit/weights-guard.tsx +1 -1
  32. package/cli/native/commands/autocomplete.ts +1 -1
  33. package/cli/native/commands/doctor.ts +1 -1
  34. package/cli/native/commands/geocode.ts +10 -2
  35. package/cli/native/commands/license.ts +5 -5
  36. package/cli/native/commands/reverse.ts +1 -1
  37. package/lib/ablation/expectation.ts +8 -6
  38. package/lib/admin-coherence.ts +2 -1
  39. package/lib/api-engine.ts +1 -1
  40. package/lib/browser-runtime/classify.ts +9 -0
  41. package/lib/browser-runtime/fetch.ts +4 -4
  42. package/lib/browser-runtime/load-assets.ts +15 -4
  43. package/lib/browser-runtime/manifest.ts +39 -6
  44. package/lib/browser-runtime/resources.ts +4 -14
  45. package/lib/data/bundles.ts +1 -1
  46. package/lib/data/inventory.ts +2 -2
  47. package/lib/data/sources.ts +1 -1
  48. package/lib/default/reverse-geocoder.ts +1 -1
  49. package/lib/fork-entity.ts +307 -110
  50. package/lib/freshness.ts +1 -1
  51. package/lib/geocode/classifier.ts +2 -2
  52. package/lib/geocode/command-options.ts +8 -1
  53. package/lib/geocode/core.ts +43 -14
  54. package/lib/geocode/diff.ts +4 -3
  55. package/lib/geocode/epistemic-status.ts +5 -2
  56. package/lib/geocode/national-overture.ts +1 -1
  57. package/lib/geocode/parse-priors.ts +352 -0
  58. package/lib/geocode/result.ts +44 -4
  59. package/lib/geocode/session.ts +39 -50
  60. package/lib/inferred-scope.ts +40 -1
  61. package/lib/poi/intent.ts +26 -5
  62. package/lib/query-intent.ts +7 -6
  63. package/lib/region-recognition.ts +3 -3
  64. package/lib/runtime-pipeline.ts +78 -55
  65. package/lib/span-script.ts +1 -1
  66. package/man/mailwoman.1 +10 -6
  67. package/out/ablation/expectation.d.ts +4 -4
  68. package/out/ablation/expectation.d.ts.map +1 -1
  69. package/out/ablation/expectation.js +8 -6
  70. package/out/ablation/expectation.js.map +1 -1
  71. package/out/admin-coherence.d.ts +2 -1
  72. package/out/admin-coherence.d.ts.map +1 -1
  73. package/out/admin-coherence.js +2 -1
  74. package/out/admin-coherence.js.map +1 -1
  75. package/out/api-engine.js +1 -1
  76. package/out/api-engine.js.map +1 -1
  77. package/out/browser-runtime/classify.d.ts +8 -0
  78. package/out/browser-runtime/classify.d.ts.map +1 -1
  79. package/out/browser-runtime/classify.js +1 -0
  80. package/out/browser-runtime/classify.js.map +1 -1
  81. package/out/browser-runtime/fetch.d.ts +1 -1
  82. package/out/browser-runtime/fetch.d.ts.map +1 -1
  83. package/out/browser-runtime/fetch.js +3 -4
  84. package/out/browser-runtime/fetch.js.map +1 -1
  85. package/out/browser-runtime/load-assets.d.ts +7 -0
  86. package/out/browser-runtime/load-assets.d.ts.map +1 -1
  87. package/out/browser-runtime/load-assets.js +7 -5
  88. package/out/browser-runtime/load-assets.js.map +1 -1
  89. package/out/browser-runtime/manifest.d.ts +24 -5
  90. package/out/browser-runtime/manifest.d.ts.map +1 -1
  91. package/out/browser-runtime/manifest.js +22 -4
  92. package/out/browser-runtime/manifest.js.map +1 -1
  93. package/out/browser-runtime/resources.d.ts +4 -5
  94. package/out/browser-runtime/resources.d.ts.map +1 -1
  95. package/out/browser-runtime/resources.js +3 -7
  96. package/out/browser-runtime/resources.js.map +1 -1
  97. package/out/cli/commands/corpus/golden/relabel.d.ts +2 -2
  98. package/out/cli/commands/corpus/golden/relabel.js +2 -2
  99. package/out/cli/commands/corpus/migrate/overlays.d.ts +1 -1
  100. package/out/cli/commands/corpus/migrate/overlays.js +2 -2
  101. package/out/cli/commands/corpus/migrate/overlays.js.map +1 -1
  102. package/out/cli/commands/corpus/overlay-manifest.d.ts +4 -0
  103. package/out/cli/commands/corpus/overlay-manifest.d.ts.map +1 -1
  104. package/out/cli/commands/corpus/overlay-manifest.js +5 -0
  105. package/out/cli/commands/corpus/overlay-manifest.js.map +1 -1
  106. package/out/cli/commands/corpus/split-slice.d.ts +1 -1
  107. package/out/cli/commands/corpus/split-slice.js +1 -1
  108. package/out/cli/commands/data/bom.js +1 -1
  109. package/out/cli/commands/data/bom.js.map +1 -1
  110. package/out/cli/commands/data/inventory.d.ts +1 -1
  111. package/out/cli/commands/data/inventory.d.ts.map +1 -1
  112. package/out/cli/commands/data/inventory.js +4 -4
  113. package/out/cli/commands/data/inventory.js.map +1 -1
  114. package/out/cli/commands/data/pull.d.ts +1 -1
  115. package/out/cli/commands/data/pull.d.ts.map +1 -1
  116. package/out/cli/commands/data/pull.js +3 -3
  117. package/out/cli/commands/data/pull.js.map +1 -1
  118. package/out/cli/commands/eval/oracle-k.d.ts +1 -1
  119. package/out/cli/commands/eval/oracle-k.js +1 -1
  120. package/out/cli/commands/gazetteer/anchor-lexicon.d.ts +1 -1
  121. package/out/cli/commands/gazetteer/anchor-lexicon.js +2 -2
  122. package/out/cli/commands/gazetteer/anchor-lexicon.js.map +1 -1
  123. package/out/cli/commands/gazetteer/build/coastal.d.ts +2 -2
  124. package/out/cli/commands/gazetteer/build/coastal.js +2 -2
  125. package/out/cli/commands/gazetteer/build/poi/index.d.ts +1 -1
  126. package/out/cli/commands/gazetteer/build/poi/index.js +1 -1
  127. package/out/cli/commands/gazetteer/build/venue-heads.js +1 -1
  128. package/out/cli/commands/gazetteer/build/venue-heads.js.map +1 -1
  129. package/out/cli/commands/gazetteer/census.js +1 -1
  130. package/out/cli/commands/gazetteer/census.js.map +1 -1
  131. package/out/cli/commands/gazetteer/inspect/graph.d.ts +1 -1
  132. package/out/cli/commands/gazetteer/inspect/graph.js +1 -1
  133. package/out/cli/commands/gazetteer/inspect/mermaid.d.ts +4 -3
  134. package/out/cli/commands/gazetteer/inspect/mermaid.d.ts.map +1 -1
  135. package/out/cli/commands/gazetteer/inspect/mermaid.js +5 -4
  136. package/out/cli/commands/gazetteer/inspect/mermaid.js.map +1 -1
  137. package/out/cli/commands/gazetteer/inspect/sync/index.js +1 -1
  138. package/out/cli/commands/gazetteer/overture-ingest.d.ts +1 -1
  139. package/out/cli/commands/gazetteer/overture-ingest.d.ts.map +1 -1
  140. package/out/cli/commands/gazetteer/overture-ingest.js +1 -3
  141. package/out/cli/commands/gazetteer/overture-ingest.js.map +1 -1
  142. package/out/cli/commands/gazetteer/postcode/intl.js +2 -2
  143. package/out/cli/commands/gazetteer/postcode/intl.js.map +1 -1
  144. package/out/cli/commands/poi.js +1 -1
  145. package/out/cli/commands/registry/run.d.ts +2 -2
  146. package/out/cli/commands/serve.js +5 -5
  147. package/out/cli/commands/serve.js.map +1 -1
  148. package/out/cli/commands/situs/build.js +1 -1
  149. package/out/cli/commands/tiger/fetch.d.ts +1 -1
  150. package/out/cli/commands/tiger/fetch.js +1 -1
  151. package/out/cli/debug-view/DebugFrame.d.ts +1 -1
  152. package/out/cli/debug-view/DebugFrame.js +1 -1
  153. package/out/cli/debug-view/output-lines.js +1 -1
  154. package/out/cli/debug-view/trace-rows.d.ts +4 -4
  155. package/out/cli/debug-view/trace-rows.js +4 -4
  156. package/out/cli/doctor/checks.d.ts +1 -1
  157. package/out/cli/doctor/runner.d.ts +1 -1
  158. package/out/cli/kit/weights-guard.d.ts +1 -1
  159. package/out/cli/kit/weights-guard.js +1 -1
  160. package/out/cli/native/commands/autocomplete.d.ts +1 -1
  161. package/out/cli/native/commands/autocomplete.d.ts.map +1 -1
  162. package/out/cli/native/commands/autocomplete.js +1 -1
  163. package/out/cli/native/commands/autocomplete.js.map +1 -1
  164. package/out/cli/native/commands/doctor.d.ts +1 -1
  165. package/out/cli/native/commands/doctor.d.ts.map +1 -1
  166. package/out/cli/native/commands/doctor.js +1 -1
  167. package/out/cli/native/commands/doctor.js.map +1 -1
  168. package/out/cli/native/commands/geocode.d.ts +7 -2
  169. package/out/cli/native/commands/geocode.d.ts.map +1 -1
  170. package/out/cli/native/commands/geocode.js +9 -2
  171. package/out/cli/native/commands/geocode.js.map +1 -1
  172. package/out/cli/native/commands/license.d.ts +2 -2
  173. package/out/cli/native/commands/license.d.ts.map +1 -1
  174. package/out/cli/native/commands/license.js +5 -5
  175. package/out/cli/native/commands/license.js.map +1 -1
  176. package/out/cli/native/commands/reverse.d.ts +1 -1
  177. package/out/cli/native/commands/reverse.d.ts.map +1 -1
  178. package/out/cli/native/commands/reverse.js +1 -1
  179. package/out/cli/native/commands/reverse.js.map +1 -1
  180. package/out/data/bundles.d.ts +1 -1
  181. package/out/data/bundles.js +1 -1
  182. package/out/data/inventory.d.ts +2 -2
  183. package/out/data/inventory.js +1 -1
  184. package/out/data/sources.d.ts +1 -1
  185. package/out/default/reverse-geocoder.d.ts +1 -1
  186. package/out/default/reverse-geocoder.js +1 -1
  187. package/out/fork-entity.d.ts +43 -4
  188. package/out/fork-entity.d.ts.map +1 -1
  189. package/out/fork-entity.js +222 -91
  190. package/out/fork-entity.js.map +1 -1
  191. package/out/freshness.d.ts +1 -1
  192. package/out/freshness.js +1 -1
  193. package/out/geocode/classifier.d.ts +2 -2
  194. package/out/geocode/classifier.d.ts.map +1 -1
  195. package/out/geocode/command-options.d.ts +5 -0
  196. package/out/geocode/command-options.d.ts.map +1 -1
  197. package/out/geocode/command-options.js +3 -1
  198. package/out/geocode/command-options.js.map +1 -1
  199. package/out/geocode/core.d.ts +15 -4
  200. package/out/geocode/core.d.ts.map +1 -1
  201. package/out/geocode/core.js +16 -10
  202. package/out/geocode/core.js.map +1 -1
  203. package/out/geocode/diff.d.ts +2 -2
  204. package/out/geocode/diff.d.ts.map +1 -1
  205. package/out/geocode/diff.js +2 -1
  206. package/out/geocode/diff.js.map +1 -1
  207. package/out/geocode/epistemic-status.d.ts +2 -1
  208. package/out/geocode/epistemic-status.d.ts.map +1 -1
  209. package/out/geocode/epistemic-status.js +4 -2
  210. package/out/geocode/epistemic-status.js.map +1 -1
  211. package/out/geocode/national-overture.d.ts +1 -1
  212. package/out/geocode/parse-priors.d.ts +179 -0
  213. package/out/geocode/parse-priors.d.ts.map +1 -0
  214. package/out/geocode/parse-priors.js +162 -0
  215. package/out/geocode/parse-priors.js.map +1 -0
  216. package/out/geocode/result.d.ts +1 -0
  217. package/out/geocode/result.d.ts.map +1 -1
  218. package/out/geocode/result.js +35 -5
  219. package/out/geocode/result.js.map +1 -1
  220. package/out/geocode/session.d.ts +8 -0
  221. package/out/geocode/session.d.ts.map +1 -1
  222. package/out/geocode/session.js +28 -43
  223. package/out/geocode/session.js.map +1 -1
  224. package/out/inferred-scope.d.ts +2 -0
  225. package/out/inferred-scope.d.ts.map +1 -1
  226. package/out/inferred-scope.js +35 -1
  227. package/out/inferred-scope.js.map +1 -1
  228. package/out/poi/intent.d.ts +11 -2
  229. package/out/poi/intent.d.ts.map +1 -1
  230. package/out/poi/intent.js +21 -4
  231. package/out/poi/intent.js.map +1 -1
  232. package/out/query-intent.d.ts +5 -4
  233. package/out/query-intent.d.ts.map +1 -1
  234. package/out/query-intent.js +7 -6
  235. package/out/query-intent.js.map +1 -1
  236. package/out/region-recognition.js +3 -3
  237. package/out/region-recognition.js.map +1 -1
  238. package/out/runtime-pipeline.d.ts +19 -0
  239. package/out/runtime-pipeline.d.ts.map +1 -1
  240. package/out/runtime-pipeline.js +51 -47
  241. package/out/runtime-pipeline.js.map +1 -1
  242. package/out/span-script.d.ts +1 -1
  243. package/out/span-script.js +1 -1
  244. package/out/tools/coverage/census.js +1 -1
  245. package/out/tools/coverage/census.js.map +1 -1
  246. package/out/tools/coverage/core.d.ts +1 -1
  247. package/out/tools/coverage/core.js +3 -3
  248. package/out/tools/coverage/core.js.map +1 -1
  249. package/out/tools/coverage/jurisdictions.d.ts +2 -2
  250. package/out/tools/coverage/jurisdictions.js +1 -1
  251. package/out/tools/dev-tools/ca/province-code-probe.run.d.ts +2 -2
  252. package/out/tools/dev-tools/ca/province-code-probe.run.js +4 -4
  253. package/out/tools/dev-tools/codex/export-country-surfaces.d.ts +1 -1
  254. package/out/tools/dev-tools/codex/export-country-surfaces.js +1 -1
  255. package/out/tools/dev-tools/collect-span-confidences.run.d.ts +1 -1
  256. package/out/tools/dev-tools/collect-span-confidences.run.js +1 -1
  257. package/out/tools/dev-tools/conformal-calibrate.run.d.ts +1 -1
  258. package/out/tools/dev-tools/conformal-calibrate.run.js +3 -3
  259. package/out/tools/dev-tools/corpus/country-less-census.run.d.ts +1 -1
  260. package/out/tools/dev-tools/corpus/country-less-census.run.js +1 -1
  261. package/out/tools/dev-tools/corpus/dedup/cause-census.run.d.ts +4 -4
  262. package/out/tools/dev-tools/corpus/dedup/cause-census.run.js +5 -5
  263. package/out/tools/dev-tools/corpus/global-census.run.d.ts +4 -4
  264. package/out/tools/dev-tools/corpus/global-census.run.js +4 -4
  265. package/out/tools/dev-tools/corpus/holdout/leakage.run.d.ts +1 -1
  266. package/out/tools/dev-tools/corpus/holdout/leakage.run.js +7 -7
  267. package/out/tools/dev-tools/corpus/jurisdiction-coverage.run.js +8 -8
  268. package/out/tools/dev-tools/corpus/jurisdiction-coverage.run.js.map +1 -1
  269. package/out/tools/dev-tools/corpus/overlay-plan.run.d.ts +1 -1
  270. package/out/tools/dev-tools/corpus/overlay-plan.run.js +4 -3
  271. package/out/tools/dev-tools/corpus/overlay-plan.run.js.map +1 -1
  272. package/out/tools/dev-tools/corpus/overture-address-census.run.d.ts +1 -1
  273. package/out/tools/dev-tools/corpus/overture-address-census.run.js +1 -1
  274. package/out/tools/dev-tools/corpus/projection-drops.run.d.ts +1 -1
  275. package/out/tools/dev-tools/corpus/projection-drops.run.js +1 -1
  276. package/out/tools/dev-tools/corpus/region-composition.run.js +1 -1
  277. package/out/tools/dev-tools/corpus/street/type/channel-arms.run.d.ts +3 -3
  278. package/out/tools/dev-tools/corpus/street/type/channel-arms.run.js +3 -3
  279. package/out/tools/dev-tools/corpus/street/type/lexicon-coverage.run.d.ts +1 -1
  280. package/out/tools/dev-tools/corpus/street/type/lexicon-coverage.run.js +1 -1
  281. package/out/tools/dev-tools/corpus/surface-provenance-census.run.d.ts +1 -1
  282. package/out/tools/dev-tools/corpus/surface-provenance-census.run.js +1 -1
  283. package/out/tools/dev-tools/coverage-funnel.run.js +1 -1
  284. package/out/tools/dev-tools/fr/admin/split/eval.run.js +1 -1
  285. package/out/tools/dev-tools/fr/admin/split/eval.run.js.map +1 -1
  286. package/out/tools/dev-tools/fr/admin/split/selfvalidation.run.d.ts +1 -1
  287. package/out/tools/dev-tools/fr/admin/split/selfvalidation.run.js +5 -5
  288. package/out/tools/dev-tools/fr/admin/split/selfvalidation.run.js.map +1 -1
  289. package/out/tools/dev-tools/gb-fragment-board.run.js +1 -1
  290. package/out/tools/dev-tools/gb-fragment-board.run.js.map +1 -1
  291. package/out/tools/dev-tools/generate-trace-fixture.d.ts +1 -1
  292. package/out/tools/dev-tools/generate-trace-fixture.js +1 -1
  293. package/out/tools/dev-tools/grade-seed-cases.d.ts +1 -1
  294. package/out/tools/dev-tools/grade-seed-cases.js +1 -1
  295. package/out/tools/dev-tools/{honest-eval.run.d.ts → heldout-geography-eval.run.d.ts} +5 -5
  296. package/out/tools/dev-tools/heldout-geography-eval.run.d.ts.map +1 -0
  297. package/out/tools/dev-tools/{honest-eval.run.js → heldout-geography-eval.run.js} +6 -6
  298. package/out/tools/dev-tools/heldout-geography-eval.run.js.map +1 -0
  299. package/out/tools/dev-tools/lint-mdx-angles.js +1 -1
  300. package/out/tools/dev-tools/locality/context-swap.run.js +1 -1
  301. package/out/tools/dev-tools/locality/reachability.run.js +1 -1
  302. package/out/tools/dev-tools/man-page.d.ts +1 -1
  303. package/out/tools/dev-tools/man-page.js +4 -4
  304. package/out/tools/dev-tools/man-page.js.map +1 -1
  305. package/out/tools/dev-tools/parse-register-census.run.d.ts +1 -1
  306. package/out/tools/dev-tools/parse-register-census.run.js +1 -1
  307. package/out/tools/dev-tools/perturb-golden.run.js +1 -1
  308. package/out/tools/dev-tools/postcode/coherence/coverage.run.d.ts +1 -1
  309. package/out/tools/dev-tools/postcode/coherence/coverage.run.js +1 -1
  310. package/out/tools/dev-tools/probe/referential-delta.run.js +1 -1
  311. package/out/tools/dev-tools/probe/referential-delta.run.js.map +1 -1
  312. package/out/tools/dev-tools/same-data-benchmark.run.js +7 -7
  313. package/out/tools/dev-tools/same-data-benchmark.run.js.map +1 -1
  314. package/out/tools/dev-tools/street-recall-full-probe.run.d.ts +1 -1
  315. package/out/tools/dev-tools/street-recall-full-probe.run.js +1 -1
  316. package/out/tools/dev-tools/undersized-locality-census.run.js +3 -3
  317. package/out/tools/dev-tools/undersized-locality-census.run.js.map +1 -1
  318. package/out/tools/dev-tools/us/locality-region-postcode-arms.run.d.ts +4 -3
  319. package/out/tools/dev-tools/us/locality-region-postcode-arms.run.d.ts.map +1 -1
  320. package/out/tools/dev-tools/us/locality-region-postcode-arms.run.js +5 -4
  321. package/out/tools/dev-tools/us/locality-region-postcode-arms.run.js.map +1 -1
  322. package/out/tools/dev-tools/us/recall-flip-census.run.js +1 -1
  323. package/out/tools/eval-harness/activity-lexicon/phrase-collision-census.d.ts +1 -1
  324. package/out/tools/eval-harness/autocomplete-ladder.d.ts +2 -2
  325. package/out/tools/eval-harness/autocomplete-ladder.js +1 -1
  326. package/out/tools/eval-harness/capability-manifest.js +1 -1
  327. package/out/tools/eval-harness/capability-manifest.js.map +1 -1
  328. package/out/tools/eval-harness/conformance/comparators.d.ts +1 -1
  329. package/out/tools/eval-harness/conformance/fixture.d.ts +16 -9
  330. package/out/tools/eval-harness/conformance/fixture.d.ts.map +1 -1
  331. package/out/tools/eval-harness/conformance/fixture.js +9 -5
  332. package/out/tools/eval-harness/conformance/fixture.js.map +1 -1
  333. package/out/tools/eval-harness/conformance/refinement-monotonicity.d.ts +2 -1
  334. package/out/tools/eval-harness/conformance/refinement-monotonicity.d.ts.map +1 -1
  335. package/out/tools/eval-harness/conformance/refinement-monotonicity.js +2 -1
  336. package/out/tools/eval-harness/conformance/refinement-monotonicity.js.map +1 -1
  337. package/out/tools/eval-harness/conformance/run.d.ts +1 -1
  338. package/out/tools/eval-harness/demo/cascade/smoke.d.ts.map +1 -1
  339. package/out/tools/eval-harness/demo/cascade/smoke.js +4 -2
  340. package/out/tools/eval-harness/demo/cascade/smoke.js.map +1 -1
  341. package/out/tools/eval-harness/error-analysis.js +2 -2
  342. package/out/tools/eval-harness/error-analysis.js.map +1 -1
  343. package/out/tools/eval-harness/es-postcode-centroids.js +1 -1
  344. package/out/tools/eval-harness/es-postcode-centroids.js.map +1 -1
  345. package/out/tools/eval-harness/fr-parse-recall.d.ts +1 -1
  346. package/out/tools/eval-harness/fr-parse-recall.js +1 -1
  347. package/out/tools/eval-harness/gauntlet/ablation/gazetteer.d.ts.map +1 -1
  348. package/out/tools/eval-harness/gauntlet/ablation/gazetteer.js +3 -2
  349. package/out/tools/eval-harness/gauntlet/ablation/gazetteer.js.map +1 -1
  350. package/out/tools/eval-harness/gauntlet/ablation/types.d.ts +2 -2
  351. package/out/tools/eval-harness/gauntlet/ablation.d.ts +2 -2
  352. package/out/tools/eval-harness/gauntlet/ablation.js +4 -4
  353. package/out/tools/eval-harness/gauntlet/cases/seed-case.d.ts +2 -1
  354. package/out/tools/eval-harness/gauntlet/cases/seed-case.d.ts.map +1 -1
  355. package/out/tools/eval-harness/gauntlet/cases/seed-case.js +2 -1
  356. package/out/tools/eval-harness/gauntlet/cases/seed-case.js.map +1 -1
  357. package/out/tools/eval-harness/gauntlet/check-case.js +4 -4
  358. package/out/tools/eval-harness/gauntlet/check-case.js.map +1 -1
  359. package/out/tools/eval-harness/gauntlet/corpus-stamp.d.ts +2 -2
  360. package/out/tools/eval-harness/gauntlet/corpus-stamp.js +2 -2
  361. package/out/tools/eval-harness/gauntlet/harness.d.ts +6 -1
  362. package/out/tools/eval-harness/gauntlet/harness.d.ts.map +1 -1
  363. package/out/tools/eval-harness/gauntlet/harness.js +45 -26
  364. package/out/tools/eval-harness/gauntlet/harness.js.map +1 -1
  365. package/out/tools/eval-harness/gauntlet/holdout.d.ts +1 -1
  366. package/out/tools/eval-harness/gauntlet/holdout.js +1 -1
  367. package/out/tools/eval-harness/gauntlet/regression.d.ts +3 -2
  368. package/out/tools/eval-harness/gauntlet/regression.d.ts.map +1 -1
  369. package/out/tools/eval-harness/gauntlet/regression.js +3 -3
  370. package/out/tools/eval-harness/gauntlet/regression.js.map +1 -1
  371. package/out/tools/eval-harness/gauntlet/run.d.ts +4 -0
  372. package/out/tools/eval-harness/gauntlet/run.d.ts.map +1 -1
  373. package/out/tools/eval-harness/gauntlet/run.js +1 -0
  374. package/out/tools/eval-harness/gauntlet/run.js.map +1 -1
  375. package/out/tools/eval-harness/gauntlet/schema.d.ts +1 -1
  376. package/out/tools/eval-harness/gauntlet/schema.js +1 -1
  377. package/out/tools/eval-harness/gauntlet/schema.js.map +1 -1
  378. package/out/tools/eval-harness/hard-case-board.d.ts +1 -1
  379. package/out/tools/eval-harness/hard-case-board.js +1 -1
  380. package/out/tools/eval-harness/mask-regression.d.ts +1 -1
  381. package/out/tools/eval-harness/mask-regression.js +1 -1
  382. package/out/tools/eval-harness/oa/resolver/admin-match.d.ts +3 -3
  383. package/out/tools/eval-harness/oa/resolver/admin-match.js +7 -7
  384. package/out/tools/eval-harness/oa/resolver/admin-match.js.map +1 -1
  385. package/out/tools/eval-harness/oa/resolver/coordinate-tiers.d.ts +1 -1
  386. package/out/tools/eval-harness/oa/resolver/options.d.ts +1 -1
  387. package/out/tools/eval-harness/oa/resolver/parse-rig.d.ts.map +1 -1
  388. package/out/tools/eval-harness/oa/resolver/parse-rig.js +10 -6
  389. package/out/tools/eval-harness/oa/resolver/parse-rig.js.map +1 -1
  390. package/out/tools/eval-harness/oa/resolver/tree-hits.d.ts +2 -2
  391. package/out/tools/eval-harness/oa/resolver/tree-hits.js +2 -2
  392. package/out/tools/eval-harness/per/locale-f1.d.ts.map +1 -1
  393. package/out/tools/eval-harness/per/locale-f1.js +4 -0
  394. package/out/tools/eval-harness/per/locale-f1.js.map +1 -1
  395. package/out/tools/eval-harness/phase-2-decision/decision.d.ts +2 -2
  396. package/out/tools/eval-harness/phase-2-decision/decision.js +1 -1
  397. package/out/tools/eval-harness/premise-linkage/schema.d.ts +5 -4
  398. package/out/tools/eval-harness/premise-linkage/schema.d.ts.map +1 -1
  399. package/out/tools/eval-harness/production-priors.d.ts +24 -0
  400. package/out/tools/eval-harness/production-priors.d.ts.map +1 -0
  401. package/out/tools/eval-harness/production-priors.js +37 -0
  402. package/out/tools/eval-harness/production-priors.js.map +1 -0
  403. package/out/tools/eval-harness/same-data/concordance.d.ts +2 -2
  404. package/out/tools/eval-harness/same-data/concordance.js +2 -2
  405. package/out/tools/eval-harness/same-data/fixture.d.ts +1 -1
  406. package/out/tools/eval-harness/same-data/fixture.js +1 -1
  407. package/out/tools/eval-harness/same-data/score.d.ts +1 -2
  408. package/out/tools/eval-harness/same-data/score.d.ts.map +1 -1
  409. package/out/tools/eval-harness/same-data/score.js.map +1 -1
  410. package/out/tools/eval-harness/score/affix.d.ts +1 -1
  411. package/out/tools/eval-harness/score/affix.d.ts.map +1 -1
  412. package/out/tools/eval-harness/score/affix.js +4 -1
  413. package/out/tools/eval-harness/score/affix.js.map +1 -1
  414. package/out/tools/eval-harness/score/country-homograph.d.ts +2 -2
  415. package/out/tools/eval-harness/score/country-homograph.d.ts.map +1 -1
  416. package/out/tools/eval-harness/score/country-homograph.js +7 -4
  417. package/out/tools/eval-harness/score/country-homograph.js.map +1 -1
  418. package/out/tools/eval-harness/score/trends.js +5 -5
  419. package/out/tools/eval-harness/score/trends.js.map +1 -1
  420. package/out/tools/eval-harness/semantic-utility/probe.d.ts +3 -3
  421. package/out/tools/gazetteer-pipeline/admin/enrich.d.ts +1 -1
  422. package/out/tools/gazetteer-pipeline/admin/enrich.js +1 -1
  423. package/out/tools/gazetteer-pipeline/admin/ingest-wof.d.ts +3 -1
  424. package/out/tools/gazetteer-pipeline/admin/ingest-wof.d.ts.map +1 -1
  425. package/out/tools/gazetteer-pipeline/admin/ingest-wof.js +9 -4
  426. package/out/tools/gazetteer-pipeline/admin/ingest-wof.js.map +1 -1
  427. package/out/tools/gazetteer-pipeline/admin/label-point-adjudicator.d.ts +2 -1
  428. package/out/tools/gazetteer-pipeline/admin/label-point-adjudicator.d.ts.map +1 -1
  429. package/out/tools/gazetteer-pipeline/admin/label-point-adjudicator.js +2 -1
  430. package/out/tools/gazetteer-pipeline/admin/label-point-adjudicator.js.map +1 -1
  431. package/out/tools/gazetteer-pipeline/admin/manifest.d.ts +2 -2
  432. package/out/tools/gazetteer-pipeline/admin/manifest.js +3 -3
  433. package/out/tools/gazetteer-pipeline/admin.js +6 -5
  434. package/out/tools/gazetteer-pipeline/admin.js.map +1 -1
  435. package/out/tools/gazetteer-pipeline/borough-pairs.d.ts.map +1 -1
  436. package/out/tools/gazetteer-pipeline/borough-pairs.js +6 -7
  437. package/out/tools/gazetteer-pipeline/borough-pairs.js.map +1 -1
  438. package/out/tools/gazetteer-pipeline/capitals.d.ts +2 -1
  439. package/out/tools/gazetteer-pipeline/capitals.d.ts.map +1 -1
  440. package/out/tools/gazetteer-pipeline/capitals.js.map +1 -1
  441. package/out/tools/gazetteer-pipeline/country/plan.d.ts +1 -1
  442. package/out/tools/gazetteer-pipeline/country/plan.js +1 -1
  443. package/out/tools/gazetteer-pipeline/defaults.d.ts +0 -12
  444. package/out/tools/gazetteer-pipeline/defaults.d.ts.map +1 -1
  445. package/out/tools/gazetteer-pipeline/defaults.js +3 -15
  446. package/out/tools/gazetteer-pipeline/defaults.js.map +1 -1
  447. package/out/tools/gazetteer-pipeline/evidence-lexicons.d.ts +2 -2
  448. package/out/tools/gazetteer-pipeline/evidence-lexicons.js +2 -2
  449. package/out/tools/gazetteer-pipeline/fst.d.ts.map +1 -1
  450. package/out/tools/gazetteer-pipeline/fst.js +2 -7
  451. package/out/tools/gazetteer-pipeline/fst.js.map +1 -1
  452. package/out/tools/gazetteer-pipeline/granularity.d.ts +3 -3
  453. package/out/tools/gazetteer-pipeline/importance-fanout.d.ts +2 -2
  454. package/out/tools/gazetteer-pipeline/importance-fanout.js +2 -2
  455. package/out/tools/gazetteer-pipeline/nsul-layer.d.ts +10 -4
  456. package/out/tools/gazetteer-pipeline/nsul-layer.d.ts.map +1 -1
  457. package/out/tools/gazetteer-pipeline/nsul-layer.js +20 -9
  458. package/out/tools/gazetteer-pipeline/nsul-layer.js.map +1 -1
  459. package/out/tools/gazetteer-pipeline/nz-localities.d.ts +1 -1
  460. package/out/tools/gazetteer-pipeline/nz-localities.js +1 -1
  461. package/out/tools/gazetteer-pipeline/placetype-census.d.ts +2 -2
  462. package/out/tools/gazetteer-pipeline/placetype-census.d.ts.map +1 -1
  463. package/out/tools/gazetteer-pipeline/placetype-census.js +4 -3
  464. package/out/tools/gazetteer-pipeline/placetype-census.js.map +1 -1
  465. package/out/tools/gazetteer-pipeline/poi/build/brands.d.ts +3 -2
  466. package/out/tools/gazetteer-pipeline/poi/build/brands.d.ts.map +1 -1
  467. package/out/tools/gazetteer-pipeline/poi/build/brands.js +3 -2
  468. package/out/tools/gazetteer-pipeline/poi/build/brands.js.map +1 -1
  469. package/out/tools/gazetteer-pipeline/poi/build/venue-heads.d.ts +19 -7
  470. package/out/tools/gazetteer-pipeline/poi/build/venue-heads.d.ts.map +1 -1
  471. package/out/tools/gazetteer-pipeline/poi/build/venue-heads.js +33 -12
  472. package/out/tools/gazetteer-pipeline/poi/build/venue-heads.js.map +1 -1
  473. package/out/tools/gazetteer-pipeline/poi/capture-recapture.d.ts +2 -1
  474. package/out/tools/gazetteer-pipeline/poi/capture-recapture.d.ts.map +1 -1
  475. package/out/tools/gazetteer-pipeline/poi/capture-recapture.js.map +1 -1
  476. package/out/tools/gazetteer-pipeline/poi/defaults.d.ts +6 -4
  477. package/out/tools/gazetteer-pipeline/poi/defaults.d.ts.map +1 -1
  478. package/out/tools/gazetteer-pipeline/poi/defaults.js +6 -4
  479. package/out/tools/gazetteer-pipeline/poi/defaults.js.map +1 -1
  480. package/out/tools/gazetteer-pipeline/postcode/codepoint/comparison.d.ts +4 -3
  481. package/out/tools/gazetteer-pipeline/postcode/codepoint/comparison.d.ts.map +1 -1
  482. package/out/tools/gazetteer-pipeline/postcode/codepoint/comparison.js.map +1 -1
  483. package/out/tools/gazetteer-pipeline/postcode/geonames/tail.d.ts +1 -1
  484. package/out/tools/gazetteer-pipeline/postcode/locality/base.d.ts +1 -1
  485. package/out/tools/gazetteer-pipeline/postcode/locality/base.js +1 -1
  486. package/out/tools/gazetteer-pipeline/postcode/locality/kr.js +4 -4
  487. package/out/tools/gazetteer-pipeline/postcode/locality/kr.js.map +1 -1
  488. package/out/tools/gazetteer-pipeline/postcode/ni/osm/parse.d.ts +1 -1
  489. package/out/tools/gazetteer-pipeline/postcode/ni/osm/parse.js +1 -1
  490. package/out/tools/gazetteer-pipeline/postcode/prefix.d.ts +1 -1
  491. package/out/tools/gazetteer-pipeline/postcode/prefix.js +1 -1
  492. package/out/tools/gazetteer-pipeline/repos/sync.d.ts +2 -2
  493. package/out/tools/gazetteer-pipeline/repos/sync.js +2 -2
  494. package/out/tools/gazetteer-pipeline/street-morphology.d.ts +2 -2
  495. package/out/tools/gazetteer-pipeline/street-morphology.js +1 -1
  496. package/out/tools/gazetteer-pipeline.d.ts +1 -1
  497. package/out/tools/gazetteer-pipeline.d.ts.map +1 -1
  498. package/out/tools/gazetteer-pipeline.js +3 -2
  499. package/out/tools/gazetteer-pipeline.js.map +1 -1
  500. package/out/tools/release-tools/publish/demo-assets.d.ts +1 -1
  501. package/out/tools/release-tools/publish/hf.d.ts +4 -0
  502. package/out/tools/release-tools/publish/hf.d.ts.map +1 -1
  503. package/out/tools/release-tools/publish/hf.js +6 -1
  504. package/out/tools/release-tools/publish/hf.js.map +1 -1
  505. package/package.json +36 -36
  506. package/skills/mailwoman/SKILL.md +12 -12
  507. package/tools/coverage/census.ts +1 -1
  508. package/tools/coverage/core.ts +4 -4
  509. package/tools/coverage/jurisdictions.ts +2 -2
  510. package/tools/dev-tools/build/oa-coord-golden.run.ts +1 -1
  511. package/tools/dev-tools/ca/province-code-probe.run.ts +4 -4
  512. package/tools/dev-tools/codex/export-country-surfaces.ts +1 -1
  513. package/tools/dev-tools/collect-span-confidences.run.ts +1 -1
  514. package/tools/dev-tools/conformal-calibrate.run.ts +3 -3
  515. package/tools/dev-tools/corpus/country-less-census.run.ts +1 -1
  516. package/tools/dev-tools/corpus/dedup/cause-census.run.ts +5 -5
  517. package/tools/dev-tools/corpus/global-census.run.ts +4 -4
  518. package/tools/dev-tools/corpus/holdout/leakage.run.ts +7 -7
  519. package/tools/dev-tools/corpus/jurisdiction-coverage.run.ts +8 -8
  520. package/tools/dev-tools/corpus/overlay-plan.run.ts +4 -3
  521. package/tools/dev-tools/corpus/overture-address-census.run.ts +1 -1
  522. package/tools/dev-tools/corpus/projection-drops.run.ts +1 -1
  523. package/tools/dev-tools/corpus/region-composition.run.ts +2 -2
  524. package/tools/dev-tools/corpus/street/type/channel-arms.run.ts +3 -3
  525. package/tools/dev-tools/corpus/street/type/lexicon-coverage.run.ts +1 -1
  526. package/tools/dev-tools/corpus/surface-provenance-census.run.ts +1 -1
  527. package/tools/dev-tools/coverage-funnel.run.ts +1 -1
  528. package/tools/dev-tools/fr/admin/split/eval.run.ts +1 -1
  529. package/tools/dev-tools/fr/admin/split/selfvalidation.run.ts +5 -5
  530. package/tools/dev-tools/gb-fragment-board.run.ts +1 -1
  531. package/tools/dev-tools/generate-trace-fixture.ts +1 -1
  532. package/tools/dev-tools/grade-seed-cases.ts +1 -1
  533. package/tools/dev-tools/{honest-eval.run.ts → heldout-geography-eval.run.ts} +5 -5
  534. package/tools/dev-tools/lint-mdx-angles.ts +1 -1
  535. package/tools/dev-tools/locality/context-swap.run.ts +1 -1
  536. package/tools/dev-tools/locality/reachability.run.ts +1 -1
  537. package/tools/dev-tools/man-page.ts +4 -4
  538. package/tools/dev-tools/parse-register-census.run.ts +1 -1
  539. package/tools/dev-tools/perturb-golden.run.ts +1 -1
  540. package/tools/dev-tools/postcode/coherence/coverage.run.ts +1 -1
  541. package/tools/dev-tools/probe/referential-delta.run.ts +1 -1
  542. package/tools/dev-tools/same-data-benchmark.run.ts +7 -7
  543. package/tools/dev-tools/street-recall-full-probe.run.ts +1 -1
  544. package/tools/dev-tools/undersized-locality-census.run.ts +3 -3
  545. package/tools/dev-tools/us/locality-region-postcode-arms.run.ts +5 -4
  546. package/tools/dev-tools/us/recall-flip-census.run.ts +1 -1
  547. package/tools/eval-harness/activity-lexicon/phrase-collision-census.ts +1 -1
  548. package/tools/eval-harness/autocomplete-ladder.ts +2 -2
  549. package/tools/eval-harness/capability-manifest.ts +1 -1
  550. package/tools/eval-harness/conformance/comparators.ts +1 -1
  551. package/tools/eval-harness/conformance/fixture.ts +19 -10
  552. package/tools/eval-harness/conformance/refinement-monotonicity.ts +2 -1
  553. package/tools/eval-harness/conformance/run.ts +1 -1
  554. package/tools/eval-harness/demo/cascade/smoke.ts +4 -2
  555. package/tools/eval-harness/error-analysis.ts +2 -2
  556. package/tools/eval-harness/es-postcode-centroids.ts +1 -1
  557. package/tools/eval-harness/fr-parse-recall.ts +1 -1
  558. package/tools/eval-harness/gauntlet/ablation/gazetteer.ts +3 -2
  559. package/tools/eval-harness/gauntlet/ablation/types.ts +2 -2
  560. package/tools/eval-harness/gauntlet/ablation.ts +4 -4
  561. package/tools/eval-harness/gauntlet/cases/gb/family-possessive-qualifier.jsonl +1 -1
  562. package/tools/eval-harness/gauntlet/cases/gb/regression.jsonl +7 -0
  563. package/tools/eval-harness/gauntlet/cases/gb/venue-oracle-batch.jsonl +31 -0
  564. package/tools/eval-harness/gauntlet/cases/seed-case.ts +2 -2
  565. package/tools/eval-harness/gauntlet/cases/us/regression.jsonl +12 -0
  566. package/tools/eval-harness/gauntlet/cases/us/venue-oracle-batch.jsonl +1 -0
  567. package/tools/eval-harness/gauntlet/check-case.ts +4 -4
  568. package/tools/eval-harness/gauntlet/corpus-stamp.ts +2 -2
  569. package/tools/eval-harness/gauntlet/harness.ts +61 -29
  570. package/tools/eval-harness/gauntlet/holdout.ts +1 -1
  571. package/tools/eval-harness/gauntlet/regression.ts +6 -5
  572. package/tools/eval-harness/gauntlet/run.ts +5 -0
  573. package/tools/eval-harness/gauntlet/schema.ts +2 -2
  574. package/tools/eval-harness/hard-case-board.ts +1 -1
  575. package/tools/eval-harness/mask-regression.ts +1 -1
  576. package/tools/eval-harness/oa/resolver/admin-match.ts +7 -7
  577. package/tools/eval-harness/oa/resolver/coordinate-tiers.ts +1 -1
  578. package/tools/eval-harness/oa/resolver/options.ts +1 -1
  579. package/tools/eval-harness/oa/resolver/parse-rig.ts +13 -7
  580. package/tools/eval-harness/oa/resolver/tree-hits.ts +2 -2
  581. package/tools/eval-harness/per/locale-f1.ts +5 -0
  582. package/tools/eval-harness/phase-2-decision/decision.ts +2 -2
  583. package/tools/eval-harness/premise-linkage/schema.ts +5 -4
  584. package/tools/eval-harness/production-priors.ts +56 -0
  585. package/tools/eval-harness/same-data/concordance.ts +2 -2
  586. package/tools/eval-harness/same-data/fixture.ts +1 -1
  587. package/tools/eval-harness/same-data/score.ts +1 -2
  588. package/tools/eval-harness/score/affix.ts +6 -2
  589. package/tools/eval-harness/score/country-homograph.ts +8 -4
  590. package/tools/eval-harness/score/trends.ts +5 -5
  591. package/tools/eval-harness/semantic-utility/probe.ts +3 -3
  592. package/tools/gazetteer-pipeline/admin/enrich.ts +1 -1
  593. package/tools/gazetteer-pipeline/admin/ingest-wof.ts +14 -5
  594. package/tools/gazetteer-pipeline/admin/label-point-adjudicator.ts +2 -1
  595. package/tools/gazetteer-pipeline/admin/manifest.ts +4 -4
  596. package/tools/gazetteer-pipeline/admin.ts +6 -6
  597. package/tools/gazetteer-pipeline/borough-pairs.ts +6 -7
  598. package/tools/gazetteer-pipeline/capitals.ts +2 -1
  599. package/tools/gazetteer-pipeline/country/plan.ts +1 -1
  600. package/tools/gazetteer-pipeline/defaults.ts +3 -16
  601. package/tools/gazetteer-pipeline/evidence-lexicons.ts +2 -2
  602. package/tools/gazetteer-pipeline/fst.ts +2 -8
  603. package/tools/gazetteer-pipeline/granularity.ts +3 -3
  604. package/tools/gazetteer-pipeline/importance-fanout.ts +2 -2
  605. package/tools/gazetteer-pipeline/nsul-layer.ts +22 -10
  606. package/tools/gazetteer-pipeline/nz-localities.ts +1 -1
  607. package/tools/gazetteer-pipeline/placetype-census.ts +4 -3
  608. package/tools/gazetteer-pipeline/poi/build/brands.ts +3 -2
  609. package/tools/gazetteer-pipeline/poi/build/venue-heads.ts +39 -15
  610. package/tools/gazetteer-pipeline/poi/capture-recapture.ts +2 -1
  611. package/tools/gazetteer-pipeline/poi/defaults.ts +6 -4
  612. package/tools/gazetteer-pipeline/postcode/codepoint/comparison.ts +4 -3
  613. package/tools/gazetteer-pipeline/postcode/geonames/tail.ts +1 -1
  614. package/tools/gazetteer-pipeline/postcode/locality/base.ts +1 -1
  615. package/tools/gazetteer-pipeline/postcode/locality/kr.ts +4 -4
  616. package/tools/gazetteer-pipeline/postcode/ni/osm/parse.ts +2 -2
  617. package/tools/gazetteer-pipeline/postcode/prefix.ts +1 -1
  618. package/tools/gazetteer-pipeline/repos/sync.ts +2 -2
  619. package/tools/gazetteer-pipeline/street-morphology.ts +2 -2
  620. package/tools/gazetteer-pipeline.ts +4 -3
  621. package/tools/release-tools/publish/demo-assets.ts +1 -1
  622. package/tools/release-tools/publish/hf.ts +12 -1
  623. package/cli/commands/wof/mermaid.tsx +0 -18
  624. package/out/cli/commands/wof/mermaid.d.ts +0 -17
  625. package/out/cli/commands/wof/mermaid.d.ts.map +0 -1
  626. package/out/cli/commands/wof/mermaid.js +0 -14
  627. package/out/cli/commands/wof/mermaid.js.map +0 -1
  628. package/out/tools/dev-tools/honest-eval.run.d.ts.map +0 -1
  629. package/out/tools/dev-tools/honest-eval.run.js.map +0 -1
package/README.md CHANGED
@@ -31,7 +31,7 @@ console.log(decodeAsJSON(tree))
31
31
 
32
32
  Mailwoman is **not** an LLM and none of it is generative. It is a small
33
33
  transformer encoder (~30M params) doing BIO token classification over a 33-label
34
- address schema — boring NER, which is a feature for short, structured strings.
34
+ address schema. That plain NER design suits short, structured strings.
35
35
 
36
36
  The design splits the problem in two:
37
37
 
@@ -121,7 +121,7 @@ decodeAsTuples(result.tree)
121
121
  // [["house_number", "350"], ["street", "5th"], …]
122
122
  ```
123
123
 
124
- The tree is hierarchical and carries calibrated confidence per node:
124
+ The tree is hierarchical and records a calibrated confidence on each node:
125
125
 
126
126
  ```ts
127
127
  for (const root of result.tree.roots) {
@@ -136,7 +136,7 @@ right about 88% of the time) rather than raw scores.
136
136
 
137
137
  ### Options
138
138
 
139
- Factory options configure the pipeline; per-call `PipelineOpts` tune a single parse. The
139
+ Factory options configure the pipeline, and per-call `PipelineOpts` tune a single parse. The
140
140
  ones you'll reach for most:
141
141
 
142
142
  ```ts
@@ -169,7 +169,7 @@ mailwoman geocode "1600 Amphitheatre Pkwy, Mountain View, CA 94043"
169
169
  Programmatically, build a `WOFSQLitePlaceLookup` backend (from
170
170
  `@mailwoman/resolver-wof-sqlite`), pass it to `createWOFResolver` (from `@mailwoman/resolver`),
171
171
  and hand the resolver to `createRuntimePipeline({ classifier, resolver })`. The resolved
172
- `result.tree` roots then carry a `wof:id` and coordinate. See
172
+ `result.tree` roots then have a `wof:id` and coordinate. See
173
173
  [Getting started → Adding resolution](https://mailwoman.ai/docs/developers/get-started/install-and-first-parse)
174
174
  for the worked example.
175
175
 
@@ -6,8 +6,8 @@
6
6
  * `mailwoman corpus golden-relabel` — move a golden answer-key version onto the corpus's US
7
7
  * street-suffix convention (folded `street` → `street` + `street_suffix`). Writes a new version
8
8
  * dir plus a review deck. the parent version is read-only. See
9
- * `corpus/src/tools/golden-relabel-street.ts` for what it changes and, more importantly, what it
10
- * refuses to.
9
+ * `corpus/src/tools/golden-relabel-street.ts` for what it changes and what it
10
+ * refuses to change.
11
11
  */
12
12
 
13
13
  import { type CommandSpec, CommandTaskResult, type CommandComponent, useCommandTask } from "#cli-kit"
@@ -4,7 +4,7 @@
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
6
  * `mailwoman corpus migrate-overlays` — rewrite every overlay parquet of a corpus onto the current row
7
- * schema, where an overlay slice is one the corpus manifest lists and its base manifest does not, compared
7
+ * schema, where an overlay parquet is a file the corpus manifest lists and its base manifest does not, compared
8
8
  * by `sha256`.
9
9
  *
10
10
  * Each migrated file is written beside its original as `<name>.migrated.parquet` and no file is swapped, so the
@@ -40,7 +40,7 @@ const Cmd: CommandComponent<typeof spec> = ({ options }) => {
40
40
 
41
41
  type Manifest = Parameters<typeof baseManifestFiles>[0]
42
42
 
43
- // A slice without a hash could match another unhashed slice.
43
+ // A manifest file without a hash could match another unhashed file.
44
44
  // The migration could then skip an overlay as a base.
45
45
  const readHashedFiles = async (path: string) => {
46
46
  const files = baseManifestFiles(await readLocalJSONFile<Manifest>(path))
@@ -46,6 +46,11 @@ export const spec = {
46
46
  "Split per parquet, comma-separated. Unset puts every file in train. val or test is accepted only for a file `corpus split-slice` wrote, whose name ends .val.parquet or .test.parquet.",
47
47
  },
48
48
  note: { type: "string", required: true, description: "Manifest note" },
49
+ "replace-source": {
50
+ type: "string",
51
+ description:
52
+ "Base sources to drop, comma-separated. The base's files with each source leave the manifest and its counts, so the added files take their place.",
53
+ },
49
54
  },
50
55
  } as const satisfies CommandSpec
51
56
 
@@ -86,6 +91,7 @@ const Cmd: CommandComponent<typeof spec> = ({ options }) => {
86
91
  split: (splits[index] ?? "train") as "train" | "val" | "test",
87
92
  })),
88
93
  note: options.note,
94
+ replaceSources: options.replaceSource ? extractDelimited(options.replaceSource) : [],
89
95
  })
90
96
 
91
97
  return "done"
@@ -6,7 +6,7 @@
6
6
  * `mailwoman corpus split-slice --input <parquet> --out-dir <dir>` — route one overlay parquet
7
7
  * through the holdout policy the base build applies, writing a parquet per split it reaches.
8
8
  *
9
- * An overlay is appended to a manifest as a train file, so a country whose only rows of a given
9
+ * A corpus overlay is appended to a manifest as a train file, so a country whose only rows of a given
10
10
  * kind live in an overlay has no held-out row of that kind. Pass the per-split outputs to
11
11
  * `mailwoman corpus overlay-manifest --split` so the manifest records where each one belongs.
12
12
  */
@@ -84,7 +84,7 @@ type UploadedCorpusManifest = Partial<
84
84
  * `overlay-manifest` rewrites this count on each merge.
85
85
  *
86
86
  * `total_rows` here counts the same labeled rows as the build manifest's `total_aligned_rows`,
87
- * so the two are comparable and their difference is what the overlays added.
87
+ * so the two are comparable and their difference is what the corpus overlays added.
88
88
  */
89
89
  interface AssembledCorpusManifest {
90
90
  total_rows?: number
@@ -39,7 +39,7 @@ export const spec = {
39
39
  type: "boolean",
40
40
  default: false,
41
41
  description:
42
- "Leave out the data root's manifested databases. The document then carries the four bundles alone, " +
42
+ "Leave out the data root's manifested databases. The document then lists only the four bundles, " +
43
43
  "and no component records attribution, source vintage or build revision",
44
44
  },
45
45
  },
@@ -25,7 +25,7 @@ import {
25
25
 
26
26
  export const description =
27
27
  "Report every database in the data root and whether it records how it was built. `layer_manifest` is " +
28
- "the interface (docs/engineering/reference/layer-interface.mdx); this says how much of the root implements it."
28
+ "the interface (docs/engineering/reference/layer-interface.mdx). This report shows how much of the root implements it."
29
29
 
30
30
  /**
31
31
  * Native command-line interface consumed by the filesystem command router.
@@ -36,14 +36,14 @@ export const spec = {
36
36
  options: {
37
37
  "data-root": { type: "string", description: "Override the data root" },
38
38
  depth: { type: "string", description: "Directory levels to walk. Default 2" },
39
- all: { type: "boolean", default: false, description: "List every artifact; the default shows only the summary" },
39
+ all: { type: "boolean", default: false, description: "List every artifact. The default shows only the summary" },
40
40
  json: { type: "boolean", default: false, description: "Emit the report as JSON" },
41
41
  },
42
42
  } as const satisfies CommandSpec
43
43
 
44
44
  /**
45
- * The rollup is the actionable view: one builder's identical defect across many artifacts
46
- * reads as one problem per directory rather than one problem per file.
45
+ * The rollup is the actionable view: one builder's identical defect across several
46
+ * artifacts reads as one problem per directory rather than one problem per file.
47
47
  */
48
48
  function rollup(entries: readonly InventoryEntry[]): string[] {
49
49
  const by = new Map<string, { total: number; manifested: number; bytes: number }>()
@@ -76,7 +76,7 @@ export const spec = {
76
76
  "dry-run": {
77
77
  type: "boolean",
78
78
  default: false,
79
- description: "Print the download plan; touch no network and write no data",
79
+ description: "Print the download plan without network access or data writes",
80
80
  },
81
81
  only: {
82
82
  type: "string",
@@ -102,8 +102,8 @@ export const spec = {
102
102
  multiple: true,
103
103
  choices: OBLIGATION_REFUSALS,
104
104
  description:
105
- `Decline a bundle whose recorded expression carries this class of obligation (${OBLIGATION_REFUSALS.join(", ")}); ` +
106
- "repeatable. Default: $MAILWOMAN_REFUSE_OBLIGATIONS",
105
+ `Decline a bundle whose recorded expression has this class of obligation (${OBLIGATION_REFUSALS.join(", ")}). ` +
106
+ "Repeatable. Default: $MAILWOMAN_REFUSE_OBLIGATIONS",
107
107
  },
108
108
  },
109
109
  } as const satisfies CommandSpec
@@ -4,7 +4,7 @@
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
6
  * `mailwoman eval oracle-k`: oracle-recall@k over segment-level k-best decodes (stage-2
7
- * instrumentation). Measures the k-best rerank headroom the top-1 checks can't see: how often the
7
+ * instrumentation). Measures the k-best rerank headroom the top-1 checks can't see: the rate at which the
8
8
  * gold value appears anywhere in the top-k whole-segmentation hypotheses decoded from the current
9
9
  * model's emissions. Informational (always exits 0). The standing floors stay on `eval parity`.
10
10
  */
@@ -4,7 +4,7 @@
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
6
  * `mailwoman gazetteer anchor-lexicon`: build the gazetteer-anchor lexicon (knowledge-ladder rung
7
- * 3.2). One generated artifact, codex as the single source of truth, consumed by both the
7
+ * 3.2). One generated artifact, built only from codex, consumed by both the
8
8
  * Python trainer (gazetteer_anchor.py) and the TS inference side, so the two matchers cannot
9
9
  * drift (the PLACETYPE_ORDER lesson: dual implementations silently corrupt).
10
10
  *
@@ -134,7 +134,7 @@ const GazetteerAnchorLexicon: CommandComponent<typeof spec> = ({ options }) => {
134
134
  for (const map of [entries, codeEntries]) {
135
135
  for (const [key, bits] of map) {
136
136
  if (bits & BIT.country && bits & BIT.region) {
137
- // oxlint-disable-next-line oxc/bad-bitwise-operator -- genuine bit-set union rather than a mistyped logical or
137
+ // oxlint-disable-next-line oxc/bad-bitwise-operator -- an intended bit-set union rather than a mistyped logical or
138
138
  map.set(key, bits | BIT.homograph)
139
139
  }
140
140
  }
@@ -4,8 +4,8 @@
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
6
  * `mailwoman gazetteer build coastal` — acquire the Environment Agency's `Mapping (England, 2024)` dataset
7
- * for National Coastal Erosion Risk and build the sealed `coastal-england.db` layer. Thin wiring only: catalogue read
8
- * → download → build → verify all live in `@mailwoman/coastal/sdk`, so each stays unit-testable without Ink
7
+ * for National Coastal Erosion Risk and build the sealed `coastal-england.db` layer. This file only wires steps: the catalogue
8
+ * read, download, build and verify steps all live in `@mailwoman/coastal/sdk`, so each stays unit-testable without Ink
9
9
  * or the network in the loop. Mirrors `flood.tsx`'s progress (stderr) / summary (stdout) split.
10
10
  *
11
11
  * `--measure-resolutions` does not build. The index resolution is measured for this layer.
@@ -120,7 +120,7 @@ const GazetteerBuildPOI: CommandComponent<typeof spec> = ({ options }) => {
120
120
  // only on the selected build path, so a top-level import breaks the whole published
121
121
  // CLI on a clean install — the smoke test's clean-install leg is what catches it.
122
122
  // The osm source branch is build-local by design.
123
- // It may only resolve its SDK when actually invoked.
123
+ // It may only resolve its SDK when a run selects it.
124
124
  const { extractOSMPOIs } = await import("@mailwoman/osm/sdk/extract/poi")
125
125
 
126
126
  for await (const row of extractOSMPOIs(pbf)) {
@@ -49,7 +49,7 @@ const GazetteerBuildVenueHeads: CommandComponent<typeof spec> = ({ options }) =>
49
49
  await ingestPlaceNames({ release: options.release, onPhase: (_, detail) => log(detail ?? "") })
50
50
  }
51
51
 
52
- // Manifest slice paths start with the training host's `/data` root.
52
+ // Manifest file paths start with the training host's `/data` root.
53
53
  // This host keeps them under the data root.
54
54
  const dataRoot = dataRootPath().toString()
55
55
 
@@ -123,7 +123,7 @@ const GazetteerCensus: CommandComponent<typeof spec> = ({ options }) => {
123
123
 
124
124
  await writeLocalFile(bytes, outPath)
125
125
 
126
- // Self-verifying readback over the bytes just written rather than the in-memory nodes.
126
+ // Self-verifying readback over the bytes this run wrote rather than the in-memory nodes.
127
127
  const resolver = new PlacetypeCensusResolver(bytes)
128
128
  const probeParents = PROBE_PARENTS_BY_COUNTRY[country]
129
129
 
@@ -6,7 +6,7 @@
6
6
  * `mailwoman wof graph <localRepoDir> <placetype>` — emit a node-link graph of the WOF placetype
7
7
  * hierarchy rooted at the given placetype.
8
8
  *
9
- * Use this instead of `wof tree` when the root has many shared descendants, because the graph shape
9
+ * Use this instead of `wof tree` when the root has shared descendants, because the graph shape
10
10
  * stays compact regardless of DAG topology — each node and edge appears exactly once. The output
11
11
  * follows the d3-force / react-flow convention (`nodes`, `links` with `source`/`target`) so it drops
12
12
  * into common html graph viewers without translation.
@@ -3,10 +3,11 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * `mailwoman wof mermaid <localRepoDir> <placetype>` — render a Mermaid flowchart of the WOF
7
- * placetype hierarchy rooted at the given placetype.
6
+ * `mailwoman gazetteer inspect mermaid <localRepoDir> <placetype>` renders a Mermaid flowchart of
7
+ * the WOF placetype hierarchy rooted at the given placetype.
8
8
  *
9
- * Reads from the local `whosonfirst-placetypes` clone that `mailwoman wof sync` produces.
9
+ * It reads `<localRepoDir>/whosonfirst/whosonfirst-placetypes`, the clone that
10
+ * `mailwoman gazetteer inspect sync` produces.
10
11
  */
11
12
 
12
13
  import { Spinner } from "@inkjs/ui"
@@ -102,7 +103,7 @@ const WOFMermaid: CommandComponent<typeof spec, [string, string]> = ({ args, opt
102
103
 
103
104
  if (!placetype) {
104
105
  throw new CommandError(
105
- `No placetype named '${placetypeName}' found. Ensure '${localRepoDirectory.toString()}' contains a clone of whosonfirst/whosonfirst-placetypes (run \`mailwoman wof sync\` first).`
106
+ `No placetype named '${placetypeName}' found. Ensure '${localRepoDirectory.toString()}' contains a whosonfirst/whosonfirst-placetypes clone (run \`mailwoman gazetteer inspect sync\` first).`
106
107
  )
107
108
  }
108
109
 
@@ -52,7 +52,7 @@ import {
52
52
  const CONCURRENCY = 8
53
53
 
54
54
  /**
55
- * Above this many repositories the final list is summarized instead of printed in full.
55
+ * Above this repository count the final list is summarized instead of printed in full.
56
56
  *
57
57
  * The `▸` lines above it are complete either way.
58
58
  * This bounds the closing frame rather than the record.
@@ -16,10 +16,7 @@ import {
16
16
  splitCountryCodes,
17
17
  useCommandTask,
18
18
  } from "#cli-kit"
19
-
20
- // Overture prunes old releases from its bucket, so a stale pin makes the default ingest fail.
21
- // Keep this pin in step with `DEFAULT_RELEASE` in `gazetteer-pipeline/poi/defaults.ts`.
22
- const DEFAULT_RELEASE = "2026-07-22.0"
19
+ import { DEFAULT_RELEASE } from "#gazetteer/poi/defaults"
23
20
 
24
21
  const S3_GLOB = (release: string) =>
25
22
  `s3://overturemaps-us-west-2/release/${release}/theme=addresses/type=address/*.parquet`
@@ -205,8 +205,8 @@ async function buildDatabase(
205
205
  }
206
206
 
207
207
  using kdb = new DatabaseClient<WOFDatabase>(outPath)
208
- // Regenerated artifact: drop any prior table so a re-run with a different country set
209
- // fully replaces it and synthetic ids restart cleanly without colliding with stale rows.
208
+ // Regenerated artifact: drop any prior table so a re-run with a different country set fully
209
+ // replaces it and synthetic ids restart from the first id without colliding with stale rows.
210
210
  await kdb.schema.dropTable("spr").ifExists().execute()
211
211
 
212
212
  // Schema mirrors postalcode-intl.db's `spr` exactly, as a drop-in `--postcodes` input for build-candidate.
@@ -133,7 +133,7 @@ async function formatOverpassBlock(intent: POIIntent): Promise<string> {
133
133
  if (intent.subject.kind === "category") {
134
134
  const { getPOICategory } = await import("@mailwoman/poi-taxonomy")
135
135
  const { categoryIDs } = intent.subject
136
- // Every member needs a tag rather than just one: a union emitted from the subset that
136
+ // Every member needs a tag rather than only one: a union emitted from the subset that
137
137
  // happens to include `osmTag` is a narrower query than the one the POI branch ran.
138
138
  // The printed result would hide that difference.
139
139
  const untagged = categoryIDs.filter((id) => !getPOICategory(id)?.osmTag)
@@ -290,8 +290,8 @@ interface MultiSourceSpec {
290
290
  */
291
291
  role?: "eligibility" | "funding"
292
292
  /**
293
- * Read at most this many rows (the head of the file), so a huge source can
294
- * be sampled without pre-filtering.
293
+ * Read at most this number of rows (the head of the file), so a huge source
294
+ * can be sampled without pre-filtering.
295
295
  */
296
296
  limit?: number
297
297
  }
@@ -54,8 +54,8 @@ const ClusterManager: ParsedCommandComponent<ServerConfig> = ({ options: { cpus
54
54
  setWorkers(Array.from({ length: cpus }, () => cluster.fork()))
55
55
 
56
56
  // Tracks whether any worker has ever reached "listening" — distinguishes a
57
- // genuine boot failure (every worker died before one of them opened the port)
58
- // from an ordinary shutdown after a healthy run.
57
+ // boot failure (every worker died before one of them opened the port) from
58
+ // an ordinary shutdown after a healthy run.
59
59
  // `cluster.on("listening", …)` mirrors the per-worker wiring in WorkerStatus,
60
60
  // but at the primary, where the exit handler below can see it.
61
61
  let anyListened = false
@@ -85,8 +85,8 @@ const ClusterManager: ParsedCommandComponent<ServerConfig> = ({ options: { cpus
85
85
 
86
86
  // Graceful shutdown: a term/INT delivered to the primary pid (docker stop, systemctl stop)
87
87
  // never reaches worker JS handlers — Node's cluster teardown bypasses them.
88
- // Forward the signal explicitly so each worker's serveNode drain actually runs,
89
- // then exit once they're gone (bounded — a hung worker must not wedge the shutdown).
88
+ // Forward the signal explicitly so each worker's serveNode drain runs, then exit
89
+ // once they're gone (bounded — a hung worker must not wedge the shutdown).
90
90
  const forward = (signal: NodeJS.Signals) => {
91
91
  const alive = Object.values(cluster.workers ?? {}).filter(isPresent)
92
92
 
@@ -224,7 +224,7 @@ const ChildThread: ParsedCommandComponent<ServerConfig> = ({ options: { port, ho
224
224
  // The rest exit silently.
225
225
  // Chosen over a primary-side pre-fork check
226
226
  // (the primary doesn't otherwise call createServeEngine() at all. An import
227
- // and database-existence check there just to avoid forking would change more code)
227
+ // and database-existence check there only to avoid forking would change more code)
228
228
  // and over routing the message back through the primary's cluster "exit" handler
229
229
  // (would require an IPC round-trip for what's a one-line dedupe).
230
230
  if (cluster.worker?.id === 1) {
@@ -76,7 +76,7 @@ export const spec = {
76
76
  *
77
77
  * NH + HI have zero Overture address coverage in this release, so they're absent —
78
78
  * interpolation-only states.
79
- * VI (territory) included for completeness.
79
+ * VI (territory) is also included.
80
80
  * Harmless if the parser's region→slug map skips it.
81
81
  */
82
82
  const STATES_BY_COVERAGE = [
@@ -8,7 +8,7 @@
8
8
  * SpatiaLite).
9
9
  *
10
10
  * A valid cached ZIP is reused. Re-running a state replaces its rows. Pass
11
- * `--county <FIPS3>` to load just one county (handy for downstream per-county work).
11
+ * `--county <FIPS3>` to load one county (handy for downstream per-county work).
12
12
  */
13
13
 
14
14
  import { Spinner } from "@inkjs/ui"
@@ -112,7 +112,7 @@ export function mapPaneCellSize(columns: number, rows: number): { columns: numbe
112
112
  }
113
113
 
114
114
  /**
115
- * How many output lines are visible at once, exported so a caller clamping its scroll
115
+ * The number of output lines visible at once, exported so a caller clamping its scroll
116
116
  * offset uses the pane's own arithmetic rather than a second copy.
117
117
  */
118
118
  export function outputPaneCapacity(rows: number): number {
@@ -58,7 +58,7 @@ function formatMsFixed(ms: number): string {
58
58
  }
59
59
 
60
60
  /**
61
- * Whether the per-span script is worth printing: the tree holds more than one writing system,
61
+ * Whether to print the per-span script: true when the tree holds more than one writing system,
62
62
  * with `Zyyy` excluded because a house number or postcode answers it.
63
63
  */
64
64
  function scriptsWorthShowing(tree: AddressTree): boolean {
@@ -12,7 +12,7 @@ import type { GeocodeTrace } from "#geocode/session"
12
12
  // #region Shared
13
13
 
14
14
  /**
15
- * What a row shows where the datum genuinely does not exist, kept as a single constant
15
+ * What a row shows where the datum does not exist, kept as a single constant
16
16
  * so every kind of absence reads the same.
17
17
  */
18
18
  export const ABSENT = "—"
@@ -90,8 +90,8 @@ export function tokensRow(trace: GeocodeTrace | null): string {
90
90
  }
91
91
 
92
92
  /**
93
- * Per channel, how many pieces contributed a nonzero clue and which ones: `not fed` is
94
- * an unwired source while `0/12` is a wired channel that matched no entry.
93
+ * Per channel, the count of pieces that contributed a nonzero clue and which ones:
94
+ * `not fed` is an unwired source while `0/12` is a wired channel that matched no entry.
95
95
  */
96
96
  export function channelsRow(trace: GeocodeTrace | null): string {
97
97
  if (!trace) return ABSENT
@@ -121,7 +121,7 @@ export function channelsRow(trace: GeocodeTrace | null): string {
121
121
 
122
122
  /**
123
123
  * What the decode did: algorithm, mean per-token confidence, component sequence,
124
- * priors that actually contributed a nonzero bias and repair passes that changed a label.
124
+ * priors that contributed a nonzero bias and repair passes that changed a label.
125
125
  */
126
126
  export function decodeRow(trace: GeocodeTrace | null): string {
127
127
  if (!trace) return ABSENT
@@ -639,7 +639,7 @@ export interface LayerLicenseObservation {
639
639
  /**
640
640
  * Lists other `.db` files in the layer's directory when the expected file is absent.
641
641
  *
642
- * These usually come from a build written under a name the session does not attach.
642
+ * A listed file can come from a build written under a name the session does not attach.
643
643
  */
644
644
  alternates: string[] | null
645
645
  }
@@ -76,7 +76,7 @@ export interface DoctorDeps {
76
76
  weightsPackageName(locale: string): string
77
77
  dataRoot(): { path: string; fromEnv: boolean }
78
78
  /**
79
- * The candidate.db the tools would actually use, with no convention-path fallback —
79
+ * The candidate.db the tools would open, with no convention-path fallback —
80
80
  * the same precedence geocode and serve apply.
81
81
  */
82
82
  envCandidatePath(): Promise<string | null>
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * Results handed to the render prop:
12
12
  *
13
- * - `"neural"` — weights resolve (pre-existing, or just downloaded); render the real command.
13
+ * - `"neural"` — weights resolve (pre-existing, or downloaded by this guard); render the real command.
14
14
  * - `"declined"` — the user said no, the download failed, or `--degraded` was passed. the caller
15
15
  * renders its degraded (encoder-less) mode.
16
16
  * - `"unavailable"` — weights absent + non-interactive stdin and no flag. the caller keeps its
@@ -31,7 +31,7 @@ export const spec = {
31
31
  validate: (value) => Number.isInteger(value) && value >= 1 && value <= 100,
32
32
  validationMessage: "--limit must be an integer between 1 and 100.",
33
33
  },
34
- fst: { type: "string", hint: "path", description: "FST binary; defaults from $MAILWOMAN_FST_BIN." },
34
+ fst: { type: "string", hint: "path", description: "FST binary. The default comes from $MAILWOMAN_FST_BIN." },
35
35
  json: {
36
36
  type: "boolean",
37
37
  default: false,
@@ -14,7 +14,7 @@ import { booleanValue, type CommandSpec, runNativeCommand } from "#cli/native/sp
14
14
  export const spec = {
15
15
  name: "doctor",
16
16
  description:
17
- "Check whether this machine can run mailwoman, and what each gap costs you. Runtime first (node, ONNX), then the model weights, then the optional data layers geocoding needs. A missing layer is reported, never fatal, and every failing line carries the one command that closes it. Then the license posture: the branch of mailwoman's license that applies to this installation, and the obligations each attached layer's recorded license carries (attribution, share-alike, source offer).",
17
+ "Check whether this machine can run mailwoman, and what each gap costs you. Runtime first (node, ONNX), then the model weights, then the optional data layers geocoding needs. A missing layer is reported, never fatal, and every failing line prints the one command that closes it. Then the license posture: the branch of mailwoman's license that applies to this installation, and the obligations each attached layer's recorded license imposes (attribution, share-alike, source offer).",
18
18
  options: {
19
19
  json: {
20
20
  type: "boolean",
@@ -9,6 +9,7 @@
9
9
  import { type GeocodeResult, VariantAliasExemptionSchema } from "@mailwoman/core/geocode"
10
10
  import { prettyJSON, stringifyJSON } from "@mailwoman/core/json"
11
11
  import type { PipelineTiming } from "@mailwoman/core/pipeline"
12
+ import { DEFAULT_VENUE_HEAD_BIAS_SCALE } from "@mailwoman/neural/venue/head-prior"
12
13
 
13
14
  import { resolveEngineStamp } from "#cli/kit/engine-stamp"
14
15
  import {
@@ -54,7 +55,7 @@ export const spec = {
54
55
  "default-country": {
55
56
  type: "string",
56
57
  hint: "country",
57
- description: "ISO-3166 resolver country scope; pass none to disable it.",
58
+ description: "ISO-3166 resolver country scope. Pass none to disable it.",
58
59
  },
59
60
  "country-scope": {
60
61
  type: "string",
@@ -102,10 +103,16 @@ export const spec = {
102
103
  },
103
104
  "venue-head-bias-scale": {
104
105
  type: "number",
105
- default: 1,
106
+ default: DEFAULT_VENUE_HEAD_BIAS_SCALE,
106
107
  hint: "multiplier",
107
108
  description: "Multiplier on the venue-head table's biases.",
108
109
  },
110
+ "street-morphology-prior": {
111
+ type: "boolean",
112
+ default: true,
113
+ description:
114
+ "Bias a trailing street-type affix toward the street labels when its segment opens with a house number; --no-street-morphology-prior disables it.",
115
+ },
109
116
  "place-country": {
110
117
  type: "boolean",
111
118
  default: true,
@@ -215,6 +222,7 @@ async function optionsOf(values: Record<string, unknown>): Promise<GeocodeOption
215
222
  gazetteerPrior: booleanValue(values, "gazetteer-prior"),
216
223
  venueHeadPrior: booleanValue(values, "venue-head-prior"),
217
224
  venueHeadBiasScale: numberValue(values, "venue-head-bias-scale")!,
225
+ streetMorphologyPrior: booleanValue(values, "street-morphology-prior"),
218
226
  placeCountry: booleanValue(values, "place-country"),
219
227
  postcodeCountryCoherence: booleanValue(values, "postcode-country-coherence"),
220
228
  forkEntity: booleanValue(values, "fork-entity"),
@@ -60,7 +60,7 @@ import { readMailwomanManifest } from "#metadata"
60
60
  export const spec = {
61
61
  name: "license",
62
62
  description:
63
- "Mint, issue, verify, adopt and refresh commercial license keys. `keygen` writes an Ed25519 signing pair under $MAILWOMAN_CONFIG_ROOT/license and prints the public key with its id; `issue` signs a key for a licensee; `verify` checks a token offline against the public keys this build trusts; `register` prints the well-known key file the shipped register derives; `adopt <token> --secret <s>` writes a purchased key to $MAILWOMAN_CONFIG_ROOT/license/key and its refresh secret beside it; `refresh` fetches the current key after a renewal. Without a key the AGPL-3.0-only branch applies — `mailwoman doctor` says which branch applies and why.",
63
+ "Mint, issue, verify, adopt and refresh commercial license keys. `keygen` writes an Ed25519 signing pair under $MAILWOMAN_CONFIG_ROOT/license and prints the public key with its id. `issue` signs a key for a licensee. `verify` checks a token offline against the public keys this build trusts. `register` prints the well-known key file the shipped register derives. `adopt <token> --secret <s>` writes a purchased key to $MAILWOMAN_CONFIG_ROOT/license/key and its refresh secret beside it. `refresh` fetches the current key after a renewal. Without a key the AGPL-3.0-only branch applies — `mailwoman doctor` reports which branch applies and why.",
64
64
  positionals: [
65
65
  {
66
66
  name: "action",
@@ -79,7 +79,7 @@ export const spec = {
79
79
  type: "string",
80
80
  hint: "secret",
81
81
  description:
82
- "adopt: the refresh secret from the purchase page or the first email, stored beside the key; refresh: the secret, when not reading the credentials file.",
82
+ "adopt: the refresh secret from the purchase page or the first email, stored beside the key. refresh: the secret, when not reading the credentials file.",
83
83
  },
84
84
  licensee: {
85
85
  type: "string",
@@ -257,9 +257,9 @@ function refusalFor(verification: LicenseKeyVerification): string | null {
257
257
  /**
258
258
  * The `lid` in a token, when the self-service worker issued it.
259
259
  *
260
- * For a token this build cannot verify the payload is read as written:
261
- * the license's public status is the one thing worth asking about such a token,
262
- * since it identifies whether the action is an upgrade or a purchase.
260
+ * For a token this build cannot verify the payload is read as written: the command
261
+ * asks only for the license's public status for such a token, since it identifies
262
+ * whether the action is an upgrade or a purchase.
263
263
  */
264
264
  function licenseIDOf(verification: LicenseKeyVerification, token: string): string | null {
265
265
  const payload = "payload" in verification ? verification.payload : decodeLicenseKeyPayload(token)
@@ -36,7 +36,7 @@ export const spec = {
36
36
  "polygons-db": {
37
37
  type: "string",
38
38
  hint: "path",
39
- description: "Optional polygon sidecar; without it containment is approximate.",
39
+ description: "Optional polygon sidecar. Without it, containment is approximate.",
40
40
  },
41
41
  format: {
42
42
  type: "string",
@@ -137,7 +137,7 @@ export const RUNG_RADIUS_FLOOR_KM: Readonly<Record<string, number>> = {
137
137
  export const COINCIDENT_PLACE_KM = 10
138
138
 
139
139
  /**
140
- * Decisive log10 population margin for names.
140
+ * The log10 population margin by which a name's top candidate must lead the runner-up.
141
141
  */
142
142
  export const DECISIVE_MARGIN_LOG10 = 0.5
143
143
 
@@ -317,7 +317,7 @@ export function dominanceMarginLog10(places: readonly AblationPlace[]): number {
317
317
  }
318
318
 
319
319
  /**
320
- * True if top candidate is decisive.
320
+ * True if the top candidate leads the runner-up by at least the log10 population margin.
321
321
  */
322
322
  export function isDecisive(places: readonly AblationPlace[]): boolean {
323
323
  return places.length > 0 && dominanceMarginLog10(places) >= DECISIVE_MARGIN_LOG10
@@ -821,8 +821,8 @@ export function collapseCoincident(places: readonly AblationPlace[]): AblationPl
821
821
  /**
822
822
  * Coarseness rank: higher is more precise.
823
823
  *
824
- * The tier ladder is `address_point → interpolated → street → admin`, and a deletion that
825
- * walks down it has cost the user precision even when the coordinate barely moved.
824
+ * The tier ladder is `address_point → interpolated → street → postcode → admin`, and a deletion
825
+ * that walks down it has cost the user precision even when the coordinate barely moved.
826
826
  */
827
827
  export function tierRank(tier: ResolutionTier): number {
828
828
  switch (tier) {
@@ -830,10 +830,12 @@ export function tierRank(tier: ResolutionTier): number {
830
830
  case "venue":
831
831
  case "address_point":
832
832
  case "plus_code":
833
- return 4
833
+ return 5
834
834
  case "interpolated":
835
- return 3
835
+ return 4
836
836
  case "street":
837
+ return 3
838
+ case "postcode":
837
839
  return 2
838
840
  case "admin":
839
841
  return 1
@@ -211,7 +211,8 @@ export interface AdminCoherenceTreeNode extends AdminCoherenceSourceNode {
211
211
  /**
212
212
  * Builds the `admin_coherence` field for a forked-entity answer.
213
213
  *
214
- * The entity has a country but no ancestry, so a parsed region is usually `unverifiable`.
214
+ * The entity has a country but no ancestry, so a parsed region has no ancestor to match
215
+ * and can come back `unverifiable`.
215
216
  */
216
217
  export function forkedEntityCoherenceField(
217
218
  roots: readonly AdminCoherenceTreeNode[],