@mailwoman/corpus 9.0.0 → 9.2.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 (524) hide show
  1. package/README.md +3 -3
  2. package/data/PROVENANCE.md +227 -0
  3. package/data/reviewed-ve-postcode-tuples.json +74 -0
  4. package/data/sub-venue-lexicon.json +18269 -0
  5. package/out/src/adapters/ban/adapter.d.ts +1 -1
  6. package/out/src/adapters/ban/adapter.d.ts.map +1 -1
  7. package/out/src/adapters/ban/adapter.js +5 -4
  8. package/out/src/adapters/ban/adapter.js.map +1 -1
  9. package/out/src/adapters/fcc-bdc/adapter.d.ts +1 -1
  10. package/out/src/adapters/fcc-bdc/adapter.d.ts.map +1 -1
  11. package/out/src/adapters/fcc-bdc/adapter.js +3 -3
  12. package/out/src/adapters/fcc-bdc/adapter.js.map +1 -1
  13. package/out/src/adapters/geonames/adapter.d.ts +1 -1
  14. package/out/src/adapters/geonames/adapter.d.ts.map +1 -1
  15. package/out/src/adapters/geonames/adapter.js +2 -2
  16. package/out/src/adapters/geonames/adapter.js.map +1 -1
  17. package/out/src/adapters/geonames-postal/adapter.d.ts +1 -1
  18. package/out/src/adapters/geonames-postal/adapter.d.ts.map +1 -1
  19. package/out/src/adapters/geonames-postal/adapter.js +3 -3
  20. package/out/src/adapters/geonames-postal/adapter.js.map +1 -1
  21. package/out/src/adapters/gnaf/adapter.d.ts +1 -1
  22. package/out/src/adapters/gnaf/adapter.d.ts.map +1 -1
  23. package/out/src/adapters/gnaf/adapter.js +2 -2
  24. package/out/src/adapters/gnaf/adapter.js.map +1 -1
  25. package/out/src/adapters/gnaf/assemble.js +1 -1
  26. package/out/src/adapters/gnaf/assemble.js.map +1 -1
  27. package/out/src/adapters/index.d.ts +1 -1
  28. package/out/src/adapters/index.d.ts.map +1 -1
  29. package/out/src/adapters/index.js +1 -1
  30. package/out/src/adapters/index.js.map +1 -1
  31. package/out/src/adapters/openaddresses/adapter.d.ts +1 -1
  32. package/out/src/adapters/openaddresses/adapter.d.ts.map +1 -1
  33. package/out/src/adapters/openaddresses/adapter.js +3 -3
  34. package/out/src/adapters/openaddresses/adapter.js.map +1 -1
  35. package/out/src/adapters/overture/adapter.d.ts +1 -1
  36. package/out/src/adapters/overture/adapter.d.ts.map +1 -1
  37. package/out/src/adapters/overture/adapter.js +2 -2
  38. package/out/src/adapters/overture/adapter.js.map +1 -1
  39. package/out/src/adapters/state-hi-schools/adapter.d.ts +1 -1
  40. package/out/src/adapters/state-hi-schools/adapter.d.ts.map +1 -1
  41. package/out/src/adapters/state-hi-schools/adapter.js +7 -6
  42. package/out/src/adapters/state-hi-schools/adapter.js.map +1 -1
  43. package/out/src/adapters/state-ia-contractors/adapter.d.ts +1 -1
  44. package/out/src/adapters/state-ia-contractors/adapter.d.ts.map +1 -1
  45. package/out/src/adapters/state-ia-contractors/adapter.js +12 -7
  46. package/out/src/adapters/state-ia-contractors/adapter.js.map +1 -1
  47. package/out/src/adapters/state-ny-notaries/adapter.d.ts +1 -1
  48. package/out/src/adapters/state-ny-notaries/adapter.d.ts.map +1 -1
  49. package/out/src/adapters/state-ny-notaries/adapter.js +12 -18
  50. package/out/src/adapters/state-ny-notaries/adapter.js.map +1 -1
  51. package/out/src/adapters/state-tx-notaries/adapter.d.ts +1 -1
  52. package/out/src/adapters/state-tx-notaries/adapter.d.ts.map +1 -1
  53. package/out/src/adapters/state-tx-notaries/adapter.js +12 -7
  54. package/out/src/adapters/state-tx-notaries/adapter.js.map +1 -1
  55. package/out/src/adapters/synth-po-box/adapter.d.ts +3 -3
  56. package/out/src/adapters/synth-po-box/adapter.d.ts.map +1 -1
  57. package/out/src/adapters/synth-po-box/adapter.js +3 -3
  58. package/out/src/adapters/synth-po-box/adapter.js.map +1 -1
  59. package/out/src/adapters/tiger/adapter.d.ts +1 -1
  60. package/out/src/adapters/tiger/adapter.d.ts.map +1 -1
  61. package/out/src/adapters/tiger/adapter.js +2 -2
  62. package/out/src/adapters/tiger/adapter.js.map +1 -1
  63. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts +1 -1
  64. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +1 -1
  65. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js +7 -6
  66. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js.map +1 -1
  67. package/out/src/adapters/usgov-imls-pls/adapter.d.ts +1 -1
  68. package/out/src/adapters/usgov-imls-pls/adapter.d.ts.map +1 -1
  69. package/out/src/adapters/usgov-imls-pls/adapter.js +11 -7
  70. package/out/src/adapters/usgov-imls-pls/adapter.js.map +1 -1
  71. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts +1 -1
  72. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts.map +1 -1
  73. package/out/src/adapters/usgov-irs-bmf/adapter.js +6 -5
  74. package/out/src/adapters/usgov-irs-bmf/adapter.js.map +1 -1
  75. package/out/src/adapters/usgov-nad/adapter.d.ts +1 -1
  76. package/out/src/adapters/usgov-nad/adapter.d.ts.map +1 -1
  77. package/out/src/adapters/usgov-nad/adapter.js +8 -8
  78. package/out/src/adapters/usgov-nad/adapter.js.map +1 -1
  79. package/out/src/adapters/usgov-nppes/adapter.d.ts +1 -1
  80. package/out/src/adapters/usgov-nppes/adapter.d.ts.map +1 -1
  81. package/out/src/adapters/usgov-nppes/adapter.js +10 -10
  82. package/out/src/adapters/usgov-nppes/adapter.js.map +1 -1
  83. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts +1 -1
  84. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +1 -1
  85. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js +7 -6
  86. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js.map +1 -1
  87. package/out/src/{adapter.d.ts → adapters/utils/index.d.ts} +8 -2
  88. package/out/src/adapters/utils/index.d.ts.map +1 -0
  89. package/out/src/{adapter.js → adapters/utils/index.js} +11 -3
  90. package/out/src/adapters/utils/index.js.map +1 -0
  91. package/out/src/adapters/wof-admin-jp/adapter.d.ts +1 -1
  92. package/out/src/adapters/wof-admin-jp/adapter.d.ts.map +1 -1
  93. package/out/src/adapters/wof-admin-jp/adapter.js +5 -5
  94. package/out/src/adapters/wof-admin-jp/adapter.js.map +1 -1
  95. package/out/src/adapters/wof-admin-json/adapter.d.ts +4 -15
  96. package/out/src/adapters/wof-admin-json/adapter.d.ts.map +1 -1
  97. package/out/src/adapters/wof-admin-json/adapter.js +11 -35
  98. package/out/src/adapters/wof-admin-json/adapter.js.map +1 -1
  99. package/out/src/adapters/wof-json-rows.d.ts +32 -0
  100. package/out/src/adapters/wof-json-rows.d.ts.map +1 -0
  101. package/out/src/adapters/wof-json-rows.js +45 -0
  102. package/out/src/adapters/wof-json-rows.js.map +1 -0
  103. package/out/src/adapters/wof-postalcode-json/adapter.d.ts +4 -9
  104. package/out/src/adapters/wof-postalcode-json/adapter.d.ts.map +1 -1
  105. package/out/src/adapters/wof-postalcode-json/adapter.js +12 -37
  106. package/out/src/adapters/wof-postalcode-json/adapter.js.map +1 -1
  107. package/out/src/build.d.ts +4 -4
  108. package/out/src/build.d.ts.map +1 -1
  109. package/out/src/build.js +7 -7
  110. package/out/src/build.js.map +1 -1
  111. package/out/src/index.d.ts +3 -17
  112. package/out/src/index.d.ts.map +1 -1
  113. package/out/src/index.js +3 -17
  114. package/out/src/index.js.map +1 -1
  115. package/out/src/name-prone-us-suffixes.d.ts +12 -0
  116. package/out/src/name-prone-us-suffixes.d.ts.map +1 -0
  117. package/out/src/name-prone-us-suffixes.js +12 -0
  118. package/out/src/name-prone-us-suffixes.js.map +1 -0
  119. package/out/src/parquet-wrapper/reader.d.ts.map +1 -1
  120. package/out/src/parquet-wrapper/reader.js +5 -0
  121. package/out/src/parquet-wrapper/reader.js.map +1 -1
  122. package/out/src/runner.d.ts +2 -2
  123. package/out/src/runner.d.ts.map +1 -1
  124. package/out/src/runner.js +1 -1
  125. package/out/src/runner.js.map +1 -1
  126. package/out/src/shard-recipes/anchor-absorption.d.ts.map +1 -1
  127. package/out/src/shard-recipes/anchor-absorption.js +4 -5
  128. package/out/src/shard-recipes/anchor-absorption.js.map +1 -1
  129. package/out/src/shard-recipes/bare-country.d.ts +25 -0
  130. package/out/src/shard-recipes/bare-country.d.ts.map +1 -0
  131. package/out/src/shard-recipes/bare-country.js +87 -0
  132. package/out/src/shard-recipes/bare-country.js.map +1 -0
  133. package/out/src/shard-recipes/boundary-stress.d.ts.map +1 -1
  134. package/out/src/shard-recipes/boundary-stress.js +2 -2
  135. package/out/src/shard-recipes/boundary-stress.js.map +1 -1
  136. package/out/src/shard-recipes/country-balanced.d.ts.map +1 -1
  137. package/out/src/shard-recipes/country-balanced.js +14 -21
  138. package/out/src/shard-recipes/country-balanced.js.map +1 -1
  139. package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts.map +1 -1
  140. package/out/src/shard-recipes/cz-pcfirst-preposition.js +28 -10
  141. package/out/src/shard-recipes/cz-pcfirst-preposition.js.map +1 -1
  142. package/out/src/shard-recipes/fr-admin-split.d.ts.map +1 -1
  143. package/out/src/shard-recipes/fr-admin-split.js +4 -3
  144. package/out/src/shard-recipes/fr-admin-split.js.map +1 -1
  145. package/out/src/shard-recipes/fr-bare-street.d.ts.map +1 -1
  146. package/out/src/shard-recipes/fr-bare-street.js +72 -11
  147. package/out/src/shard-recipes/fr-bare-street.js.map +1 -1
  148. package/out/src/shard-recipes/fr-lieudit.d.ts.map +1 -1
  149. package/out/src/shard-recipes/fr-lieudit.js +4 -3
  150. package/out/src/shard-recipes/fr-lieudit.js.map +1 -1
  151. package/out/src/shard-recipes/fr-order.d.ts.map +1 -1
  152. package/out/src/shard-recipes/fr-order.js +11 -20
  153. package/out/src/shard-recipes/fr-order.js.map +1 -1
  154. package/out/src/shard-recipes/german.d.ts.map +1 -1
  155. package/out/src/shard-recipes/german.js +8 -14
  156. package/out/src/shard-recipes/german.js.map +1 -1
  157. package/out/src/shard-recipes/house-venue.d.ts.map +1 -1
  158. package/out/src/shard-recipes/house-venue.js +1 -1
  159. package/out/src/shard-recipes/house-venue.js.map +1 -1
  160. package/out/src/shard-recipes/index.d.ts.map +1 -1
  161. package/out/src/shard-recipes/index.js +8 -1
  162. package/out/src/shard-recipes/index.js.map +1 -1
  163. package/out/src/shard-recipes/intersection.d.ts.map +1 -1
  164. package/out/src/shard-recipes/intersection.js +7 -13
  165. package/out/src/shard-recipes/intersection.js.map +1 -1
  166. package/out/src/shard-recipes/locale.d.ts +5 -5
  167. package/out/src/shard-recipes/locale.d.ts.map +1 -1
  168. package/out/src/shard-recipes/locale.js +13 -20
  169. package/out/src/shard-recipes/locale.js.map +1 -1
  170. package/out/src/shard-recipes/no-street.d.ts.map +1 -1
  171. package/out/src/shard-recipes/no-street.js +1 -1
  172. package/out/src/shard-recipes/no-street.js.map +1 -1
  173. package/out/src/shard-recipes/po-box-cedex.d.ts.map +1 -1
  174. package/out/src/shard-recipes/po-box-cedex.js +60 -43
  175. package/out/src/shard-recipes/po-box-cedex.js.map +1 -1
  176. package/out/src/shard-recipes/po-box.d.ts.map +1 -1
  177. package/out/src/shard-recipes/po-box.js +1 -1
  178. package/out/src/shard-recipes/po-box.js.map +1 -1
  179. package/out/src/shard-recipes/reviewed-postcode-tail.d.ts +47 -0
  180. package/out/src/shard-recipes/reviewed-postcode-tail.d.ts.map +1 -0
  181. package/out/src/shard-recipes/reviewed-postcode-tail.js +125 -0
  182. package/out/src/shard-recipes/reviewed-postcode-tail.js.map +1 -0
  183. package/out/src/shard-recipes/scaffold.d.ts +51 -23
  184. package/out/src/shard-recipes/scaffold.d.ts.map +1 -1
  185. package/out/src/shard-recipes/scaffold.js +59 -23
  186. package/out/src/shard-recipes/scaffold.js.map +1 -1
  187. package/out/src/shard-recipes/street-affix.d.ts +54 -0
  188. package/out/src/shard-recipes/street-affix.d.ts.map +1 -1
  189. package/out/src/shard-recipes/street-affix.js +203 -35
  190. package/out/src/shard-recipes/street-affix.js.map +1 -1
  191. package/out/src/shard-recipes/street-bare.d.ts.map +1 -1
  192. package/out/src/shard-recipes/street-bare.js +3 -3
  193. package/out/src/shard-recipes/street-bare.js.map +1 -1
  194. package/out/src/shard-recipes/street.d.ts.map +1 -1
  195. package/out/src/shard-recipes/street.js +2 -2
  196. package/out/src/shard-recipes/street.js.map +1 -1
  197. package/out/src/shard-recipes/sub-venue-sources.d.ts +3 -6
  198. package/out/src/shard-recipes/sub-venue-sources.d.ts.map +1 -1
  199. package/out/src/shard-recipes/sub-venue-sources.js +4 -9
  200. package/out/src/shard-recipes/sub-venue-sources.js.map +1 -1
  201. package/out/src/shard-recipes/sub-venue.d.ts +2 -2
  202. package/out/src/shard-recipes/sub-venue.d.ts.map +1 -1
  203. package/out/src/shard-recipes/sub-venue.js +7 -6
  204. package/out/src/shard-recipes/sub-venue.js.map +1 -1
  205. package/out/src/shard-recipes/trailing-region.d.ts +74 -0
  206. package/out/src/shard-recipes/trailing-region.d.ts.map +1 -0
  207. package/out/src/shard-recipes/trailing-region.js +157 -0
  208. package/out/src/shard-recipes/trailing-region.js.map +1 -0
  209. package/out/src/shard-recipes/unit.d.ts.map +1 -1
  210. package/out/src/shard-recipes/unit.js +6 -12
  211. package/out/src/shard-recipes/unit.js.map +1 -1
  212. package/out/src/{synthesize-anchor-absorption.d.ts → synthesizers/anchor-absorption.d.ts} +1 -1
  213. package/out/src/synthesizers/anchor-absorption.d.ts.map +1 -0
  214. package/out/src/{synthesize-anchor-absorption.js → synthesizers/anchor-absorption.js} +1 -1
  215. package/out/src/synthesizers/anchor-absorption.js.map +1 -0
  216. package/out/src/{synthesize-boundary-stress.d.ts → synthesizers/boundary-stress.d.ts} +3 -3
  217. package/out/src/synthesizers/boundary-stress.d.ts.map +1 -0
  218. package/out/src/{synthesize-boundary-stress.js → synthesizers/boundary-stress.js} +2 -2
  219. package/out/src/synthesizers/boundary-stress.js.map +1 -0
  220. package/out/src/{synthesize-german.d.ts → synthesizers/german.d.ts} +2 -2
  221. package/out/src/synthesizers/german.d.ts.map +1 -0
  222. package/out/src/{synthesize-german.js → synthesizers/german.js} +2 -2
  223. package/out/src/synthesizers/german.js.map +1 -0
  224. package/out/src/{synthesize-house-venue.d.ts → synthesizers/house-venue.d.ts} +4 -4
  225. package/out/src/synthesizers/house-venue.d.ts.map +1 -0
  226. package/out/src/{synthesize-house-venue.js → synthesizers/house-venue.js} +20 -6
  227. package/out/src/synthesizers/house-venue.js.map +1 -0
  228. package/out/src/{synthesize-intersection.d.ts → synthesizers/intersection.d.ts} +2 -2
  229. package/out/src/synthesizers/intersection.d.ts.map +1 -0
  230. package/out/src/{synthesize-intersection.js → synthesizers/intersection.js} +1 -1
  231. package/out/src/synthesizers/intersection.js.map +1 -0
  232. package/out/src/{synthesize-no-street.d.ts → synthesizers/no-street.d.ts} +3 -3
  233. package/out/src/synthesizers/no-street.d.ts.map +1 -0
  234. package/out/src/{synthesize-no-street.js → synthesizers/no-street.js} +2 -2
  235. package/out/src/synthesizers/no-street.js.map +1 -0
  236. package/out/src/{synthesize-po-box.d.ts → synthesizers/po-box.d.ts} +2 -2
  237. package/out/src/synthesizers/po-box.d.ts.map +1 -0
  238. package/out/src/{synthesize-po-box.js → synthesizers/po-box.js} +1 -1
  239. package/out/src/synthesizers/po-box.js.map +1 -0
  240. package/out/src/{synthesize-street.d.ts → synthesizers/street.d.ts} +2 -2
  241. package/out/src/synthesizers/street.d.ts.map +1 -0
  242. package/out/src/{synthesize-street.js → synthesizers/street.js} +4 -3
  243. package/out/src/synthesizers/street.js.map +1 -0
  244. package/out/src/{synthesize.d.ts → synthesizers/utils.d.ts} +3 -3
  245. package/out/src/synthesizers/utils.d.ts.map +1 -0
  246. package/out/src/{synthesize.js → synthesizers/utils.js} +5 -4
  247. package/out/src/synthesizers/utils.js.map +1 -0
  248. package/out/src/tools/align-shard.d.ts.map +1 -1
  249. package/out/src/tools/align-shard.js +2 -2
  250. package/out/src/tools/align-shard.js.map +1 -1
  251. package/out/src/tools/fetch/ban.d.ts.map +1 -1
  252. package/out/src/tools/fetch/ban.js +2 -18
  253. package/out/src/tools/fetch/ban.js.map +1 -1
  254. package/out/src/tools/fetch/download.d.ts +12 -3
  255. package/out/src/tools/fetch/download.d.ts.map +1 -1
  256. package/out/src/tools/fetch/download.js +20 -4
  257. package/out/src/tools/fetch/download.js.map +1 -1
  258. package/out/src/tools/fetch/geonames-dump.d.ts +87 -0
  259. package/out/src/tools/fetch/geonames-dump.d.ts.map +1 -0
  260. package/out/src/tools/fetch/geonames-dump.js +178 -0
  261. package/out/src/tools/fetch/geonames-dump.js.map +1 -0
  262. package/out/src/tools/fetch/geonames-postal.d.ts +76 -0
  263. package/out/src/tools/fetch/geonames-postal.d.ts.map +1 -0
  264. package/out/src/tools/fetch/geonames-postal.js +125 -0
  265. package/out/src/tools/fetch/geonames-postal.js.map +1 -0
  266. package/out/src/tools/fetch/imls-pls.d.ts.map +1 -1
  267. package/out/src/tools/fetch/imls-pls.js +5 -17
  268. package/out/src/tools/fetch/imls-pls.js.map +1 -1
  269. package/out/src/tools/fetch/index.d.ts +11 -0
  270. package/out/src/tools/fetch/index.d.ts.map +1 -1
  271. package/out/src/tools/fetch/index.js +11 -0
  272. package/out/src/tools/fetch/index.js.map +1 -1
  273. package/out/src/tools/fetch/nad.d.ts.map +1 -1
  274. package/out/src/tools/fetch/nad.js +20 -11
  275. package/out/src/tools/fetch/nad.js.map +1 -1
  276. package/out/src/tools/fetch/nppes.d.ts.map +1 -1
  277. package/out/src/tools/fetch/nppes.js +17 -22
  278. package/out/src/tools/fetch/nppes.js.map +1 -1
  279. package/out/src/tools/fetch/openaddresses.d.ts.map +1 -1
  280. package/out/src/tools/fetch/openaddresses.js +18 -17
  281. package/out/src/tools/fetch/openaddresses.js.map +1 -1
  282. package/out/src/tools/fetch/ourairports.d.ts.map +1 -1
  283. package/out/src/tools/fetch/ourairports.js +7 -2
  284. package/out/src/tools/fetch/ourairports.js.map +1 -1
  285. package/out/src/tools/fetch/ppd.d.ts +0 -4
  286. package/out/src/tools/fetch/ppd.d.ts.map +1 -1
  287. package/out/src/tools/fetch/ppd.js +1 -1
  288. package/out/src/tools/fetch/ppd.js.map +1 -1
  289. package/out/src/tools/fetch/state-hi-schools.d.ts.map +1 -1
  290. package/out/src/tools/fetch/state-hi-schools.js +3 -19
  291. package/out/src/tools/fetch/state-hi-schools.js.map +1 -1
  292. package/out/src/tools/fetch/state-sources.d.ts +4 -0
  293. package/out/src/tools/fetch/state-sources.d.ts.map +1 -1
  294. package/out/src/tools/fetch/state-sources.js +1 -5
  295. package/out/src/tools/fetch/state-sources.js.map +1 -1
  296. package/out/src/tools/fetch/tiger-full.d.ts.map +1 -1
  297. package/out/src/tools/fetch/tiger-full.js +15 -21
  298. package/out/src/tools/fetch/tiger-full.js.map +1 -1
  299. package/out/src/tools/golden-expand.d.ts.map +1 -1
  300. package/out/src/tools/golden-expand.js +34 -25
  301. package/out/src/tools/golden-expand.js.map +1 -1
  302. package/out/src/tools/golden-relabel-street.d.ts.map +1 -1
  303. package/out/src/tools/golden-relabel-street.js +4 -77
  304. package/out/src/tools/golden-relabel-street.js.map +1 -1
  305. package/out/src/tools/index.d.ts +2 -2
  306. package/out/src/tools/index.d.ts.map +1 -1
  307. package/out/src/tools/index.js +2 -2
  308. package/out/src/tools/index.js.map +1 -1
  309. package/out/src/tools/ingest-csv.d.ts.map +1 -1
  310. package/out/src/tools/ingest-csv.js +0 -11
  311. package/out/src/tools/ingest-csv.js.map +1 -1
  312. package/out/src/tools/overlay-manifest.d.ts +4 -0
  313. package/out/src/tools/overlay-manifest.d.ts.map +1 -1
  314. package/out/src/tools/overlay-manifest.js +16 -6
  315. package/out/src/tools/overlay-manifest.js.map +1 -1
  316. package/out/src/tools/postcode-triples.d.ts +175 -0
  317. package/out/src/tools/postcode-triples.d.ts.map +1 -0
  318. package/out/src/tools/postcode-triples.js +304 -0
  319. package/out/src/tools/postcode-triples.js.map +1 -0
  320. package/out/src/tools/shard-kryptonite.d.ts.map +1 -1
  321. package/out/src/tools/shard-kryptonite.js +1 -3
  322. package/out/src/tools/shard-kryptonite.js.map +1 -1
  323. package/out/src/tools/shard-translit.d.ts.map +1 -1
  324. package/out/src/tools/shard-translit.js +4 -27
  325. package/out/src/tools/shard-translit.js.map +1 -1
  326. package/out/src/tools/sub-venue/harvest.d.ts +100 -0
  327. package/out/src/tools/sub-venue/harvest.d.ts.map +1 -0
  328. package/out/src/tools/sub-venue/harvest.js +168 -0
  329. package/out/src/tools/sub-venue/harvest.js.map +1 -0
  330. package/out/src/tools/sub-venue/head-nouns.d.ts +50 -0
  331. package/out/src/tools/sub-venue/head-nouns.d.ts.map +1 -0
  332. package/out/src/tools/sub-venue/head-nouns.js +210 -0
  333. package/out/src/tools/sub-venue/head-nouns.js.map +1 -0
  334. package/out/src/tools/sub-venue/surfaces.d.ts +45 -0
  335. package/out/src/tools/sub-venue/surfaces.d.ts.map +1 -0
  336. package/out/src/tools/sub-venue/surfaces.js +77 -0
  337. package/out/src/tools/sub-venue/surfaces.js.map +1 -0
  338. package/out/src/tools/sub-venue/table.d.ts +229 -0
  339. package/out/src/tools/sub-venue/table.d.ts.map +1 -0
  340. package/out/src/tools/sub-venue/table.js +108 -0
  341. package/out/src/tools/sub-venue/table.js.map +1 -0
  342. package/out/src/tools/sub-venue/wikidata.d.ts +26 -0
  343. package/out/src/tools/sub-venue/wikidata.d.ts.map +1 -0
  344. package/out/src/tools/sub-venue/wikidata.js +62 -0
  345. package/out/src/tools/sub-venue/wikidata.js.map +1 -0
  346. package/out/src/tools/sub-venue-lexicon.d.ts +27 -378
  347. package/out/src/tools/sub-venue-lexicon.d.ts.map +1 -1
  348. package/out/src/tools/sub-venue-lexicon.js +30 -565
  349. package/out/src/tools/sub-venue-lexicon.js.map +1 -1
  350. package/out/src/{align.d.ts → utils/align.d.ts} +1 -1
  351. package/out/src/utils/align.d.ts.map +1 -0
  352. package/out/src/utils/align.js.map +1 -0
  353. package/out/src/utils/golden.d.ts.map +1 -0
  354. package/out/src/{golden.js → utils/golden.js} +2 -2
  355. package/out/src/utils/golden.js.map +1 -0
  356. package/out/src/utils/index.d.ts +14 -0
  357. package/out/src/utils/index.d.ts.map +1 -0
  358. package/out/src/utils/index.js +14 -0
  359. package/out/src/utils/index.js.map +1 -0
  360. package/out/src/utils/license.d.ts.map +1 -0
  361. package/out/src/{license.js → utils/license.js} +1 -1
  362. package/out/src/utils/license.js.map +1 -0
  363. package/out/src/{parquet.d.ts → utils/parquet.d.ts} +24 -5
  364. package/out/src/utils/parquet.d.ts.map +1 -0
  365. package/out/src/{parquet.js → utils/parquet.js} +6 -3
  366. package/out/src/utils/parquet.js.map +1 -0
  367. package/out/src/{split.d.ts → utils/split.d.ts} +1 -1
  368. package/out/src/utils/split.d.ts.map +1 -0
  369. package/out/src/{split.js → utils/split.js} +2 -2
  370. package/out/src/utils/split.js.map +1 -0
  371. package/out/src/utils/tokenize.d.ts.map +1 -0
  372. package/out/src/utils/tokenize.js.map +1 -0
  373. package/out/src/utils/wof-json.d.ts.map +1 -0
  374. package/out/src/utils/wof-json.js.map +1 -0
  375. package/package.json +287 -21
  376. package/src/adapters/ban/adapter.ts +7 -5
  377. package/src/adapters/fcc-bdc/adapter.ts +5 -4
  378. package/src/adapters/geonames/adapter.ts +3 -3
  379. package/src/adapters/geonames-postal/adapter.ts +4 -4
  380. package/src/adapters/gnaf/adapter.ts +3 -3
  381. package/src/adapters/gnaf/assemble.ts +1 -1
  382. package/src/adapters/index.ts +3 -2
  383. package/src/adapters/openaddresses/adapter.ts +4 -4
  384. package/src/adapters/overture/adapter.ts +3 -3
  385. package/src/adapters/state-hi-schools/adapter.ts +8 -7
  386. package/src/adapters/state-ia-contractors/adapter.ts +13 -8
  387. package/src/adapters/state-ny-notaries/adapter.ts +13 -32
  388. package/src/adapters/state-tx-notaries/adapter.ts +13 -8
  389. package/src/adapters/synth-po-box/adapter.ts +4 -4
  390. package/src/adapters/tiger/adapter.ts +5 -3
  391. package/src/adapters/usgov-hrsa-fqhc/adapter.ts +8 -7
  392. package/src/adapters/usgov-imls-pls/adapter.ts +12 -8
  393. package/src/adapters/usgov-irs-bmf/adapter.ts +7 -6
  394. package/src/adapters/usgov-nad/adapter.ts +9 -9
  395. package/src/adapters/usgov-nppes/adapter.ts +13 -12
  396. package/src/adapters/usgov-samhsa-treatment-locator/adapter.ts +8 -7
  397. package/src/{adapter.ts → adapters/utils/index.ts} +15 -3
  398. package/src/adapters/wof-admin-jp/adapter.ts +9 -12
  399. package/src/adapters/wof-admin-json/adapter.ts +15 -54
  400. package/src/adapters/wof-json-rows.ts +79 -0
  401. package/src/adapters/wof-postalcode-json/adapter.ts +16 -50
  402. package/src/build.ts +8 -8
  403. package/src/index.ts +3 -17
  404. package/src/name-prone-us-suffixes.ts +12 -0
  405. package/src/parquet-wrapper/reader.ts +9 -0
  406. package/src/runner.ts +2 -2
  407. package/src/shard-recipes/anchor-absorption.ts +5 -5
  408. package/src/shard-recipes/bare-country.ts +95 -0
  409. package/src/shard-recipes/boundary-stress.ts +3 -2
  410. package/src/shard-recipes/country-balanced.ts +16 -27
  411. package/src/shard-recipes/cz-pcfirst-preposition.ts +29 -10
  412. package/src/shard-recipes/fr-admin-split.ts +6 -4
  413. package/src/shard-recipes/fr-bare-street.ts +85 -10
  414. package/src/shard-recipes/fr-lieudit.ts +6 -4
  415. package/src/shard-recipes/fr-order.ts +13 -26
  416. package/src/shard-recipes/german.ts +9 -18
  417. package/src/shard-recipes/house-venue.ts +2 -1
  418. package/src/shard-recipes/index.ts +8 -1
  419. package/src/shard-recipes/intersection.ts +9 -17
  420. package/src/shard-recipes/locale.ts +16 -24
  421. package/src/shard-recipes/no-street.ts +2 -1
  422. package/src/shard-recipes/po-box-cedex.ts +76 -58
  423. package/src/shard-recipes/po-box.ts +2 -1
  424. package/src/shard-recipes/reviewed-postcode-tail.ts +189 -0
  425. package/src/shard-recipes/scaffold.ts +99 -24
  426. package/src/shard-recipes/street-affix.ts +284 -45
  427. package/src/shard-recipes/street-bare.ts +4 -3
  428. package/src/shard-recipes/street.ts +3 -2
  429. package/src/shard-recipes/sub-venue-sources.ts +13 -23
  430. package/src/shard-recipes/sub-venue.ts +11 -9
  431. package/src/shard-recipes/trailing-region.ts +183 -0
  432. package/src/shard-recipes/unit.ts +8 -17
  433. package/src/{synthesize-boundary-stress.ts → synthesizers/boundary-stress.ts} +2 -2
  434. package/src/{synthesize-german.ts → synthesizers/german.ts} +3 -2
  435. package/src/{synthesize-house-venue.ts → synthesizers/house-venue.ts} +20 -6
  436. package/src/{synthesize-intersection.ts → synthesizers/intersection.ts} +1 -1
  437. package/src/{synthesize-no-street.ts → synthesizers/no-street.ts} +2 -2
  438. package/src/{synthesize-po-box.ts → synthesizers/po-box.ts} +1 -1
  439. package/src/{synthesize-street.ts → synthesizers/street.ts} +5 -3
  440. package/src/{synthesize.ts → synthesizers/utils.ts} +6 -4
  441. package/src/tools/align-shard.ts +3 -2
  442. package/src/tools/fetch/ban.ts +2 -22
  443. package/src/tools/fetch/download.ts +22 -4
  444. package/src/tools/fetch/geonames-dump.ts +267 -0
  445. package/src/tools/fetch/geonames-postal.ts +180 -0
  446. package/src/tools/fetch/imls-pls.ts +6 -20
  447. package/src/tools/fetch/index.ts +11 -0
  448. package/src/tools/fetch/nad.ts +21 -10
  449. package/src/tools/fetch/nppes.ts +17 -23
  450. package/src/tools/fetch/openaddresses.ts +18 -22
  451. package/src/tools/fetch/ourairports.ts +7 -2
  452. package/src/tools/fetch/ppd.ts +1 -1
  453. package/src/tools/fetch/state-hi-schools.ts +3 -23
  454. package/src/tools/fetch/state-sources.ts +1 -1
  455. package/src/tools/fetch/tiger-full.ts +17 -24
  456. package/src/tools/golden-expand.ts +44 -33
  457. package/src/tools/golden-relabel-street.ts +5 -68
  458. package/src/tools/index.ts +2 -2
  459. package/src/tools/ingest-csv.ts +0 -13
  460. package/src/tools/overlay-manifest.ts +20 -8
  461. package/src/tools/postcode-triples.ts +375 -0
  462. package/src/tools/shard-kryptonite.ts +4 -5
  463. package/src/tools/shard-translit.ts +16 -35
  464. package/src/tools/sub-venue/harvest.ts +235 -0
  465. package/src/tools/sub-venue/head-nouns.ts +242 -0
  466. package/src/tools/sub-venue/surfaces.ts +95 -0
  467. package/src/tools/sub-venue/table.ts +281 -0
  468. package/src/tools/sub-venue/wikidata.ts +85 -0
  469. package/src/tools/sub-venue-lexicon.ts +67 -886
  470. package/src/{align.ts → utils/align.ts} +2 -1
  471. package/src/{golden.ts → utils/golden.ts} +2 -3
  472. package/src/utils/index.ts +14 -0
  473. package/src/{license.ts → utils/license.ts} +1 -1
  474. package/src/{parquet.ts → utils/parquet.ts} +22 -9
  475. package/src/{split.ts → utils/split.ts} +3 -3
  476. package/out/src/adapter.d.ts.map +0 -1
  477. package/out/src/adapter.js.map +0 -1
  478. package/out/src/align.d.ts.map +0 -1
  479. package/out/src/align.js.map +0 -1
  480. package/out/src/format.d.ts +0 -14
  481. package/out/src/format.d.ts.map +0 -1
  482. package/out/src/format.js +0 -14
  483. package/out/src/format.js.map +0 -1
  484. package/out/src/golden.d.ts.map +0 -1
  485. package/out/src/golden.js.map +0 -1
  486. package/out/src/license.d.ts.map +0 -1
  487. package/out/src/license.js.map +0 -1
  488. package/out/src/parquet.d.ts.map +0 -1
  489. package/out/src/parquet.js.map +0 -1
  490. package/out/src/split.d.ts.map +0 -1
  491. package/out/src/split.js.map +0 -1
  492. package/out/src/synthesize-anchor-absorption.d.ts.map +0 -1
  493. package/out/src/synthesize-anchor-absorption.js.map +0 -1
  494. package/out/src/synthesize-boundary-stress.d.ts.map +0 -1
  495. package/out/src/synthesize-boundary-stress.js.map +0 -1
  496. package/out/src/synthesize-german.d.ts.map +0 -1
  497. package/out/src/synthesize-german.js.map +0 -1
  498. package/out/src/synthesize-house-venue.d.ts.map +0 -1
  499. package/out/src/synthesize-house-venue.js.map +0 -1
  500. package/out/src/synthesize-intersection.d.ts.map +0 -1
  501. package/out/src/synthesize-intersection.js.map +0 -1
  502. package/out/src/synthesize-no-street.d.ts.map +0 -1
  503. package/out/src/synthesize-no-street.js.map +0 -1
  504. package/out/src/synthesize-po-box.d.ts.map +0 -1
  505. package/out/src/synthesize-po-box.js.map +0 -1
  506. package/out/src/synthesize-street.d.ts.map +0 -1
  507. package/out/src/synthesize-street.js.map +0 -1
  508. package/out/src/synthesize.d.ts.map +0 -1
  509. package/out/src/synthesize.js.map +0 -1
  510. package/out/src/tokenize.d.ts.map +0 -1
  511. package/out/src/tokenize.js.map +0 -1
  512. package/out/src/wof-json.d.ts.map +0 -1
  513. package/out/src/wof-json.js.map +0 -1
  514. package/src/format.ts +0 -14
  515. /package/out/src/{align.js → utils/align.js} +0 -0
  516. /package/out/src/{golden.d.ts → utils/golden.d.ts} +0 -0
  517. /package/out/src/{license.d.ts → utils/license.d.ts} +0 -0
  518. /package/out/src/{tokenize.d.ts → utils/tokenize.d.ts} +0 -0
  519. /package/out/src/{tokenize.js → utils/tokenize.js} +0 -0
  520. /package/out/src/{wof-json.d.ts → utils/wof-json.d.ts} +0 -0
  521. /package/out/src/{wof-json.js → utils/wof-json.js} +0 -0
  522. /package/src/{synthesize-anchor-absorption.ts → synthesizers/anchor-absorption.ts} +0 -0
  523. /package/src/{tokenize.ts → utils/tokenize.ts} +0 -0
  524. /package/src/{wof-json.ts → utils/wof-json.ts} +0 -0
package/README.md CHANGED
@@ -38,7 +38,7 @@ training pipeline (`corpus-python/`).
38
38
  | **`expand-golden.ts`** | Expand reference addresses into training rows with alignment |
39
39
  | **`align.ts`** | Tokenize raw address → BIO label sequence |
40
40
  | **`validate.ts`** | Validate corpus integrity, label coverage, shard balance |
41
- | **`synthesize-*.ts`** | Synthetic shard generators (boundary stress, order variants, etc.) |
41
+ | **`synthesizers/*.ts`** | Synthetic shard generators (boundary stress, order variants, etc.) |
42
42
  | **`ingest/`** | Overture Maps + NAD ingestion |
43
43
  | **`shard-registry.ts`** | Shard metadata and composition |
44
44
  | **`stats.ts`** | Per-shard and per-tag statistics |
@@ -70,8 +70,8 @@ node scripts/corpus-stats.mjs
70
70
 
71
71
  - [`@mailwoman/neural`](../neural) — the runtime that loads and runs the trained model
72
72
  - [`@mailwoman/neural-weights-en-us`](../neural-weights-en-us) — the trained model itself
73
- - [Corpus Construction concepts](https://mailwoman.sister.software/articles/concepts/corpus-construction/)
74
- - [Training Pipeline concepts](https://mailwoman.sister.software/articles/concepts/training-pipeline/)
73
+ - [Corpus Construction concepts](https://mailwoman.ai/articles/concepts/corpus-construction/)
74
+ - [Training Pipeline concepts](https://mailwoman.ai/articles/concepts/training-pipeline/)
75
75
  - [CONTRIBUTING_MODEL_WORK](https://github.com/sister-software/mailwoman/blob/main/docs/engineering/CONTRIBUTING_MODEL_WORK.mdx)
76
76
 
77
77
  ## License
@@ -0,0 +1,227 @@
1
+ # `corpus/data/` provenance
2
+
3
+ ## `reviewed-ve-postcode-tuples.json` — reviewed Venezuelan postcode placement (#1821)
4
+
5
+ Four geographic facts support the Venezuelan `locality postcode, region` convention. The Barcelona
6
+ tuple comes from the Anzoátegui state government's contact address. The Caracas, Sanare, and Santa
7
+ Elena de Guairén tuples come from the Universal Postal Union's Venezuela addressing guide. The file
8
+ records the publisher, full source address, retrieval date, review status, and source-license note for
9
+ each tuple.
10
+
11
+ Only factual fields are stored. No source prose is copied, and the corpus rows do not claim that either
12
+ source published the facts under CC0 or another open-data license. The recipe creates bounded synthetic
13
+ case, punctuation, accent, country-tail, and left-context forms while keeping each reviewed
14
+ postcode-to-place join unchanged.
15
+
16
+ ## `sub-venue-lexicon.json` — the sub-venue designator lexicon (#35, waves 1–2)
17
+
18
+ The vocabulary a corpus shard (and eventually the span proposer) reads to recognize `Terminal 5`,
19
+ `North Terminal`, `Concourse B`, `第1ターミナル` as venue-interior structure. Generated, **not
20
+ hand-edited**. See `docs/engineering/sub-venue-corpus-task.mdx` for why this exists — the short
21
+ version is that the `unit` tag was never taught the modifier+designator shape, so closing the class by
22
+ decode weight would take a bias scale near 11 nats where the stronger designator+identifier evidence
23
+ needed 6.
24
+
25
+ The one hand-authored input is `corpus/src/tools/sub-venue-promotions.ts`, the curation ledger. The
26
+ builder cannot decide that Spanish `terminal` is safe and British `hall` is not, because that is a
27
+ judgement about a language's confounds; what it does is APPLY those decisions.
28
+
29
+ ### Regenerate
30
+
31
+ ```sh
32
+ mailwoman corpus fetch wikidata-subvenue --out-root $MAILWOMAN_DATA_ROOT/sub-venue/sources
33
+
34
+ # One extraction per region. ogr2ogr dominates: 44 s for a 340 MB extract, 371 s for Japan's 2.5 GB.
35
+ mailwoman corpus sub-venue-extract \
36
+ --pbf $MAILWOMAN_DATA_ROOT/sub-venue/pbf/japan.osm.pbf \
37
+ --out $MAILWOMAN_DATA_ROOT/sub-venue/extracts/japan.jsonl --country JP
38
+
39
+ mailwoman corpus sub-venue-lexicon \
40
+ --wikidata-dir $MAILWOMAN_DATA_ROOT/sub-venue/sources/wikidata-subvenue \
41
+ --extracts "GB=$E/great-britain.jsonl,DE=$E/germany.jsonl,FR=$E/france.jsonl,ES=$E/spain.jsonl,JP=$E/japan.jsonl" \
42
+ --overture-db $MAILWOMAN_DATA_ROOT/poi/poi.db \
43
+ --out corpus/data/sub-venue-lexicon.json
44
+ npx oxfmt corpus/data/sub-venue-lexicon.json
45
+ ```
46
+
47
+ `$E` is `$MAILWOMAN_DATA_ROOT/sub-venue/extracts`. `--extracts` takes `REGION=path` pairs because the
48
+ region is the axis every curation decision is taken on, and no extract filename carries it reliably —
49
+ `ile-de-france` is FR, `great-britain` is GB. A bare path lands region `""`, whose surfaces can never
50
+ be promoted.
51
+
52
+ The oxfmt pass is required — committed JSON is oxfmt-clean, which raw `JSON.stringify` cannot
53
+ reproduce. The generator is byte-deterministic and oxfmt is too, so the artifact is reproducible from
54
+ the same fetch outputs. `sub-venue-lexicon.test.ts` pins determinism directly.
55
+
56
+ The extract JSONLs and the `.osm.pbf` files are build inputs under
57
+ `$MAILWOMAN_DATA_ROOT/sub-venue/`, not committed.
58
+
59
+ ### Sources, as of the committed build (2026-08-05)
60
+
61
+ | source | origin | license | rows |
62
+ | --------------- | -------------------------------------------------- | ------------------- | ------- |
63
+ | Wikidata (WDQS) | `https://query.wikidata.org/sparql`, 8 concept ids | CC0 | 877 |
64
+ | OpenStreetMap | Geofabrik `great-britain-latest.osm.pbf` | ODbL | 254,356 |
65
+ | OpenStreetMap | Geofabrik `germany-latest.osm.pbf` | ODbL | 403,863 |
66
+ | OpenStreetMap | Geofabrik `france-latest.osm.pbf` | ODbL | 251,260 |
67
+ | OpenStreetMap | Geofabrik `spain-latest.osm.pbf` | ODbL | 78,918 |
68
+ | OpenStreetMap | Geofabrik `japan-latest.osm.pbf` | ODbL | 183,999 |
69
+ | Overture Places | `poi.db` spatial layer, vintage `2026-05-20.0` | CDLA-Permissive-2.0 | 9,219 |
70
+
71
+ **The ODbL question, unchanged from wave 1 and still open for the shard.** The committed artifact
72
+ contains no OSM geometry and no OSM row. What survives the OSM leg is surface COUNTS — that the token
73
+ `ターミナル` appears in 1,215 Japanese feature names — plus the `identifierShapes` distribution, whose
74
+ `examples` are gate reference strings (`B32`, `1A`, `16-18`). Facts and short factual strings are not
75
+ a substantial extraction from a database, so this table is not treated as a Derived Database. That
76
+ reading matches `osm/README.md`'s posture that the ODbL obligation rides on the built shard rather
77
+ than on code. **A corpus shard built from OSM rows IS a derived work, and that question is still not
78
+ settled** — it gates step 4, not this table.
79
+
80
+ ### What the sources are FOR, and what each cannot do
81
+
82
+ Overture and OSM fail differently, which is why both are read.
83
+
84
+ - **Overture (`poi.db`)** is curated venue-interior naming. `concourse` appears 35 times in its
85
+ `airport_terminal` slice against 4 in the whole Great Britain OSM extract, and 3 of those 4 are a
86
+ street called CONCOURSE WAY. **But poi.db is four countries** — US 11,521,612 / CA 794,418 /
87
+ FR 721,352 / MX 644,316, and nothing else (measured 2026-08-05). It can attest en-US, en-CA, fr-FR
88
+ and es-MX and nothing else, so a zero count in it is evidence of absence in four countries, not in
89
+ the world.
90
+ - **OSM** reaches any region with a Geofabrik extract, and carries the `name:<lang>` family, which is
91
+ where every non-Latin surface in this table comes from. What it does not carry is a curated notion
92
+ of "interior": 3,204 of Great Britain's 3,273 `hall` hits sit on a `public_transport=platform`,
93
+ because a British bus stop is named after the village hall it stands outside.
94
+
95
+ The Overture category set is measured, not guessed. A full scan of all 13,681,698 rows counted, per
96
+ category, how many named rows carry a designator token; the ranking is not what a category name
97
+ predicts. `gas_station` leads the entire table with 12,996 hits, every one of them `station` inside
98
+ "Holiday Station" or "Chevron Station Seward", and `shoe_store` contributes 708 hits of `wing` because
99
+ Red Wing sells boots. Four categories survived reading the distribution — `airport_terminal`,
100
+ `campus_building`, `pier`, `airport_lounge` — and `overture-subvenue.ts` lists the rejects with the
101
+ number that rejected them.
102
+
103
+ ### The wave-1 defect this build fixes
104
+
105
+ Wave 1 attributed every harvested phrase to `row.designatorID`, the rule that matched the FEATURE.
106
+ Because a bus stop tagged `public_transport=platform` is named "Village Hall" or "West Kensington",
107
+ **108 of its 133 OSM-derived surfaces named a different record than the one they pointed at**: the
108
+ shipped artifact claimed `west → platform`, `hall → platform`, `biggin → platform`, `salon →
109
+ platform`. Attribution now runs through a phrase → record index, and the row's own designator is kept
110
+ as `context` — which is the axis a confound board needs, since a `hall` on a platform is a bus stop
111
+ and a `hall` on a terminal is a hall.
112
+
113
+ ### Head nouns: what the curation pass needed before it could start
114
+
115
+ Wikidata gives the ENCYCLOPAEDIC name of a concept, not the designator as addressed. Q849706's
116
+ Spanish label is `terminal aeroportuaria`; the form on an envelope is `Terminal`. That is why wave 1
117
+ shipped 1,014 uncurated surfaces and could promote none of them — there was nothing promotable in the
118
+ table. Two derivations run before the harvest:
119
+
120
+ - **Latin script — the cognate test.** A token whose ASCII fold shares five leading characters with
121
+ the designator's own id. `terminal aeroportuaria` → `terminal`, `letištní terminál` → `terminál`,
122
+ `havalimanı terminali` → `terminali`. An earlier rule matched against any single-token surface of
123
+ the record and, because Dutch `universiteit` is one, derived `universitario`, `universitaire` and
124
+ twenty more as head nouns of `campus`. Those are the modifier half, and they would have taught the
125
+ harvest to read "Ciudad Universitaria" as sub-venue structure.
126
+ - **Han / Kana / Hangul — the shared-substring test.** Every substring of length ≥ 2 carried by two or
127
+ more surfaces of the same record and language, maximal-only, capped at six. `ターミナル` is in none
128
+ of the five Japanese labels on its own — every one is a compound — and it is the form Japanese
129
+ addresses carry. Nothing else in the pipeline can produce it, and the Japan harvest is what confirms
130
+ it: 1,215 attestations.
131
+
132
+ Run over every non-Latin phrase instead, the second derivation produced 90 fragments of Cyrillic,
133
+ Greek, Arabic, Thai, Burmese and Tamil words — `сгра`, `κτίρ`, `ิ่งก่อสร้า` — because those languages
134
+ have one surface per concept and the only shared substrings are pieces of one word. None could ever
135
+ be counted: nothing in reach attests a Thai or Burmese surface. The derivation is scoped to the four
136
+ scripts where it works.
137
+
138
+ The harvest also gained a script-aware match. `第1ターミナル` has no word boundaries, so the
139
+ token-boundary rule that protects Latin script from `Briggate` finds nothing at all in Japanese; for
140
+ Han and Kana the match is a substring test, and the Germanic-compound objection does not transfer.
141
+
142
+ ### The curation ledger
143
+
144
+ `curated: false` is still the default and nothing auto-promotes. A surface becomes curated only by
145
+ matching a decision in `sub-venue-promotions.ts`, which names a designator, a phrase AND a locale.
146
+ Per-locale because the same token is a designator in one language and a disaster in another.
147
+
148
+ Every decision below is backed by a census in that locale's own data. `real` counts occurrences in
149
+ genuine venue-interior naming; `confound` counts the rest, and the note says what the rest IS — a bare
150
+ number is not a board, and "3,273 hits" told nobody that 3,204 of them were bus stops.
151
+
152
+ | designator | phrase | locale | real | confound | what the confound is |
153
+ | ---------- | ------------ | ------ | ----: | -------: | ---------------------------------------------------------- |
154
+ | gate | `flugsteig` | de-DE | 19 | 0 | nothing — pure aviation term, no collision in German |
155
+ | gate | `porte` | fr-FR | 19 | 927 | Paris city gates and their Métro stations |
156
+ | hall | `hall` | en-GB | 0 | 3,273 | 3,204 bus stops named after a village hall; Hall Lane/Road |
157
+ | hall | `hall` | en-US | 2,095 | 27,081 | City Hall, Kingdom Hall, event halls, dormitory halls |
158
+ | hall | `hall` | fr-FR | 35 | 5 | three English `Town Hall` strings on `name:en` tags |
159
+ | hall | `halle` | de-DE | 32 | 168 | the CITY Halle (Saale) / Halle (Westf), plus village halls |
160
+ | pier | `pier` | en-GB | 120 | 44 | Pier Road / Street / Avenue / Terrace — street names |
161
+ | pier | `pier` | en-US | 278 | 2,330 | Pier 1 Imports and franchises, seafood restaurants |
162
+ | terminal | `terminal` | ca-ES | 15 | 0 | nothing |
163
+ | terminal | `terminal` | es-ES | 190 | 0 | nothing |
164
+ | terminal | `terminal` | fr-FR | 169 | 0 | nothing |
165
+ | terminal | `ターミナル` | ja-JP | 1,213 | 2 | two `ターミナル前` bus stops, arguably real |
166
+ | wing | `wing` | en-GB | 23 | 6 | the Buckinghamshire village of Wing — Wing Close/Road |
167
+ | wing | `wing` | en-US | 4 | 3,354 | Red Wing boots (676), chicken-wing restaurants (759) |
168
+ | wing | `wing` | fr-FR | 0 | 26 | Wing Chun and Wing Tsun martial-arts clubs |
169
+
170
+ Nine promotions, six rejections. Three pairs carry the whole point of doing this per-locale: `hall` is
171
+ 0-of-3,273 in Great Britain and 35-of-40 in France; `wing` is 23-of-29 in Great Britain and
172
+ 4-of-3,358 in the United States; `pier` is promotable in Great Britain and not in the United States.
173
+
174
+ **The test that separates a promote from a reject is whether SHAPE can isolate the confound**, and it
175
+ is checked by enumeration rather than asserted. `halle` keeps a 168-hit confound and is promoted
176
+ because dumping all 32 `<halle> <identifier>` hits returns numbered factory, trade-fair and airport
177
+ halls — VW Halle 42, Audi GVZ Halle G, Messe West Halle 8 — and not one instance of the city of
178
+ 240,000 people with the same name. `porte` has a smaller confound ratio in that bucket and is
179
+ rejected, because 17 of its 36 shape hits are Porte Saint-Martin, Porte Saint-Denis and Porte
180
+ Notre-Dame. Same test killed `pier` for en-US: Pier 1 Imports IS the designator+identifier shape.
181
+
182
+ **A caveat on `wing`, the designator the corpus task's board rests on.** 24 of its 29 Great Britain
183
+ hits sit on a `public_transport=platform`, because British bus stops are named after the hospital wing
184
+ they serve. The extractor maps no building wings at all: `aile` in France is **0 hits**, `ala` in
185
+ Spain **0**, `flügel` in Germany **0**. The en-GB evidence is a property of British stop naming rather
186
+ than of a source that has wings in it, and the localized wing surfaces the corpus task asked for are
187
+ out of reach until the extractor gains an `indoor=*` rule or the lexicon gains a hand-seeded surface
188
+ list.
189
+
190
+ **A rejection of a SHIPPED designator is advisory.** `neural/venue-structure.ts` carries a flat
191
+ English vocabulary with no locale gate, and `wing`, `terminal` and `concourse` are in it. This table
192
+ cannot un-ship them: the `wing` / en-US rejection tells a shard author which locale to leave out of a
193
+ generated line, and it does nothing to stop the span proposer firing on "Red Wing". Giving the shipped
194
+ vocabulary a per-locale gate is step 4's problem, and it is the single largest thing the shard will
195
+ want that does not exist yet.
196
+
197
+ The mechanism does hold for anything the lexicon adds. `pier` is promoted for en-GB and rejected for
198
+ en-US, and because it is not in the shipped list, the rejection has teeth: the region-free English
199
+ `pier` surface stays `curated: false` and only the 164 Great Britain attestations are marked usable.
200
+
201
+ ### Identifier shapes are per-region now
202
+
203
+ `Gate A12` is a rendering, not a string anyone wrote down: all 658 Great Britain `aeroway=gate`
204
+ features but 13 are unnamed and carry only a `ref`. The table therefore carries a distribution rather
205
+ than a phrase list — and the distribution turns out to differ by country far more than the shared
206
+ vocabulary suggests, so a shard generating `Gate <ref>` for a French address has to sample France's:
207
+
208
+ | region | gate refs | most common shape | second | third |
209
+ | ------ | --------: | ---------------------- | ---------------: | --------------- |
210
+ | GB | 655 | digit 463 (71%) | letter-digit 19% | digit-letter 8% |
211
+ | JP | 450 | digit 402 (89%) | digit-letter 5% | other 3% |
212
+ | FR | 628 | letter-digit 385 (61%) | digit 29% | letter 5% |
213
+ | DE | 642 | letter-digit 387 (60%) | digit 18% | range 11% |
214
+ | ES | 493 | letter-digit 189 (38%) | range 35% | digit 15% |
215
+
216
+ Britain and Japan number their gates; France and Germany letter-then-number them (`A37`, `B05`); Spain
217
+ is the outlier that gives a third of its gates a RANGE (`B18-B20`, `D42-D43`), which no other country
218
+ does at that rate. A generator that samples Great Britain's 71%-bare-digit shape into a Spanish line
219
+ produces a plausible string that is wrong about Spain.
220
+
221
+ ### The seed duplicates `neural/venue-structure.ts`
222
+
223
+ `@mailwoman/corpus` does not depend on `@mailwoman/neural`, so the shipped designator and modifier
224
+ lists are re-declared in `sub-venue-lexicon.ts`. That is a drift surface, and
225
+ `sub-venue-lexicon.test.ts` pins both lists literally so a change in either place fails a test rather
226
+ than passing silently. The right move is still the reverse direction: have `neural/venue-structure.ts`
227
+ read a committed lexicon slice and delete both copies.
@@ -0,0 +1,74 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "reviewedAt": "2026-08-24",
4
+ "tuples": [
5
+ {
6
+ "id": "ve-barcelona-6001-anzoategui",
7
+ "locality": "Barcelona",
8
+ "postcode": "6001",
9
+ "region": "Anzoátegui",
10
+ "country": "Venezuela",
11
+ "cc": "VE",
12
+ "locale": "es-VE",
13
+ "postcodePlacement": "after_locality",
14
+ "provenance": {
15
+ "publisher": "Gobierno del Estado Anzoátegui",
16
+ "url": "https://anzoategui.gob.ve/contacto/",
17
+ "retrievedAt": "2026-08-24",
18
+ "reviewStatus": "reviewed",
19
+ "sourceLicenseNote": "Factual address fields only; the source page does not state a reusable data license."
20
+ }
21
+ },
22
+ {
23
+ "id": "ve-caracas-1010-distrito-capital",
24
+ "locality": "Caracas",
25
+ "postcode": "1010",
26
+ "region": "Distrito Capital",
27
+ "country": "Venezuela",
28
+ "cc": "VE",
29
+ "locale": "es-VE",
30
+ "postcodePlacement": "after_locality",
31
+ "provenance": {
32
+ "publisher": "Universal Postal Union",
33
+ "url": "https://www.upu.int/UPU/media/upu/PostalEntitiesFiles/addressingUnit/venEn.pdf",
34
+ "retrievedAt": "2026-08-24",
35
+ "reviewStatus": "reviewed",
36
+ "sourceLicenseNote": "Factual postal fields only; no source prose is reproduced."
37
+ }
38
+ },
39
+ {
40
+ "id": "ve-sanare-3028-lara",
41
+ "locality": "Sanare",
42
+ "postcode": "3028",
43
+ "region": "Lara",
44
+ "country": "Venezuela",
45
+ "cc": "VE",
46
+ "locale": "es-VE",
47
+ "postcodePlacement": "after_locality",
48
+ "provenance": {
49
+ "publisher": "Universal Postal Union",
50
+ "url": "https://www.upu.int/UPU/media/upu/PostalEntitiesFiles/addressingUnit/venEn.pdf",
51
+ "retrievedAt": "2026-08-24",
52
+ "reviewStatus": "reviewed",
53
+ "sourceLicenseNote": "Factual postal fields only; no source prose is reproduced."
54
+ }
55
+ },
56
+ {
57
+ "id": "ve-santa-elena-8011-bolivar",
58
+ "locality": "Santa Elena de Guairén",
59
+ "postcode": "8011",
60
+ "region": "Bolívar",
61
+ "country": "Venezuela",
62
+ "cc": "VE",
63
+ "locale": "es-VE",
64
+ "postcodePlacement": "after_locality",
65
+ "provenance": {
66
+ "publisher": "Universal Postal Union",
67
+ "url": "https://www.upu.int/UPU/media/upu/PostalEntitiesFiles/addressingUnit/venEn.pdf",
68
+ "retrievedAt": "2026-08-24",
69
+ "reviewStatus": "reviewed",
70
+ "sourceLicenseNote": "Factual postal fields only; no source prose is reproduced."
71
+ }
72
+ }
73
+ ]
74
+ }