@mailwoman/corpus 9.4.0 → 10.0.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 (981) hide show
  1. package/README.md +16 -0
  2. package/lib/adapters/geonames/adapter.ts +3 -3
  3. package/lib/adapters/geonames/postal/adapter.ts +122 -0
  4. package/lib/adapters/index.ts +39 -32
  5. package/lib/adapters/openaddresses/adapter.ts +4 -7
  6. package/lib/adapters/osm/adapter.ts +278 -0
  7. package/lib/adapters/overture/adapter.ts +22 -7
  8. package/lib/adapters/utils/index.ts +1 -1
  9. package/lib/adapters/wof/admin/json/adapter.ts +239 -0
  10. package/lib/adapters/wof/json-rows.ts +181 -0
  11. package/lib/adapters/wof/postalcode-json/adapter.ts +196 -0
  12. package/lib/au/adapters/gnaf/adapter.ts +152 -0
  13. package/lib/au/adapters/gnaf/assemble.ts +225 -0
  14. package/lib/de/recipes/locale.ts +360 -0
  15. package/lib/fr/adapters/ban/adapter.ts +159 -0
  16. package/lib/fr/recipes/admin-split.ts +243 -0
  17. package/lib/fr/recipes/bare-street.ts +171 -0
  18. package/lib/fr/recipes/fragment.ts +334 -0
  19. package/lib/fr/recipes/lieudit.ts +274 -0
  20. package/lib/fr/recipes/order.ts +246 -0
  21. package/lib/fr/tools/fetch/ban.ts +289 -0
  22. package/lib/index.ts +1 -1
  23. package/lib/international/recipes/locale.ts +598 -0
  24. package/lib/jp/tools/fetch/houjin.ts +141 -0
  25. package/lib/kr/adapters/juso/label-rows.ts +259 -0
  26. package/lib/kr/adapters/localdata/align.ts +299 -0
  27. package/lib/kr/adapters/localdata/key-index.ts +185 -0
  28. package/lib/kr/adapters/localdata/permit-rows.ts +186 -0
  29. package/lib/kr/tools/fetch/juso.ts +172 -0
  30. package/lib/kr/tools/fetch/localdata.ts +206 -0
  31. package/lib/recipes/bare/postcode/eval.ts +99 -0
  32. package/lib/recipes/bare/postcode/index.ts +327 -0
  33. package/lib/recipes/country-balanced.ts +1 -1
  34. package/lib/recipes/index.ts +28 -21
  35. package/lib/recipes/intersection.ts +1 -1
  36. package/lib/recipes/po/box/cedex/au-nz.ts +82 -0
  37. package/lib/recipes/po/box/cedex/ca.ts +58 -0
  38. package/lib/recipes/po/box/cedex/fr.ts +76 -0
  39. package/lib/recipes/po/box/cedex/phrases.ts +108 -0
  40. package/lib/recipes/po/box/cedex/recipe.ts +203 -0
  41. package/lib/recipes/po/box/cedex/sources.ts +189 -0
  42. package/lib/recipes/po/box/cedex/types.ts +35 -0
  43. package/lib/recipes/po/box/cedex/us.ts +69 -0
  44. package/lib/recipes/po/box/cedex/vocabulary.ts +106 -0
  45. package/lib/recipes/po/box/cedex.ts +9 -0
  46. package/lib/recipes/po/box/index.ts +128 -0
  47. package/lib/recipes/scaffold.ts +18 -41
  48. package/lib/recipes/street/affix.ts +807 -0
  49. package/lib/recipes/sub/venue/context.ts +149 -0
  50. package/lib/recipes/sub/venue/index.ts +997 -0
  51. package/lib/recipes/sub/venue/sources.ts +739 -0
  52. package/lib/recipes/trailing-region.ts +6 -1
  53. package/lib/recipes/unit.ts +1 -1
  54. package/lib/sg/recipes/register.ts +270 -0
  55. package/lib/sg/tools/fetch/acra.ts +179 -0
  56. package/lib/south-asia/recipes/register.ts +214 -0
  57. package/lib/synthesizers/anchor-absorption.ts +1 -1
  58. package/lib/synthesizers/locale.ts +261 -0
  59. package/lib/synthesizers/street.ts +1 -1
  60. package/lib/synthesizers/utils.ts +2 -2
  61. package/lib/tools/audit.ts +3 -2
  62. package/lib/tools/corpus-stats.ts +3 -3
  63. package/lib/tools/fetch/download/index.ts +10 -0
  64. package/lib/tools/fetch/download/manifest.ts +102 -0
  65. package/lib/tools/fetch/download/network.ts +226 -0
  66. package/lib/tools/fetch/download/retry.ts +173 -0
  67. package/lib/tools/fetch/geonames/dump.ts +257 -0
  68. package/lib/tools/fetch/geonames/postal.ts +180 -0
  69. package/lib/tools/fetch/index.ts +30 -30
  70. package/lib/tools/fetch/openaddresses.ts +2 -2
  71. package/lib/tools/fetch/ourairports.ts +2 -2
  72. package/lib/tools/fetch/ppd.ts +1 -3
  73. package/lib/tools/fetch/wikidata-subvenue.ts +2 -2
  74. package/lib/tools/golden/promote.ts +340 -0
  75. package/lib/tools/golden/relabel-street/directory.ts +340 -0
  76. package/lib/tools/golden/relabel-street/index.ts +9 -0
  77. package/lib/tools/golden/relabel-street/row.ts +361 -0
  78. package/lib/tools/index.ts +10 -10
  79. package/lib/tools/ingest-csv.ts +5 -7
  80. package/lib/tools/lint/slice/vocab.ts +376 -0
  81. package/lib/tools/overlay-manifest.ts +92 -25
  82. package/lib/tools/overture-subvenue.ts +1 -1
  83. package/lib/tools/postcode-triples.ts +138 -14
  84. package/lib/tools/sub/venue/harvest.ts +234 -0
  85. package/lib/tools/sub/venue/head-nouns.ts +245 -0
  86. package/lib/tools/sub/venue/lexicon.ts +429 -0
  87. package/lib/tools/sub/venue/surfaces.ts +95 -0
  88. package/lib/tools/sub/venue/table.ts +281 -0
  89. package/lib/tools/sub/venue/wikidata.ts +85 -0
  90. package/lib/tw/tools/fetch/gcis.ts +180 -0
  91. package/lib/types.ts +1 -1
  92. package/lib/us/adapters/fcc-bdc/adapter.ts +173 -0
  93. package/lib/us/adapters/state/hi-schools/adapter.ts +160 -0
  94. package/lib/us/adapters/state/ia-contractors/adapter.ts +136 -0
  95. package/lib/us/adapters/state/ny-notaries/adapter.ts +133 -0
  96. package/lib/us/adapters/state/tx-notaries/adapter.ts +149 -0
  97. package/lib/us/adapters/tiger/adapter.ts +250 -0
  98. package/lib/us/adapters/usgov/hrsa-fqhc/adapter.ts +156 -0
  99. package/lib/us/adapters/usgov/imls-pls/adapter.ts +134 -0
  100. package/lib/us/adapters/usgov/irs-bmf/adapter.ts +145 -0
  101. package/lib/us/adapters/usgov/nad/adapter.ts +324 -0
  102. package/lib/us/adapters/usgov/nppes/adapter.ts +143 -0
  103. package/lib/us/adapters/usgov/samhsa-treatment-locator/adapter.ts +182 -0
  104. package/lib/us/tools/fetch/hrsa.ts +59 -0
  105. package/lib/us/tools/fetch/imls-pls.ts +149 -0
  106. package/lib/us/tools/fetch/nad.ts +341 -0
  107. package/lib/us/tools/fetch/nppes.ts +165 -0
  108. package/lib/us/tools/fetch/state/hi-schools.ts +161 -0
  109. package/lib/us/tools/fetch/state/sources.ts +146 -0
  110. package/lib/us/tools/fetch/tiger-full.ts +308 -0
  111. package/lib/utils/align.ts +1 -1
  112. package/lib/utils/golden.ts +12 -8
  113. package/lib/utils/wof-json.ts +7 -13
  114. package/out/adapters/geonames/adapter.d.ts +1 -1
  115. package/out/adapters/geonames/adapter.js +3 -3
  116. package/out/adapters/geonames/adapter.js.map +1 -1
  117. package/out/adapters/geonames/postal/adapter.d.ts.map +1 -0
  118. package/out/adapters/geonames/postal/adapter.js +107 -0
  119. package/out/adapters/geonames/postal/adapter.js.map +1 -0
  120. package/out/adapters/index.d.ts +16 -16
  121. package/out/adapters/index.d.ts.map +1 -1
  122. package/out/adapters/index.js +34 -32
  123. package/out/adapters/index.js.map +1 -1
  124. package/out/adapters/openaddresses/adapter.d.ts.map +1 -1
  125. package/out/adapters/openaddresses/adapter.js +4 -6
  126. package/out/adapters/openaddresses/adapter.js.map +1 -1
  127. package/out/adapters/osm/adapter.d.ts +95 -0
  128. package/out/adapters/osm/adapter.d.ts.map +1 -0
  129. package/out/adapters/osm/adapter.js +211 -0
  130. package/out/adapters/osm/adapter.js.map +1 -0
  131. package/out/adapters/overture/adapter.d.ts +10 -0
  132. package/out/adapters/overture/adapter.d.ts.map +1 -1
  133. package/out/adapters/overture/adapter.js +20 -7
  134. package/out/adapters/overture/adapter.js.map +1 -1
  135. package/out/adapters/synth-po-box/adapter.js.map +1 -1
  136. package/out/adapters/utils/index.d.ts +1 -1
  137. package/out/adapters/utils/index.d.ts.map +1 -1
  138. package/out/adapters/utils/index.js.map +1 -1
  139. package/out/adapters/wof/admin/json/adapter.d.ts +79 -0
  140. package/out/adapters/wof/admin/json/adapter.d.ts.map +1 -0
  141. package/out/adapters/wof/admin/json/adapter.js +204 -0
  142. package/out/adapters/wof/admin/json/adapter.js.map +1 -0
  143. package/out/adapters/wof/json-rows.d.ts +73 -0
  144. package/out/adapters/wof/json-rows.d.ts.map +1 -0
  145. package/out/adapters/wof/json-rows.js +115 -0
  146. package/out/adapters/wof/json-rows.js.map +1 -0
  147. package/out/adapters/wof/postalcode-json/adapter.d.ts +65 -0
  148. package/out/adapters/wof/postalcode-json/adapter.d.ts.map +1 -0
  149. package/out/adapters/wof/postalcode-json/adapter.js +167 -0
  150. package/out/adapters/wof/postalcode-json/adapter.js.map +1 -0
  151. package/out/au/adapters/gnaf/adapter.d.ts.map +1 -0
  152. package/out/au/adapters/gnaf/adapter.js +127 -0
  153. package/out/au/adapters/gnaf/adapter.js.map +1 -0
  154. package/out/au/adapters/gnaf/assemble.d.ts +65 -0
  155. package/out/au/adapters/gnaf/assemble.d.ts.map +1 -0
  156. package/out/au/adapters/gnaf/assemble.js +154 -0
  157. package/out/au/adapters/gnaf/assemble.js.map +1 -0
  158. package/out/cn/recipes/organizational-units.d.ts +36 -0
  159. package/out/cn/recipes/organizational-units.d.ts.map +1 -0
  160. package/out/cn/recipes/organizational-units.js +159 -0
  161. package/out/cn/recipes/organizational-units.js.map +1 -0
  162. package/out/cz/recipes/pcfirst-preposition.d.ts +22 -0
  163. package/out/cz/recipes/pcfirst-preposition.d.ts.map +1 -0
  164. package/out/cz/recipes/pcfirst-preposition.js +101 -0
  165. package/out/cz/recipes/pcfirst-preposition.js.map +1 -0
  166. package/out/de/recipes/locale.d.ts +44 -0
  167. package/out/de/recipes/locale.d.ts.map +1 -0
  168. package/out/de/recipes/locale.js +289 -0
  169. package/out/de/recipes/locale.js.map +1 -0
  170. package/out/env.d.ts +1 -1
  171. package/out/fr/adapters/ban/adapter.d.ts.map +1 -0
  172. package/out/fr/adapters/ban/adapter.js +123 -0
  173. package/out/fr/adapters/ban/adapter.js.map +1 -0
  174. package/out/fr/adapters/ban/street-decompose.d.ts.map +1 -0
  175. package/out/fr/adapters/ban/street-decompose.js.map +1 -0
  176. package/out/fr/recipes/admin-split.d.ts +38 -0
  177. package/out/fr/recipes/admin-split.d.ts.map +1 -0
  178. package/out/fr/recipes/admin-split.js +192 -0
  179. package/out/fr/recipes/admin-split.js.map +1 -0
  180. package/out/fr/recipes/bare-street.d.ts +28 -0
  181. package/out/fr/recipes/bare-street.d.ts.map +1 -0
  182. package/out/fr/recipes/bare-street.js +144 -0
  183. package/out/fr/recipes/bare-street.js.map +1 -0
  184. package/out/fr/recipes/fragment.d.ts +77 -0
  185. package/out/fr/recipes/fragment.d.ts.map +1 -0
  186. package/out/fr/recipes/fragment.js +277 -0
  187. package/out/fr/recipes/fragment.js.map +1 -0
  188. package/out/fr/recipes/lieudit.d.ts +32 -0
  189. package/out/fr/recipes/lieudit.d.ts.map +1 -0
  190. package/out/fr/recipes/lieudit.js +211 -0
  191. package/out/fr/recipes/lieudit.js.map +1 -0
  192. package/out/fr/recipes/order.d.ts +38 -0
  193. package/out/fr/recipes/order.d.ts.map +1 -0
  194. package/out/fr/recipes/order.js +198 -0
  195. package/out/fr/recipes/order.js.map +1 -0
  196. package/out/fr/tools/fetch/ban.d.ts +31 -0
  197. package/out/fr/tools/fetch/ban.d.ts.map +1 -0
  198. package/out/fr/tools/fetch/ban.js +239 -0
  199. package/out/fr/tools/fetch/ban.js.map +1 -0
  200. package/out/index.d.ts +1 -1
  201. package/out/index.d.ts.map +1 -1
  202. package/out/index.js +1 -1
  203. package/out/index.js.map +1 -1
  204. package/out/international/recipes/locale.d.ts +136 -0
  205. package/out/international/recipes/locale.d.ts.map +1 -0
  206. package/out/international/recipes/locale.js +458 -0
  207. package/out/international/recipes/locale.js.map +1 -0
  208. package/out/jp/adapters/wof-admin/adapter.d.ts.map +1 -0
  209. package/out/jp/adapters/wof-admin/adapter.js.map +1 -0
  210. package/out/jp/tools/fetch/houjin.d.ts +24 -0
  211. package/out/jp/tools/fetch/houjin.d.ts.map +1 -0
  212. package/out/jp/tools/fetch/houjin.js +102 -0
  213. package/out/jp/tools/fetch/houjin.js.map +1 -0
  214. package/out/kr/adapters/juso/label-rows.d.ts +76 -0
  215. package/out/kr/adapters/juso/label-rows.d.ts.map +1 -0
  216. package/out/kr/adapters/juso/label-rows.js +194 -0
  217. package/out/kr/adapters/juso/label-rows.js.map +1 -0
  218. package/out/kr/adapters/localdata/align.d.ts +43 -0
  219. package/out/kr/adapters/localdata/align.d.ts.map +1 -0
  220. package/out/kr/adapters/localdata/align.js +223 -0
  221. package/out/kr/adapters/localdata/align.js.map +1 -0
  222. package/out/kr/adapters/localdata/key-index.d.ts +71 -0
  223. package/out/kr/adapters/localdata/key-index.d.ts.map +1 -0
  224. package/out/kr/adapters/localdata/key-index.js +133 -0
  225. package/out/kr/adapters/localdata/key-index.js.map +1 -0
  226. package/out/kr/adapters/localdata/permit-rows.d.ts +66 -0
  227. package/out/kr/adapters/localdata/permit-rows.d.ts.map +1 -0
  228. package/out/kr/adapters/localdata/permit-rows.js +131 -0
  229. package/out/kr/adapters/localdata/permit-rows.js.map +1 -0
  230. package/out/kr/tools/fetch/juso.d.ts +30 -0
  231. package/out/kr/tools/fetch/juso.d.ts.map +1 -0
  232. package/out/kr/tools/fetch/juso.js +120 -0
  233. package/out/kr/tools/fetch/juso.js.map +1 -0
  234. package/out/kr/tools/fetch/localdata.d.ts +30 -0
  235. package/out/kr/tools/fetch/localdata.d.ts.map +1 -0
  236. package/out/kr/tools/fetch/localdata.js +139 -0
  237. package/out/kr/tools/fetch/localdata.js.map +1 -0
  238. package/out/nl/recipes/postcode.d.ts +26 -0
  239. package/out/nl/recipes/postcode.d.ts.map +1 -0
  240. package/out/nl/recipes/postcode.js +103 -0
  241. package/out/nl/recipes/postcode.js.map +1 -0
  242. package/out/no/recipes/fragment.d.ts +43 -0
  243. package/out/no/recipes/fragment.d.ts.map +1 -0
  244. package/out/no/recipes/fragment.js +183 -0
  245. package/out/no/recipes/fragment.js.map +1 -0
  246. package/out/no/recipes/street/index.d.ts +18 -0
  247. package/out/no/recipes/street/index.d.ts.map +1 -0
  248. package/out/no/recipes/street/index.js +72 -0
  249. package/out/no/recipes/street/index.js.map +1 -0
  250. package/out/no/recipes/street/led.d.ts +24 -0
  251. package/out/no/recipes/street/led.d.ts.map +1 -0
  252. package/out/no/recipes/street/led.js +114 -0
  253. package/out/no/recipes/street/led.js.map +1 -0
  254. package/out/recipes/bare/country.d.ts +25 -0
  255. package/out/recipes/bare/country.d.ts.map +1 -0
  256. package/out/recipes/bare/country.js +88 -0
  257. package/out/recipes/bare/country.js.map +1 -0
  258. package/out/recipes/bare/postcode/eval.d.ts +29 -0
  259. package/out/recipes/bare/postcode/eval.d.ts.map +1 -0
  260. package/out/recipes/bare/postcode/eval.js +85 -0
  261. package/out/recipes/bare/postcode/eval.js.map +1 -0
  262. package/out/recipes/bare/postcode/index.d.ts +62 -0
  263. package/out/recipes/bare/postcode/index.d.ts.map +1 -0
  264. package/out/recipes/bare/postcode/index.js +267 -0
  265. package/out/recipes/bare/postcode/index.js.map +1 -0
  266. package/out/recipes/country-balanced.js.map +1 -1
  267. package/out/recipes/index.d.ts.map +1 -1
  268. package/out/recipes/index.js +28 -21
  269. package/out/recipes/index.js.map +1 -1
  270. package/out/recipes/intersection.js.map +1 -1
  271. package/out/recipes/po/box/cedex/au-nz.d.ts +7 -0
  272. package/out/recipes/po/box/cedex/au-nz.d.ts.map +1 -0
  273. package/out/recipes/po/box/cedex/au-nz.js +56 -0
  274. package/out/recipes/po/box/cedex/au-nz.js.map +1 -0
  275. package/out/recipes/po/box/cedex/ca.d.ts +7 -0
  276. package/out/recipes/po/box/cedex/ca.d.ts.map +1 -0
  277. package/out/recipes/po/box/cedex/ca.js +38 -0
  278. package/out/recipes/po/box/cedex/ca.js.map +1 -0
  279. package/out/recipes/po/box/cedex/fr.d.ts +7 -0
  280. package/out/recipes/po/box/cedex/fr.d.ts.map +1 -0
  281. package/out/recipes/po/box/cedex/fr.js +57 -0
  282. package/out/recipes/po/box/cedex/fr.js.map +1 -0
  283. package/out/recipes/po/box/cedex/phrases.d.ts +8 -0
  284. package/out/recipes/po/box/cedex/phrases.d.ts.map +1 -0
  285. package/out/recipes/po/box/cedex/phrases.js +76 -0
  286. package/out/recipes/po/box/cedex/phrases.js.map +1 -0
  287. package/out/recipes/po/box/cedex/recipe.d.ts +9 -0
  288. package/out/recipes/po/box/cedex/recipe.d.ts.map +1 -0
  289. package/out/recipes/po/box/cedex/recipe.js +153 -0
  290. package/out/recipes/po/box/cedex/recipe.js.map +1 -0
  291. package/out/recipes/po/box/cedex/sources.d.ts +86 -0
  292. package/out/recipes/po/box/cedex/sources.d.ts.map +1 -0
  293. package/out/recipes/po/box/cedex/sources.js +143 -0
  294. package/out/recipes/po/box/cedex/sources.js.map +1 -0
  295. package/out/recipes/po/box/cedex/types.d.ts +31 -0
  296. package/out/recipes/po/box/cedex/types.d.ts.map +1 -0
  297. package/out/recipes/po/box/cedex/types.js +5 -0
  298. package/out/recipes/po/box/cedex/types.js.map +1 -0
  299. package/out/recipes/po/box/cedex/us.d.ts +7 -0
  300. package/out/recipes/po/box/cedex/us.d.ts.map +1 -0
  301. package/out/recipes/po/box/cedex/us.js +51 -0
  302. package/out/recipes/po/box/cedex/us.js.map +1 -0
  303. package/out/recipes/po/box/cedex/vocabulary.d.ts +68 -0
  304. package/out/recipes/po/box/cedex/vocabulary.d.ts.map +1 -0
  305. package/out/recipes/po/box/cedex/vocabulary.js +90 -0
  306. package/out/recipes/po/box/cedex/vocabulary.js.map +1 -0
  307. package/out/recipes/po/box/cedex.d.ts +9 -0
  308. package/out/recipes/po/box/cedex.d.ts.map +1 -0
  309. package/out/recipes/po/box/cedex.js +9 -0
  310. package/out/recipes/po/box/cedex.js.map +1 -0
  311. package/out/recipes/po/box/index.d.ts +17 -0
  312. package/out/recipes/po/box/index.d.ts.map +1 -0
  313. package/out/recipes/po/box/index.js +105 -0
  314. package/out/recipes/po/box/index.js.map +1 -0
  315. package/out/recipes/scaffold.d.ts +20 -0
  316. package/out/recipes/scaffold.d.ts.map +1 -1
  317. package/out/recipes/scaffold.js +18 -37
  318. package/out/recipes/scaffold.js.map +1 -1
  319. package/out/recipes/street/affix.d.ts +89 -0
  320. package/out/recipes/street/affix.d.ts.map +1 -0
  321. package/out/recipes/street/affix.js +565 -0
  322. package/out/recipes/street/affix.js.map +1 -0
  323. package/out/recipes/street/bare.d.ts +25 -0
  324. package/out/recipes/street/bare.d.ts.map +1 -0
  325. package/out/recipes/street/bare.js +87 -0
  326. package/out/recipes/street/bare.js.map +1 -0
  327. package/out/recipes/sub/venue/context.d.ts +29 -0
  328. package/out/recipes/sub/venue/context.d.ts.map +1 -0
  329. package/out/recipes/sub/venue/context.js +106 -0
  330. package/out/recipes/sub/venue/context.js.map +1 -0
  331. package/out/recipes/sub/venue/index.d.ts +270 -0
  332. package/out/recipes/sub/venue/index.d.ts.map +1 -0
  333. package/out/recipes/sub/venue/index.js +728 -0
  334. package/out/recipes/sub/venue/index.js.map +1 -0
  335. package/out/recipes/sub/venue/sources.d.ts +209 -0
  336. package/out/recipes/sub/venue/sources.d.ts.map +1 -0
  337. package/out/recipes/sub/venue/sources.js +555 -0
  338. package/out/recipes/sub/venue/sources.js.map +1 -0
  339. package/out/recipes/trailing-region.d.ts.map +1 -1
  340. package/out/recipes/trailing-region.js +6 -1
  341. package/out/recipes/trailing-region.js.map +1 -1
  342. package/out/recipes/unit.js.map +1 -1
  343. package/out/sg/recipes/register.d.ts +69 -0
  344. package/out/sg/recipes/register.d.ts.map +1 -0
  345. package/out/sg/recipes/register.js +211 -0
  346. package/out/sg/recipes/register.js.map +1 -0
  347. package/out/sg/tools/fetch/acra.d.ts +23 -0
  348. package/out/sg/tools/fetch/acra.d.ts.map +1 -0
  349. package/out/sg/tools/fetch/acra.js +126 -0
  350. package/out/sg/tools/fetch/acra.js.map +1 -0
  351. package/out/si/recipes/bare-village.d.ts +32 -0
  352. package/out/si/recipes/bare-village.d.ts.map +1 -0
  353. package/out/si/recipes/bare-village.js +89 -0
  354. package/out/si/recipes/bare-village.js.map +1 -0
  355. package/out/south-asia/recipes/register.d.ts +51 -0
  356. package/out/south-asia/recipes/register.d.ts.map +1 -0
  357. package/out/south-asia/recipes/register.js +154 -0
  358. package/out/south-asia/recipes/register.js.map +1 -0
  359. package/out/synthesizers/anchor-absorption.d.ts +1 -1
  360. package/out/synthesizers/anchor-absorption.d.ts.map +1 -1
  361. package/out/synthesizers/anchor-absorption.js.map +1 -1
  362. package/out/synthesizers/boundary-stress.js.map +1 -1
  363. package/out/synthesizers/house-venue.js.map +1 -1
  364. package/out/synthesizers/intersection.js.map +1 -1
  365. package/out/synthesizers/locale.d.ts +116 -0
  366. package/out/synthesizers/locale.d.ts.map +1 -0
  367. package/out/synthesizers/locale.js +150 -0
  368. package/out/synthesizers/locale.js.map +1 -0
  369. package/out/synthesizers/no-street.d.ts.map +1 -1
  370. package/out/synthesizers/no-street.js.map +1 -1
  371. package/out/synthesizers/po-box.js.map +1 -1
  372. package/out/synthesizers/street.d.ts.map +1 -1
  373. package/out/synthesizers/street.js +1 -1
  374. package/out/synthesizers/street.js.map +1 -1
  375. package/out/synthesizers/utils.js +1 -1
  376. package/out/synthesizers/utils.js.map +1 -1
  377. package/out/test-kit/corpus-recipe.d.ts.map +1 -1
  378. package/out/test-kit/corpus-recipe.js.map +1 -1
  379. package/out/tools/audit.d.ts.map +1 -1
  380. package/out/tools/audit.js +3 -2
  381. package/out/tools/audit.js.map +1 -1
  382. package/out/tools/corpus-stats.js +3 -3
  383. package/out/tools/corpus-stats.js.map +1 -1
  384. package/out/tools/fetch/download/index.d.ts +10 -0
  385. package/out/tools/fetch/download/index.d.ts.map +1 -0
  386. package/out/tools/fetch/download/index.js +10 -0
  387. package/out/tools/fetch/download/index.js.map +1 -0
  388. package/out/tools/fetch/download/manifest.d.ts +47 -0
  389. package/out/tools/fetch/download/manifest.d.ts.map +1 -0
  390. package/out/tools/fetch/download/manifest.js +74 -0
  391. package/out/tools/fetch/download/manifest.js.map +1 -0
  392. package/out/tools/fetch/download/network.d.ts +105 -0
  393. package/out/tools/fetch/download/network.d.ts.map +1 -0
  394. package/out/tools/fetch/download/network.js +130 -0
  395. package/out/tools/fetch/download/network.js.map +1 -0
  396. package/out/tools/fetch/download/retry.d.ts +45 -0
  397. package/out/tools/fetch/download/retry.d.ts.map +1 -0
  398. package/out/tools/fetch/download/retry.js +136 -0
  399. package/out/tools/fetch/download/retry.js.map +1 -0
  400. package/out/tools/fetch/geonames/dump.d.ts +91 -0
  401. package/out/tools/fetch/geonames/dump.d.ts.map +1 -0
  402. package/out/tools/fetch/geonames/dump.js +171 -0
  403. package/out/tools/fetch/geonames/dump.js.map +1 -0
  404. package/out/tools/fetch/geonames/postal.d.ts +76 -0
  405. package/out/tools/fetch/geonames/postal.d.ts.map +1 -0
  406. package/out/tools/fetch/geonames/postal.js +126 -0
  407. package/out/tools/fetch/geonames/postal.js.map +1 -0
  408. package/out/tools/fetch/index.d.ts +30 -30
  409. package/out/tools/fetch/index.d.ts.map +1 -1
  410. package/out/tools/fetch/index.js +30 -30
  411. package/out/tools/fetch/index.js.map +1 -1
  412. package/out/tools/fetch/openaddresses.d.ts +1 -1
  413. package/out/tools/fetch/openaddresses.d.ts.map +1 -1
  414. package/out/tools/fetch/openaddresses.js +1 -1
  415. package/out/tools/fetch/openaddresses.js.map +1 -1
  416. package/out/tools/fetch/ourairports.d.ts +1 -1
  417. package/out/tools/fetch/ourairports.d.ts.map +1 -1
  418. package/out/tools/fetch/ourairports.js +1 -1
  419. package/out/tools/fetch/ourairports.js.map +1 -1
  420. package/out/tools/fetch/ppd.js +1 -3
  421. package/out/tools/fetch/ppd.js.map +1 -1
  422. package/out/tools/fetch/wikidata-subvenue.d.ts +1 -1
  423. package/out/tools/fetch/wikidata-subvenue.d.ts.map +1 -1
  424. package/out/tools/fetch/wikidata-subvenue.js +1 -1
  425. package/out/tools/fetch/wikidata-subvenue.js.map +1 -1
  426. package/out/tools/golden/expand.d.ts +90 -0
  427. package/out/tools/golden/expand.d.ts.map +1 -0
  428. package/out/tools/golden/expand.js +406 -0
  429. package/out/tools/golden/expand.js.map +1 -0
  430. package/out/tools/golden/promote.d.ts +72 -0
  431. package/out/tools/golden/promote.d.ts.map +1 -0
  432. package/out/tools/golden/promote.js +243 -0
  433. package/out/tools/golden/promote.js.map +1 -0
  434. package/out/tools/golden/relabel-street/directory.d.ts +83 -0
  435. package/out/tools/golden/relabel-street/directory.d.ts.map +1 -0
  436. package/out/tools/golden/relabel-street/directory.js +216 -0
  437. package/out/tools/golden/relabel-street/directory.js.map +1 -0
  438. package/out/tools/golden/relabel-street/index.d.ts +9 -0
  439. package/out/tools/golden/relabel-street/index.d.ts.map +1 -0
  440. package/out/tools/golden/relabel-street/index.js +9 -0
  441. package/out/tools/golden/relabel-street/index.js.map +1 -0
  442. package/out/tools/golden/relabel-street/row.d.ts +121 -0
  443. package/out/tools/golden/relabel-street/row.d.ts.map +1 -0
  444. package/out/tools/golden/relabel-street/row.js +232 -0
  445. package/out/tools/golden/relabel-street/row.js.map +1 -0
  446. package/out/tools/index.d.ts +10 -10
  447. package/out/tools/index.d.ts.map +1 -1
  448. package/out/tools/index.js +10 -10
  449. package/out/tools/index.js.map +1 -1
  450. package/out/tools/ingest-csv.d.ts.map +1 -1
  451. package/out/tools/ingest-csv.js +5 -7
  452. package/out/tools/ingest-csv.js.map +1 -1
  453. package/out/tools/lint/slice/index.d.ts +93 -0
  454. package/out/tools/lint/slice/index.d.ts.map +1 -0
  455. package/out/tools/lint/slice/index.js +322 -0
  456. package/out/tools/lint/slice/index.js.map +1 -0
  457. package/out/tools/lint/slice/vocab.d.ts +90 -0
  458. package/out/tools/lint/slice/vocab.d.ts.map +1 -0
  459. package/out/tools/lint/slice/vocab.js +254 -0
  460. package/out/tools/lint/slice/vocab.js.map +1 -0
  461. package/out/tools/overlay-manifest.d.ts +56 -6
  462. package/out/tools/overlay-manifest.d.ts.map +1 -1
  463. package/out/tools/overlay-manifest.js +56 -15
  464. package/out/tools/overlay-manifest.js.map +1 -1
  465. package/out/tools/overture-subvenue.d.ts +1 -1
  466. package/out/tools/postcode-triples.d.ts +36 -0
  467. package/out/tools/postcode-triples.d.ts.map +1 -1
  468. package/out/tools/postcode-triples.js +91 -12
  469. package/out/tools/postcode-triples.js.map +1 -1
  470. package/out/tools/slice/kryptonite.d.ts +32 -0
  471. package/out/tools/slice/kryptonite.d.ts.map +1 -0
  472. package/out/tools/slice/kryptonite.js +99 -0
  473. package/out/tools/slice/kryptonite.js.map +1 -0
  474. package/out/tools/slice/translit.d.ts +51 -0
  475. package/out/tools/slice/translit.d.ts.map +1 -0
  476. package/out/tools/slice/translit.js +166 -0
  477. package/out/tools/slice/translit.js.map +1 -0
  478. package/out/tools/sub/venue/harvest.d.ts +100 -0
  479. package/out/tools/sub/venue/harvest.d.ts.map +1 -0
  480. package/out/tools/sub/venue/harvest.js +168 -0
  481. package/out/tools/sub/venue/harvest.js.map +1 -0
  482. package/out/tools/sub/venue/head-nouns.d.ts +50 -0
  483. package/out/tools/sub/venue/head-nouns.d.ts.map +1 -0
  484. package/out/tools/sub/venue/head-nouns.js.map +1 -0
  485. package/out/tools/sub/venue/lexicon.d.ts +156 -0
  486. package/out/tools/sub/venue/lexicon.d.ts.map +1 -0
  487. package/out/tools/sub/venue/lexicon.js +283 -0
  488. package/out/tools/sub/venue/lexicon.js.map +1 -0
  489. package/out/tools/sub/venue/promotions.d.ts +94 -0
  490. package/out/tools/sub/venue/promotions.d.ts.map +1 -0
  491. package/out/tools/sub/venue/promotions.js +266 -0
  492. package/out/tools/sub/venue/promotions.js.map +1 -0
  493. package/out/tools/sub/venue/surfaces.d.ts +45 -0
  494. package/out/tools/sub/venue/surfaces.d.ts.map +1 -0
  495. package/out/tools/sub/venue/surfaces.js.map +1 -0
  496. package/out/tools/sub/venue/table.d.ts +229 -0
  497. package/out/tools/sub/venue/table.d.ts.map +1 -0
  498. package/out/tools/sub/venue/table.js.map +1 -0
  499. package/out/tools/sub/venue/wikidata.d.ts +26 -0
  500. package/out/tools/sub/venue/wikidata.d.ts.map +1 -0
  501. package/out/tools/sub/venue/wikidata.js +62 -0
  502. package/out/tools/sub/venue/wikidata.js.map +1 -0
  503. package/out/tw/tools/fetch/gcis.d.ts +23 -0
  504. package/out/tw/tools/fetch/gcis.d.ts.map +1 -0
  505. package/out/tw/tools/fetch/gcis.js +135 -0
  506. package/out/tw/tools/fetch/gcis.js.map +1 -0
  507. package/out/types.d.ts +1 -1
  508. package/out/types.d.ts.map +1 -1
  509. package/out/us/adapters/fcc-bdc/adapter.d.ts.map +1 -0
  510. package/out/us/adapters/fcc-bdc/adapter.js +142 -0
  511. package/out/us/adapters/fcc-bdc/adapter.js.map +1 -0
  512. package/out/us/adapters/state/hi-schools/adapter.d.ts.map +1 -0
  513. package/out/us/adapters/state/hi-schools/adapter.js +136 -0
  514. package/out/us/adapters/state/hi-schools/adapter.js.map +1 -0
  515. package/out/us/adapters/state/hi-schools/workbook.d.ts.map +1 -0
  516. package/out/us/adapters/state/hi-schools/workbook.js.map +1 -0
  517. package/out/us/adapters/state/ia-contractors/adapter.d.ts.map +1 -0
  518. package/out/us/adapters/state/ia-contractors/adapter.js +104 -0
  519. package/out/us/adapters/state/ia-contractors/adapter.js.map +1 -0
  520. package/out/us/adapters/state/ny-notaries/adapter.d.ts.map +1 -0
  521. package/out/us/adapters/state/ny-notaries/adapter.js +112 -0
  522. package/out/us/adapters/state/ny-notaries/adapter.js.map +1 -0
  523. package/out/us/adapters/state/tx-notaries/adapter.d.ts.map +1 -0
  524. package/out/us/adapters/state/tx-notaries/adapter.js +118 -0
  525. package/out/us/adapters/state/tx-notaries/adapter.js.map +1 -0
  526. package/out/us/adapters/tiger/adapter.d.ts +55 -0
  527. package/out/us/adapters/tiger/adapter.d.ts.map +1 -0
  528. package/out/us/adapters/tiger/adapter.js +197 -0
  529. package/out/us/adapters/tiger/adapter.js.map +1 -0
  530. package/out/us/adapters/tiger/street-decompose.d.ts.map +1 -0
  531. package/out/us/adapters/tiger/street-decompose.js.map +1 -0
  532. package/out/us/adapters/usgov/hrsa-fqhc/adapter.d.ts.map +1 -0
  533. package/out/us/adapters/usgov/hrsa-fqhc/adapter.js +121 -0
  534. package/out/us/adapters/usgov/hrsa-fqhc/adapter.js.map +1 -0
  535. package/out/us/adapters/usgov/imls-pls/adapter.d.ts.map +1 -0
  536. package/out/us/adapters/usgov/imls-pls/adapter.js +106 -0
  537. package/out/us/adapters/usgov/imls-pls/adapter.js.map +1 -0
  538. package/out/us/adapters/usgov/irs-bmf/adapter.d.ts.map +1 -0
  539. package/out/us/adapters/usgov/irs-bmf/adapter.js +116 -0
  540. package/out/us/adapters/usgov/irs-bmf/adapter.js.map +1 -0
  541. package/out/us/adapters/usgov/nad/adapter.d.ts.map +1 -0
  542. package/out/us/adapters/usgov/nad/adapter.js +239 -0
  543. package/out/us/adapters/usgov/nad/adapter.js.map +1 -0
  544. package/out/us/adapters/usgov/nppes/adapter.d.ts.map +1 -0
  545. package/out/us/adapters/usgov/nppes/adapter.js +110 -0
  546. package/out/us/adapters/usgov/nppes/adapter.js.map +1 -0
  547. package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.d.ts.map +1 -0
  548. package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.js +143 -0
  549. package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.js.map +1 -0
  550. package/out/us/fips-state.d.ts +41 -0
  551. package/out/us/fips-state.d.ts.map +1 -0
  552. package/out/us/fips-state.js +100 -0
  553. package/out/us/fips-state.js.map +1 -0
  554. package/out/us/tools/fetch/hrsa.d.ts +18 -0
  555. package/out/us/tools/fetch/hrsa.d.ts.map +1 -0
  556. package/out/us/tools/fetch/hrsa.js +46 -0
  557. package/out/us/tools/fetch/hrsa.js.map +1 -0
  558. package/out/us/tools/fetch/imls-pls.d.ts +25 -0
  559. package/out/us/tools/fetch/imls-pls.d.ts.map +1 -0
  560. package/out/us/tools/fetch/imls-pls.js +108 -0
  561. package/out/us/tools/fetch/imls-pls.js.map +1 -0
  562. package/out/us/tools/fetch/nad.d.ts +70 -0
  563. package/out/us/tools/fetch/nad.d.ts.map +1 -0
  564. package/out/us/tools/fetch/nad.js +234 -0
  565. package/out/us/tools/fetch/nad.js.map +1 -0
  566. package/out/us/tools/fetch/nppes.d.ts +26 -0
  567. package/out/us/tools/fetch/nppes.d.ts.map +1 -0
  568. package/out/us/tools/fetch/nppes.js +126 -0
  569. package/out/us/tools/fetch/nppes.js.map +1 -0
  570. package/out/us/tools/fetch/state/hi-schools.d.ts +26 -0
  571. package/out/us/tools/fetch/state/hi-schools.d.ts.map +1 -0
  572. package/out/us/tools/fetch/state/hi-schools.js +112 -0
  573. package/out/us/tools/fetch/state/hi-schools.js.map +1 -0
  574. package/out/us/tools/fetch/state/sources.d.ts +26 -0
  575. package/out/us/tools/fetch/state/sources.d.ts.map +1 -0
  576. package/out/us/tools/fetch/state/sources.js +111 -0
  577. package/out/us/tools/fetch/state/sources.js.map +1 -0
  578. package/out/us/tools/fetch/tiger-full.d.ts +22 -0
  579. package/out/us/tools/fetch/tiger-full.d.ts.map +1 -0
  580. package/out/us/tools/fetch/tiger-full.js +217 -0
  581. package/out/us/tools/fetch/tiger-full.js.map +1 -0
  582. package/out/utils/align.d.ts +1 -1
  583. package/out/utils/align.d.ts.map +1 -1
  584. package/out/utils/align.js.map +1 -1
  585. package/out/utils/golden.d.ts +7 -3
  586. package/out/utils/golden.d.ts.map +1 -1
  587. package/out/utils/golden.js +12 -8
  588. package/out/utils/golden.js.map +1 -1
  589. package/out/utils/parquet.d.ts.map +1 -1
  590. package/out/utils/split.js.map +1 -1
  591. package/out/utils/wof-json.d.ts.map +1 -1
  592. package/out/utils/wof-json.js +7 -12
  593. package/out/utils/wof-json.js.map +1 -1
  594. package/out/ve/recipes/reviewed-postcode-tail.d.ts.map +1 -0
  595. package/out/ve/recipes/reviewed-postcode-tail.js.map +1 -0
  596. package/package.json +196 -46
  597. package/lib/adapters/ban/adapter.ts +0 -190
  598. package/lib/adapters/fcc-bdc/adapter.ts +0 -174
  599. package/lib/adapters/geonames-postal/adapter.ts +0 -122
  600. package/lib/adapters/gnaf/adapter.ts +0 -149
  601. package/lib/adapters/gnaf/assemble.ts +0 -225
  602. package/lib/adapters/state-hi-schools/adapter.ts +0 -170
  603. package/lib/adapters/state-ia-contractors/adapter.ts +0 -144
  604. package/lib/adapters/state-ny-notaries/adapter.ts +0 -141
  605. package/lib/adapters/state-tx-notaries/adapter.ts +0 -157
  606. package/lib/adapters/tiger/adapter.ts +0 -252
  607. package/lib/adapters/usgov-hrsa-fqhc/adapter.ts +0 -167
  608. package/lib/adapters/usgov-imls-pls/adapter.ts +0 -143
  609. package/lib/adapters/usgov-irs-bmf/adapter.ts +0 -151
  610. package/lib/adapters/usgov-nad/adapter.ts +0 -334
  611. package/lib/adapters/usgov-nppes/adapter.ts +0 -151
  612. package/lib/adapters/usgov-samhsa-treatment-locator/adapter.ts +0 -193
  613. package/lib/adapters/wof-admin-json/adapter.ts +0 -231
  614. package/lib/adapters/wof-json-rows.ts +0 -129
  615. package/lib/adapters/wof-postalcode-json/adapter.ts +0 -176
  616. package/lib/recipes/fr-admin-split.ts +0 -243
  617. package/lib/recipes/fr-bare-street.ts +0 -171
  618. package/lib/recipes/fr-fragment.ts +0 -334
  619. package/lib/recipes/fr-lieudit.ts +0 -301
  620. package/lib/recipes/fr-order.ts +0 -246
  621. package/lib/recipes/german.ts +0 -360
  622. package/lib/recipes/locale.ts +0 -600
  623. package/lib/recipes/po-box-cedex.ts +0 -976
  624. package/lib/recipes/po-box.ts +0 -124
  625. package/lib/recipes/street-affix.ts +0 -805
  626. package/lib/recipes/sub-venue-sources.ts +0 -878
  627. package/lib/recipes/sub-venue.ts +0 -998
  628. package/lib/synthesizers/german.ts +0 -260
  629. package/lib/tools/fetch/acra-sg.ts +0 -174
  630. package/lib/tools/fetch/ban.ts +0 -289
  631. package/lib/tools/fetch/download.ts +0 -477
  632. package/lib/tools/fetch/gcis-tw.ts +0 -175
  633. package/lib/tools/fetch/geonames-dump.ts +0 -257
  634. package/lib/tools/fetch/geonames-postal.ts +0 -180
  635. package/lib/tools/fetch/houjin-jp.ts +0 -135
  636. package/lib/tools/fetch/hrsa.ts +0 -59
  637. package/lib/tools/fetch/imls-pls.ts +0 -149
  638. package/lib/tools/fetch/juso-kr.ts +0 -165
  639. package/lib/tools/fetch/localdata-kr.ts +0 -194
  640. package/lib/tools/fetch/nad.ts +0 -341
  641. package/lib/tools/fetch/nppes.ts +0 -165
  642. package/lib/tools/fetch/state-hi-schools.ts +0 -161
  643. package/lib/tools/fetch/state-sources.ts +0 -146
  644. package/lib/tools/fetch/tiger-full.ts +0 -308
  645. package/lib/tools/golden-promote.ts +0 -337
  646. package/lib/tools/golden-relabel-street.ts +0 -686
  647. package/lib/tools/lint-slice-vocab.ts +0 -388
  648. package/lib/tools/sub-venue/harvest.ts +0 -234
  649. package/lib/tools/sub-venue/head-nouns.ts +0 -245
  650. package/lib/tools/sub-venue/surfaces.ts +0 -95
  651. package/lib/tools/sub-venue/table.ts +0 -281
  652. package/lib/tools/sub-venue/wikidata.ts +0 -85
  653. package/lib/tools/sub-venue-lexicon.ts +0 -429
  654. package/out/adapters/ban/adapter.d.ts.map +0 -1
  655. package/out/adapters/ban/adapter.js +0 -149
  656. package/out/adapters/ban/adapter.js.map +0 -1
  657. package/out/adapters/ban/street-decompose.d.ts.map +0 -1
  658. package/out/adapters/ban/street-decompose.js.map +0 -1
  659. package/out/adapters/fcc-bdc/adapter.d.ts.map +0 -1
  660. package/out/adapters/fcc-bdc/adapter.js +0 -144
  661. package/out/adapters/fcc-bdc/adapter.js.map +0 -1
  662. package/out/adapters/geonames-postal/adapter.d.ts.map +0 -1
  663. package/out/adapters/geonames-postal/adapter.js +0 -107
  664. package/out/adapters/geonames-postal/adapter.js.map +0 -1
  665. package/out/adapters/gnaf/adapter.d.ts.map +0 -1
  666. package/out/adapters/gnaf/adapter.js +0 -124
  667. package/out/adapters/gnaf/adapter.js.map +0 -1
  668. package/out/adapters/gnaf/assemble.d.ts +0 -65
  669. package/out/adapters/gnaf/assemble.d.ts.map +0 -1
  670. package/out/adapters/gnaf/assemble.js +0 -154
  671. package/out/adapters/gnaf/assemble.js.map +0 -1
  672. package/out/adapters/state-hi-schools/adapter.d.ts.map +0 -1
  673. package/out/adapters/state-hi-schools/adapter.js +0 -145
  674. package/out/adapters/state-hi-schools/adapter.js.map +0 -1
  675. package/out/adapters/state-hi-schools/workbook.d.ts.map +0 -1
  676. package/out/adapters/state-hi-schools/workbook.js.map +0 -1
  677. package/out/adapters/state-ia-contractors/adapter.d.ts.map +0 -1
  678. package/out/adapters/state-ia-contractors/adapter.js +0 -111
  679. package/out/adapters/state-ia-contractors/adapter.js.map +0 -1
  680. package/out/adapters/state-ny-notaries/adapter.d.ts.map +0 -1
  681. package/out/adapters/state-ny-notaries/adapter.js +0 -119
  682. package/out/adapters/state-ny-notaries/adapter.js.map +0 -1
  683. package/out/adapters/state-tx-notaries/adapter.d.ts.map +0 -1
  684. package/out/adapters/state-tx-notaries/adapter.js +0 -125
  685. package/out/adapters/state-tx-notaries/adapter.js.map +0 -1
  686. package/out/adapters/tiger/adapter.d.ts +0 -55
  687. package/out/adapters/tiger/adapter.d.ts.map +0 -1
  688. package/out/adapters/tiger/adapter.js +0 -201
  689. package/out/adapters/tiger/adapter.js.map +0 -1
  690. package/out/adapters/tiger/street-decompose.d.ts.map +0 -1
  691. package/out/adapters/tiger/street-decompose.js.map +0 -1
  692. package/out/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +0 -1
  693. package/out/adapters/usgov-hrsa-fqhc/adapter.js +0 -132
  694. package/out/adapters/usgov-hrsa-fqhc/adapter.js.map +0 -1
  695. package/out/adapters/usgov-imls-pls/adapter.d.ts.map +0 -1
  696. package/out/adapters/usgov-imls-pls/adapter.js +0 -114
  697. package/out/adapters/usgov-imls-pls/adapter.js.map +0 -1
  698. package/out/adapters/usgov-irs-bmf/adapter.d.ts.map +0 -1
  699. package/out/adapters/usgov-irs-bmf/adapter.js +0 -120
  700. package/out/adapters/usgov-irs-bmf/adapter.js.map +0 -1
  701. package/out/adapters/usgov-nad/adapter.d.ts.map +0 -1
  702. package/out/adapters/usgov-nad/adapter.js +0 -249
  703. package/out/adapters/usgov-nad/adapter.js.map +0 -1
  704. package/out/adapters/usgov-nppes/adapter.d.ts.map +0 -1
  705. package/out/adapters/usgov-nppes/adapter.js +0 -118
  706. package/out/adapters/usgov-nppes/adapter.js.map +0 -1
  707. package/out/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +0 -1
  708. package/out/adapters/usgov-samhsa-treatment-locator/adapter.js +0 -154
  709. package/out/adapters/usgov-samhsa-treatment-locator/adapter.js.map +0 -1
  710. package/out/adapters/wof-admin-jp/adapter.d.ts.map +0 -1
  711. package/out/adapters/wof-admin-jp/adapter.js.map +0 -1
  712. package/out/adapters/wof-admin-json/adapter.d.ts +0 -79
  713. package/out/adapters/wof-admin-json/adapter.d.ts.map +0 -1
  714. package/out/adapters/wof-admin-json/adapter.js +0 -197
  715. package/out/adapters/wof-admin-json/adapter.js.map +0 -1
  716. package/out/adapters/wof-json-rows.d.ts +0 -62
  717. package/out/adapters/wof-json-rows.d.ts.map +0 -1
  718. package/out/adapters/wof-json-rows.js +0 -83
  719. package/out/adapters/wof-json-rows.js.map +0 -1
  720. package/out/adapters/wof-postalcode-json/adapter.d.ts +0 -65
  721. package/out/adapters/wof-postalcode-json/adapter.d.ts.map +0 -1
  722. package/out/adapters/wof-postalcode-json/adapter.js +0 -151
  723. package/out/adapters/wof-postalcode-json/adapter.js.map +0 -1
  724. package/out/codex/us-fips-state.d.ts +0 -41
  725. package/out/codex/us-fips-state.d.ts.map +0 -1
  726. package/out/codex/us-fips-state.js +0 -100
  727. package/out/codex/us-fips-state.js.map +0 -1
  728. package/out/recipes/bare-country.d.ts +0 -25
  729. package/out/recipes/bare-country.d.ts.map +0 -1
  730. package/out/recipes/bare-country.js +0 -88
  731. package/out/recipes/bare-country.js.map +0 -1
  732. package/out/recipes/cn-organizational-units.d.ts +0 -36
  733. package/out/recipes/cn-organizational-units.d.ts.map +0 -1
  734. package/out/recipes/cn-organizational-units.js +0 -159
  735. package/out/recipes/cn-organizational-units.js.map +0 -1
  736. package/out/recipes/cz-pcfirst-preposition.d.ts +0 -22
  737. package/out/recipes/cz-pcfirst-preposition.d.ts.map +0 -1
  738. package/out/recipes/cz-pcfirst-preposition.js +0 -101
  739. package/out/recipes/cz-pcfirst-preposition.js.map +0 -1
  740. package/out/recipes/fr-admin-split.d.ts +0 -38
  741. package/out/recipes/fr-admin-split.d.ts.map +0 -1
  742. package/out/recipes/fr-admin-split.js +0 -192
  743. package/out/recipes/fr-admin-split.js.map +0 -1
  744. package/out/recipes/fr-bare-street.d.ts +0 -28
  745. package/out/recipes/fr-bare-street.d.ts.map +0 -1
  746. package/out/recipes/fr-bare-street.js +0 -144
  747. package/out/recipes/fr-bare-street.js.map +0 -1
  748. package/out/recipes/fr-fragment.d.ts +0 -77
  749. package/out/recipes/fr-fragment.d.ts.map +0 -1
  750. package/out/recipes/fr-fragment.js +0 -277
  751. package/out/recipes/fr-fragment.js.map +0 -1
  752. package/out/recipes/fr-lieudit.d.ts +0 -32
  753. package/out/recipes/fr-lieudit.d.ts.map +0 -1
  754. package/out/recipes/fr-lieudit.js +0 -227
  755. package/out/recipes/fr-lieudit.js.map +0 -1
  756. package/out/recipes/fr-order.d.ts +0 -38
  757. package/out/recipes/fr-order.d.ts.map +0 -1
  758. package/out/recipes/fr-order.js +0 -198
  759. package/out/recipes/fr-order.js.map +0 -1
  760. package/out/recipes/german.d.ts +0 -44
  761. package/out/recipes/german.d.ts.map +0 -1
  762. package/out/recipes/german.js +0 -289
  763. package/out/recipes/german.js.map +0 -1
  764. package/out/recipes/locale.d.ts +0 -136
  765. package/out/recipes/locale.d.ts.map +0 -1
  766. package/out/recipes/locale.js +0 -460
  767. package/out/recipes/locale.js.map +0 -1
  768. package/out/recipes/nl-postcode.d.ts +0 -26
  769. package/out/recipes/nl-postcode.d.ts.map +0 -1
  770. package/out/recipes/nl-postcode.js +0 -103
  771. package/out/recipes/nl-postcode.js.map +0 -1
  772. package/out/recipes/no-fragment.d.ts +0 -43
  773. package/out/recipes/no-fragment.d.ts.map +0 -1
  774. package/out/recipes/no-fragment.js +0 -183
  775. package/out/recipes/no-fragment.js.map +0 -1
  776. package/out/recipes/no-street-led.d.ts +0 -24
  777. package/out/recipes/no-street-led.d.ts.map +0 -1
  778. package/out/recipes/no-street-led.js +0 -114
  779. package/out/recipes/no-street-led.js.map +0 -1
  780. package/out/recipes/no-street.d.ts +0 -18
  781. package/out/recipes/no-street.d.ts.map +0 -1
  782. package/out/recipes/no-street.js +0 -72
  783. package/out/recipes/no-street.js.map +0 -1
  784. package/out/recipes/po-box-cedex.d.ts +0 -38
  785. package/out/recipes/po-box-cedex.d.ts.map +0 -1
  786. package/out/recipes/po-box-cedex.js +0 -768
  787. package/out/recipes/po-box-cedex.js.map +0 -1
  788. package/out/recipes/po-box.d.ts +0 -17
  789. package/out/recipes/po-box.d.ts.map +0 -1
  790. package/out/recipes/po-box.js +0 -101
  791. package/out/recipes/po-box.js.map +0 -1
  792. package/out/recipes/reviewed-postcode-tail.d.ts.map +0 -1
  793. package/out/recipes/reviewed-postcode-tail.js.map +0 -1
  794. package/out/recipes/si-bare-village.d.ts +0 -32
  795. package/out/recipes/si-bare-village.d.ts.map +0 -1
  796. package/out/recipes/si-bare-village.js +0 -89
  797. package/out/recipes/si-bare-village.js.map +0 -1
  798. package/out/recipes/street-affix.d.ts +0 -89
  799. package/out/recipes/street-affix.d.ts.map +0 -1
  800. package/out/recipes/street-affix.js +0 -563
  801. package/out/recipes/street-affix.js.map +0 -1
  802. package/out/recipes/street-bare.d.ts +0 -25
  803. package/out/recipes/street-bare.d.ts.map +0 -1
  804. package/out/recipes/street-bare.js +0 -87
  805. package/out/recipes/street-bare.js.map +0 -1
  806. package/out/recipes/sub-venue-sources.d.ts +0 -229
  807. package/out/recipes/sub-venue-sources.d.ts.map +0 -1
  808. package/out/recipes/sub-venue-sources.js +0 -654
  809. package/out/recipes/sub-venue-sources.js.map +0 -1
  810. package/out/recipes/sub-venue.d.ts +0 -269
  811. package/out/recipes/sub-venue.d.ts.map +0 -1
  812. package/out/recipes/sub-venue.js +0 -726
  813. package/out/recipes/sub-venue.js.map +0 -1
  814. package/out/synthesizers/german.d.ts +0 -115
  815. package/out/synthesizers/german.d.ts.map +0 -1
  816. package/out/synthesizers/german.js +0 -149
  817. package/out/synthesizers/german.js.map +0 -1
  818. package/out/tools/fetch/acra-sg.d.ts +0 -23
  819. package/out/tools/fetch/acra-sg.d.ts.map +0 -1
  820. package/out/tools/fetch/acra-sg.js +0 -126
  821. package/out/tools/fetch/acra-sg.js.map +0 -1
  822. package/out/tools/fetch/ban.d.ts +0 -31
  823. package/out/tools/fetch/ban.d.ts.map +0 -1
  824. package/out/tools/fetch/ban.js +0 -239
  825. package/out/tools/fetch/ban.js.map +0 -1
  826. package/out/tools/fetch/download.d.ts +0 -182
  827. package/out/tools/fetch/download.d.ts.map +0 -1
  828. package/out/tools/fetch/download.js +0 -318
  829. package/out/tools/fetch/download.js.map +0 -1
  830. package/out/tools/fetch/gcis-tw.d.ts +0 -23
  831. package/out/tools/fetch/gcis-tw.d.ts.map +0 -1
  832. package/out/tools/fetch/gcis-tw.js +0 -135
  833. package/out/tools/fetch/gcis-tw.js.map +0 -1
  834. package/out/tools/fetch/geonames-dump.d.ts +0 -91
  835. package/out/tools/fetch/geonames-dump.d.ts.map +0 -1
  836. package/out/tools/fetch/geonames-dump.js +0 -171
  837. package/out/tools/fetch/geonames-dump.js.map +0 -1
  838. package/out/tools/fetch/geonames-postal.d.ts +0 -76
  839. package/out/tools/fetch/geonames-postal.d.ts.map +0 -1
  840. package/out/tools/fetch/geonames-postal.js +0 -126
  841. package/out/tools/fetch/geonames-postal.js.map +0 -1
  842. package/out/tools/fetch/houjin-jp.d.ts +0 -24
  843. package/out/tools/fetch/houjin-jp.d.ts.map +0 -1
  844. package/out/tools/fetch/houjin-jp.js +0 -102
  845. package/out/tools/fetch/houjin-jp.js.map +0 -1
  846. package/out/tools/fetch/hrsa.d.ts +0 -18
  847. package/out/tools/fetch/hrsa.d.ts.map +0 -1
  848. package/out/tools/fetch/hrsa.js +0 -46
  849. package/out/tools/fetch/hrsa.js.map +0 -1
  850. package/out/tools/fetch/imls-pls.d.ts +0 -25
  851. package/out/tools/fetch/imls-pls.d.ts.map +0 -1
  852. package/out/tools/fetch/imls-pls.js +0 -108
  853. package/out/tools/fetch/imls-pls.js.map +0 -1
  854. package/out/tools/fetch/juso-kr.d.ts +0 -30
  855. package/out/tools/fetch/juso-kr.d.ts.map +0 -1
  856. package/out/tools/fetch/juso-kr.js +0 -120
  857. package/out/tools/fetch/juso-kr.js.map +0 -1
  858. package/out/tools/fetch/localdata-kr.d.ts +0 -30
  859. package/out/tools/fetch/localdata-kr.d.ts.map +0 -1
  860. package/out/tools/fetch/localdata-kr.js +0 -139
  861. package/out/tools/fetch/localdata-kr.js.map +0 -1
  862. package/out/tools/fetch/nad.d.ts +0 -70
  863. package/out/tools/fetch/nad.d.ts.map +0 -1
  864. package/out/tools/fetch/nad.js +0 -234
  865. package/out/tools/fetch/nad.js.map +0 -1
  866. package/out/tools/fetch/nppes.d.ts +0 -26
  867. package/out/tools/fetch/nppes.d.ts.map +0 -1
  868. package/out/tools/fetch/nppes.js +0 -126
  869. package/out/tools/fetch/nppes.js.map +0 -1
  870. package/out/tools/fetch/state-hi-schools.d.ts +0 -26
  871. package/out/tools/fetch/state-hi-schools.d.ts.map +0 -1
  872. package/out/tools/fetch/state-hi-schools.js +0 -112
  873. package/out/tools/fetch/state-hi-schools.js.map +0 -1
  874. package/out/tools/fetch/state-sources.d.ts +0 -26
  875. package/out/tools/fetch/state-sources.d.ts.map +0 -1
  876. package/out/tools/fetch/state-sources.js +0 -111
  877. package/out/tools/fetch/state-sources.js.map +0 -1
  878. package/out/tools/fetch/tiger-full.d.ts +0 -22
  879. package/out/tools/fetch/tiger-full.d.ts.map +0 -1
  880. package/out/tools/fetch/tiger-full.js +0 -217
  881. package/out/tools/fetch/tiger-full.js.map +0 -1
  882. package/out/tools/golden-expand.d.ts +0 -90
  883. package/out/tools/golden-expand.d.ts.map +0 -1
  884. package/out/tools/golden-expand.js +0 -406
  885. package/out/tools/golden-expand.js.map +0 -1
  886. package/out/tools/golden-promote.d.ts +0 -72
  887. package/out/tools/golden-promote.d.ts.map +0 -1
  888. package/out/tools/golden-promote.js +0 -240
  889. package/out/tools/golden-promote.js.map +0 -1
  890. package/out/tools/golden-relabel-street.d.ts +0 -196
  891. package/out/tools/golden-relabel-street.d.ts.map +0 -1
  892. package/out/tools/golden-relabel-street.js +0 -439
  893. package/out/tools/golden-relabel-street.js.map +0 -1
  894. package/out/tools/lint-slice-vocab.d.ts +0 -90
  895. package/out/tools/lint-slice-vocab.d.ts.map +0 -1
  896. package/out/tools/lint-slice-vocab.js +0 -267
  897. package/out/tools/lint-slice-vocab.js.map +0 -1
  898. package/out/tools/lint-slice.d.ts +0 -93
  899. package/out/tools/lint-slice.d.ts.map +0 -1
  900. package/out/tools/lint-slice.js +0 -322
  901. package/out/tools/lint-slice.js.map +0 -1
  902. package/out/tools/slice-kryptonite.d.ts +0 -32
  903. package/out/tools/slice-kryptonite.d.ts.map +0 -1
  904. package/out/tools/slice-kryptonite.js +0 -99
  905. package/out/tools/slice-kryptonite.js.map +0 -1
  906. package/out/tools/slice-translit.d.ts +0 -51
  907. package/out/tools/slice-translit.d.ts.map +0 -1
  908. package/out/tools/slice-translit.js +0 -166
  909. package/out/tools/slice-translit.js.map +0 -1
  910. package/out/tools/sub-venue/harvest.d.ts +0 -100
  911. package/out/tools/sub-venue/harvest.d.ts.map +0 -1
  912. package/out/tools/sub-venue/harvest.js +0 -168
  913. package/out/tools/sub-venue/harvest.js.map +0 -1
  914. package/out/tools/sub-venue/head-nouns.d.ts +0 -50
  915. package/out/tools/sub-venue/head-nouns.d.ts.map +0 -1
  916. package/out/tools/sub-venue/head-nouns.js.map +0 -1
  917. package/out/tools/sub-venue/surfaces.d.ts +0 -45
  918. package/out/tools/sub-venue/surfaces.d.ts.map +0 -1
  919. package/out/tools/sub-venue/surfaces.js.map +0 -1
  920. package/out/tools/sub-venue/table.d.ts +0 -229
  921. package/out/tools/sub-venue/table.d.ts.map +0 -1
  922. package/out/tools/sub-venue/table.js.map +0 -1
  923. package/out/tools/sub-venue/wikidata.d.ts +0 -26
  924. package/out/tools/sub-venue/wikidata.d.ts.map +0 -1
  925. package/out/tools/sub-venue/wikidata.js +0 -62
  926. package/out/tools/sub-venue/wikidata.js.map +0 -1
  927. package/out/tools/sub-venue-lexicon.d.ts +0 -156
  928. package/out/tools/sub-venue-lexicon.d.ts.map +0 -1
  929. package/out/tools/sub-venue-lexicon.js +0 -283
  930. package/out/tools/sub-venue-lexicon.js.map +0 -1
  931. package/out/tools/sub-venue-promotions.d.ts +0 -94
  932. package/out/tools/sub-venue-promotions.d.ts.map +0 -1
  933. package/out/tools/sub-venue-promotions.js +0 -266
  934. package/out/tools/sub-venue-promotions.js.map +0 -1
  935. /package/lib/{recipes/cn-organizational-units.ts → cn/recipes/organizational-units.ts} +0 -0
  936. /package/lib/{recipes/cz-pcfirst-preposition.ts → cz/recipes/pcfirst-preposition.ts} +0 -0
  937. /package/lib/{adapters → fr/adapters}/ban/street-decompose.ts +0 -0
  938. /package/lib/{adapters/wof-admin-jp → jp/adapters/wof-admin}/adapter.ts +0 -0
  939. /package/lib/{recipes/nl-postcode.ts → nl/recipes/postcode.ts} +0 -0
  940. /package/lib/{recipes/no-fragment.ts → no/recipes/fragment.ts} +0 -0
  941. /package/lib/{recipes/no-street.ts → no/recipes/street/index.ts} +0 -0
  942. /package/lib/{recipes/no-street-led.ts → no/recipes/street/led.ts} +0 -0
  943. /package/lib/recipes/{bare-country.ts → bare/country.ts} +0 -0
  944. /package/lib/recipes/{street-bare.ts → street/bare.ts} +0 -0
  945. /package/lib/{recipes/si-bare-village.ts → si/recipes/bare-village.ts} +0 -0
  946. /package/lib/tools/{golden-expand.ts → golden/expand.ts} +0 -0
  947. /package/lib/tools/{lint-slice.ts → lint/slice/index.ts} +0 -0
  948. /package/lib/tools/{slice-kryptonite.ts → slice/kryptonite.ts} +0 -0
  949. /package/lib/tools/{slice-translit.ts → slice/translit.ts} +0 -0
  950. /package/lib/tools/{sub-venue-promotions.ts → sub/venue/promotions.ts} +0 -0
  951. /package/lib/{adapters/state-hi-schools → us/adapters/state/hi-schools}/workbook.ts +0 -0
  952. /package/lib/{adapters → us/adapters}/tiger/street-decompose.ts +0 -0
  953. /package/lib/{codex/us-fips-state.ts → us/fips-state.ts} +0 -0
  954. /package/lib/{recipes → ve/recipes}/reviewed-postcode-tail.ts +0 -0
  955. /package/out/adapters/{geonames-postal → geonames/postal}/adapter.d.ts +0 -0
  956. /package/out/{adapters → au/adapters}/gnaf/adapter.d.ts +0 -0
  957. /package/out/{adapters → fr/adapters}/ban/adapter.d.ts +0 -0
  958. /package/out/{adapters → fr/adapters}/ban/street-decompose.d.ts +0 -0
  959. /package/out/{adapters → fr/adapters}/ban/street-decompose.js +0 -0
  960. /package/out/{adapters/wof-admin-jp → jp/adapters/wof-admin}/adapter.d.ts +0 -0
  961. /package/out/{adapters/wof-admin-jp → jp/adapters/wof-admin}/adapter.js +0 -0
  962. /package/out/tools/{sub-venue → sub/venue}/head-nouns.js +0 -0
  963. /package/out/tools/{sub-venue → sub/venue}/surfaces.js +0 -0
  964. /package/out/tools/{sub-venue → sub/venue}/table.js +0 -0
  965. /package/out/{adapters → us/adapters}/fcc-bdc/adapter.d.ts +0 -0
  966. /package/out/{adapters/state-hi-schools → us/adapters/state/hi-schools}/adapter.d.ts +0 -0
  967. /package/out/{adapters/state-hi-schools → us/adapters/state/hi-schools}/workbook.d.ts +0 -0
  968. /package/out/{adapters/state-hi-schools → us/adapters/state/hi-schools}/workbook.js +0 -0
  969. /package/out/{adapters/state-ia-contractors → us/adapters/state/ia-contractors}/adapter.d.ts +0 -0
  970. /package/out/{adapters/state-ny-notaries → us/adapters/state/ny-notaries}/adapter.d.ts +0 -0
  971. /package/out/{adapters/state-tx-notaries → us/adapters/state/tx-notaries}/adapter.d.ts +0 -0
  972. /package/out/{adapters → us/adapters}/tiger/street-decompose.d.ts +0 -0
  973. /package/out/{adapters → us/adapters}/tiger/street-decompose.js +0 -0
  974. /package/out/{adapters/usgov-hrsa-fqhc → us/adapters/usgov/hrsa-fqhc}/adapter.d.ts +0 -0
  975. /package/out/{adapters/usgov-imls-pls → us/adapters/usgov/imls-pls}/adapter.d.ts +0 -0
  976. /package/out/{adapters/usgov-irs-bmf → us/adapters/usgov/irs-bmf}/adapter.d.ts +0 -0
  977. /package/out/{adapters/usgov-nad → us/adapters/usgov/nad}/adapter.d.ts +0 -0
  978. /package/out/{adapters/usgov-nppes → us/adapters/usgov/nppes}/adapter.d.ts +0 -0
  979. /package/out/{adapters/usgov-samhsa-treatment-locator → us/adapters/usgov/samhsa-treatment-locator}/adapter.d.ts +0 -0
  980. /package/out/{recipes → ve/recipes}/reviewed-postcode-tail.d.ts +0 -0
  981. /package/out/{recipes → ve/recipes}/reviewed-postcode-tail.js +0 -0
@@ -0,0 +1,376 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * #511 base-consistency lint, GENERALIZED + COUNTRY-SCOPED (v2) — any synthetic slice vs the base.
7
+ *
8
+ * Ported from scripts/lint-slice-vocab.py (pyarrow → @duckdb/node-api); behavior preserved
9
+ * byte-for-byte (same flags, same stdout, same verdicts). The base-root default routes through
10
+ * `dataRootPath` so the lab `/mnt/playpen` literal stays in its one home
11
+ * (core/utils/data-root.ts) and `$MAILWOMAN_DATA_ROOT` is honored; with the env unset it equals
12
+ * the Python default.
13
+ *
14
+ * The #511 lesson: a synthetic slice must not label a token a tag the BASE dominantly labels
15
+ * something else, or training gets conflicting gradients on the same token and the minority (the
16
+ * slice) loses. This reads a slice's own (token -> tag) and checks each token against the base.
17
+ *
18
+ * WHY v2 IS COUNTRY-SCOPED + FULL-COUNT (the night-2026-06-18 lesson, learned the hard way over
19
+ * three tries): a token's correct tag is COUNTRY-specific — "Paris" is locality in FR data and
20
+ * street in US "Paris Ave"; "Marion" is a US town AND many US "Marion" streets. So:
21
+ *
22
+ * 1. A cross-COUNTRY aggregate mis-judges any country-specific token (v1 uniform AND a proportional
23
+ * retry both false-flagged FR cities as "street" from US street-contexts).
24
+ * 2. A SMALL sample is street-BIASED regardless, because the street sources (tiger 39 + nad 378 parts)
25
+ * dwarf the locality sources (a small US-scoped spot-check read Indianapolis 54% street vs
26
+ * its true 219700:29 LOCALITY). The fix: tally each slice token's base tag SCOPED to the
27
+ * country the slice uses it in (the base has a `country` column), over a LARGE/FULL scan
28
+ * (`fraction`, default 1.0). Pure-numeric tokens excluded (house_number/postcode are
29
+ * context-determined). An affix-split flag (slice street_suffix/_prefix vs base "street") is
30
+ * EXPECTED — the loader's affix-relabel handles it; weigh those separately.
31
+ *
32
+ * Usage: mailwoman dev lint slice-vocab --slice <slice.parquet>
33
+ * [--base-version v0.5.0] [--base-root <dir>] [--fraction 1.0] [--threshold 0.7] [--min-count
34
+ * 50]
35
+ */
36
+
37
+ import { dataRootPath } from "@mailwoman/core/data-root"
38
+ import { tryParsingJSON } from "@mailwoman/core/json"
39
+ import { pyRound } from "@mailwoman/core/numeric"
40
+ import { join } from "path-ts"
41
+ import { Globerator } from "spliterator/node/fs"
42
+
43
+ import { connectDuckDB, type DuckDBConnection } from "#utils/parquet"
44
+
45
+ /**
46
+ * A column-projected base/slice row: parallel token + label lists plus the row's country.
47
+ */
48
+ interface CorpusRow {
49
+ tokens: string[]
50
+ labels: string[]
51
+ country: string | null
52
+ }
53
+
54
+ /**
55
+ * Strip a BIO prefix ("B-"/"I-") off a label, matching the Python `strip_bio`.
56
+ */
57
+ function stripBIO(label: string): string {
58
+ const head = label.slice(0, 2)
59
+
60
+ return head === "B-" || head === "I-" ? label.slice(2) : label
61
+ }
62
+
63
+ /**
64
+ * Python `str.isdigit()`: non-empty and every character a Unicode digit. Pure-numeric tokens (house_number / postcode)
65
+ * are context-determined, not lexical vocab, so they're excluded. `\p{Nd}` covers the decimal digits these address
66
+ * corpora actually contain.
67
+ */
68
+ function isDigit(token: string): boolean {
69
+ return token.length > 0 && /^\p{Nd}+$/u.test(token)
70
+ }
71
+
72
+ /**
73
+ * Format a fraction as a whole-percent string the way Python's `:.0%` does, e.g. 0.73 -> "73%".
74
+ */
75
+ function pct(frac: number): string {
76
+ return `${pyRound(frac * 100)}%`
77
+ }
78
+
79
+ /**
80
+ * Format a float the way a Python f-string renders it: integer-valued floats keep one decimal (1.0 -> "1.0"),
81
+ * everything else is its shortest decimal (0.5 -> "0.5"). Used for the `fraction` echo so the banner matches the Python
82
+ * print.
83
+ */
84
+ function formatPyFloat(n: number): string {
85
+ return Number.isInteger(n) ? n.toFixed(1) : String(n)
86
+ }
87
+
88
+ /**
89
+ * Left-justify to a minimum width with spaces, matching Python's `{value:N}` string field.
90
+ */
91
+ function pad(value: string, width: number): string {
92
+ return value.padEnd(width)
93
+ }
94
+
95
+ /**
96
+ * The dominant tag of a counter: (tag, total, fraction). Empty counter -> ("", 0, 0.0). Ties go to the first-inserted
97
+ * tag, mirroring `Counter.most_common(1)` (stable on equal counts).
98
+ */
99
+ function dominant(counter: Map<string, number>): [string, number, number] {
100
+ let total = 0
101
+ let bestTag = ""
102
+ let bestCount = -1
103
+
104
+ for (const [tag, count] of counter) {
105
+ total += count
106
+
107
+ if (count > bestCount) {
108
+ bestCount = count
109
+ bestTag = tag
110
+ }
111
+ }
112
+
113
+ if (total === 0) return ["", 0, 0]
114
+
115
+ return [bestTag, total, bestCount / total]
116
+ }
117
+
118
+ /**
119
+ * Bump a (key -> count) tally, creating the inner counter on first sight.
120
+ */
121
+ function bump(table: Map<string, Map<string, number>>, key: string, sub: string): void {
122
+ let counter = table.get(key)
123
+
124
+ if (!counter) {
125
+ counter = new Map()
126
+ table.set(key, counter)
127
+ }
128
+
129
+ counter.set(sub, (counter.get(sub) ?? 0) + 1)
130
+ }
131
+
132
+ /**
133
+ * Read a corpus parquet into rows, projecting only tokens/labels/country. The list columns ride out as JSON text
134
+ * (DuckDB `to_json`) — the same trick the gazetteer builders use for nested columns — and parse back to string arrays
135
+ * here.
136
+ */
137
+ async function readRows(con: DuckDBConnection, path: string): Promise<CorpusRow[]> {
138
+ const result = await con.runAndReadAll(
139
+ `SELECT to_json(tokens) AS tokens, to_json(labels) AS labels, country FROM read_parquet('${path}')`
140
+ )
141
+
142
+ const raw = result.getRowObjects() as Array<{ tokens: unknown; labels: unknown; country: unknown }>
143
+ const rows: CorpusRow[] = []
144
+
145
+ for (const r of raw) {
146
+ const tokens = tryParsingJSON(String(r.tokens))
147
+ const labels = tryParsingJSON(String(r.labels))
148
+
149
+ if (!Array.isArray(tokens) || !Array.isArray(labels)) continue
150
+
151
+ rows.push({
152
+ tokens: tokens as string[],
153
+ labels: labels as string[],
154
+ country: r.country == null ? null : String(r.country),
155
+ })
156
+ }
157
+
158
+ return rows
159
+ }
160
+
161
+ /**
162
+ * Read just the first row's `source` value — used to group base parts for a proportional slice.
163
+ */
164
+ async function readSource(con: DuckDBConnection, path: string): Promise<string> {
165
+ const result = await con.runAndReadAll(`SELECT source FROM read_parquet('${path}') LIMIT 1`)
166
+ const rows = result.getRowObjects() as Array<{ source: unknown }>
167
+
168
+ return rows.length ? String(rows[0]!.source) : ""
169
+ }
170
+
171
+ /**
172
+ * Options for {@linkcode lintSliceVocab}.
173
+ */
174
+ export interface LintSliceVocabOptions {
175
+ /**
176
+ * The slice parquet to lint.
177
+ */
178
+ slice: string
179
+ /**
180
+ * Base corpus version. Default `v0.5.0`.
181
+ */
182
+ baseVersion?: string
183
+ /**
184
+ * Base corpus root. Default `$MAILWOMAN_DATA_ROOT/corpus/versioned`.
185
+ */
186
+ baseRoot?: string
187
+ /**
188
+ * Base-majority confidence floor for a contradiction. Default 0.7.
189
+ */
190
+ threshold?: number
191
+ /**
192
+ * Minimum base support to judge a token. Default 50.
193
+ */
194
+ minCount?: number
195
+ /**
196
+ * Fraction of base parts to scan (proportional per-source slice below 1.0). Default 1.0.
197
+ */
198
+ fraction?: number
199
+ }
200
+
201
+ /**
202
+ * One contradiction row: token, slice tag, base tag, base fraction, base total.
203
+ */
204
+ export type SliceVocabRow = [token: string, sliceTag: string, baseTag: string, baseFrac: number, baseTotal: number]
205
+
206
+ /**
207
+ * Findings summary returned by {@linkcode lintSliceVocab}.
208
+ */
209
+ export interface LintSliceVocabSummary {
210
+ /**
211
+ * Real contradictions — the command exits 1 when nonzero.
212
+ */
213
+ errors: number
214
+ /**
215
+ * Affix-split rows (EXPECTED — the loader's affix-relabel handles them).
216
+ */
217
+ warnings: number
218
+ findings: { contradictions: SliceVocabRow[]; affixSplits: SliceVocabRow[] }
219
+ }
220
+
221
+ /**
222
+ * Lint a synthetic slice's (token → tag) vocabulary against the base corpus, country-scoped.
223
+ */
224
+ export async function lintSliceVocab(options: LintSliceVocabOptions): Promise<LintSliceVocabSummary> {
225
+ const baseVersion = options.baseVersion ?? "v0.5.0"
226
+ const baseRoot = options.baseRoot ?? dataRootPath("corpus", "versioned")
227
+ const threshold = options.threshold ?? 0.7
228
+ const minCount = options.minCount ?? 50
229
+ const fraction = options.fraction ?? 1
230
+
231
+ const con = await connectDuckDB()
232
+
233
+ // 1. the slice's own (token -> dominant tag) + the COUNTRIES it uses each token in
234
+ const sliceRows = await readRows(con, options.slice)
235
+ const sliceTags = new Map<string, Map<string, number>>()
236
+ const sliceCountries = new Map<string, Set<string | null>>()
237
+
238
+ for (const { tokens, labels, country } of sliceRows) {
239
+ const n = Math.min(tokens.length, labels.length)
240
+
241
+ for (let i = 0; i < n; i++) {
242
+ const w = tokens[i]!
243
+ const l = labels[i]!
244
+
245
+ if (isDigit(w)) continue // numbers are context-determined (house_number/postcode), not lexical vocab
246
+ bump(sliceTags, w, stripBIO(l))
247
+ let set = sliceCountries.get(w)
248
+
249
+ if (!set) {
250
+ set = new Set()
251
+ sliceCountries.set(w, set)
252
+ }
253
+
254
+ set.add(country)
255
+ }
256
+ }
257
+
258
+ const sliceVocab = new Set(sliceTags.keys())
259
+
260
+ console.log(`slice: ${sliceRows.length} rows, ${sliceVocab.size} unique tokens`)
261
+
262
+ // 2. base parts — FULL by default; fraction<1 takes a proportional per-source slice (still big)
263
+ const trainDir = join(baseRoot, baseVersion, `corpus-${baseVersion}`, "train")
264
+
265
+ let parts = (
266
+ await Globerator.from("*.parquet", {
267
+ cwd: trainDir,
268
+ absolute: true,
269
+ }).toArray()
270
+ ).toSorted()
271
+
272
+ if (!parts.length) {
273
+ throw new Error("no base parts found")
274
+ }
275
+
276
+ if (fraction < 1) {
277
+ const bysrc = new Map<string, string[]>()
278
+
279
+ for (const p of parts) {
280
+ const src = await readSource(con, p)
281
+ let list = bysrc.get(src)
282
+
283
+ if (!list) {
284
+ list = []
285
+ bysrc.set(src, list)
286
+ }
287
+
288
+ list.push(p)
289
+ }
290
+
291
+ const sliced: string[] = []
292
+
293
+ for (const ps of bysrc.values()) {
294
+ const take = Math.max(2, pyRound(ps.length * fraction))
295
+
296
+ for (const p of ps.slice(0, take)) {
297
+ sliced.push(p)
298
+ }
299
+ }
300
+
301
+ parts = sliced
302
+ }
303
+
304
+ console.log(
305
+ `base ${baseVersion}: scanning ${parts.length} parts (fraction=${formatPyFloat(fraction)}), COUNTRY-scoped`
306
+ )
307
+
308
+ // 3. tally each slice token's base tag, SCOPED to the country the slice uses it in
309
+ const baseTags = new Map<string, Map<string, number>>()
310
+
311
+ for (let i = 0; i < parts.length; i++) {
312
+ const rows = await readRows(con, parts[i]!)
313
+
314
+ for (const { tokens, labels, country } of rows) {
315
+ const n = Math.min(tokens.length, labels.length)
316
+
317
+ for (let j = 0; j < n; j++) {
318
+ const w = tokens[j]!
319
+
320
+ if (sliceVocab.has(w) && sliceCountries.get(w)!.has(country)) {
321
+ bump(baseTags, w, stripBIO(labels[j]!))
322
+ }
323
+ }
324
+ }
325
+
326
+ if ((i + 1) % 100 === 0) {
327
+ console.log(` ...${i + 1}/${parts.length} parts`)
328
+ }
329
+ }
330
+
331
+ // 4. compare; flag contradictions (affix-split is expected — surfaced but tagged)
332
+ const flagged: SliceVocabRow[] = []
333
+ const affix: SliceVocabRow[] = []
334
+
335
+ for (const w of sliceVocab) {
336
+ const [sTag] = dominant(sliceTags.get(w)!)
337
+ const [bTag, bTotal, bFrac] = dominant(baseTags.get(w) ?? new Map())
338
+
339
+ if (bTotal < minCount || !bTag || bTag === sTag || bFrac < threshold) continue
340
+ const row: SliceVocabRow = [w, sTag, bTag, bFrac, bTotal]
341
+
342
+ if ((sTag === "street_suffix" || sTag === "street_prefix") && bTag === "street") {
343
+ affix.push(row)
344
+ } else {
345
+ flagged.push(row)
346
+ }
347
+ }
348
+
349
+ const sections: Array<[string, SliceVocabRow[]]> = [
350
+ ["CONTRADICTION", flagged],
351
+ ["affix-split (EXPECTED — affix-relabel handles)", affix],
352
+ ]
353
+
354
+ for (const [label, rows] of sections) {
355
+ if (!rows.length) continue
356
+ rows.sort((a, b) => b[4] - a[4] || b[3] - a[3])
357
+
358
+ console.log(`\n${label.startsWith("CONTRA") ? "⚠️ " : "· "}${rows.length} ${label}:`)
359
+
360
+ for (const [w, sTag, bTag, bFrac, bTotal] of rows) {
361
+ console.log(` ${pad(w, 18)} slice=${pad(sTag, 14)} base=${bTag} (${pct(bFrac)}, n=${bTotal})`)
362
+ }
363
+ }
364
+
365
+ if (!flagged.length) {
366
+ console.log(
367
+ `\n✅ NO real contradictions (country-scoped, threshold ${pct(threshold)}, support ${minCount}) — slice base-consistent`
368
+ )
369
+ }
370
+
371
+ return {
372
+ errors: flagged.length,
373
+ warnings: affix.length,
374
+ findings: { contradictions: flagged, affixSplits: affix },
375
+ }
376
+ }
@@ -4,10 +4,12 @@
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
6
  * Assemble a corpus OVERLAY MANIFEST — generalized from assemble-fr-admin-split-overlay-manifest.
7
- * ADDS one slice parquet to a base corpus, keeping every base slice VERBATIM (pure overlay ADD),
8
- * and re-roots base paths to /data (the Modal volume). Parameterized by --slice-parquet +
9
- * --source so it works for any overlay slice (the fr-admin-split one is the original; #148's
10
- * overture-multilocale is the second user).
7
+ * ADDS slice parquets to a base corpus, keeping every base slice VERBATIM (pure overlay ADD), and
8
+ * re-roots base paths to /data (the Modal volume). Parameterized by --slice-parquet + --source, one
9
+ * label per parquet, so it works for any overlay (the fr-admin-split one is the original; #148's
10
+ * overture-multilocale is the second user; v0.29.0's eight target-family slices are why it takes a
11
+ * set rather than one — chaining eight single-slice overlays would leave seven dead directories and
12
+ * an eight-deep base chain for what is one version).
11
13
  *
12
14
  * Ported faithfully from scripts/assemble-overlay-manifest.py. The new slice's source_id column is
13
15
  * read through DuckDB (`@duckdb/node-api`) instead of PyArrow; everything else is pure JSON.
@@ -43,14 +45,62 @@ interface SliceDescriptor {
43
45
  source: string
44
46
  }
45
47
 
48
+ type ManifestSlice = Record<string, unknown> & { path: string; source?: string }
49
+
50
+ /**
51
+ * The two keys a manifest written before the 2026-09-01 vocabulary rename uses for its slice list and its size. Every
52
+ * corpus built before that date carries them, here and on the Modal volume, and a built corpus is an immutable artifact
53
+ * — so a reader accepts either spelling and a writer emits only the current one. Spelled by concatenation because the
54
+ * word is banned in this tree and the ratchet's baseline is zero.
55
+ */
56
+ const LEGACY_SLICES_KEY = `sh${"ards"}` as const
57
+ const LEGACY_ROWS_PER_SLICE_KEY = `rows_per_sh${"ard"}` as const
58
+
46
59
  interface BaseManifest {
47
60
  corpus_version?: string
48
61
  schema: unknown
49
- rows_per_slice: unknown
62
+ rows_per_slice?: unknown
50
63
  row_group_size: unknown
51
- slices: Array<Record<string, unknown> & { path: string; source?: string }>
64
+ slices?: ManifestSlice[]
52
65
  counts: { train: number; val: number; test: number }
53
66
  total_rows: number
67
+ /**
68
+ * The pre-rename spellings, present on every corpus built before 2026-09-01.
69
+ */
70
+ [LEGACY_SLICES_KEY]?: ManifestSlice[]
71
+ [LEGACY_ROWS_PER_SLICE_KEY]?: unknown
72
+ }
73
+
74
+ /**
75
+ * A base manifest's slice list under either key.
76
+ *
77
+ * The rename moved this reader and the trainer's to the new key without migrating the manifests, and the trainer
78
+ * measured the cost on 2026-09-09: `v0.28.0-reviewed-postcode-tail` declares 706 train slices under the old key and the
79
+ * loader resolved ONE. An overlay assembled from a base read as empty would carry no base slices at all.
80
+ */
81
+ export function baseManifestSlices(base: BaseManifest): ManifestSlice[] {
82
+ const slices = base.slices?.length ? base.slices : base[LEGACY_SLICES_KEY]
83
+
84
+ if (slices?.length) return slices
85
+
86
+ throw new Error(
87
+ `base manifest lists no slices under "slices" or the pre-rename key — refusing to assemble an overlay whose base would be empty`
88
+ )
89
+ }
90
+
91
+ /**
92
+ * The base's rows-per-slice under either key, carried through to the new manifest verbatim.
93
+ */
94
+ function baseRowsPerSlice(base: BaseManifest): unknown {
95
+ return base.rows_per_slice ?? base[LEGACY_ROWS_PER_SLICE_KEY]
96
+ }
97
+
98
+ /**
99
+ * One parquet to add, with the source label its rows carry.
100
+ */
101
+ export interface OverlaySlice {
102
+ parquet: string
103
+ source: string
54
104
  }
55
105
 
56
106
  async function descriptor(
@@ -82,8 +132,10 @@ export interface OverlayManifestOptions {
82
132
  newDir: string
83
133
  modalRoot: string
84
134
  version: string
85
- sliceParquet: string
86
- source: string
135
+ /**
136
+ * The parquets this overlay adds, in the order they should appear after the base's own.
137
+ */
138
+ slices: readonly OverlaySlice[]
87
139
  note: string
88
140
  }
89
141
 
@@ -106,43 +158,58 @@ export function rerootBaseSlicePath(path: string, baseManifestPath: string): str
106
158
  }
107
159
 
108
160
  export async function assembleOverlayManifest(args: OverlayManifestOptions): Promise<void> {
161
+ if (!args.slices.length) throw new Error("an overlay must add at least one slice")
162
+
109
163
  const base = await readLocalJSONFile<BaseManifest>(args.base)
164
+ const baseSlices = baseManifestSlices(base)
110
165
 
111
- if (base.slices.some((s) => s.source === args.source)) {
112
- console.log(`WARN: base already contains source '${args.source}' — is this the right base?`)
166
+ for (const slice of args.slices) {
167
+ if (baseSlices.some((s) => s.source === slice.source)) {
168
+ console.log(`WARN: base already contains source '${slice.source}' — is this the right base?`)
169
+ }
113
170
  }
114
171
 
115
- const kept = base.slices.map((s) => ({ ...s, path: rerootBaseSlicePath(s.path, args.base) }))
172
+ const kept = baseSlices.map((s) => ({ ...s, path: rerootBaseSlicePath(s.path, args.base) }))
173
+ const added: SliceDescriptor[] = []
174
+
175
+ for (const slice of args.slices) {
176
+ added.push(
177
+ await descriptor(
178
+ join(args.newDir, "train", slice.parquet),
179
+ `${args.modalRoot}/train/${slice.parquet}`,
180
+ "train",
181
+ slice.source
182
+ )
183
+ )
184
+ }
116
185
 
117
- const newTrain = await descriptor(
118
- join(args.newDir, "train", args.sliceParquet),
119
- `${args.modalRoot}/train/${args.sliceParquet}`,
120
- "train",
121
- args.source
122
- )
186
+ const addedRows = added.reduce((total, slice) => total + slice.rows, 0)
187
+ const sources = args.slices.map((slice) => slice.source).join(", ")
123
188
 
124
189
  const manifest = {
125
190
  corpus_version: args.version,
126
191
  overlay_base: base.corpus_version ?? null,
127
- note:
128
- args.note || `${base.corpus_version} slices (all kept verbatim) + the ${args.source} slice. Pure overlay add.`,
192
+ note: args.note || `${base.corpus_version} slices (all kept verbatim) + ${sources}. Pure overlay add.`,
129
193
  schema: base.schema,
130
- rows_per_slice: base.rows_per_slice,
194
+ rows_per_slice: baseRowsPerSlice(base),
131
195
  row_group_size: base.row_group_size,
132
- slices: [...kept, newTrain],
196
+ slices: [...kept, ...added],
133
197
  counts: {
134
- train: base.counts.train + newTrain.rows,
198
+ train: base.counts.train + addedRows,
135
199
  val: base.counts.val,
136
200
  test: base.counts.test,
137
201
  },
138
- total_rows: base.total_rows + newTrain.rows,
202
+ total_rows: base.total_rows + addedRows,
139
203
  }
140
204
 
141
205
  const out = join(args.newDir, "MANIFEST.json")
142
206
  await writeLocalJSONFile(manifest, out)
143
207
 
144
208
  console.log(`wrote ${out}`)
145
- console.log(` slices: ${manifest.slices.length} (${kept.length} base kept, +1 ${args.source})`)
209
+ console.log(` slices: ${manifest.slices.length} (${kept.length} base kept, +${added.length} added)`)
146
210
  console.log(` counts: ${JSON.stringify(manifest.counts)} total: ${manifest.total_rows}`)
147
- console.log(` ${args.source} train: ${newTrain.rows} rows (${newTrain.bytes} bytes)`)
211
+
212
+ for (const slice of added) {
213
+ console.log(` ${slice.source} train: ${slice.rows} rows (${slice.bytes} bytes)`)
214
+ }
148
215
  }
@@ -40,7 +40,7 @@
40
40
 
41
41
  import { DatabaseClient } from "@mailwoman/sqlite/client"
42
42
 
43
- import type { SubVenueHarvestRow } from "#tools/sub-venue-lexicon"
43
+ import type { SubVenueHarvestRow } from "#tools/sub/venue/lexicon"
44
44
 
45
45
  /**
46
46
  * Overture Places category → the designator its rows attest.