@mailwoman/corpus 9.2.0 → 9.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 (1261) hide show
  1. package/README.md +22 -22
  2. package/data/PROVENANCE.md +7 -7
  3. package/lib/adapters/ban/adapter.ts +190 -0
  4. package/lib/adapters/ban/street-decompose.ts +66 -0
  5. package/lib/adapters/fcc-bdc/adapter.ts +174 -0
  6. package/lib/adapters/geonames/adapter.ts +199 -0
  7. package/lib/adapters/geonames-postal/adapter.ts +122 -0
  8. package/lib/adapters/gnaf/adapter.ts +149 -0
  9. package/lib/adapters/gnaf/assemble.ts +225 -0
  10. package/lib/adapters/index.ts +153 -0
  11. package/lib/adapters/openaddresses/adapter.ts +251 -0
  12. package/lib/adapters/overture/adapter.ts +162 -0
  13. package/lib/adapters/state-hi-schools/adapter.ts +170 -0
  14. package/lib/adapters/state-hi-schools/workbook.ts +35 -0
  15. package/lib/adapters/synth-po-box/adapter.ts +204 -0
  16. package/lib/adapters/tiger/adapter.ts +252 -0
  17. package/lib/adapters/tiger/street-decompose.ts +83 -0
  18. package/lib/adapters/usgov-hrsa-fqhc/adapter.ts +167 -0
  19. package/lib/adapters/usgov-imls-pls/adapter.ts +143 -0
  20. package/lib/adapters/usgov-irs-bmf/adapter.ts +151 -0
  21. package/lib/adapters/usgov-nad/adapter.ts +334 -0
  22. package/lib/adapters/usgov-nppes/adapter.ts +151 -0
  23. package/lib/adapters/usgov-samhsa-treatment-locator/adapter.ts +193 -0
  24. package/lib/adapters/utils/index.ts +307 -0
  25. package/lib/adapters/wof-admin-jp/adapter.ts +214 -0
  26. package/lib/adapters/wof-admin-json/adapter.ts +231 -0
  27. package/lib/adapters/wof-json-rows.ts +129 -0
  28. package/lib/adapters/wof-postalcode-json/adapter.ts +176 -0
  29. package/lib/build.ts +378 -0
  30. package/lib/env.ts +50 -0
  31. package/lib/index.ts +13 -0
  32. package/lib/recipes/anchor-absorption.ts +101 -0
  33. package/lib/recipes/bare-country.ts +95 -0
  34. package/lib/recipes/boundary-stress.ts +102 -0
  35. package/lib/recipes/cn-organizational-units.ts +199 -0
  36. package/lib/recipes/country-balanced.ts +510 -0
  37. package/lib/recipes/cz-pcfirst-preposition.ts +112 -0
  38. package/lib/recipes/fr-admin-split.ts +243 -0
  39. package/lib/recipes/fr-bare-street.ts +171 -0
  40. package/lib/recipes/fr-fragment.ts +334 -0
  41. package/lib/recipes/fr-lieudit.ts +301 -0
  42. package/lib/recipes/fr-order.ts +246 -0
  43. package/lib/recipes/german.ts +360 -0
  44. package/lib/recipes/house-venue.ts +93 -0
  45. package/lib/recipes/index.ts +97 -0
  46. package/lib/recipes/intersection.ts +619 -0
  47. package/lib/recipes/locale.ts +600 -0
  48. package/lib/recipes/nl-postcode.ts +117 -0
  49. package/lib/recipes/no-fragment.ts +213 -0
  50. package/lib/recipes/no-street-led.ts +135 -0
  51. package/lib/recipes/no-street.ts +91 -0
  52. package/lib/recipes/po-box-cedex.ts +976 -0
  53. package/lib/recipes/po-box.ts +124 -0
  54. package/lib/recipes/reviewed-postcode-tail.ts +190 -0
  55. package/lib/recipes/scaffold.ts +468 -0
  56. package/lib/recipes/si-bare-village.ts +99 -0
  57. package/lib/recipes/street-affix.ts +805 -0
  58. package/lib/recipes/street-bare.ts +102 -0
  59. package/lib/recipes/street.ts +83 -0
  60. package/lib/recipes/sub-venue-sources.ts +878 -0
  61. package/lib/recipes/sub-venue.ts +998 -0
  62. package/lib/recipes/trailing-region.ts +178 -0
  63. package/lib/recipes/unit.ts +304 -0
  64. package/lib/runner.ts +312 -0
  65. package/lib/synthesizers/anchor-absorption.ts +288 -0
  66. package/lib/synthesizers/boundary-stress.ts +532 -0
  67. package/lib/synthesizers/german.ts +260 -0
  68. package/lib/synthesizers/house-venue.ts +308 -0
  69. package/lib/synthesizers/intersection.ts +233 -0
  70. package/lib/synthesizers/no-street.ts +327 -0
  71. package/lib/synthesizers/po-box.ts +323 -0
  72. package/lib/synthesizers/street.ts +269 -0
  73. package/lib/synthesizers/utils.ts +993 -0
  74. package/lib/test-kit/corpus-recipe.ts +86 -0
  75. package/lib/test-kit/index.ts +100 -0
  76. package/lib/tools/align-slice.ts +68 -0
  77. package/lib/tools/audit.ts +403 -0
  78. package/lib/tools/corpus-stats.ts +136 -0
  79. package/lib/tools/fetch/acra-sg.ts +174 -0
  80. package/lib/tools/fetch/ban.ts +289 -0
  81. package/lib/tools/fetch/download.ts +477 -0
  82. package/lib/tools/fetch/gcis-tw.ts +175 -0
  83. package/lib/tools/fetch/geonames-dump.ts +257 -0
  84. package/lib/tools/fetch/geonames-postal.ts +180 -0
  85. package/lib/tools/fetch/houjin-jp.ts +135 -0
  86. package/lib/tools/fetch/hrsa.ts +59 -0
  87. package/lib/tools/fetch/imls-pls.ts +149 -0
  88. package/lib/tools/fetch/index.ts +174 -0
  89. package/lib/tools/fetch/juso-kr.ts +165 -0
  90. package/lib/tools/fetch/localdata-kr.ts +194 -0
  91. package/lib/tools/fetch/nad.ts +341 -0
  92. package/lib/tools/fetch/nppes.ts +165 -0
  93. package/lib/tools/fetch/openaddresses.ts +347 -0
  94. package/lib/tools/fetch/ourairports.ts +170 -0
  95. package/lib/tools/fetch/ppd.ts +121 -0
  96. package/lib/tools/fetch/state-hi-schools.ts +161 -0
  97. package/lib/tools/fetch/state-sources.ts +146 -0
  98. package/lib/tools/fetch/tiger-full.ts +308 -0
  99. package/lib/tools/fetch/wikidata-subvenue.ts +384 -0
  100. package/lib/tools/golden-expand.ts +574 -0
  101. package/lib/tools/golden-promote.ts +337 -0
  102. package/lib/tools/golden-relabel-street.ts +686 -0
  103. package/lib/tools/index.ts +28 -0
  104. package/lib/tools/ingest-csv.ts +378 -0
  105. package/lib/tools/jsonl-to-parquet.ts +207 -0
  106. package/lib/tools/lint-slice-vocab.ts +388 -0
  107. package/lib/tools/lint-slice.ts +496 -0
  108. package/lib/tools/overlay-manifest.ts +148 -0
  109. package/lib/tools/overture-subvenue.ts +209 -0
  110. package/lib/tools/postcode-triples.ts +363 -0
  111. package/lib/tools/slice-kryptonite.ts +137 -0
  112. package/lib/tools/slice-translit.ts +218 -0
  113. package/lib/tools/sub-venue/harvest.ts +234 -0
  114. package/lib/tools/sub-venue/head-nouns.ts +245 -0
  115. package/lib/tools/sub-venue/surfaces.ts +95 -0
  116. package/lib/tools/sub-venue/table.ts +281 -0
  117. package/lib/tools/sub-venue/wikidata.ts +85 -0
  118. package/lib/tools/sub-venue-lexicon.ts +429 -0
  119. package/lib/tools/sub-venue-promotions.ts +330 -0
  120. package/lib/types.ts +247 -0
  121. package/lib/utils/align.ts +330 -0
  122. package/lib/utils/golden.ts +189 -0
  123. package/lib/utils/index.ts +14 -0
  124. package/lib/utils/parquet.ts +582 -0
  125. package/lib/utils/slice-stats.ts +95 -0
  126. package/lib/utils/split.ts +279 -0
  127. package/lib/utils/tokenize.ts +120 -0
  128. package/lib/utils/wof-json.ts +247 -0
  129. package/out/adapters/ban/adapter.d.ts.map +1 -0
  130. package/out/adapters/ban/adapter.js +149 -0
  131. package/out/adapters/ban/adapter.js.map +1 -0
  132. package/out/adapters/ban/street-decompose.d.ts.map +1 -0
  133. package/out/adapters/ban/street-decompose.js +51 -0
  134. package/out/adapters/ban/street-decompose.js.map +1 -0
  135. package/out/adapters/fcc-bdc/adapter.d.ts.map +1 -0
  136. package/out/adapters/fcc-bdc/adapter.js +144 -0
  137. package/out/adapters/fcc-bdc/adapter.js.map +1 -0
  138. package/out/adapters/geonames/adapter.d.ts.map +1 -0
  139. package/out/adapters/geonames/adapter.js +176 -0
  140. package/out/adapters/geonames/adapter.js.map +1 -0
  141. package/out/adapters/geonames-postal/adapter.d.ts +54 -0
  142. package/out/adapters/geonames-postal/adapter.d.ts.map +1 -0
  143. package/out/adapters/geonames-postal/adapter.js +107 -0
  144. package/out/adapters/geonames-postal/adapter.js.map +1 -0
  145. package/out/adapters/gnaf/adapter.d.ts +49 -0
  146. package/out/adapters/gnaf/adapter.d.ts.map +1 -0
  147. package/out/adapters/gnaf/adapter.js +124 -0
  148. package/out/adapters/gnaf/adapter.js.map +1 -0
  149. package/out/adapters/gnaf/assemble.d.ts +65 -0
  150. package/out/adapters/gnaf/assemble.d.ts.map +1 -0
  151. package/out/adapters/gnaf/assemble.js +154 -0
  152. package/out/adapters/gnaf/assemble.js.map +1 -0
  153. package/out/adapters/index.d.ts +51 -0
  154. package/out/adapters/index.d.ts.map +1 -0
  155. package/out/adapters/index.js +95 -0
  156. package/out/adapters/index.js.map +1 -0
  157. package/out/adapters/openaddresses/adapter.d.ts.map +1 -0
  158. package/out/adapters/openaddresses/adapter.js +186 -0
  159. package/out/adapters/openaddresses/adapter.js.map +1 -0
  160. package/out/adapters/overture/adapter.d.ts +48 -0
  161. package/out/adapters/overture/adapter.d.ts.map +1 -0
  162. package/out/adapters/overture/adapter.js +125 -0
  163. package/out/adapters/overture/adapter.js.map +1 -0
  164. package/out/adapters/state-hi-schools/adapter.d.ts +46 -0
  165. package/out/adapters/state-hi-schools/adapter.d.ts.map +1 -0
  166. package/out/adapters/state-hi-schools/adapter.js +145 -0
  167. package/out/adapters/state-hi-schools/adapter.js.map +1 -0
  168. package/out/adapters/state-hi-schools/workbook.d.ts +29 -0
  169. package/out/adapters/state-hi-schools/workbook.d.ts.map +1 -0
  170. package/out/adapters/state-hi-schools/workbook.js +20 -0
  171. package/out/adapters/state-hi-schools/workbook.js.map +1 -0
  172. package/out/adapters/state-ia-contractors/adapter.d.ts.map +1 -0
  173. package/out/adapters/state-ia-contractors/adapter.js.map +1 -0
  174. package/out/adapters/state-ny-notaries/adapter.d.ts.map +1 -0
  175. package/out/adapters/state-ny-notaries/adapter.js.map +1 -0
  176. package/out/adapters/state-tx-notaries/adapter.d.ts.map +1 -0
  177. package/out/adapters/state-tx-notaries/adapter.js.map +1 -0
  178. package/out/adapters/synth-po-box/adapter.d.ts.map +1 -0
  179. package/out/adapters/synth-po-box/adapter.js +140 -0
  180. package/out/adapters/synth-po-box/adapter.js.map +1 -0
  181. package/out/adapters/tiger/adapter.d.ts +55 -0
  182. package/out/adapters/tiger/adapter.d.ts.map +1 -0
  183. package/out/adapters/tiger/adapter.js +201 -0
  184. package/out/adapters/tiger/adapter.js.map +1 -0
  185. package/out/adapters/tiger/street-decompose.d.ts.map +1 -0
  186. package/out/adapters/tiger/street-decompose.js +68 -0
  187. package/out/adapters/tiger/street-decompose.js.map +1 -0
  188. package/out/adapters/usgov-hrsa-fqhc/adapter.d.ts +56 -0
  189. package/out/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +1 -0
  190. package/out/adapters/usgov-hrsa-fqhc/adapter.js +132 -0
  191. package/out/adapters/usgov-hrsa-fqhc/adapter.js.map +1 -0
  192. package/out/adapters/usgov-imls-pls/adapter.d.ts +36 -0
  193. package/out/adapters/usgov-imls-pls/adapter.d.ts.map +1 -0
  194. package/out/adapters/usgov-imls-pls/adapter.js +114 -0
  195. package/out/adapters/usgov-imls-pls/adapter.js.map +1 -0
  196. package/out/adapters/usgov-irs-bmf/adapter.d.ts +37 -0
  197. package/out/adapters/usgov-irs-bmf/adapter.d.ts.map +1 -0
  198. package/out/adapters/usgov-irs-bmf/adapter.js +120 -0
  199. package/out/adapters/usgov-irs-bmf/adapter.js.map +1 -0
  200. package/out/adapters/usgov-nad/adapter.d.ts +48 -0
  201. package/out/adapters/usgov-nad/adapter.d.ts.map +1 -0
  202. package/out/adapters/usgov-nad/adapter.js +249 -0
  203. package/out/adapters/usgov-nad/adapter.js.map +1 -0
  204. package/out/adapters/usgov-nppes/adapter.d.ts.map +1 -0
  205. package/out/adapters/usgov-nppes/adapter.js +118 -0
  206. package/out/adapters/usgov-nppes/adapter.js.map +1 -0
  207. package/out/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +1 -0
  208. package/out/adapters/usgov-samhsa-treatment-locator/adapter.js +154 -0
  209. package/out/adapters/usgov-samhsa-treatment-locator/adapter.js.map +1 -0
  210. package/out/adapters/utils/index.d.ts +191 -0
  211. package/out/adapters/utils/index.d.ts.map +1 -0
  212. package/out/adapters/utils/index.js +206 -0
  213. package/out/adapters/utils/index.js.map +1 -0
  214. package/out/adapters/wof-admin-jp/adapter.d.ts.map +1 -0
  215. package/out/adapters/wof-admin-jp/adapter.js +161 -0
  216. package/out/adapters/wof-admin-jp/adapter.js.map +1 -0
  217. package/out/adapters/wof-admin-json/adapter.d.ts +79 -0
  218. package/out/adapters/wof-admin-json/adapter.d.ts.map +1 -0
  219. package/out/adapters/wof-admin-json/adapter.js +197 -0
  220. package/out/adapters/wof-admin-json/adapter.js.map +1 -0
  221. package/out/adapters/wof-json-rows.d.ts +62 -0
  222. package/out/adapters/wof-json-rows.d.ts.map +1 -0
  223. package/out/adapters/wof-json-rows.js +83 -0
  224. package/out/adapters/wof-json-rows.js.map +1 -0
  225. package/out/adapters/wof-postalcode-json/adapter.d.ts +65 -0
  226. package/out/adapters/wof-postalcode-json/adapter.d.ts.map +1 -0
  227. package/out/adapters/wof-postalcode-json/adapter.js +151 -0
  228. package/out/adapters/wof-postalcode-json/adapter.js.map +1 -0
  229. package/out/build.d.ts +132 -0
  230. package/out/build.d.ts.map +1 -0
  231. package/out/build.js +245 -0
  232. package/out/build.js.map +1 -0
  233. package/out/codex/us-fips-state.d.ts.map +1 -0
  234. package/out/codex/us-fips-state.js.map +1 -0
  235. package/out/env.d.ts +46 -0
  236. package/out/env.d.ts.map +1 -0
  237. package/out/env.js +46 -0
  238. package/out/env.js.map +1 -0
  239. package/out/index.d.ts +13 -0
  240. package/out/index.d.ts.map +1 -0
  241. package/out/index.js +13 -0
  242. package/out/index.js.map +1 -0
  243. package/out/recipes/anchor-absorption.d.ts +20 -0
  244. package/out/recipes/anchor-absorption.d.ts.map +1 -0
  245. package/out/recipes/anchor-absorption.js +82 -0
  246. package/out/recipes/anchor-absorption.js.map +1 -0
  247. package/out/recipes/bare-country.d.ts +25 -0
  248. package/out/recipes/bare-country.d.ts.map +1 -0
  249. package/out/recipes/bare-country.js +88 -0
  250. package/out/recipes/bare-country.js.map +1 -0
  251. package/out/recipes/boundary-stress.d.ts +20 -0
  252. package/out/recipes/boundary-stress.d.ts.map +1 -0
  253. package/out/recipes/boundary-stress.js +84 -0
  254. package/out/recipes/boundary-stress.js.map +1 -0
  255. package/out/recipes/cn-organizational-units.d.ts +36 -0
  256. package/out/recipes/cn-organizational-units.d.ts.map +1 -0
  257. package/out/recipes/cn-organizational-units.js +159 -0
  258. package/out/recipes/cn-organizational-units.js.map +1 -0
  259. package/out/recipes/country-balanced.d.ts +32 -0
  260. package/out/recipes/country-balanced.d.ts.map +1 -0
  261. package/out/recipes/country-balanced.js +394 -0
  262. package/out/recipes/country-balanced.js.map +1 -0
  263. package/out/recipes/cz-pcfirst-preposition.d.ts +22 -0
  264. package/out/recipes/cz-pcfirst-preposition.d.ts.map +1 -0
  265. package/out/recipes/cz-pcfirst-preposition.js +101 -0
  266. package/out/recipes/cz-pcfirst-preposition.js.map +1 -0
  267. package/out/recipes/fr-admin-split.d.ts +38 -0
  268. package/out/recipes/fr-admin-split.d.ts.map +1 -0
  269. package/out/recipes/fr-admin-split.js +192 -0
  270. package/out/recipes/fr-admin-split.js.map +1 -0
  271. package/out/recipes/fr-bare-street.d.ts +28 -0
  272. package/out/recipes/fr-bare-street.d.ts.map +1 -0
  273. package/out/recipes/fr-bare-street.js +144 -0
  274. package/out/recipes/fr-bare-street.js.map +1 -0
  275. package/out/recipes/fr-fragment.d.ts +77 -0
  276. package/out/recipes/fr-fragment.d.ts.map +1 -0
  277. package/out/recipes/fr-fragment.js +277 -0
  278. package/out/recipes/fr-fragment.js.map +1 -0
  279. package/out/recipes/fr-lieudit.d.ts +32 -0
  280. package/out/recipes/fr-lieudit.d.ts.map +1 -0
  281. package/out/recipes/fr-lieudit.js +227 -0
  282. package/out/recipes/fr-lieudit.js.map +1 -0
  283. package/out/recipes/fr-order.d.ts +38 -0
  284. package/out/recipes/fr-order.d.ts.map +1 -0
  285. package/out/recipes/fr-order.js +198 -0
  286. package/out/recipes/fr-order.js.map +1 -0
  287. package/out/recipes/german.d.ts +44 -0
  288. package/out/recipes/german.d.ts.map +1 -0
  289. package/out/recipes/german.js +289 -0
  290. package/out/recipes/german.js.map +1 -0
  291. package/out/recipes/house-venue.d.ts +18 -0
  292. package/out/recipes/house-venue.d.ts.map +1 -0
  293. package/out/recipes/house-venue.js +74 -0
  294. package/out/recipes/house-venue.js.map +1 -0
  295. package/out/recipes/index.d.ts +24 -0
  296. package/out/recipes/index.d.ts.map +1 -0
  297. package/out/recipes/index.js +91 -0
  298. package/out/recipes/index.js.map +1 -0
  299. package/out/recipes/intersection.d.ts +42 -0
  300. package/out/recipes/intersection.d.ts.map +1 -0
  301. package/out/recipes/intersection.js +453 -0
  302. package/out/recipes/intersection.js.map +1 -0
  303. package/out/recipes/locale.d.ts +136 -0
  304. package/out/recipes/locale.d.ts.map +1 -0
  305. package/out/recipes/locale.js +460 -0
  306. package/out/recipes/locale.js.map +1 -0
  307. package/out/recipes/nl-postcode.d.ts +26 -0
  308. package/out/recipes/nl-postcode.d.ts.map +1 -0
  309. package/out/recipes/nl-postcode.js +103 -0
  310. package/out/recipes/nl-postcode.js.map +1 -0
  311. package/out/recipes/no-fragment.d.ts +43 -0
  312. package/out/recipes/no-fragment.d.ts.map +1 -0
  313. package/out/recipes/no-fragment.js +183 -0
  314. package/out/recipes/no-fragment.js.map +1 -0
  315. package/out/recipes/no-street-led.d.ts +24 -0
  316. package/out/recipes/no-street-led.d.ts.map +1 -0
  317. package/out/recipes/no-street-led.js +114 -0
  318. package/out/recipes/no-street-led.js.map +1 -0
  319. package/out/recipes/no-street.d.ts +18 -0
  320. package/out/recipes/no-street.d.ts.map +1 -0
  321. package/out/recipes/no-street.js +72 -0
  322. package/out/recipes/no-street.js.map +1 -0
  323. package/out/recipes/po-box-cedex.d.ts +38 -0
  324. package/out/recipes/po-box-cedex.d.ts.map +1 -0
  325. package/out/recipes/po-box-cedex.js +768 -0
  326. package/out/recipes/po-box-cedex.js.map +1 -0
  327. package/out/recipes/po-box.d.ts +17 -0
  328. package/out/recipes/po-box.d.ts.map +1 -0
  329. package/out/recipes/po-box.js +101 -0
  330. package/out/recipes/po-box.js.map +1 -0
  331. package/out/recipes/reviewed-postcode-tail.d.ts +47 -0
  332. package/out/recipes/reviewed-postcode-tail.d.ts.map +1 -0
  333. package/out/recipes/reviewed-postcode-tail.js +125 -0
  334. package/out/recipes/reviewed-postcode-tail.js.map +1 -0
  335. package/out/recipes/scaffold.d.ts +323 -0
  336. package/out/recipes/scaffold.d.ts.map +1 -0
  337. package/out/recipes/scaffold.js +174 -0
  338. package/out/recipes/scaffold.js.map +1 -0
  339. package/out/recipes/si-bare-village.d.ts +32 -0
  340. package/out/recipes/si-bare-village.d.ts.map +1 -0
  341. package/out/recipes/si-bare-village.js +89 -0
  342. package/out/recipes/si-bare-village.js.map +1 -0
  343. package/out/recipes/street-affix.d.ts +89 -0
  344. package/out/recipes/street-affix.d.ts.map +1 -0
  345. package/out/recipes/street-affix.js +563 -0
  346. package/out/recipes/street-affix.js.map +1 -0
  347. package/out/recipes/street-bare.d.ts +25 -0
  348. package/out/recipes/street-bare.d.ts.map +1 -0
  349. package/out/recipes/street-bare.js +87 -0
  350. package/out/recipes/street-bare.js.map +1 -0
  351. package/out/recipes/street.d.ts +15 -0
  352. package/out/recipes/street.d.ts.map +1 -0
  353. package/out/recipes/street.js +70 -0
  354. package/out/recipes/street.js.map +1 -0
  355. package/out/recipes/sub-venue-sources.d.ts +229 -0
  356. package/out/recipes/sub-venue-sources.d.ts.map +1 -0
  357. package/out/recipes/sub-venue-sources.js +654 -0
  358. package/out/recipes/sub-venue-sources.js.map +1 -0
  359. package/out/recipes/sub-venue.d.ts +269 -0
  360. package/out/recipes/sub-venue.d.ts.map +1 -0
  361. package/out/recipes/sub-venue.js +726 -0
  362. package/out/recipes/sub-venue.js.map +1 -0
  363. package/out/recipes/trailing-region.d.ts +74 -0
  364. package/out/recipes/trailing-region.d.ts.map +1 -0
  365. package/out/recipes/trailing-region.js +158 -0
  366. package/out/recipes/trailing-region.js.map +1 -0
  367. package/out/recipes/unit.d.ts +29 -0
  368. package/out/recipes/unit.d.ts.map +1 -0
  369. package/out/recipes/unit.js +231 -0
  370. package/out/recipes/unit.js.map +1 -0
  371. package/out/runner.d.ts +130 -0
  372. package/out/runner.d.ts.map +1 -0
  373. package/out/runner.js +185 -0
  374. package/out/runner.js.map +1 -0
  375. package/out/synthesizers/anchor-absorption.d.ts +63 -0
  376. package/out/synthesizers/anchor-absorption.d.ts.map +1 -0
  377. package/out/synthesizers/anchor-absorption.js +221 -0
  378. package/out/synthesizers/anchor-absorption.js.map +1 -0
  379. package/out/synthesizers/boundary-stress.d.ts +78 -0
  380. package/out/synthesizers/boundary-stress.d.ts.map +1 -0
  381. package/out/synthesizers/boundary-stress.js +455 -0
  382. package/out/synthesizers/boundary-stress.js.map +1 -0
  383. package/out/synthesizers/german.d.ts +115 -0
  384. package/out/synthesizers/german.d.ts.map +1 -0
  385. package/out/synthesizers/german.js +149 -0
  386. package/out/synthesizers/german.js.map +1 -0
  387. package/out/synthesizers/house-venue.d.ts +56 -0
  388. package/out/synthesizers/house-venue.d.ts.map +1 -0
  389. package/out/synthesizers/house-venue.js +247 -0
  390. package/out/synthesizers/house-venue.js.map +1 -0
  391. package/out/synthesizers/intersection.d.ts +52 -0
  392. package/out/synthesizers/intersection.d.ts.map +1 -0
  393. package/out/synthesizers/intersection.js +175 -0
  394. package/out/synthesizers/intersection.js.map +1 -0
  395. package/out/synthesizers/no-street.d.ts +72 -0
  396. package/out/synthesizers/no-street.d.ts.map +1 -0
  397. package/out/synthesizers/no-street.js +262 -0
  398. package/out/synthesizers/no-street.js.map +1 -0
  399. package/out/synthesizers/po-box.d.ts +108 -0
  400. package/out/synthesizers/po-box.d.ts.map +1 -0
  401. package/out/synthesizers/po-box.js +250 -0
  402. package/out/synthesizers/po-box.js.map +1 -0
  403. package/out/synthesizers/street.d.ts +54 -0
  404. package/out/synthesizers/street.d.ts.map +1 -0
  405. package/out/synthesizers/street.js +218 -0
  406. package/out/synthesizers/street.js.map +1 -0
  407. package/out/synthesizers/utils.d.ts +241 -0
  408. package/out/synthesizers/utils.d.ts.map +1 -0
  409. package/out/synthesizers/utils.js +776 -0
  410. package/out/synthesizers/utils.js.map +1 -0
  411. package/out/test-kit/corpus-recipe.d.ts +59 -0
  412. package/out/test-kit/corpus-recipe.d.ts.map +1 -0
  413. package/out/test-kit/corpus-recipe.js +39 -0
  414. package/out/test-kit/corpus-recipe.js.map +1 -0
  415. package/out/test-kit/index.d.ts +48 -0
  416. package/out/test-kit/index.d.ts.map +1 -0
  417. package/out/test-kit/index.js +78 -0
  418. package/out/test-kit/index.js.map +1 -0
  419. package/out/tools/align-slice.d.ts +7 -0
  420. package/out/tools/align-slice.d.ts.map +1 -0
  421. package/out/tools/align-slice.js +55 -0
  422. package/out/tools/align-slice.js.map +1 -0
  423. package/out/tools/audit.d.ts +29 -0
  424. package/out/tools/audit.d.ts.map +1 -0
  425. package/out/tools/audit.js +282 -0
  426. package/out/tools/audit.js.map +1 -0
  427. package/out/tools/corpus-stats.d.ts +44 -0
  428. package/out/tools/corpus-stats.d.ts.map +1 -0
  429. package/out/tools/corpus-stats.js +102 -0
  430. package/out/tools/corpus-stats.js.map +1 -0
  431. package/out/tools/fetch/acra-sg.d.ts +23 -0
  432. package/out/tools/fetch/acra-sg.d.ts.map +1 -0
  433. package/out/tools/fetch/acra-sg.js +126 -0
  434. package/out/tools/fetch/acra-sg.js.map +1 -0
  435. package/out/tools/fetch/ban.d.ts +31 -0
  436. package/out/tools/fetch/ban.d.ts.map +1 -0
  437. package/out/tools/fetch/ban.js +239 -0
  438. package/out/tools/fetch/ban.js.map +1 -0
  439. package/out/tools/fetch/download.d.ts +182 -0
  440. package/out/tools/fetch/download.d.ts.map +1 -0
  441. package/out/tools/fetch/download.js +318 -0
  442. package/out/tools/fetch/download.js.map +1 -0
  443. package/out/tools/fetch/gcis-tw.d.ts +23 -0
  444. package/out/tools/fetch/gcis-tw.d.ts.map +1 -0
  445. package/out/tools/fetch/gcis-tw.js +135 -0
  446. package/out/tools/fetch/gcis-tw.js.map +1 -0
  447. package/out/tools/fetch/geonames-dump.d.ts +91 -0
  448. package/out/tools/fetch/geonames-dump.d.ts.map +1 -0
  449. package/out/tools/fetch/geonames-dump.js +171 -0
  450. package/out/tools/fetch/geonames-dump.js.map +1 -0
  451. package/out/tools/fetch/geonames-postal.d.ts +76 -0
  452. package/out/tools/fetch/geonames-postal.d.ts.map +1 -0
  453. package/out/tools/fetch/geonames-postal.js +126 -0
  454. package/out/tools/fetch/geonames-postal.js.map +1 -0
  455. package/out/tools/fetch/houjin-jp.d.ts +24 -0
  456. package/out/tools/fetch/houjin-jp.d.ts.map +1 -0
  457. package/out/tools/fetch/houjin-jp.js +102 -0
  458. package/out/tools/fetch/houjin-jp.js.map +1 -0
  459. package/out/tools/fetch/hrsa.d.ts +18 -0
  460. package/out/tools/fetch/hrsa.d.ts.map +1 -0
  461. package/out/tools/fetch/hrsa.js +46 -0
  462. package/out/tools/fetch/hrsa.js.map +1 -0
  463. package/out/tools/fetch/imls-pls.d.ts +25 -0
  464. package/out/tools/fetch/imls-pls.d.ts.map +1 -0
  465. package/out/tools/fetch/imls-pls.js +108 -0
  466. package/out/tools/fetch/imls-pls.js.map +1 -0
  467. package/out/tools/fetch/index.d.ts +171 -0
  468. package/out/tools/fetch/index.d.ts.map +1 -0
  469. package/out/tools/fetch/index.js +170 -0
  470. package/out/tools/fetch/index.js.map +1 -0
  471. package/out/tools/fetch/juso-kr.d.ts +30 -0
  472. package/out/tools/fetch/juso-kr.d.ts.map +1 -0
  473. package/out/tools/fetch/juso-kr.js +120 -0
  474. package/out/tools/fetch/juso-kr.js.map +1 -0
  475. package/out/tools/fetch/localdata-kr.d.ts +30 -0
  476. package/out/tools/fetch/localdata-kr.d.ts.map +1 -0
  477. package/out/tools/fetch/localdata-kr.js +139 -0
  478. package/out/tools/fetch/localdata-kr.js.map +1 -0
  479. package/out/tools/fetch/nad.d.ts +70 -0
  480. package/out/tools/fetch/nad.d.ts.map +1 -0
  481. package/out/tools/fetch/nad.js +234 -0
  482. package/out/tools/fetch/nad.js.map +1 -0
  483. package/out/tools/fetch/nppes.d.ts +26 -0
  484. package/out/tools/fetch/nppes.d.ts.map +1 -0
  485. package/out/tools/fetch/nppes.js +126 -0
  486. package/out/tools/fetch/nppes.js.map +1 -0
  487. package/out/tools/fetch/openaddresses.d.ts +9 -0
  488. package/out/tools/fetch/openaddresses.d.ts.map +1 -0
  489. package/out/tools/fetch/openaddresses.js +279 -0
  490. package/out/tools/fetch/openaddresses.js.map +1 -0
  491. package/out/tools/fetch/ourairports.d.ts +45 -0
  492. package/out/tools/fetch/ourairports.d.ts.map +1 -0
  493. package/out/tools/fetch/ourairports.js +128 -0
  494. package/out/tools/fetch/ourairports.js.map +1 -0
  495. package/out/tools/fetch/ppd.d.ts.map +1 -0
  496. package/out/tools/fetch/ppd.js +85 -0
  497. package/out/tools/fetch/ppd.js.map +1 -0
  498. package/out/tools/fetch/state-hi-schools.d.ts +26 -0
  499. package/out/tools/fetch/state-hi-schools.d.ts.map +1 -0
  500. package/out/tools/fetch/state-hi-schools.js +112 -0
  501. package/out/tools/fetch/state-hi-schools.js.map +1 -0
  502. package/out/tools/fetch/state-sources.d.ts +26 -0
  503. package/out/tools/fetch/state-sources.d.ts.map +1 -0
  504. package/out/tools/fetch/state-sources.js +111 -0
  505. package/out/tools/fetch/state-sources.js.map +1 -0
  506. package/out/tools/fetch/tiger-full.d.ts +22 -0
  507. package/out/tools/fetch/tiger-full.d.ts.map +1 -0
  508. package/out/tools/fetch/tiger-full.js +217 -0
  509. package/out/tools/fetch/tiger-full.js.map +1 -0
  510. package/out/tools/fetch/wikidata-subvenue.d.ts +171 -0
  511. package/out/tools/fetch/wikidata-subvenue.d.ts.map +1 -0
  512. package/out/tools/fetch/wikidata-subvenue.js +274 -0
  513. package/out/tools/fetch/wikidata-subvenue.js.map +1 -0
  514. package/out/tools/gb-title-case.d.ts.map +1 -0
  515. package/out/tools/gb-title-case.js.map +1 -0
  516. package/out/tools/golden-expand.d.ts +90 -0
  517. package/out/tools/golden-expand.d.ts.map +1 -0
  518. package/out/tools/golden-expand.js +406 -0
  519. package/out/tools/golden-expand.js.map +1 -0
  520. package/out/tools/golden-promote.d.ts.map +1 -0
  521. package/out/tools/golden-promote.js +240 -0
  522. package/out/tools/golden-promote.js.map +1 -0
  523. package/out/tools/golden-relabel-street.d.ts +196 -0
  524. package/out/tools/golden-relabel-street.d.ts.map +1 -0
  525. package/out/tools/golden-relabel-street.js +439 -0
  526. package/out/tools/golden-relabel-street.js.map +1 -0
  527. package/out/tools/index.d.ts +28 -0
  528. package/out/tools/index.d.ts.map +1 -0
  529. package/out/tools/index.js +28 -0
  530. package/out/tools/index.js.map +1 -0
  531. package/out/tools/ingest-csv.d.ts.map +1 -0
  532. package/out/tools/ingest-csv.js +265 -0
  533. package/out/tools/ingest-csv.js.map +1 -0
  534. package/out/tools/jsonl-to-parquet.d.ts +61 -0
  535. package/out/tools/jsonl-to-parquet.d.ts.map +1 -0
  536. package/out/tools/jsonl-to-parquet.js +150 -0
  537. package/out/tools/jsonl-to-parquet.js.map +1 -0
  538. package/out/tools/lint-slice-vocab.d.ts +90 -0
  539. package/out/tools/lint-slice-vocab.d.ts.map +1 -0
  540. package/out/tools/lint-slice-vocab.js +267 -0
  541. package/out/tools/lint-slice-vocab.js.map +1 -0
  542. package/out/tools/lint-slice.d.ts +93 -0
  543. package/out/tools/lint-slice.d.ts.map +1 -0
  544. package/out/tools/lint-slice.js +322 -0
  545. package/out/tools/lint-slice.js.map +1 -0
  546. package/out/tools/overlay-manifest.d.ts +39 -0
  547. package/out/tools/overlay-manifest.d.ts.map +1 -0
  548. package/out/tools/overlay-manifest.js +90 -0
  549. package/out/tools/overlay-manifest.js.map +1 -0
  550. package/out/tools/overture-subvenue.d.ts +112 -0
  551. package/out/tools/overture-subvenue.d.ts.map +1 -0
  552. package/out/tools/overture-subvenue.js +139 -0
  553. package/out/tools/overture-subvenue.js.map +1 -0
  554. package/out/tools/postcode-triples.d.ts +174 -0
  555. package/out/tools/postcode-triples.d.ts.map +1 -0
  556. package/out/tools/postcode-triples.js +292 -0
  557. package/out/tools/postcode-triples.js.map +1 -0
  558. package/out/tools/slice-kryptonite.d.ts +32 -0
  559. package/out/tools/slice-kryptonite.d.ts.map +1 -0
  560. package/out/tools/slice-kryptonite.js +99 -0
  561. package/out/tools/slice-kryptonite.js.map +1 -0
  562. package/out/tools/slice-translit.d.ts +51 -0
  563. package/out/tools/slice-translit.d.ts.map +1 -0
  564. package/out/tools/slice-translit.js +166 -0
  565. package/out/tools/slice-translit.js.map +1 -0
  566. package/out/tools/sub-venue/harvest.d.ts +100 -0
  567. package/out/tools/sub-venue/harvest.d.ts.map +1 -0
  568. package/out/tools/sub-venue/harvest.js +168 -0
  569. package/out/tools/sub-venue/harvest.js.map +1 -0
  570. package/out/tools/sub-venue/head-nouns.d.ts +50 -0
  571. package/out/tools/sub-venue/head-nouns.d.ts.map +1 -0
  572. package/out/tools/sub-venue/head-nouns.js +213 -0
  573. package/out/tools/sub-venue/head-nouns.js.map +1 -0
  574. package/out/tools/sub-venue/surfaces.d.ts +45 -0
  575. package/out/tools/sub-venue/surfaces.d.ts.map +1 -0
  576. package/out/tools/sub-venue/surfaces.js +77 -0
  577. package/out/tools/sub-venue/surfaces.js.map +1 -0
  578. package/out/tools/sub-venue/table.d.ts +229 -0
  579. package/out/tools/sub-venue/table.d.ts.map +1 -0
  580. package/out/tools/sub-venue/table.js +108 -0
  581. package/out/tools/sub-venue/table.js.map +1 -0
  582. package/out/tools/sub-venue/wikidata.d.ts +26 -0
  583. package/out/tools/sub-venue/wikidata.d.ts.map +1 -0
  584. package/out/tools/sub-venue/wikidata.js +62 -0
  585. package/out/tools/sub-venue/wikidata.js.map +1 -0
  586. package/out/tools/sub-venue-lexicon.d.ts +156 -0
  587. package/out/tools/sub-venue-lexicon.d.ts.map +1 -0
  588. package/out/tools/sub-venue-lexicon.js +283 -0
  589. package/out/tools/sub-venue-lexicon.js.map +1 -0
  590. package/out/tools/sub-venue-promotions.d.ts +94 -0
  591. package/out/tools/sub-venue-promotions.d.ts.map +1 -0
  592. package/out/tools/sub-venue-promotions.js +266 -0
  593. package/out/tools/sub-venue-promotions.js.map +1 -0
  594. package/out/types.d.ts +221 -0
  595. package/out/types.d.ts.map +1 -0
  596. package/out/types.js.map +1 -0
  597. package/out/utils/align.d.ts +93 -0
  598. package/out/utils/align.d.ts.map +1 -0
  599. package/out/utils/align.js +234 -0
  600. package/out/utils/align.js.map +1 -0
  601. package/out/utils/golden.d.ts +85 -0
  602. package/out/utils/golden.d.ts.map +1 -0
  603. package/out/utils/golden.js +127 -0
  604. package/out/utils/golden.js.map +1 -0
  605. package/out/utils/index.d.ts +14 -0
  606. package/out/utils/index.d.ts.map +1 -0
  607. package/out/utils/index.js +14 -0
  608. package/out/utils/index.js.map +1 -0
  609. package/out/utils/license.d.ts.map +1 -0
  610. package/out/utils/license.js.map +1 -0
  611. package/out/utils/parquet.d.ts +178 -0
  612. package/out/utils/parquet.d.ts.map +1 -0
  613. package/out/utils/parquet.js +371 -0
  614. package/out/utils/parquet.js.map +1 -0
  615. package/out/utils/slice-stats.d.ts +52 -0
  616. package/out/utils/slice-stats.d.ts.map +1 -0
  617. package/out/utils/slice-stats.js +58 -0
  618. package/out/utils/slice-stats.js.map +1 -0
  619. package/out/utils/split.d.ts +128 -0
  620. package/out/utils/split.d.ts.map +1 -0
  621. package/out/utils/split.js +204 -0
  622. package/out/utils/split.js.map +1 -0
  623. package/out/utils/tokenize.d.ts +64 -0
  624. package/out/utils/tokenize.d.ts.map +1 -0
  625. package/out/utils/tokenize.js +82 -0
  626. package/out/utils/tokenize.js.map +1 -0
  627. package/out/utils/wof-json.d.ts +113 -0
  628. package/out/utils/wof-json.d.ts.map +1 -0
  629. package/out/utils/wof-json.js +173 -0
  630. package/out/utils/wof-json.js.map +1 -0
  631. package/package.json +259 -194
  632. package/out/src/adapters/ban/adapter.d.ts.map +0 -1
  633. package/out/src/adapters/ban/adapter.js +0 -149
  634. package/out/src/adapters/ban/adapter.js.map +0 -1
  635. package/out/src/adapters/ban/street-decompose.d.ts.map +0 -1
  636. package/out/src/adapters/ban/street-decompose.js +0 -75
  637. package/out/src/adapters/ban/street-decompose.js.map +0 -1
  638. package/out/src/adapters/fcc-bdc/adapter.d.ts.map +0 -1
  639. package/out/src/adapters/fcc-bdc/adapter.js +0 -144
  640. package/out/src/adapters/fcc-bdc/adapter.js.map +0 -1
  641. package/out/src/adapters/geonames/adapter.d.ts.map +0 -1
  642. package/out/src/adapters/geonames/adapter.js +0 -176
  643. package/out/src/adapters/geonames/adapter.js.map +0 -1
  644. package/out/src/adapters/geonames-postal/adapter.d.ts +0 -41
  645. package/out/src/adapters/geonames-postal/adapter.d.ts.map +0 -1
  646. package/out/src/adapters/geonames-postal/adapter.js +0 -104
  647. package/out/src/adapters/geonames-postal/adapter.js.map +0 -1
  648. package/out/src/adapters/gnaf/adapter.d.ts +0 -49
  649. package/out/src/adapters/gnaf/adapter.d.ts.map +0 -1
  650. package/out/src/adapters/gnaf/adapter.js +0 -124
  651. package/out/src/adapters/gnaf/adapter.js.map +0 -1
  652. package/out/src/adapters/gnaf/assemble.d.ts +0 -65
  653. package/out/src/adapters/gnaf/assemble.d.ts.map +0 -1
  654. package/out/src/adapters/gnaf/assemble.js +0 -154
  655. package/out/src/adapters/gnaf/assemble.js.map +0 -1
  656. package/out/src/adapters/index.d.ts +0 -51
  657. package/out/src/adapters/index.d.ts.map +0 -1
  658. package/out/src/adapters/index.js +0 -95
  659. package/out/src/adapters/index.js.map +0 -1
  660. package/out/src/adapters/openaddresses/adapter.d.ts.map +0 -1
  661. package/out/src/adapters/openaddresses/adapter.js +0 -186
  662. package/out/src/adapters/openaddresses/adapter.js.map +0 -1
  663. package/out/src/adapters/overture/adapter.d.ts +0 -48
  664. package/out/src/adapters/overture/adapter.d.ts.map +0 -1
  665. package/out/src/adapters/overture/adapter.js +0 -125
  666. package/out/src/adapters/overture/adapter.js.map +0 -1
  667. package/out/src/adapters/state-hi-schools/adapter.d.ts +0 -47
  668. package/out/src/adapters/state-hi-schools/adapter.d.ts.map +0 -1
  669. package/out/src/adapters/state-hi-schools/adapter.js +0 -133
  670. package/out/src/adapters/state-hi-schools/adapter.js.map +0 -1
  671. package/out/src/adapters/state-ia-contractors/adapter.d.ts.map +0 -1
  672. package/out/src/adapters/state-ia-contractors/adapter.js.map +0 -1
  673. package/out/src/adapters/state-ny-notaries/adapter.d.ts.map +0 -1
  674. package/out/src/adapters/state-ny-notaries/adapter.js.map +0 -1
  675. package/out/src/adapters/state-tx-notaries/adapter.d.ts.map +0 -1
  676. package/out/src/adapters/state-tx-notaries/adapter.js.map +0 -1
  677. package/out/src/adapters/synth-po-box/adapter.d.ts.map +0 -1
  678. package/out/src/adapters/synth-po-box/adapter.js +0 -140
  679. package/out/src/adapters/synth-po-box/adapter.js.map +0 -1
  680. package/out/src/adapters/tiger/adapter.d.ts +0 -55
  681. package/out/src/adapters/tiger/adapter.d.ts.map +0 -1
  682. package/out/src/adapters/tiger/adapter.js +0 -201
  683. package/out/src/adapters/tiger/adapter.js.map +0 -1
  684. package/out/src/adapters/tiger/street-decompose.d.ts.map +0 -1
  685. package/out/src/adapters/tiger/street-decompose.js +0 -90
  686. package/out/src/adapters/tiger/street-decompose.js.map +0 -1
  687. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts +0 -47
  688. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +0 -1
  689. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js +0 -139
  690. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js.map +0 -1
  691. package/out/src/adapters/usgov-imls-pls/adapter.d.ts +0 -36
  692. package/out/src/adapters/usgov-imls-pls/adapter.d.ts.map +0 -1
  693. package/out/src/adapters/usgov-imls-pls/adapter.js +0 -114
  694. package/out/src/adapters/usgov-imls-pls/adapter.js.map +0 -1
  695. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts +0 -37
  696. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts.map +0 -1
  697. package/out/src/adapters/usgov-irs-bmf/adapter.js +0 -124
  698. package/out/src/adapters/usgov-irs-bmf/adapter.js.map +0 -1
  699. package/out/src/adapters/usgov-nad/adapter.d.ts +0 -48
  700. package/out/src/adapters/usgov-nad/adapter.d.ts.map +0 -1
  701. package/out/src/adapters/usgov-nad/adapter.js +0 -252
  702. package/out/src/adapters/usgov-nad/adapter.js.map +0 -1
  703. package/out/src/adapters/usgov-nppes/adapter.d.ts.map +0 -1
  704. package/out/src/adapters/usgov-nppes/adapter.js +0 -116
  705. package/out/src/adapters/usgov-nppes/adapter.js.map +0 -1
  706. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +0 -1
  707. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js +0 -156
  708. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js.map +0 -1
  709. package/out/src/adapters/utils/index.d.ts +0 -150
  710. package/out/src/adapters/utils/index.d.ts.map +0 -1
  711. package/out/src/adapters/utils/index.js +0 -159
  712. package/out/src/adapters/utils/index.js.map +0 -1
  713. package/out/src/adapters/wof-admin-jp/adapter.d.ts.map +0 -1
  714. package/out/src/adapters/wof-admin-jp/adapter.js +0 -164
  715. package/out/src/adapters/wof-admin-jp/adapter.js.map +0 -1
  716. package/out/src/adapters/wof-admin-json/adapter.d.ts +0 -82
  717. package/out/src/adapters/wof-admin-json/adapter.d.ts.map +0 -1
  718. package/out/src/adapters/wof-admin-json/adapter.js +0 -224
  719. package/out/src/adapters/wof-admin-json/adapter.js.map +0 -1
  720. package/out/src/adapters/wof-json-rows.d.ts +0 -32
  721. package/out/src/adapters/wof-json-rows.d.ts.map +0 -1
  722. package/out/src/adapters/wof-json-rows.js +0 -45
  723. package/out/src/adapters/wof-json-rows.js.map +0 -1
  724. package/out/src/adapters/wof-postalcode-json/adapter.d.ts +0 -65
  725. package/out/src/adapters/wof-postalcode-json/adapter.d.ts.map +0 -1
  726. package/out/src/adapters/wof-postalcode-json/adapter.js +0 -160
  727. package/out/src/adapters/wof-postalcode-json/adapter.js.map +0 -1
  728. package/out/src/build.d.ts +0 -132
  729. package/out/src/build.d.ts.map +0 -1
  730. package/out/src/build.js +0 -251
  731. package/out/src/build.js.map +0 -1
  732. package/out/src/codex/us-fips-state.d.ts.map +0 -1
  733. package/out/src/codex/us-fips-state.js.map +0 -1
  734. package/out/src/index.d.ts +0 -14
  735. package/out/src/index.d.ts.map +0 -1
  736. package/out/src/index.js +0 -14
  737. package/out/src/index.js.map +0 -1
  738. package/out/src/name-prone-us-suffixes.d.ts +0 -12
  739. package/out/src/name-prone-us-suffixes.d.ts.map +0 -1
  740. package/out/src/name-prone-us-suffixes.js +0 -12
  741. package/out/src/name-prone-us-suffixes.js.map +0 -1
  742. package/out/src/parquet-wrapper/index.d.ts +0 -9
  743. package/out/src/parquet-wrapper/index.d.ts.map +0 -1
  744. package/out/src/parquet-wrapper/index.js +0 -9
  745. package/out/src/parquet-wrapper/index.js.map +0 -1
  746. package/out/src/parquet-wrapper/reader.d.ts +0 -34
  747. package/out/src/parquet-wrapper/reader.d.ts.map +0 -1
  748. package/out/src/parquet-wrapper/reader.js +0 -69
  749. package/out/src/parquet-wrapper/reader.js.map +0 -1
  750. package/out/src/parquet-wrapper/schema.d.ts +0 -49
  751. package/out/src/parquet-wrapper/schema.d.ts.map +0 -1
  752. package/out/src/parquet-wrapper/schema.js +0 -55
  753. package/out/src/parquet-wrapper/schema.js.map +0 -1
  754. package/out/src/parquet-wrapper/writer.d.ts +0 -46
  755. package/out/src/parquet-wrapper/writer.d.ts.map +0 -1
  756. package/out/src/parquet-wrapper/writer.js +0 -76
  757. package/out/src/parquet-wrapper/writer.js.map +0 -1
  758. package/out/src/runner.d.ts +0 -126
  759. package/out/src/runner.d.ts.map +0 -1
  760. package/out/src/runner.js +0 -189
  761. package/out/src/runner.js.map +0 -1
  762. package/out/src/shard-recipes/anchor-absorption.d.ts +0 -20
  763. package/out/src/shard-recipes/anchor-absorption.d.ts.map +0 -1
  764. package/out/src/shard-recipes/anchor-absorption.js +0 -82
  765. package/out/src/shard-recipes/anchor-absorption.js.map +0 -1
  766. package/out/src/shard-recipes/bare-country.d.ts +0 -25
  767. package/out/src/shard-recipes/bare-country.d.ts.map +0 -1
  768. package/out/src/shard-recipes/bare-country.js +0 -87
  769. package/out/src/shard-recipes/bare-country.js.map +0 -1
  770. package/out/src/shard-recipes/boundary-stress.d.ts +0 -20
  771. package/out/src/shard-recipes/boundary-stress.d.ts.map +0 -1
  772. package/out/src/shard-recipes/boundary-stress.js +0 -83
  773. package/out/src/shard-recipes/boundary-stress.js.map +0 -1
  774. package/out/src/shard-recipes/country-balanced.d.ts +0 -32
  775. package/out/src/shard-recipes/country-balanced.d.ts.map +0 -1
  776. package/out/src/shard-recipes/country-balanced.js +0 -406
  777. package/out/src/shard-recipes/country-balanced.js.map +0 -1
  778. package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts +0 -22
  779. package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts.map +0 -1
  780. package/out/src/shard-recipes/cz-pcfirst-preposition.js +0 -100
  781. package/out/src/shard-recipes/cz-pcfirst-preposition.js.map +0 -1
  782. package/out/src/shard-recipes/fr-admin-split.d.ts +0 -38
  783. package/out/src/shard-recipes/fr-admin-split.d.ts.map +0 -1
  784. package/out/src/shard-recipes/fr-admin-split.js +0 -188
  785. package/out/src/shard-recipes/fr-admin-split.js.map +0 -1
  786. package/out/src/shard-recipes/fr-bare-street.d.ts +0 -28
  787. package/out/src/shard-recipes/fr-bare-street.d.ts.map +0 -1
  788. package/out/src/shard-recipes/fr-bare-street.js +0 -143
  789. package/out/src/shard-recipes/fr-bare-street.js.map +0 -1
  790. package/out/src/shard-recipes/fr-fragment.d.ts +0 -77
  791. package/out/src/shard-recipes/fr-fragment.d.ts.map +0 -1
  792. package/out/src/shard-recipes/fr-fragment.js +0 -276
  793. package/out/src/shard-recipes/fr-fragment.js.map +0 -1
  794. package/out/src/shard-recipes/fr-lieudit.d.ts +0 -32
  795. package/out/src/shard-recipes/fr-lieudit.d.ts.map +0 -1
  796. package/out/src/shard-recipes/fr-lieudit.js +0 -226
  797. package/out/src/shard-recipes/fr-lieudit.js.map +0 -1
  798. package/out/src/shard-recipes/fr-order.d.ts +0 -38
  799. package/out/src/shard-recipes/fr-order.d.ts.map +0 -1
  800. package/out/src/shard-recipes/fr-order.js +0 -208
  801. package/out/src/shard-recipes/fr-order.js.map +0 -1
  802. package/out/src/shard-recipes/german.d.ts +0 -23
  803. package/out/src/shard-recipes/german.d.ts.map +0 -1
  804. package/out/src/shard-recipes/german.js +0 -132
  805. package/out/src/shard-recipes/german.js.map +0 -1
  806. package/out/src/shard-recipes/house-venue.d.ts +0 -18
  807. package/out/src/shard-recipes/house-venue.d.ts.map +0 -1
  808. package/out/src/shard-recipes/house-venue.js +0 -74
  809. package/out/src/shard-recipes/house-venue.js.map +0 -1
  810. package/out/src/shard-recipes/index.d.ts +0 -24
  811. package/out/src/shard-recipes/index.d.ts.map +0 -1
  812. package/out/src/shard-recipes/index.js +0 -89
  813. package/out/src/shard-recipes/index.js.map +0 -1
  814. package/out/src/shard-recipes/intersection.d.ts +0 -42
  815. package/out/src/shard-recipes/intersection.d.ts.map +0 -1
  816. package/out/src/shard-recipes/intersection.js +0 -460
  817. package/out/src/shard-recipes/intersection.js.map +0 -1
  818. package/out/src/shard-recipes/locale.d.ts +0 -135
  819. package/out/src/shard-recipes/locale.d.ts.map +0 -1
  820. package/out/src/shard-recipes/locale.js +0 -459
  821. package/out/src/shard-recipes/locale.js.map +0 -1
  822. package/out/src/shard-recipes/nl-postcode.d.ts +0 -26
  823. package/out/src/shard-recipes/nl-postcode.d.ts.map +0 -1
  824. package/out/src/shard-recipes/nl-postcode.js +0 -102
  825. package/out/src/shard-recipes/nl-postcode.js.map +0 -1
  826. package/out/src/shard-recipes/no-fragment.d.ts +0 -43
  827. package/out/src/shard-recipes/no-fragment.d.ts.map +0 -1
  828. package/out/src/shard-recipes/no-fragment.js +0 -188
  829. package/out/src/shard-recipes/no-fragment.js.map +0 -1
  830. package/out/src/shard-recipes/no-street-led.d.ts +0 -24
  831. package/out/src/shard-recipes/no-street-led.d.ts.map +0 -1
  832. package/out/src/shard-recipes/no-street-led.js +0 -121
  833. package/out/src/shard-recipes/no-street-led.js.map +0 -1
  834. package/out/src/shard-recipes/no-street.d.ts +0 -18
  835. package/out/src/shard-recipes/no-street.d.ts.map +0 -1
  836. package/out/src/shard-recipes/no-street.js +0 -72
  837. package/out/src/shard-recipes/no-street.js.map +0 -1
  838. package/out/src/shard-recipes/po-box-cedex.d.ts +0 -38
  839. package/out/src/shard-recipes/po-box-cedex.d.ts.map +0 -1
  840. package/out/src/shard-recipes/po-box-cedex.js +0 -726
  841. package/out/src/shard-recipes/po-box-cedex.js.map +0 -1
  842. package/out/src/shard-recipes/po-box.d.ts +0 -17
  843. package/out/src/shard-recipes/po-box.d.ts.map +0 -1
  844. package/out/src/shard-recipes/po-box.js +0 -101
  845. package/out/src/shard-recipes/po-box.js.map +0 -1
  846. package/out/src/shard-recipes/reviewed-postcode-tail.d.ts +0 -47
  847. package/out/src/shard-recipes/reviewed-postcode-tail.d.ts.map +0 -1
  848. package/out/src/shard-recipes/reviewed-postcode-tail.js +0 -125
  849. package/out/src/shard-recipes/reviewed-postcode-tail.js.map +0 -1
  850. package/out/src/shard-recipes/scaffold.d.ts +0 -246
  851. package/out/src/shard-recipes/scaffold.d.ts.map +0 -1
  852. package/out/src/shard-recipes/scaffold.js +0 -137
  853. package/out/src/shard-recipes/scaffold.js.map +0 -1
  854. package/out/src/shard-recipes/si-bare-village.d.ts +0 -32
  855. package/out/src/shard-recipes/si-bare-village.d.ts.map +0 -1
  856. package/out/src/shard-recipes/si-bare-village.js +0 -88
  857. package/out/src/shard-recipes/si-bare-village.js.map +0 -1
  858. package/out/src/shard-recipes/street-affix.d.ts +0 -89
  859. package/out/src/shard-recipes/street-affix.d.ts.map +0 -1
  860. package/out/src/shard-recipes/street-affix.js +0 -578
  861. package/out/src/shard-recipes/street-affix.js.map +0 -1
  862. package/out/src/shard-recipes/street-bare.d.ts +0 -25
  863. package/out/src/shard-recipes/street-bare.d.ts.map +0 -1
  864. package/out/src/shard-recipes/street-bare.js +0 -86
  865. package/out/src/shard-recipes/street-bare.js.map +0 -1
  866. package/out/src/shard-recipes/street.d.ts +0 -15
  867. package/out/src/shard-recipes/street.d.ts.map +0 -1
  868. package/out/src/shard-recipes/street.js +0 -69
  869. package/out/src/shard-recipes/street.js.map +0 -1
  870. package/out/src/shard-recipes/sub-venue-sources.d.ts +0 -228
  871. package/out/src/shard-recipes/sub-venue-sources.d.ts.map +0 -1
  872. package/out/src/shard-recipes/sub-venue-sources.js +0 -664
  873. package/out/src/shard-recipes/sub-venue-sources.js.map +0 -1
  874. package/out/src/shard-recipes/sub-venue.d.ts +0 -269
  875. package/out/src/shard-recipes/sub-venue.d.ts.map +0 -1
  876. package/out/src/shard-recipes/sub-venue.js +0 -710
  877. package/out/src/shard-recipes/sub-venue.js.map +0 -1
  878. package/out/src/shard-recipes/trailing-region.d.ts +0 -74
  879. package/out/src/shard-recipes/trailing-region.d.ts.map +0 -1
  880. package/out/src/shard-recipes/trailing-region.js +0 -157
  881. package/out/src/shard-recipes/trailing-region.js.map +0 -1
  882. package/out/src/shard-recipes/unit.d.ts +0 -29
  883. package/out/src/shard-recipes/unit.d.ts.map +0 -1
  884. package/out/src/shard-recipes/unit.js +0 -243
  885. package/out/src/shard-recipes/unit.js.map +0 -1
  886. package/out/src/synthesizers/anchor-absorption.d.ts +0 -63
  887. package/out/src/synthesizers/anchor-absorption.d.ts.map +0 -1
  888. package/out/src/synthesizers/anchor-absorption.js +0 -223
  889. package/out/src/synthesizers/anchor-absorption.js.map +0 -1
  890. package/out/src/synthesizers/boundary-stress.d.ts +0 -78
  891. package/out/src/synthesizers/boundary-stress.d.ts.map +0 -1
  892. package/out/src/synthesizers/boundary-stress.js +0 -455
  893. package/out/src/synthesizers/boundary-stress.js.map +0 -1
  894. package/out/src/synthesizers/german.d.ts +0 -107
  895. package/out/src/synthesizers/german.d.ts.map +0 -1
  896. package/out/src/synthesizers/german.js +0 -148
  897. package/out/src/synthesizers/german.js.map +0 -1
  898. package/out/src/synthesizers/house-venue.d.ts +0 -56
  899. package/out/src/synthesizers/house-venue.d.ts.map +0 -1
  900. package/out/src/synthesizers/house-venue.js +0 -267
  901. package/out/src/synthesizers/house-venue.js.map +0 -1
  902. package/out/src/synthesizers/intersection.d.ts +0 -52
  903. package/out/src/synthesizers/intersection.d.ts.map +0 -1
  904. package/out/src/synthesizers/intersection.js +0 -175
  905. package/out/src/synthesizers/intersection.js.map +0 -1
  906. package/out/src/synthesizers/no-street.d.ts +0 -72
  907. package/out/src/synthesizers/no-street.d.ts.map +0 -1
  908. package/out/src/synthesizers/no-street.js +0 -282
  909. package/out/src/synthesizers/no-street.js.map +0 -1
  910. package/out/src/synthesizers/po-box.d.ts +0 -104
  911. package/out/src/synthesizers/po-box.d.ts.map +0 -1
  912. package/out/src/synthesizers/po-box.js +0 -266
  913. package/out/src/synthesizers/po-box.js.map +0 -1
  914. package/out/src/synthesizers/street.d.ts +0 -54
  915. package/out/src/synthesizers/street.d.ts.map +0 -1
  916. package/out/src/synthesizers/street.js +0 -221
  917. package/out/src/synthesizers/street.js.map +0 -1
  918. package/out/src/synthesizers/utils.d.ts +0 -203
  919. package/out/src/synthesizers/utils.d.ts.map +0 -1
  920. package/out/src/synthesizers/utils.js +0 -708
  921. package/out/src/synthesizers/utils.js.map +0 -1
  922. package/out/src/tools/align-shard.d.ts +0 -8
  923. package/out/src/tools/align-shard.d.ts.map +0 -1
  924. package/out/src/tools/align-shard.js +0 -56
  925. package/out/src/tools/align-shard.js.map +0 -1
  926. package/out/src/tools/audit.d.ts +0 -28
  927. package/out/src/tools/audit.d.ts.map +0 -1
  928. package/out/src/tools/audit.js +0 -285
  929. package/out/src/tools/audit.js.map +0 -1
  930. package/out/src/tools/corpus-stats.d.ts +0 -44
  931. package/out/src/tools/corpus-stats.d.ts.map +0 -1
  932. package/out/src/tools/corpus-stats.js +0 -138
  933. package/out/src/tools/corpus-stats.js.map +0 -1
  934. package/out/src/tools/fetch/ban.d.ts +0 -31
  935. package/out/src/tools/fetch/ban.d.ts.map +0 -1
  936. package/out/src/tools/fetch/ban.js +0 -239
  937. package/out/src/tools/fetch/ban.js.map +0 -1
  938. package/out/src/tools/fetch/download.d.ts +0 -78
  939. package/out/src/tools/fetch/download.d.ts.map +0 -1
  940. package/out/src/tools/fetch/download.js +0 -116
  941. package/out/src/tools/fetch/download.js.map +0 -1
  942. package/out/src/tools/fetch/geonames-dump.d.ts +0 -87
  943. package/out/src/tools/fetch/geonames-dump.d.ts.map +0 -1
  944. package/out/src/tools/fetch/geonames-dump.js +0 -178
  945. package/out/src/tools/fetch/geonames-dump.js.map +0 -1
  946. package/out/src/tools/fetch/geonames-postal.d.ts +0 -76
  947. package/out/src/tools/fetch/geonames-postal.d.ts.map +0 -1
  948. package/out/src/tools/fetch/geonames-postal.js +0 -125
  949. package/out/src/tools/fetch/geonames-postal.js.map +0 -1
  950. package/out/src/tools/fetch/hrsa.d.ts +0 -18
  951. package/out/src/tools/fetch/hrsa.d.ts.map +0 -1
  952. package/out/src/tools/fetch/hrsa.js +0 -46
  953. package/out/src/tools/fetch/hrsa.js.map +0 -1
  954. package/out/src/tools/fetch/imls-pls.d.ts +0 -25
  955. package/out/src/tools/fetch/imls-pls.d.ts.map +0 -1
  956. package/out/src/tools/fetch/imls-pls.js +0 -108
  957. package/out/src/tools/fetch/imls-pls.js.map +0 -1
  958. package/out/src/tools/fetch/index.d.ts +0 -144
  959. package/out/src/tools/fetch/index.d.ts.map +0 -1
  960. package/out/src/tools/fetch/index.js +0 -143
  961. package/out/src/tools/fetch/index.js.map +0 -1
  962. package/out/src/tools/fetch/nad.d.ts +0 -70
  963. package/out/src/tools/fetch/nad.d.ts.map +0 -1
  964. package/out/src/tools/fetch/nad.js +0 -234
  965. package/out/src/tools/fetch/nad.js.map +0 -1
  966. package/out/src/tools/fetch/nppes.d.ts +0 -26
  967. package/out/src/tools/fetch/nppes.d.ts.map +0 -1
  968. package/out/src/tools/fetch/nppes.js +0 -126
  969. package/out/src/tools/fetch/nppes.js.map +0 -1
  970. package/out/src/tools/fetch/openaddresses.d.ts +0 -61
  971. package/out/src/tools/fetch/openaddresses.d.ts.map +0 -1
  972. package/out/src/tools/fetch/openaddresses.js +0 -317
  973. package/out/src/tools/fetch/openaddresses.js.map +0 -1
  974. package/out/src/tools/fetch/ourairports.d.ts +0 -45
  975. package/out/src/tools/fetch/ourairports.d.ts.map +0 -1
  976. package/out/src/tools/fetch/ourairports.js +0 -128
  977. package/out/src/tools/fetch/ourairports.js.map +0 -1
  978. package/out/src/tools/fetch/ppd.d.ts.map +0 -1
  979. package/out/src/tools/fetch/ppd.js +0 -100
  980. package/out/src/tools/fetch/ppd.js.map +0 -1
  981. package/out/src/tools/fetch/state-hi-schools.d.ts +0 -25
  982. package/out/src/tools/fetch/state-hi-schools.d.ts.map +0 -1
  983. package/out/src/tools/fetch/state-hi-schools.js +0 -162
  984. package/out/src/tools/fetch/state-hi-schools.js.map +0 -1
  985. package/out/src/tools/fetch/state-sources.d.ts +0 -26
  986. package/out/src/tools/fetch/state-sources.d.ts.map +0 -1
  987. package/out/src/tools/fetch/state-sources.js +0 -111
  988. package/out/src/tools/fetch/state-sources.js.map +0 -1
  989. package/out/src/tools/fetch/tiger-full.d.ts +0 -42
  990. package/out/src/tools/fetch/tiger-full.d.ts.map +0 -1
  991. package/out/src/tools/fetch/tiger-full.js +0 -248
  992. package/out/src/tools/fetch/tiger-full.js.map +0 -1
  993. package/out/src/tools/fetch/wikidata-subvenue.d.ts +0 -171
  994. package/out/src/tools/fetch/wikidata-subvenue.d.ts.map +0 -1
  995. package/out/src/tools/fetch/wikidata-subvenue.js +0 -275
  996. package/out/src/tools/fetch/wikidata-subvenue.js.map +0 -1
  997. package/out/src/tools/gb-title-case.d.ts.map +0 -1
  998. package/out/src/tools/gb-title-case.js.map +0 -1
  999. package/out/src/tools/golden-expand.d.ts +0 -90
  1000. package/out/src/tools/golden-expand.d.ts.map +0 -1
  1001. package/out/src/tools/golden-expand.js +0 -413
  1002. package/out/src/tools/golden-expand.js.map +0 -1
  1003. package/out/src/tools/golden-promote.d.ts.map +0 -1
  1004. package/out/src/tools/golden-promote.js +0 -244
  1005. package/out/src/tools/golden-promote.js.map +0 -1
  1006. package/out/src/tools/golden-relabel-street.d.ts +0 -196
  1007. package/out/src/tools/golden-relabel-street.d.ts.map +0 -1
  1008. package/out/src/tools/golden-relabel-street.js +0 -440
  1009. package/out/src/tools/golden-relabel-street.js.map +0 -1
  1010. package/out/src/tools/index.d.ts +0 -28
  1011. package/out/src/tools/index.d.ts.map +0 -1
  1012. package/out/src/tools/index.js +0 -28
  1013. package/out/src/tools/index.js.map +0 -1
  1014. package/out/src/tools/ingest-csv.d.ts.map +0 -1
  1015. package/out/src/tools/ingest-csv.js +0 -296
  1016. package/out/src/tools/ingest-csv.js.map +0 -1
  1017. package/out/src/tools/jsonl-to-parquet.d.ts +0 -61
  1018. package/out/src/tools/jsonl-to-parquet.d.ts.map +0 -1
  1019. package/out/src/tools/jsonl-to-parquet.js +0 -164
  1020. package/out/src/tools/jsonl-to-parquet.js.map +0 -1
  1021. package/out/src/tools/lint-shard-vocab.d.ts +0 -90
  1022. package/out/src/tools/lint-shard-vocab.d.ts.map +0 -1
  1023. package/out/src/tools/lint-shard-vocab.js +0 -281
  1024. package/out/src/tools/lint-shard-vocab.js.map +0 -1
  1025. package/out/src/tools/lint-shard.d.ts +0 -93
  1026. package/out/src/tools/lint-shard.d.ts.map +0 -1
  1027. package/out/src/tools/lint-shard.js +0 -354
  1028. package/out/src/tools/lint-shard.js.map +0 -1
  1029. package/out/src/tools/overlay-manifest.d.ts +0 -39
  1030. package/out/src/tools/overlay-manifest.d.ts.map +0 -1
  1031. package/out/src/tools/overlay-manifest.js +0 -98
  1032. package/out/src/tools/overlay-manifest.js.map +0 -1
  1033. package/out/src/tools/overture-subvenue.d.ts +0 -112
  1034. package/out/src/tools/overture-subvenue.d.ts.map +0 -1
  1035. package/out/src/tools/overture-subvenue.js +0 -144
  1036. package/out/src/tools/overture-subvenue.js.map +0 -1
  1037. package/out/src/tools/postcode-triples.d.ts +0 -175
  1038. package/out/src/tools/postcode-triples.d.ts.map +0 -1
  1039. package/out/src/tools/postcode-triples.js +0 -304
  1040. package/out/src/tools/postcode-triples.js.map +0 -1
  1041. package/out/src/tools/shard-kryptonite.d.ts +0 -32
  1042. package/out/src/tools/shard-kryptonite.d.ts.map +0 -1
  1043. package/out/src/tools/shard-kryptonite.js +0 -100
  1044. package/out/src/tools/shard-kryptonite.js.map +0 -1
  1045. package/out/src/tools/shard-translit.d.ts +0 -51
  1046. package/out/src/tools/shard-translit.d.ts.map +0 -1
  1047. package/out/src/tools/shard-translit.js +0 -175
  1048. package/out/src/tools/shard-translit.js.map +0 -1
  1049. package/out/src/tools/sub-venue/harvest.d.ts +0 -100
  1050. package/out/src/tools/sub-venue/harvest.d.ts.map +0 -1
  1051. package/out/src/tools/sub-venue/harvest.js +0 -168
  1052. package/out/src/tools/sub-venue/harvest.js.map +0 -1
  1053. package/out/src/tools/sub-venue/head-nouns.d.ts +0 -50
  1054. package/out/src/tools/sub-venue/head-nouns.d.ts.map +0 -1
  1055. package/out/src/tools/sub-venue/head-nouns.js +0 -210
  1056. package/out/src/tools/sub-venue/head-nouns.js.map +0 -1
  1057. package/out/src/tools/sub-venue/surfaces.d.ts +0 -45
  1058. package/out/src/tools/sub-venue/surfaces.d.ts.map +0 -1
  1059. package/out/src/tools/sub-venue/surfaces.js +0 -77
  1060. package/out/src/tools/sub-venue/surfaces.js.map +0 -1
  1061. package/out/src/tools/sub-venue/table.d.ts +0 -229
  1062. package/out/src/tools/sub-venue/table.d.ts.map +0 -1
  1063. package/out/src/tools/sub-venue/table.js +0 -108
  1064. package/out/src/tools/sub-venue/table.js.map +0 -1
  1065. package/out/src/tools/sub-venue/wikidata.d.ts +0 -26
  1066. package/out/src/tools/sub-venue/wikidata.d.ts.map +0 -1
  1067. package/out/src/tools/sub-venue/wikidata.js +0 -62
  1068. package/out/src/tools/sub-venue/wikidata.js.map +0 -1
  1069. package/out/src/tools/sub-venue-lexicon.d.ts +0 -156
  1070. package/out/src/tools/sub-venue-lexicon.d.ts.map +0 -1
  1071. package/out/src/tools/sub-venue-lexicon.js +0 -282
  1072. package/out/src/tools/sub-venue-lexicon.js.map +0 -1
  1073. package/out/src/tools/sub-venue-promotions.d.ts +0 -94
  1074. package/out/src/tools/sub-venue-promotions.d.ts.map +0 -1
  1075. package/out/src/tools/sub-venue-promotions.js +0 -266
  1076. package/out/src/tools/sub-venue-promotions.js.map +0 -1
  1077. package/out/src/types.d.ts +0 -221
  1078. package/out/src/types.d.ts.map +0 -1
  1079. package/out/src/types.js.map +0 -1
  1080. package/out/src/utils/align.d.ts +0 -93
  1081. package/out/src/utils/align.d.ts.map +0 -1
  1082. package/out/src/utils/align.js +0 -234
  1083. package/out/src/utils/align.js.map +0 -1
  1084. package/out/src/utils/golden.d.ts +0 -69
  1085. package/out/src/utils/golden.d.ts.map +0 -1
  1086. package/out/src/utils/golden.js +0 -127
  1087. package/out/src/utils/golden.js.map +0 -1
  1088. package/out/src/utils/index.d.ts +0 -14
  1089. package/out/src/utils/index.d.ts.map +0 -1
  1090. package/out/src/utils/index.js +0 -14
  1091. package/out/src/utils/index.js.map +0 -1
  1092. package/out/src/utils/license.d.ts.map +0 -1
  1093. package/out/src/utils/license.js.map +0 -1
  1094. package/out/src/utils/parquet.d.ts +0 -162
  1095. package/out/src/utils/parquet.d.ts.map +0 -1
  1096. package/out/src/utils/parquet.js +0 -262
  1097. package/out/src/utils/parquet.js.map +0 -1
  1098. package/out/src/utils/split.d.ts +0 -127
  1099. package/out/src/utils/split.d.ts.map +0 -1
  1100. package/out/src/utils/split.js +0 -204
  1101. package/out/src/utils/split.js.map +0 -1
  1102. package/out/src/utils/tokenize.d.ts +0 -56
  1103. package/out/src/utils/tokenize.d.ts.map +0 -1
  1104. package/out/src/utils/tokenize.js +0 -48
  1105. package/out/src/utils/tokenize.js.map +0 -1
  1106. package/out/src/utils/wof-json.d.ts +0 -109
  1107. package/out/src/utils/wof-json.d.ts.map +0 -1
  1108. package/out/src/utils/wof-json.js +0 -173
  1109. package/out/src/utils/wof-json.js.map +0 -1
  1110. package/src/adapters/ban/adapter.ts +0 -191
  1111. package/src/adapters/ban/street-decompose.ts +0 -96
  1112. package/src/adapters/fcc-bdc/adapter.ts +0 -174
  1113. package/src/adapters/geonames/adapter.ts +0 -200
  1114. package/src/adapters/geonames-postal/adapter.ts +0 -119
  1115. package/src/adapters/gnaf/adapter.ts +0 -149
  1116. package/src/adapters/gnaf/assemble.ts +0 -226
  1117. package/src/adapters/index.ts +0 -149
  1118. package/src/adapters/openaddresses/adapter.ts +0 -251
  1119. package/src/adapters/overture/adapter.ts +0 -162
  1120. package/src/adapters/state-hi-schools/adapter.ts +0 -164
  1121. package/src/adapters/synth-po-box/adapter.ts +0 -204
  1122. package/src/adapters/tiger/adapter.ts +0 -253
  1123. package/src/adapters/tiger/street-decompose.ts +0 -111
  1124. package/src/adapters/usgov-hrsa-fqhc/adapter.ts +0 -183
  1125. package/src/adapters/usgov-imls-pls/adapter.ts +0 -143
  1126. package/src/adapters/usgov-irs-bmf/adapter.ts +0 -163
  1127. package/src/adapters/usgov-nad/adapter.ts +0 -348
  1128. package/src/adapters/usgov-nppes/adapter.ts +0 -159
  1129. package/src/adapters/usgov-samhsa-treatment-locator/adapter.ts +0 -204
  1130. package/src/adapters/utils/index.ts +0 -233
  1131. package/src/adapters/wof-admin-jp/adapter.ts +0 -216
  1132. package/src/adapters/wof-admin-json/adapter.ts +0 -256
  1133. package/src/adapters/wof-json-rows.ts +0 -79
  1134. package/src/adapters/wof-postalcode-json/adapter.ts +0 -183
  1135. package/src/build.ts +0 -386
  1136. package/src/index.ts +0 -14
  1137. package/src/name-prone-us-suffixes.ts +0 -12
  1138. package/src/parquet-wrapper/index.ts +0 -9
  1139. package/src/parquet-wrapper/reader.ts +0 -97
  1140. package/src/parquet-wrapper/schema.ts +0 -88
  1141. package/src/parquet-wrapper/writer.ts +0 -110
  1142. package/src/runner.ts +0 -317
  1143. package/src/shard-recipes/anchor-absorption.ts +0 -103
  1144. package/src/shard-recipes/bare-country.ts +0 -95
  1145. package/src/shard-recipes/boundary-stress.ts +0 -101
  1146. package/src/shard-recipes/country-balanced.ts +0 -524
  1147. package/src/shard-recipes/cz-pcfirst-preposition.ts +0 -111
  1148. package/src/shard-recipes/fr-admin-split.ts +0 -239
  1149. package/src/shard-recipes/fr-bare-street.ts +0 -170
  1150. package/src/shard-recipes/fr-fragment.ts +0 -332
  1151. package/src/shard-recipes/fr-lieudit.ts +0 -302
  1152. package/src/shard-recipes/fr-order.ts +0 -258
  1153. package/src/shard-recipes/german.ts +0 -170
  1154. package/src/shard-recipes/house-venue.ts +0 -88
  1155. package/src/shard-recipes/index.ts +0 -95
  1156. package/src/shard-recipes/intersection.ts +0 -630
  1157. package/src/shard-recipes/locale.ts +0 -599
  1158. package/src/shard-recipes/nl-postcode.ts +0 -115
  1159. package/src/shard-recipes/no-fragment.ts +0 -219
  1160. package/src/shard-recipes/no-street-led.ts +0 -143
  1161. package/src/shard-recipes/no-street.ts +0 -86
  1162. package/src/shard-recipes/po-box-cedex.ts +0 -920
  1163. package/src/shard-recipes/po-box.ts +0 -119
  1164. package/src/shard-recipes/reviewed-postcode-tail.ts +0 -189
  1165. package/src/shard-recipes/scaffold.ts +0 -360
  1166. package/src/shard-recipes/si-bare-village.ts +0 -97
  1167. package/src/shard-recipes/street-affix.ts +0 -826
  1168. package/src/shard-recipes/street-bare.ts +0 -101
  1169. package/src/shard-recipes/street.ts +0 -82
  1170. package/src/shard-recipes/sub-venue-sources.ts +0 -885
  1171. package/src/shard-recipes/sub-venue.ts +0 -984
  1172. package/src/shard-recipes/trailing-region.ts +0 -183
  1173. package/src/shard-recipes/unit.ts +0 -321
  1174. package/src/synthesizers/anchor-absorption.ts +0 -290
  1175. package/src/synthesizers/boundary-stress.ts +0 -531
  1176. package/src/synthesizers/german.ts +0 -251
  1177. package/src/synthesizers/house-venue.ts +0 -330
  1178. package/src/synthesizers/intersection.ts +0 -232
  1179. package/src/synthesizers/no-street.ts +0 -349
  1180. package/src/synthesizers/po-box.ts +0 -339
  1181. package/src/synthesizers/street.ts +0 -274
  1182. package/src/synthesizers/utils.ts +0 -903
  1183. package/src/tools/align-shard.ts +0 -70
  1184. package/src/tools/audit.ts +0 -399
  1185. package/src/tools/corpus-stats.ts +0 -184
  1186. package/src/tools/fetch/ban.ts +0 -290
  1187. package/src/tools/fetch/download.ts +0 -176
  1188. package/src/tools/fetch/geonames-dump.ts +0 -267
  1189. package/src/tools/fetch/geonames-postal.ts +0 -180
  1190. package/src/tools/fetch/hrsa.ts +0 -68
  1191. package/src/tools/fetch/imls-pls.ts +0 -158
  1192. package/src/tools/fetch/index.ts +0 -147
  1193. package/src/tools/fetch/nad.ts +0 -342
  1194. package/src/tools/fetch/nppes.ts +0 -174
  1195. package/src/tools/fetch/openaddresses.ts +0 -404
  1196. package/src/tools/fetch/ourairports.ts +0 -171
  1197. package/src/tools/fetch/ppd.ts +0 -137
  1198. package/src/tools/fetch/state-hi-schools.ts +0 -208
  1199. package/src/tools/fetch/state-sources.ts +0 -155
  1200. package/src/tools/fetch/tiger-full.ts +0 -354
  1201. package/src/tools/fetch/wikidata-subvenue.ts +0 -386
  1202. package/src/tools/golden-expand.ts +0 -584
  1203. package/src/tools/golden-promote.ts +0 -353
  1204. package/src/tools/golden-relabel-street.ts +0 -685
  1205. package/src/tools/index.ts +0 -28
  1206. package/src/tools/ingest-csv.ts +0 -422
  1207. package/src/tools/jsonl-to-parquet.ts +0 -221
  1208. package/src/tools/lint-shard-vocab.ts +0 -409
  1209. package/src/tools/lint-shard.ts +0 -543
  1210. package/src/tools/overlay-manifest.ts +0 -157
  1211. package/src/tools/overture-subvenue.ts +0 -215
  1212. package/src/tools/postcode-triples.ts +0 -375
  1213. package/src/tools/shard-kryptonite.ts +0 -139
  1214. package/src/tools/shard-translit.ts +0 -245
  1215. package/src/tools/sub-venue/harvest.ts +0 -235
  1216. package/src/tools/sub-venue/head-nouns.ts +0 -242
  1217. package/src/tools/sub-venue/surfaces.ts +0 -95
  1218. package/src/tools/sub-venue/table.ts +0 -281
  1219. package/src/tools/sub-venue/wikidata.ts +0 -85
  1220. package/src/tools/sub-venue-lexicon.ts +0 -431
  1221. package/src/tools/sub-venue-promotions.ts +0 -330
  1222. package/src/types.ts +0 -247
  1223. package/src/utils/align.ts +0 -331
  1224. package/src/utils/golden.ts +0 -176
  1225. package/src/utils/index.ts +0 -14
  1226. package/src/utils/parquet.ts +0 -391
  1227. package/src/utils/split.ts +0 -279
  1228. package/src/utils/tokenize.ts +0 -78
  1229. package/src/utils/wof-json.ts +0 -244
  1230. /package/{src → lib}/adapters/state-ia-contractors/adapter.ts +0 -0
  1231. /package/{src → lib}/adapters/state-ny-notaries/adapter.ts +0 -0
  1232. /package/{src → lib}/adapters/state-tx-notaries/adapter.ts +0 -0
  1233. /package/{src → lib}/codex/us-fips-state.ts +0 -0
  1234. /package/{src → lib}/tools/gb-title-case.ts +0 -0
  1235. /package/{src → lib}/utils/license.ts +0 -0
  1236. /package/out/{src/adapters → adapters}/ban/adapter.d.ts +0 -0
  1237. /package/out/{src/adapters → adapters}/ban/street-decompose.d.ts +0 -0
  1238. /package/out/{src/adapters → adapters}/fcc-bdc/adapter.d.ts +0 -0
  1239. /package/out/{src/adapters → adapters}/geonames/adapter.d.ts +0 -0
  1240. /package/out/{src/adapters → adapters}/openaddresses/adapter.d.ts +0 -0
  1241. /package/out/{src/adapters → adapters}/state-ia-contractors/adapter.d.ts +0 -0
  1242. /package/out/{src/adapters → adapters}/state-ia-contractors/adapter.js +0 -0
  1243. /package/out/{src/adapters → adapters}/state-ny-notaries/adapter.d.ts +0 -0
  1244. /package/out/{src/adapters → adapters}/state-ny-notaries/adapter.js +0 -0
  1245. /package/out/{src/adapters → adapters}/state-tx-notaries/adapter.d.ts +0 -0
  1246. /package/out/{src/adapters → adapters}/state-tx-notaries/adapter.js +0 -0
  1247. /package/out/{src/adapters → adapters}/synth-po-box/adapter.d.ts +0 -0
  1248. /package/out/{src/adapters → adapters}/tiger/street-decompose.d.ts +0 -0
  1249. /package/out/{src/adapters → adapters}/usgov-nppes/adapter.d.ts +0 -0
  1250. /package/out/{src/adapters → adapters}/usgov-samhsa-treatment-locator/adapter.d.ts +0 -0
  1251. /package/out/{src/adapters → adapters}/wof-admin-jp/adapter.d.ts +0 -0
  1252. /package/out/{src/codex → codex}/us-fips-state.d.ts +0 -0
  1253. /package/out/{src/codex → codex}/us-fips-state.js +0 -0
  1254. /package/out/{src/tools → tools}/fetch/ppd.d.ts +0 -0
  1255. /package/out/{src/tools → tools}/gb-title-case.d.ts +0 -0
  1256. /package/out/{src/tools → tools}/gb-title-case.js +0 -0
  1257. /package/out/{src/tools → tools}/golden-promote.d.ts +0 -0
  1258. /package/out/{src/tools → tools}/ingest-csv.d.ts +0 -0
  1259. /package/out/{src/types.js → types.js} +0 -0
  1260. /package/out/{src/utils → utils}/license.d.ts +0 -0
  1261. /package/out/{src/utils → utils}/license.js +0 -0
@@ -0,0 +1,998 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * `sub-venue` slice recipe (#35 step 4) — teach the `unit` tag the venue-INTERIOR shapes it was
7
+ * never taught, so the modifier+designator class wins at the shipped `venueStructureBiasScale` of
8
+ * 6.0 instead of needing ~11 nats. `docs/engineering/sub-venue-corpus-task.mdx` is the spec; the
9
+ * vocabulary is `corpus/data/sub-venue-lexicon.json` (v0.2.0) and the curation ledger is
10
+ * `corpus/src/tools/sub-venue-promotions.ts`. The READ half — promotions, identifier
11
+ * distributions, name pools — is `sub-venue-sources.ts`; this file renders lines and emits rows.
12
+ *
13
+ * ── WHY THIS SYNTHESIZES RATHER THAN HARVESTS ────────────────────────────────────────────────────
14
+ * Wave 1's lesson, and the reason the spec's "get real data first" instruction is honoured in a
15
+ * shape it did not anticipate: the attested SURFACE STRINGS are thin. 87 GB features attest
16
+ * `terminal`, 29 attest `wing`, 4 attest `concourse` (3 of which are a street called CONCOURSE WAY).
17
+ * You cannot train a tag on 29 strings. What the five extracts DO carry at volume is the three
18
+ * things a generator needs — 45,000+ real venue names across four countries, a per-region
19
+ * identifier DISTRIBUTION measured over 2,868 gate/terminal/campus refs, and the confound
20
+ * population that becomes the negatives. So the bulk is `designator × per-region-identifier ×
21
+ * modifier` sampled per locale, and the attested strings ride along as seasoning
22
+ * ({@link ATTESTED_FRACTION}) rather than as the corpus.
23
+ *
24
+ * ── THE PER-REGION IDENTIFIER RULE, AND WHY IT IS NOT COSMETIC ───────────────────────────────────
25
+ * `Gate A12` is a rendering, not a string anyone wrote down: all but 13 of Great Britain's 658
26
+ * `aeroway=gate` features are unnamed and carry only a `ref`. The lexicon therefore ships a
27
+ * distribution, and it differs by country far more than the shared English vocabulary suggests —
28
+ * GB gates are 71% bare digits and JP 89%, FR and DE are ~60% letter-digit (`A37`, `B05`), and ES
29
+ * gives a THIRD of its gates a range (`B18-B20`), which no other country does at that rate. A
30
+ * generator that samples Great Britain's shape into a Spanish line produces a plausible string that
31
+ * is wrong about Spain, so every leg samples its own region.
32
+ *
33
+ * ── ONLY PROMOTED (designator, locale) PAIRS PRODUCE POSITIVES ───────────────────────────────────
34
+ * A promotion names a designator, a phrase AND a locale, because the same token is a designator in
35
+ * one language and a disaster in another: `hall` is 0-of-3,273 in Great Britain and 35-of-40 in
36
+ * France; `wing` is 23-of-29 in Great Britain and 4-of-3,358 in the United States. A REJECTED pair
37
+ * generates NEGATIVES in that locale instead — en-US `wing` rows are Red Wing, not units.
38
+ *
39
+ * `shape: "identifier-required"` is honoured as the ledger's docstring demands: de-DE `halle` is
40
+ * emitted only as `Halle <identifier>`, never bare and never after a modifier, because its 168-hit
41
+ * confound includes the CITY Halle (Saale) and only the identifier-bearing shape separates them.
42
+ * {@link buildSubVenueForm} enforces it and `sub-venue.test.ts` pins it.
43
+ *
44
+ * ── LABELS ───────────────────────────────────────────────────────────────────────────────────────
45
+ * Sub-venue is `unit`; the container is `venue`. That is the spec's wording and it invents nothing:
46
+ * `block` / `sub_block` exist in the `ComponentTag` union but are JP-char-model-only and outside
47
+ * `ACTIVE_TAGS` (STAGE3), so they are not reachable from a Latin slice.
48
+ *
49
+ * ── WHAT IS DELIBERATELY NOT HERE ────────────────────────────────────────────────────────────────
50
+ * 1. **A modifier+designator form outside English.** `VENUE_STRUCTURE_MODIFIERS` is an English
51
+ * list, and the extracts say the localized modifier surfaces do not exist to copy: `aile` in
52
+ * France is 0 hits, `ala` in Spain 0, `flügel` in Germany 0. Generating `Terminal Sud` would
53
+ * be inventing a vocabulary with no confound board behind it, which is the exact failure the
54
+ * promotion ledger exists to prevent. Non-English legs get designator+identifier only.
55
+ * 2. **A ja-JP leg.** `ターミナル` is promoted (1,213 real of 1,215). The one non-Latin
56
+ * surface the task named, but Japanese addresses train through `build_jp_slice.py` against the
57
+ * `stage3-jp` 47-label head, where the interior tags are `block`/`sub_block`/`building_number`
58
+ * — a different model, a different label set, and a different builder. A katakana `unit` row
59
+ * in this (Latin) feed would in any case be dropped by `country_weights`, which carries no
60
+ * `JP` key. The JP extract is harvested and ready; the leg belongs to the JP slice.
61
+ */
62
+
63
+ import { dataRootPath } from "@mailwoman/core/data-root"
64
+ import { isPresent } from "@mailwoman/core/objects"
65
+ import type { ComponentTag } from "@mailwoman/core/types"
66
+ import { mulberry32 as makeMulberry32 } from "@mailwoman/core/utils"
67
+ import type { PathBuilderLike } from "path-ts"
68
+
69
+ import { sliceSourceID, type CorpusRecipe } from "#recipes/scaffold"
70
+ import {
71
+ buildIdentifierModel,
72
+ buildStreetNegatives,
73
+ defaultLexiconPath,
74
+ EMPTY_NAME_POOLS,
75
+ type IdentifierModel,
76
+ loadContextTuples,
77
+ type LegPools,
78
+ mergeNamePools,
79
+ type PoolQuery,
80
+ type PromotedSurface,
81
+ promotedSurfacesFor,
82
+ readExtractPools,
83
+ readPOIPools,
84
+ readSubVenueLexicon,
85
+ rejectedPhrasesFor,
86
+ sampleIdentifier,
87
+ type StreetNegatives,
88
+ titleCase,
89
+ } from "#recipes/sub-venue-sources"
90
+ import type { LocaleBaseTuple } from "#synthesizers/german"
91
+ import { pick } from "#synthesizers/utils"
92
+ import type { SubVenueLexiconTable } from "#tools"
93
+ import { alignRow } from "#utils"
94
+
95
+ export * from "#recipes/sub-venue-sources"
96
+
97
+ //#region Plan
98
+
99
+ /**
100
+ * One locale's leg of the slice.
101
+ *
102
+ * `positiveShare` / `negativeShare` are relative weights, normalized at run time — they do not have to sum to 1.
103
+ */
104
+ export interface SubVenueLeg {
105
+ locale: string
106
+ country: string
107
+ /**
108
+ * ISO 3166-1 alpha-2 key into the lexicon's `identifierShapes` AND the extract filename. The two axes are the same
109
+ * axis: a distribution is measured in a region's own extract.
110
+ */
111
+ region: string
112
+ /**
113
+ * Extract filename under `--extracts-dir`. Absent = no OSM extract for this leg (en-US), which then draws its venue
114
+ * and confound pools from `poi.db` instead.
115
+ */
116
+ extract?: string
117
+ /**
118
+ * May this leg use the English `<modifier> <designator>` grammar? See the module docstring's exclusion 1.
119
+ */
120
+ english: boolean
121
+ positiveShare: number
122
+ negativeShare: number
123
+ /**
124
+ * Ca-ES only — keep context tuples whose postcode starts with one of these. Catalan-language territories by postal
125
+ * prefix (07 Illes Balears, 08 Barcelona, 17 Girona, 25 Lleida, 43 Tarragona) rather than by a REGION string, whose
126
+ * spelling in the OA export is not something to guess at.
127
+ */
128
+ postcodePrefixes?: readonly string[]
129
+ }
130
+
131
+ /**
132
+ * The legs, and the numbers behind the shares.
133
+ *
134
+ * En-GB and en-US carry the most because they are where the eval board lives (28 of the 30 confound rows are GB or US
135
+ * addresses) and because the English shipped vocabulary is the only one with a modifier grammar — the target class.
136
+ * fr-FR, de-DE and es-ES exist because the ledger promoted surfaces there (169, 19+32 and 190 real hits respectively)
137
+ * and a slice that skipped them would leave every non-English promotion untrained. ca-ES is small on purpose: its
138
+ * promotion is 15 hits and its line differs from es-ES only in the Catalan street vocabulary the postal-prefix filter
139
+ * selects for.
140
+ *
141
+ * The negative shares invert that ordering where the confound mass does. en-US carries the largest negative share
142
+ * because its confound population is the largest measured anywhere in the ledger — 3,354 `wing` (Red Wing boots 676,
143
+ * chicken wings 759), 2,330 `pier` (Pier 1 Imports, which IS the designator+identifier shape), 27,081 `hall`.
144
+ */
145
+ export const SUBVENUE_LEGS: readonly SubVenueLeg[] = [
146
+ {
147
+ locale: "en-GB",
148
+ country: "GB",
149
+ region: "GB",
150
+ extract: "great-britain.jsonl",
151
+ english: true,
152
+ positiveShare: 0.25,
153
+ negativeShare: 0.3,
154
+ },
155
+ { locale: "en-US", country: "US", region: "GB", english: true, positiveShare: 0.25, negativeShare: 0.35 },
156
+ {
157
+ locale: "fr-FR",
158
+ country: "FR",
159
+ region: "FR",
160
+ extract: "france.jsonl",
161
+ english: false,
162
+ positiveShare: 0.16,
163
+ negativeShare: 0.2,
164
+ },
165
+ {
166
+ locale: "de-DE",
167
+ country: "DE",
168
+ region: "DE",
169
+ extract: "germany.jsonl",
170
+ english: false,
171
+ positiveShare: 0.14,
172
+ negativeShare: 0.1,
173
+ },
174
+ {
175
+ locale: "es-ES",
176
+ country: "ES",
177
+ region: "ES",
178
+ extract: "spain.jsonl",
179
+ english: false,
180
+ positiveShare: 0.15,
181
+ negativeShare: 0.05,
182
+ },
183
+ {
184
+ locale: "ca-ES",
185
+ country: "ES",
186
+ region: "ES",
187
+ extract: "spain.jsonl",
188
+ english: false,
189
+ positiveShare: 0.05,
190
+ negativeShare: 0,
191
+ postcodePrefixes: ["07", "08", "17", "25", "43"],
192
+ },
193
+ ]
194
+
195
+ /**
196
+ * En-US has no OSM extract, so its identifier distribution has to be borrowed. GB is the borrow, and the leg's `region`
197
+ * says so literally rather than in a comment: the two English-speaking aviation systems number their gates the same way
198
+ * (GB 71% bare digit) and poi.db — the only US source in reach — carries names, not refs, so it cannot supply a
199
+ * distribution of its own. Recorded here because it is the one place a leg's `region` is not its own country.
200
+ */
201
+ export const US_IDENTIFIER_REGION_BORROWED_FROM = "GB"
202
+
203
+ //#endregion
204
+
205
+ //#region Tunables
206
+
207
+ /**
208
+ * The row count this slice is built at, and the arithmetic behind it. `--count` overrides; this is the number to use
209
+ * absent a reason.
210
+ *
211
+ * The training sampler (`corpus-python/src/mailwoman_train/data_loader.py`, `_raw_row_stream`) draws SOURCES from a
212
+ * multinomial over `source_weights` and yields the next row from that source's iterator. Two consequences set the
213
+ * size:
214
+ *
215
+ * 1. A source's share of an epoch is `weight / Σweights`, independent of how many rows it has.
216
+ * 2. **A source that exhausts is DELETED from the multinomial** — there is no cycling. Under-size the slice and its
217
+ * nominal dose is fiction for the rest of the epoch.
218
+ *
219
+ * Measured against the shipped `v4.1.0-gb-venue-l1e4-2k` weight table: 33 sources summing to 144.5. At the dose the B11
220
+ * GB-venue exercise settled on for a hard rare class — 12.0, the value `synth-fr-bare-street`, `synth-si-bare-village`,
221
+ * `synth-cz-pcfirst-preposition`, `synth-fr-fragment` and `synth-no-fragment` all carry — the share is `12 / 156.5 =
222
+ * 7.67%`, and `train_rows_per_epoch` is 1,000,000. So the epoch draws **76,677 rows** from this slice, and anything
223
+ * smaller runs dry mid-epoch. 120,000 clears that with room for a config that drops a source or raises the dose. (For
224
+ * contrast: `synth-fr-bare-street` is 10,803 rows at dose 12.0, so it exhausts 14% into its own nominal share every
225
+ * epoch — a precedent for the dose, not for the size.)
226
+ */
227
+ export const RECOMMENDED_ROW_COUNT = 120_000
228
+
229
+ /**
230
+ * Share of emitted rows that are NEGATIVES (the confound classes, carrying no `unit`).
231
+ *
232
+ * The spec's instruction is structural: "include the confound shapes as NEGATIVES in the same slice, or the model
233
+ * learns the surface rather than the structure". 0.3 is the dose the `no-fragment` recipe settled on for its own
234
+ * counter-distribution and there is no measurement here that beats it; `--negative-fraction` moves it.
235
+ */
236
+ const DEFAULT_NEGATIVE_FRACTION = 0.3
237
+
238
+ /**
239
+ * Share of POSITIVES whose sub-venue string is a REAL name lifted verbatim out of an extract rather than synthesized —
240
+ * `Terminal 2 D`, `Pier 1`, `Terminal 1 Flugsteig B`. The seasoning, per the module docstring. Kept small because the
241
+ * attested pool is small: after promotion + shape filtering it is 13–47 strings per leg, and a larger share would just
242
+ * repeat them.
243
+ */
244
+ const ATTESTED_FRACTION = 0.1
245
+
246
+ /**
247
+ * Within the SYNTHESIZED positives of an English leg: the split between the two proposal shapes.
248
+ *
249
+ * Modifier-heavy on purpose. Designator+identifier proposes at 0.85 confidence and already wins the decode at the
250
+ * shipped 6.0; modifier+designator proposes at 0.6 and needs 5.87–10.65. The failing class is the one to teach, and the
251
+ * passing one is here to not regress (`Concourse B` / `Terminal 5` / `Gate 12` / `Wing B` must stay correct).
252
+ */
253
+ const ENGLISH_MODIFIER_FORM_FRACTION = 0.6
254
+
255
+ //#endregion
256
+
257
+ //#region Board reservation
258
+
259
+ /**
260
+ * Surfaces reserved by `mailwoman/eval-harness/fixtures/venue-structure-confounds.jsonl` — the 30-row board this slice
261
+ * has to hold. A row containing any of these is DROPPED and counted in `contaminated`.
262
+ *
263
+ * The `--exclude-surfaces` precedent from `fr-fragment` / `no-fragment`, applied by hand rather than by file because
264
+ * the board lives in `mailwoman/` and `@mailwoman/corpus` cannot reach across that workspace boundary at run time. Keep
265
+ * it in sync when the board grows; a slice that trains on its own eval set measures memorization.
266
+ *
267
+ * Note what this costs and why it is still right: reserving `east gate` / `west gate` removes the two GB surfaces the
268
+ * board uses for its `modifier-designator-street` class, so the slice teaches that class from the OTHER real ones its
269
+ * sources carry (`North Gate`, `South Gate`, `East Hall`, `West Hall`, `Lower Hall`, `East Campus`, …). The class is
270
+ * taught; the board's own strings are not.
271
+ */
272
+ export const BOARD_RESERVED_SURFACES: readonly string[] = [
273
+ // gb-street-gate
274
+ "briggate",
275
+ "kirkgate",
276
+ "castlegate",
277
+ "micklegate",
278
+ "fishergate",
279
+ "gallowgate",
280
+ "cowgate",
281
+ "canongate",
282
+ "westgate",
283
+ "northgate",
284
+ // gate-house-venue
285
+ "gate house",
286
+ "gatehouse",
287
+ // terminal-estate
288
+ "terminal industrial estate",
289
+ "terminal house",
290
+ "ocean terminal",
291
+ "terminal warehouse",
292
+ // wing-name
293
+ "wing yip",
294
+ "wing lee",
295
+ "bletchley park",
296
+ // designator-as-street
297
+ "campus drive",
298
+ "arcade avenue",
299
+ "concourse village",
300
+ "building society place",
301
+ "enclosure road",
302
+ // modifier-designator-street
303
+ "east gate",
304
+ "west gate",
305
+ "west wickham",
306
+ ]
307
+
308
+ /**
309
+ * Does this row's text collide with a board-reserved surface?
310
+ */
311
+ export function isBoardReserved(raw: string): boolean {
312
+ const low = raw.toLowerCase()
313
+
314
+ return BOARD_RESERVED_SURFACES.some((surface) => low.includes(surface))
315
+ }
316
+
317
+ //#endregion
318
+
319
+ //#region Rendering
320
+
321
+ /**
322
+ * One labelled piece of the line. Pieces inside a group are space-joined; groups are joined by the register's
323
+ * separator.
324
+ */
325
+ interface Piece {
326
+ text: string
327
+ tag?: ComponentTag
328
+ }
329
+
330
+ type Group = Piece[]
331
+
332
+ /**
333
+ * Surface register. Every eval in this repo gets a lowercase leg because lowercase is the register users type — Google
334
+ * Maps taught them — so every slice has to carry one.
335
+ */
336
+ const Register = {
337
+ Canonical: "canonical",
338
+ CommaFree: "comma-free",
339
+ Lower: "lower",
340
+ Upper: "upper",
341
+ } as const
342
+
343
+ type Register = (typeof Register)[keyof typeof Register]
344
+
345
+ // Registers: 45% canonical, 20% comma-free, 25% lower, 10% upper.
346
+ const CANONICAL_REGISTER_CUTOFF = 0.45
347
+ const COMMA_FREE_REGISTER_CUTOFF = 0.65
348
+ const LOWER_REGISTER_CUTOFF = 0.9
349
+
350
+ function sampleRegister(random: () => number): Register {
351
+ const r = random()
352
+
353
+ if (r < CANONICAL_REGISTER_CUTOFF) return Register.Canonical
354
+
355
+ if (r < COMMA_FREE_REGISTER_CUTOFF) return Register.CommaFree
356
+
357
+ if (r < LOWER_REGISTER_CUTOFF) return Register.Lower
358
+
359
+ return Register.Upper
360
+ }
361
+
362
+ /**
363
+ * Join groups into `raw` + `components`, applying the register to BOTH so alignment still finds every value.
364
+ */
365
+ export function renderGroups(
366
+ groups: Group[],
367
+ register: Register
368
+ ): { raw: string; components: Partial<Record<ComponentTag, string>> } {
369
+ const fold = (text: string): string => {
370
+ if (register === Register.Lower) return text.toLowerCase()
371
+
372
+ if (register === Register.Upper) return text.toUpperCase()
373
+
374
+ return text
375
+ }
376
+
377
+ const separator = register === Register.CommaFree ? " " : ", "
378
+
379
+ const raw = groups
380
+ .map((group) => group.map((piece) => fold(piece.text)).join(" "))
381
+ .filter(isPresent)
382
+ .join(separator)
383
+
384
+ const components: Partial<Record<ComponentTag, string>> = {}
385
+
386
+ for (const group of groups) {
387
+ for (const piece of group) {
388
+ if (piece.tag && !components[piece.tag]) {
389
+ components[piece.tag] = fold(piece.text)
390
+ }
391
+ }
392
+ }
393
+
394
+ return { raw, components }
395
+ }
396
+
397
+ /**
398
+ * The street + tail groups for a country, in that country's own order.
399
+ *
400
+ * DE/ES/FR put the postcode before the locality and DE/ES put the house number after the street; GB and US keep the
401
+ * anglophone order and US carries a region. These are the same orders `synthesizers/german.ts` renders, restated here
402
+ * because this recipe assembles its groups piece-by-piece (it has to, to place a sub-venue group in front of them).
403
+ */
404
+ export function addressGroups(country: string, tuple: LocaleBaseTuple, withStreet: boolean): Group[] {
405
+ const groups: Group[] = []
406
+ const houseNumber = tuple.house_number?.trim()
407
+ const street = tuple.street.trim()
408
+
409
+ if (withStreet && street) {
410
+ const streetPiece: Piece = { text: street, tag: "street" }
411
+ const numberPiece: Piece | null = houseNumber ? { text: houseNumber, tag: "house_number" } : null
412
+
413
+ if (!numberPiece) {
414
+ groups.push([streetPiece])
415
+ } else if (country === "DE" || country === "ES") {
416
+ groups.push([streetPiece, numberPiece])
417
+ } else {
418
+ groups.push([numberPiece, streetPiece])
419
+ }
420
+ }
421
+
422
+ const locality: Piece = { text: tuple.locality.trim(), tag: "locality" }
423
+ const postcode = tuple.postcode?.trim()
424
+ const region = tuple.region?.trim()
425
+
426
+ if (country === "US") {
427
+ groups.push([locality])
428
+ const tail: Group = []
429
+
430
+ if (region) {
431
+ tail.push({ text: region, tag: "region" })
432
+ }
433
+
434
+ if (postcode) {
435
+ tail.push({ text: postcode, tag: "postcode" })
436
+ }
437
+
438
+ if (tail.length) {
439
+ groups.push(tail)
440
+ }
441
+ } else if (country === "GB") {
442
+ groups.push([locality])
443
+
444
+ if (postcode) {
445
+ groups.push([{ text: postcode, tag: "postcode" }])
446
+ }
447
+ } else {
448
+ // FR / DE / ES — postcode then locality, one group.
449
+ const tail: Group = []
450
+
451
+ if (postcode) {
452
+ tail.push({ text: postcode, tag: "postcode" })
453
+ }
454
+
455
+ tail.push(locality)
456
+ groups.push(tail)
457
+ }
458
+
459
+ return groups
460
+ }
461
+
462
+ //#endregion
463
+
464
+ //#region Positive forms
465
+
466
+ /**
467
+ * A sub-venue string plus how it was made, for the composition report.
468
+ */
469
+ export interface SubVenueForm {
470
+ text: string
471
+ form: "designator-identifier" | "modifier-designator" | "attested"
472
+ designatorID: string
473
+ }
474
+
475
+ /**
476
+ * Build one sub-venue string for a leg.
477
+ *
478
+ * The `identifier-required` guard is here and not at the call site on purpose: it is the one rule in this file that a
479
+ * refactor must not be able to route around. A promotion carrying `shape: "identifier-required"` can only ever leave
480
+ * this function as `<Phrase> <identifier>`, and returns `null` rather than a bare or modified form.
481
+ */
482
+ export function buildSubVenueForm(
483
+ leg: SubVenueLeg,
484
+ promoted: readonly PromotedSurface[],
485
+ model: IdentifierModel,
486
+ modifiers: readonly string[],
487
+ attested: readonly string[],
488
+ random: () => number
489
+ ): SubVenueForm | null {
490
+ if (!promoted.length) return null
491
+
492
+ if (attested.length && random() < ATTESTED_FRACTION) {
493
+ const text = pick(attested, random)
494
+
495
+ return { text, form: "attested", designatorID: "attested" }
496
+ }
497
+
498
+ const modifierCandidates = leg.english ? promoted.filter((p) => p.modifierEligible && !p.identifierRequired) : []
499
+ const useModifier = modifierCandidates.length > 0 && random() < ENGLISH_MODIFIER_FORM_FRACTION
500
+
501
+ if (useModifier) {
502
+ const promotedSurface = pick(modifierCandidates, random)
503
+ const modifier = pick(modifiers, random)
504
+
505
+ return {
506
+ text: `${titleCase(modifier)} ${promotedSurface.surface}`,
507
+ form: "modifier-designator",
508
+ designatorID: promotedSurface.designatorID,
509
+ }
510
+ }
511
+
512
+ const promotedSurface = pick(promoted, random)
513
+ const identifier = sampleIdentifier(model, promotedSurface.designatorID, random)
514
+
515
+ if (!identifier) return null
516
+
517
+ return {
518
+ text: `${promotedSurface.surface} ${identifier}`,
519
+ form: "designator-identifier",
520
+ designatorID: promotedSurface.designatorID,
521
+ }
522
+ }
523
+
524
+ /**
525
+ * Alias kept for readers of the arc's earlier drafts.
526
+ *
527
+ * @deprecated Use {@link buildSubVenueForm}.
528
+ */
529
+ export const buildPositiveForms = buildSubVenueForm
530
+
531
+ //#endregion
532
+
533
+ //#region Negatives
534
+
535
+ /**
536
+ * Negative classes, named so the composition report can count them and a failure can be attributed.
537
+ */
538
+ export const NegativeClass = {
539
+ /**
540
+ * A locale-REJECTED surface in the venue slot: Red Wing Shoes, Village Hall, Porte de Champerret.
541
+ */
542
+ RejectedVenue: "rejected-venue",
543
+ /**
544
+ * The designator inside a longer proper name, whole string tagged `venue`: Lochaline Ferry Terminal.
545
+ */
546
+ LongerName: "longer-name",
547
+ /**
548
+ * A real street whose name carries a designator token: Pier Road, Egg Hall, Orchard Gate.
549
+ */
550
+ DesignatorStreet: "designator-street",
551
+ /**
552
+ * A real street of the `<modifier> <designator>` shape — the class that would otherwise be read as a sub-venue.
553
+ */
554
+ ModifierDesignatorStreet: "modifier-designator-street",
555
+ /**
556
+ * A GB single-token `-gate` street: Eastgate, Southgate, Moorgate, Stonegate.
557
+ */
558
+ GateSuffixStreet: "gate-suffix-street",
559
+ /**
560
+ * A PROMOTED phrase outside the shape its promotion covers — `Halle Rosengarten`, `PHOENIX Halle`. The other half of
561
+ * an `identifier-required` ruling; see `LegPools.unpromotedShapes`.
562
+ */
563
+ UnpromotedShape: "unpromoted-shape",
564
+ } as const
565
+
566
+ export type NegativeClass = (typeof NegativeClass)[keyof typeof NegativeClass]
567
+
568
+ /**
569
+ * Which negative classes this leg's pools can actually produce. A class with no source is ABSENT rather than
570
+ * substituted — the report then says so, and a reader can tell a missing class from an unsampled one.
571
+ */
572
+ function availableNegativeClasses(pools: LegPools, streets: StreetNegatives): NegativeClass[] {
573
+ const available: NegativeClass[] = []
574
+
575
+ const sourced: ReadonlyArray<readonly [NegativeClass, number]> = [
576
+ [NegativeClass.RejectedVenue, pools.rejectedVenues.length],
577
+ [NegativeClass.LongerName, pools.longerNames.length],
578
+ [NegativeClass.UnpromotedShape, pools.unpromotedShapes.length],
579
+ [NegativeClass.DesignatorStreet, streets.designator.length],
580
+ [NegativeClass.ModifierDesignatorStreet, streets.modifierDesignator.length],
581
+ [NegativeClass.GateSuffixStreet, streets.gateSuffix.length],
582
+ ]
583
+
584
+ for (const [negativeClass, size] of sourced) {
585
+ if (size > 0) {
586
+ available.push(negativeClass)
587
+ }
588
+ }
589
+
590
+ return available
591
+ }
592
+
593
+ //#endregion
594
+
595
+ //#region Recipe
596
+
597
+ /**
598
+ * Per-leg composition tallies the build prints and the report quotes.
599
+ */
600
+ export interface SubVenueLegStats {
601
+ locale: string
602
+ positives: number
603
+ negatives: number
604
+ byForm: Record<string, number>
605
+ byDesignator: Record<string, number>
606
+ byNegativeClass: Record<string, number>
607
+ byRegister: Record<string, number>
608
+ poolSizes: Record<string, number>
609
+ }
610
+
611
+ const LICENSE =
612
+ "Synthetic — OpenStreetMap venue + sub-venue names (ODbL, © OpenStreetMap contributors) and Overture Places names " +
613
+ "(CDLA-Permissive-2.0) over OpenAddresses / HM Land Registry Price Paid Data address skeletons"
614
+
615
+ const CORPUS_VERSION = "0.16.0"
616
+
617
+ const bump = (record: Record<string, number>, key: string): void => {
618
+ record[key] = (record[key] ?? 0) + 1
619
+ }
620
+
621
+ /**
622
+ * Everything the emit loop needs that does not vary per row.
623
+ */
624
+ interface EmitContext {
625
+ write: (line: string) => void
626
+ source: string
627
+ random: () => number
628
+ modifiers: readonly string[]
629
+ designatorPhrases: readonly string[]
630
+ counters: { emitted: number; skipped: number; contaminated: number }
631
+ }
632
+
633
+ /**
634
+ * Render one row, drop it if it collides with the eval board, align it, write it.
635
+ *
636
+ * A free function rather than a closure over the leg loop: a closure there is both a lint error (`no-loop-func`) and a
637
+ * real hazard, since it would capture the loop's mutable counters.
638
+ */
639
+ function emitRow(
640
+ context: EmitContext,
641
+ leg: SubVenueLeg,
642
+ stats: SubVenueLegStats,
643
+ groups: Group[],
644
+ register: Register,
645
+ synthMethod: string,
646
+ disambiguator: Record<string, string>
647
+ ): boolean {
648
+ const { raw, components } = renderGroups(groups, register)
649
+
650
+ if (isBoardReserved(raw)) {
651
+ context.counters.contaminated++
652
+
653
+ return false
654
+ }
655
+
656
+ const aligned = alignRow({
657
+ raw,
658
+ components,
659
+ country: leg.country,
660
+ locale: leg.locale,
661
+ source: context.source,
662
+ source_id: sliceSourceID(context.source, { ...components, ...disambiguator }),
663
+ corpus_version: CORPUS_VERSION,
664
+ license: LICENSE,
665
+ })
666
+
667
+ if (aligned.kind !== "labeled" || !aligned.row) {
668
+ context.counters.skipped++
669
+
670
+ return false
671
+ }
672
+
673
+ context.write(JSON.stringify({ ...aligned.row, synth_method: synthMethod, synth_base_id: null }) + "\n")
674
+
675
+ context.counters.emitted++
676
+ bump(stats.byRegister, register)
677
+
678
+ return true
679
+ }
680
+
681
+ // One draw per row: 25% carry no street; 55% put the sub-venue before the venue, the rest the venue first.
682
+ const NO_STREET_SHARE = 0.25
683
+ const SUBVENUE_FIRST_CUTOFF = 0.55
684
+
685
+ /**
686
+ * Emit one leg's POSITIVE rows: `<sub-venue> unit`, a real `venue`, and the leg's own address skeleton.
687
+ */
688
+ function emitPositives(
689
+ context: EmitContext,
690
+ leg: SubVenueLeg,
691
+ pools: LegPools,
692
+ promoted: readonly PromotedSurface[],
693
+ model: IdentifierModel,
694
+ stats: SubVenueLegStats,
695
+ target: number
696
+ ): void {
697
+ const { random } = context
698
+ let produced = 0
699
+ let guard = 0
700
+
701
+ while (produced < target && guard++ < target * 8) {
702
+ if (!pools.context.length || !pools.venues.length) break
703
+ const form = buildSubVenueForm(leg, promoted, model, context.modifiers, pools.attested, random)
704
+
705
+ if (!form) {
706
+ context.counters.skipped++
707
+
708
+ continue
709
+ }
710
+
711
+ const tuple = pick(pools.context, random)
712
+ const venue = pick(pools.venues, random)
713
+
714
+ // A venue name that CONTAINS the sub-venue string (or vice versa) makes the two spans
715
+ // unresolvable — alignment claims the longer one and quarantines the other — and the row would
716
+ // teach an overlap that never occurs on a real envelope. Redraw instead.
717
+ const lowVenue = venue.toLowerCase()
718
+ const lowForm = form.text.toLowerCase()
719
+
720
+ if (lowVenue.includes(lowForm) || lowForm.includes(lowVenue)) continue
721
+
722
+ const register = sampleRegister(random)
723
+ const subGroup: Group = [{ text: form.text, tag: "unit" }]
724
+ const venueGroup: Group = [{ text: venue, tag: "venue" }]
725
+ const r = random()
726
+ // A quarter of rows carry no street: an airport terminal's address usually does not have one.
727
+ const body = addressGroups(leg.country, tuple, r >= NO_STREET_SHARE)
728
+ // Both orders occur on real signage and mail — "Terminal 5, Heathrow" and "Heathrow, Terminal 5".
729
+ const groups = r < SUBVENUE_FIRST_CUTOFF ? [subGroup, venueGroup, ...body] : [venueGroup, subGroup, ...body]
730
+
731
+ const ok = emitRow(context, leg, stats, groups, register, `sub-venue:${form.form}`, {
732
+ leg: leg.locale,
733
+ form: form.form,
734
+ v: String(produced),
735
+ })
736
+
737
+ if (!ok) continue
738
+
739
+ produced++
740
+
741
+ stats.positives++
742
+ bump(stats.byForm, form.form)
743
+ bump(stats.byDesignator, form.designatorID)
744
+ }
745
+ }
746
+
747
+ // Name-pool negatives: 75% carry a street line.
748
+ const NEGATIVE_WITH_STREET_SHARE = 0.75
749
+
750
+ /**
751
+ * Emit one leg's NEGATIVE rows — the confound classes, none of which carries a `unit`.
752
+ */
753
+ function emitNegatives(
754
+ context: EmitContext,
755
+ leg: SubVenueLeg,
756
+ pools: LegPools,
757
+ stats: SubVenueLegStats,
758
+ target: number
759
+ ): void {
760
+ const { random } = context
761
+ const streets = buildStreetNegatives(pools.context, context.designatorPhrases, context.modifiers, leg.country)
762
+ const available = availableNegativeClasses(pools, streets)
763
+ let produced = 0
764
+ let guard = 0
765
+
766
+ while (produced < target && guard++ < target * 8) {
767
+ if (!available.length || !pools.context.length) break
768
+ const negativeClass = pick(available, random)
769
+ const register = sampleRegister(random)
770
+ let groups: Group[]
771
+
772
+ if (negativeClass === NegativeClass.DesignatorStreet) {
773
+ groups = addressGroups(leg.country, pickTuple(streets.designator, random), true)
774
+ } else if (negativeClass === NegativeClass.ModifierDesignatorStreet) {
775
+ groups = addressGroups(leg.country, pickTuple(streets.modifierDesignator, random), true)
776
+ } else if (negativeClass === NegativeClass.GateSuffixStreet) {
777
+ groups = addressGroups(leg.country, pickTuple(streets.gateSuffix, random), true)
778
+ } else {
779
+ const pool =
780
+ negativeClass === NegativeClass.RejectedVenue
781
+ ? pools.rejectedVenues
782
+ : negativeClass === NegativeClass.LongerName
783
+ ? pools.longerNames
784
+ : pools.unpromotedShapes
785
+
786
+ const name = pick(pool, random)
787
+ const tuple = pick(pools.context, random)
788
+
789
+ groups = [
790
+ [{ text: name, tag: "venue" }],
791
+ ...addressGroups(leg.country, tuple, random() < NEGATIVE_WITH_STREET_SHARE),
792
+ ]
793
+ }
794
+
795
+ const ok = emitRow(context, leg, stats, groups, register, `sub-venue-negative:${negativeClass}`, {
796
+ leg: leg.locale,
797
+ negative: negativeClass,
798
+ v: String(produced),
799
+ })
800
+
801
+ if (!ok) continue
802
+
803
+ produced++
804
+
805
+ stats.negatives++
806
+ bump(stats.byNegativeClass, negativeClass)
807
+ }
808
+ }
809
+
810
+ function pickTuple(pool: readonly LocaleBaseTuple[], random: () => number): LocaleBaseTuple {
811
+ return pick(pool, random)
812
+ }
813
+
814
+ /**
815
+ * Split `total` across `shares` (which need not sum to 1), largest-remainder so the parts sum exactly.
816
+ */
817
+ export function allocate(total: number, shares: readonly number[]): number[] {
818
+ const sum = shares.reduce((a, b) => a + b, 0)
819
+
820
+ if (sum <= 0) return shares.map(() => 0)
821
+ const exact = shares.map((s) => (total * s) / sum)
822
+ const floored = exact.map((v) => Math.floor(v))
823
+ let remainder = total - floored.reduce((a, b) => a + b, 0)
824
+ const order = exact.map((v, i) => ({ i, frac: v - Math.floor(v) })).toSorted((a, b) => b.frac - a.frac)
825
+
826
+ for (const entry of order) {
827
+ if (remainder <= 0) break
828
+ floored[entry.i]! += 1
829
+
830
+ remainder--
831
+ }
832
+
833
+ return floored
834
+ }
835
+
836
+ /**
837
+ * Build one leg's pools: the name pools from its extract and/or poi.db, plus its address context.
838
+ */
839
+ async function buildLegPools(
840
+ leg: SubVenueLeg,
841
+ query: PoolQuery,
842
+ contextByCountry: ReadonlyMap<string, LocaleBaseTuple[]>,
843
+ paths: { extractsDir: PathBuilderLike; poiDB: PathBuilderLike }
844
+ ): Promise<LegPools> {
845
+ const extractPools = leg.extract
846
+ ? await readExtractPools(`${paths.extractsDir}/${leg.extract}`, query)
847
+ : EMPTY_NAME_POOLS
848
+
849
+ // poi.db holds four countries; only these two legs are inside it.
850
+ const poiPools =
851
+ leg.country === "US" || leg.country === "FR" ? readPOIPools(paths.poiDB, leg.country, query) : EMPTY_NAME_POOLS
852
+
853
+ const names = mergeNamePools(extractPools, poiPools)
854
+ let context = contextByCountry.get(leg.country) ?? []
855
+
856
+ if (leg.postcodePrefixes) {
857
+ const prefixes = leg.postcodePrefixes
858
+ const filtered = context.filter((t) => prefixes.some((p) => (t.postcode ?? "").startsWith(p)))
859
+
860
+ // A leg that filters itself empty is a build-time fact worth failing on, not a silent fallback
861
+ // to the parent locale's rows under a different `locale` stamp.
862
+ if (!filtered.length) {
863
+ throw new Error(
864
+ `${leg.locale}: no context tuples matched postcode prefixes ${prefixes.join(",")} among ${context.length} ${leg.country} rows`
865
+ )
866
+ }
867
+
868
+ context = filtered
869
+ }
870
+
871
+ return { context, ...names }
872
+ }
873
+
874
+ function emptyStats(leg: SubVenueLeg, pools: LegPools, promotedCount: number): SubVenueLegStats {
875
+ return {
876
+ locale: leg.locale,
877
+ positives: 0,
878
+ negatives: 0,
879
+ byForm: {},
880
+ byDesignator: {},
881
+ byNegativeClass: {},
882
+ byRegister: {},
883
+ poolSizes: {
884
+ promoted: promotedCount,
885
+ context: pools.context.length,
886
+ venues: pools.venues.length,
887
+ attested: pools.attested.length,
888
+ rejectedVenues: pools.rejectedVenues.length,
889
+ longerNames: pools.longerNames.length,
890
+ unpromotedShapes: pools.unpromotedShapes.length,
891
+ },
892
+ }
893
+ }
894
+
895
+ /**
896
+ * Slice recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
897
+ * and `description` below for the surface form it generates.
898
+ */
899
+ export const subVenueRecipe: CorpusRecipe = {
900
+ name: "sub-venue",
901
+ description:
902
+ "Venue-interior structure (#35): <sub-venue> unit + <venue> lines per promoted (designator, locale) pair, with the rejection ledger's confounds as negatives",
903
+ mode: "generate",
904
+ options: [
905
+ { flag: "--lexicon <path>", description: "sub-venue lexicon JSON (default: the committed corpus/data one)" },
906
+ {
907
+ flag: "--extracts-dir <dir>",
908
+ description: "OSM sub-venue extract JSONLs (default: $MAILWOMAN_DATA_ROOT/sub-venue/extracts)",
909
+ },
910
+ {
911
+ flag: "--poi-db <path>",
912
+ description: "poi.db for the en-US / fr-FR pools (default: $MAILWOMAN_DATA_ROOT/poi/poi.db)",
913
+ },
914
+ { flag: "--sub-venue-tuples <path>", description: "GB/US/FR address-context tuples JSONL" },
915
+ {
916
+ flag: "--negative-fraction <n>",
917
+ description: `share of rows that are confound negatives (default ${DEFAULT_NEGATIVE_FRACTION})`,
918
+ },
919
+ ],
920
+ async run(opts, write) {
921
+ if (opts.count == null) throw new Error("sub-venue recipe requires --count <N>")
922
+ const count = opts.count
923
+ const negativeFraction = opts.negativeFraction ?? DEFAULT_NEGATIVE_FRACTION
924
+ const extractsDir = opts.extractsDir ?? dataRootPath("sub-venue", "extracts")
925
+ const poiDB = opts.poiDB ?? dataRootPath("poi", "poi.db")
926
+ const tuplesPath = opts.subVenueTuples ?? dataRootPath("corpus", "intermediate", "house-venue-tuples-v3.jsonl")
927
+ const lexicon: SubVenueLexiconTable = await readSubVenueLexicon(opts.lexicon ?? defaultLexiconPath())
928
+
929
+ const context: EmitContext = {
930
+ write,
931
+ source: opts.sourceName ?? "synth-sub-venue",
932
+ random: makeMulberry32(opts.seed),
933
+ modifiers: lexicon.modifiers.filter((m) => m.shipped).map((m) => m.id),
934
+ designatorPhrases: lexicon.designators.filter((d) => d.tier === "subvenue").map((d) => d.id),
935
+ counters: { emitted: 0, skipped: 0, contaminated: 0 },
936
+ }
937
+
938
+ console.error(` reading context tuples: ${tuplesPath}`)
939
+
940
+ const contextByCountry = await loadContextTuples(tuplesPath, opts.seed)
941
+ const legPools = new Map<string, LegPools>()
942
+ const legStats = new Map<string, SubVenueLegStats>()
943
+ const legPromoted = new Map<string, PromotedSurface[]>()
944
+
945
+ for (const leg of SUBVENUE_LEGS) {
946
+ const promoted = promotedSurfacesFor(leg.locale, lexicon)
947
+
948
+ const query: PoolQuery = {
949
+ promoted,
950
+ rejectedPhrases: rejectedPhrasesFor(leg.locale),
951
+ designatorPhrases: context.designatorPhrases,
952
+ modifiers: context.modifiers,
953
+ english: leg.english,
954
+ }
955
+
956
+ const pools = await buildLegPools(leg, query, contextByCountry, { extractsDir, poiDB })
957
+
958
+ legPromoted.set(leg.locale, promoted)
959
+ legPools.set(leg.locale, pools)
960
+ legStats.set(leg.locale, emptyStats(leg, pools, promoted.length))
961
+ }
962
+
963
+ const positiveTotal = Math.round(count * (1 - negativeFraction))
964
+
965
+ const positiveQuota = allocate(
966
+ positiveTotal,
967
+ SUBVENUE_LEGS.map((l) => l.positiveShare)
968
+ )
969
+
970
+ const negativeQuota = allocate(
971
+ count - positiveTotal,
972
+ SUBVENUE_LEGS.map((l) => l.negativeShare)
973
+ )
974
+
975
+ for (const [index, leg] of SUBVENUE_LEGS.entries()) {
976
+ const pools = legPools.get(leg.locale)!
977
+ const stats = legStats.get(leg.locale)!
978
+ const promoted = legPromoted.get(leg.locale)!
979
+ const model = buildIdentifierModel(lexicon, leg.region)
980
+
981
+ emitPositives(context, leg, pools, promoted, model, stats, positiveQuota[index]!)
982
+ emitNegatives(context, leg, pools, stats, negativeQuota[index]!)
983
+ }
984
+
985
+ for (const stats of legStats.values()) {
986
+ console.error(
987
+ ` ${stats.locale}: +${stats.positives} positives / -${stats.negatives} negatives ` +
988
+ `forms=${JSON.stringify(stats.byForm)} designators=${JSON.stringify(stats.byDesignator)} ` +
989
+ `negclasses=${JSON.stringify(stats.byNegativeClass)} registers=${JSON.stringify(stats.byRegister)} ` +
990
+ `pools=${JSON.stringify(stats.poolSizes)}`
991
+ )
992
+ }
993
+
994
+ return { read: count, ...context.counters }
995
+ },
996
+ }
997
+
998
+ //#endregion