@mailwoman/corpus 10.3.0 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/README.md +17 -17
  2. package/data/PROVENANCE.md +273 -273
  3. package/data/address-source-register.json +517 -23
  4. package/data/license-decisions.json +120 -0
  5. package/data/licenses/PROVENANCE.md +5 -5
  6. package/data/licenses/cdla-permissive-2.0.md +6 -6
  7. package/data/licenses/geonames-publication.md +5 -5
  8. package/data/licenses/licence-ouverte-2.0.md +3 -3
  9. package/data/licenses/national-address-database.md +12 -12
  10. package/data/licenses/nlod-2.0.md +3 -3
  11. package/data/licenses/sirene-publication.md +13 -6
  12. package/data/licenses/whosonfirst-licenses.md +4 -4
  13. package/data/source-resolutions.json +11 -0
  14. package/lib/adapters/cordis/adapter.ts +8 -8
  15. package/lib/adapters/gleif/adapter.ts +7 -8
  16. package/lib/adapters/po-box/adapter.ts +1 -1
  17. package/lib/adapters/source-id.ts +1 -1
  18. package/lib/adapters.ts +2 -2
  19. package/lib/au/adapters/gnaf/adapter.ts +1 -1
  20. package/lib/be/adapters/brussels/adapter.ts +2 -2
  21. package/lib/be/adapters/vlaanderen/adapter.ts +1 -1
  22. package/lib/build.ts +1 -1
  23. package/lib/cz/adapters/cuzk/adapter.ts +1 -1
  24. package/lib/cz/tools/fetch/cuzk.ts +4 -4
  25. package/lib/de/recipes/locale.ts +1 -1
  26. package/lib/dk/adapters/inspire/adapter.ts +1 -1
  27. package/lib/ee/tools/fetch/ads.ts +2 -2
  28. package/lib/es/adapters/bizkaia/adapter.ts +1 -1
  29. package/lib/es/adapters/navarra/adapter.ts +2 -2
  30. package/lib/es/cadastre.ts +2 -2
  31. package/lib/es/tools/fetch/bizkaia.ts +7 -7
  32. package/lib/es/tools/fetch/catastro.ts +6 -6
  33. package/lib/es/tools/fetch/navarra.ts +4 -4
  34. package/lib/fingerprints.ts +3 -3
  35. package/lib/fr/adapters/finess/adapter.ts +6 -5
  36. package/lib/fr/adapters/finess/voie-type.ts +1 -1
  37. package/lib/fr/tools/fetch/annuaire-education.ts +3 -3
  38. package/lib/gb/constituent-country.ts +52 -0
  39. package/lib/inspire/address.ts +3 -3
  40. package/lib/international/recipes/locale.ts +41 -7
  41. package/lib/it/adapters/anac/adapter.ts +4 -3
  42. package/lib/jp/adapters/wof-admin/adapter.ts +2 -2
  43. package/lib/kr/adapters/juso/label-rows.ts +1 -1
  44. package/lib/kr/adapters/localdata/key-index.ts +2 -1
  45. package/lib/lu/adapters/bd-adresses/adapter.ts +1 -1
  46. package/lib/nl/adapters/kadaster/adapter.ts +2 -2
  47. package/lib/nl/tools/fetch/kadaster.ts +1 -1
  48. package/lib/parquet/shuffle.ts +2 -2
  49. package/lib/parquet/span-sql.ts +8 -6
  50. package/lib/parquet/streams.ts +1 -1
  51. package/lib/parquet/writers.ts +2 -2
  52. package/lib/pl/tools/fetch/emuia.ts +2 -2
  53. package/lib/recipes/scaffold.ts +2 -2
  54. package/lib/recipes/sources.ts +3 -3
  55. package/lib/recipes/sub/venue/render.ts +1 -1
  56. package/lib/recipes/sub/venue/sources.ts +4 -3
  57. package/lib/recipes/sub/venue.ts +4 -3
  58. package/lib/recipes/venue.ts +11 -11
  59. package/lib/ro/adapters/retea-scolara/adapter.ts +2 -2
  60. package/lib/runner.ts +3 -3
  61. package/lib/sk/tools/fetch/inspire.ts +3 -3
  62. package/lib/source-register/effective-manifest.ts +2 -2
  63. package/lib/source-register/types.ts +2 -2
  64. package/lib/subvenue/harvest.ts +6 -5
  65. package/lib/subvenue/promotions.ts +3 -3
  66. package/lib/subvenue/table.ts +6 -6
  67. package/lib/surfaces/locale.ts +1 -1
  68. package/lib/synthesizers/anchor-absorption.ts +1 -1
  69. package/lib/synthesizers/boundary-stress.ts +3 -2
  70. package/lib/synthesizers/no-street.ts +1 -1
  71. package/lib/synthesizers/po-box.ts +1 -1
  72. package/lib/synthesizers/tail.ts +2 -2
  73. package/lib/test-kit/corpus-recipe.ts +1 -1
  74. package/lib/tools/align-canonical.ts +3 -2
  75. package/lib/tools/audit.ts +1 -1
  76. package/lib/tools/corpus-stats.ts +1 -1
  77. package/lib/tools/fetch/download/network.ts +1 -1
  78. package/lib/tools/fetch/geonames/dump.ts +1 -1
  79. package/lib/tools/fetch/gleif.ts +1 -1
  80. package/lib/tools/fetch/header.ts +1 -1
  81. package/lib/tools/fetch/inspire-addresses.ts +1 -1
  82. package/lib/tools/fetch/vlaanderen-ad.ts +1 -1
  83. package/lib/tools/fetch/wfs-harvest.ts +6 -6
  84. package/lib/tools/fetch/zip-archive.ts +2 -2
  85. package/lib/tools/golden/expand.ts +1 -1
  86. package/lib/tools/golden/promote.ts +3 -3
  87. package/lib/tools/golden/relabel-street/directory.ts +2 -1
  88. package/lib/tools/lint/recipe-output/vocab.ts +2 -2
  89. package/lib/tools/overlay/manifest.ts +62 -10
  90. package/lib/tools/overlay/split-slice.ts +2 -10
  91. package/lib/tools/postcode-triples.ts +2 -2
  92. package/lib/tools/sub/venue/head-nouns.ts +4 -3
  93. package/lib/types.ts +3 -3
  94. package/lib/us/adapters/state/tx-notaries/adapter.ts +1 -1
  95. package/lib/us/adapters/usgov/irs-bmf/adapter.ts +2 -2
  96. package/lib/us/adapters/usgov/nppes/adapter.ts +1 -1
  97. package/lib/us/synthesizers/intersection.ts +4 -4
  98. package/lib/us/synthesizers/street.ts +3 -3
  99. package/lib/us/tools/fetch/nad.ts +2 -2
  100. package/lib/utils/split.ts +59 -6
  101. package/lib/utils/wof-json.ts +1 -1
  102. package/out/adapters/cordis/adapter.d.ts +7 -7
  103. package/out/adapters/cordis/adapter.js +8 -8
  104. package/out/adapters/cordis/adapter.js.map +1 -1
  105. package/out/adapters/gleif/adapter.d.ts +7 -8
  106. package/out/adapters/gleif/adapter.d.ts.map +1 -1
  107. package/out/adapters/gleif/adapter.js +7 -8
  108. package/out/adapters/gleif/adapter.js.map +1 -1
  109. package/out/adapters/po-box/adapter.d.ts +1 -1
  110. package/out/adapters/source-id.d.ts +1 -1
  111. package/out/adapters/source-id.js +1 -1
  112. package/out/adapters.d.ts +2 -2
  113. package/out/adapters.js +2 -2
  114. package/out/au/adapters/gnaf/adapter.js +1 -1
  115. package/out/be/adapters/brussels/adapter.d.ts +1 -1
  116. package/out/be/adapters/brussels/adapter.js +2 -2
  117. package/out/be/adapters/vlaanderen/adapter.d.ts +1 -1
  118. package/out/build.js +1 -1
  119. package/out/build.js.map +1 -1
  120. package/out/cz/adapters/cuzk/adapter.d.ts +1 -1
  121. package/out/cz/adapters/cuzk/adapter.js +1 -1
  122. package/out/cz/tools/fetch/cuzk.d.ts +2 -2
  123. package/out/cz/tools/fetch/cuzk.js +2 -2
  124. package/out/de/recipes/locale.d.ts +1 -1
  125. package/out/de/recipes/locale.js +1 -1
  126. package/out/dk/adapters/inspire/adapter.js +1 -1
  127. package/out/ee/tools/fetch/ads.d.ts +2 -2
  128. package/out/ee/tools/fetch/ads.js +1 -1
  129. package/out/es/adapters/bizkaia/adapter.js +1 -1
  130. package/out/es/adapters/navarra/adapter.d.ts +2 -2
  131. package/out/es/adapters/navarra/adapter.js +2 -2
  132. package/out/es/cadastre.d.ts +2 -2
  133. package/out/es/cadastre.js +2 -2
  134. package/out/es/tools/fetch/bizkaia.d.ts +5 -5
  135. package/out/es/tools/fetch/bizkaia.js +5 -5
  136. package/out/es/tools/fetch/catastro.d.ts +4 -4
  137. package/out/es/tools/fetch/catastro.js +2 -2
  138. package/out/es/tools/fetch/navarra.d.ts +2 -2
  139. package/out/es/tools/fetch/navarra.js +2 -2
  140. package/out/fingerprints.d.ts +3 -3
  141. package/out/fingerprints.js +3 -3
  142. package/out/fr/adapters/finess/adapter.d.ts +6 -5
  143. package/out/fr/adapters/finess/adapter.d.ts.map +1 -1
  144. package/out/fr/adapters/finess/adapter.js +6 -5
  145. package/out/fr/adapters/finess/adapter.js.map +1 -1
  146. package/out/fr/adapters/finess/voie-type.d.ts +1 -1
  147. package/out/fr/adapters/finess/voie-type.js +1 -1
  148. package/out/fr/tools/fetch/annuaire-education.d.ts +3 -3
  149. package/out/fr/tools/fetch/annuaire-education.js +3 -3
  150. package/out/gb/constituent-country.d.ts +36 -0
  151. package/out/gb/constituent-country.d.ts.map +1 -0
  152. package/out/gb/constituent-country.js +30 -0
  153. package/out/gb/constituent-country.js.map +1 -0
  154. package/out/inspire/address.d.ts +3 -3
  155. package/out/inspire/address.js +3 -3
  156. package/out/international/recipes/locale.d.ts +6 -0
  157. package/out/international/recipes/locale.d.ts.map +1 -1
  158. package/out/international/recipes/locale.js +29 -7
  159. package/out/international/recipes/locale.js.map +1 -1
  160. package/out/it/adapters/anac/adapter.d.ts +1 -1
  161. package/out/it/adapters/anac/adapter.d.ts.map +1 -1
  162. package/out/it/adapters/anac/adapter.js +4 -3
  163. package/out/it/adapters/anac/adapter.js.map +1 -1
  164. package/out/jp/adapters/wof-admin/adapter.d.ts +2 -2
  165. package/out/jp/adapters/wof-admin/adapter.js +2 -2
  166. package/out/kr/adapters/juso/label-rows.d.ts +1 -1
  167. package/out/kr/adapters/localdata/key-index.d.ts +2 -1
  168. package/out/kr/adapters/localdata/key-index.d.ts.map +1 -1
  169. package/out/kr/adapters/localdata/key-index.js +2 -1
  170. package/out/kr/adapters/localdata/key-index.js.map +1 -1
  171. package/out/lu/adapters/bd-adresses/adapter.d.ts +1 -1
  172. package/out/lu/adapters/bd-adresses/adapter.js +1 -1
  173. package/out/nl/adapters/kadaster/adapter.js +2 -2
  174. package/out/nl/tools/fetch/kadaster.d.ts +1 -1
  175. package/out/nl/tools/fetch/kadaster.js +1 -1
  176. package/out/parquet/shuffle.d.ts +2 -2
  177. package/out/parquet/shuffle.js +2 -2
  178. package/out/parquet/span-sql.d.ts +8 -6
  179. package/out/parquet/span-sql.d.ts.map +1 -1
  180. package/out/parquet/span-sql.js +8 -6
  181. package/out/parquet/span-sql.js.map +1 -1
  182. package/out/parquet/streams.d.ts +1 -1
  183. package/out/parquet/writers.d.ts +2 -2
  184. package/out/parquet/writers.js +1 -1
  185. package/out/pl/tools/fetch/emuia.d.ts +2 -2
  186. package/out/recipes/scaffold.d.ts +2 -2
  187. package/out/recipes/sources.d.ts +2 -2
  188. package/out/recipes/sources.js +3 -3
  189. package/out/recipes/sources.js.map +1 -1
  190. package/out/recipes/sub/venue/render.d.ts +1 -1
  191. package/out/recipes/sub/venue/render.js +1 -1
  192. package/out/recipes/sub/venue/sources.d.ts +4 -3
  193. package/out/recipes/sub/venue/sources.d.ts.map +1 -1
  194. package/out/recipes/sub/venue/sources.js +4 -3
  195. package/out/recipes/sub/venue/sources.js.map +1 -1
  196. package/out/recipes/sub/venue.d.ts +3 -2
  197. package/out/recipes/sub/venue.d.ts.map +1 -1
  198. package/out/recipes/sub/venue.js +2 -2
  199. package/out/recipes/sub/venue.js.map +1 -1
  200. package/out/recipes/venue.d.ts +7 -6
  201. package/out/recipes/venue.d.ts.map +1 -1
  202. package/out/recipes/venue.js +11 -10
  203. package/out/recipes/venue.js.map +1 -1
  204. package/out/ro/adapters/retea-scolara/adapter.d.ts +2 -2
  205. package/out/ro/adapters/retea-scolara/adapter.js +2 -2
  206. package/out/runner.d.ts +3 -3
  207. package/out/runner.js +2 -2
  208. package/out/sk/tools/fetch/inspire.d.ts +3 -3
  209. package/out/sk/tools/fetch/inspire.js +1 -1
  210. package/out/source-register/effective-manifest.d.ts +2 -2
  211. package/out/source-register/types.d.ts +2 -2
  212. package/out/subvenue/harvest.d.ts +4 -3
  213. package/out/subvenue/harvest.d.ts.map +1 -1
  214. package/out/subvenue/harvest.js +6 -5
  215. package/out/subvenue/harvest.js.map +1 -1
  216. package/out/subvenue/promotions.d.ts +2 -2
  217. package/out/subvenue/promotions.js +3 -3
  218. package/out/subvenue/promotions.js.map +1 -1
  219. package/out/subvenue/table.d.ts +6 -6
  220. package/out/subvenue/table.js +1 -1
  221. package/out/surfaces/locale.d.ts +1 -1
  222. package/out/surfaces/locale.js +1 -1
  223. package/out/synthesizers/boundary-stress.d.ts.map +1 -1
  224. package/out/synthesizers/boundary-stress.js +2 -1
  225. package/out/synthesizers/boundary-stress.js.map +1 -1
  226. package/out/synthesizers/tail.d.ts +2 -2
  227. package/out/synthesizers/tail.js +2 -2
  228. package/out/test-kit/corpus-recipe.d.ts +1 -1
  229. package/out/test-kit/corpus-recipe.js +1 -1
  230. package/out/tools/align-canonical.d.ts.map +1 -1
  231. package/out/tools/align-canonical.js +3 -2
  232. package/out/tools/align-canonical.js.map +1 -1
  233. package/out/tools/audit.js +1 -1
  234. package/out/tools/corpus-stats.d.ts +1 -1
  235. package/out/tools/fetch/download/network.d.ts +1 -1
  236. package/out/tools/fetch/download/network.js +1 -1
  237. package/out/tools/fetch/geonames/dump.d.ts +1 -1
  238. package/out/tools/fetch/geonames/dump.js +1 -1
  239. package/out/tools/fetch/gleif.d.ts +1 -1
  240. package/out/tools/fetch/gleif.js +1 -1
  241. package/out/tools/fetch/header.d.ts +1 -1
  242. package/out/tools/fetch/header.js +1 -1
  243. package/out/tools/fetch/inspire-addresses.d.ts +1 -1
  244. package/out/tools/fetch/vlaanderen-ad.d.ts +1 -1
  245. package/out/tools/fetch/wfs-harvest.d.ts +3 -3
  246. package/out/tools/fetch/wfs-harvest.js +4 -4
  247. package/out/tools/fetch/wfs-harvest.js.map +1 -1
  248. package/out/tools/fetch/zip-archive.d.ts +2 -2
  249. package/out/tools/fetch/zip-archive.js +2 -2
  250. package/out/tools/golden/expand.js +1 -1
  251. package/out/tools/golden/expand.js.map +1 -1
  252. package/out/tools/golden/promote.d.ts +1 -1
  253. package/out/tools/golden/promote.js +3 -3
  254. package/out/tools/golden/promote.js.map +1 -1
  255. package/out/tools/golden/relabel-street/directory.d.ts +2 -1
  256. package/out/tools/golden/relabel-street/directory.d.ts.map +1 -1
  257. package/out/tools/golden/relabel-street/directory.js.map +1 -1
  258. package/out/tools/lint/recipe-output/vocab.js +2 -2
  259. package/out/tools/overlay/manifest.d.ts +15 -2
  260. package/out/tools/overlay/manifest.d.ts.map +1 -1
  261. package/out/tools/overlay/manifest.js +41 -10
  262. package/out/tools/overlay/manifest.js.map +1 -1
  263. package/out/tools/overlay/split-slice.d.ts.map +1 -1
  264. package/out/tools/overlay/split-slice.js +2 -9
  265. package/out/tools/overlay/split-slice.js.map +1 -1
  266. package/out/tools/postcode-triples.d.ts +1 -1
  267. package/out/tools/postcode-triples.js +2 -2
  268. package/out/tools/postcode-triples.js.map +1 -1
  269. package/out/tools/sub/venue/head-nouns.d.ts +1 -1
  270. package/out/tools/sub/venue/head-nouns.d.ts.map +1 -1
  271. package/out/tools/sub/venue/head-nouns.js +4 -3
  272. package/out/tools/sub/venue/head-nouns.js.map +1 -1
  273. package/out/types.d.ts +3 -3
  274. package/out/types.js +1 -1
  275. package/out/us/adapters/state/tx-notaries/adapter.d.ts +1 -1
  276. package/out/us/adapters/state/tx-notaries/adapter.js +1 -1
  277. package/out/us/adapters/usgov/irs-bmf/adapter.d.ts +1 -1
  278. package/out/us/adapters/usgov/irs-bmf/adapter.js +2 -2
  279. package/out/us/synthesizers/intersection.js +4 -4
  280. package/out/us/synthesizers/intersection.js.map +1 -1
  281. package/out/us/synthesizers/street.js +3 -3
  282. package/out/us/synthesizers/street.js.map +1 -1
  283. package/out/us/tools/fetch/nad.d.ts +2 -2
  284. package/out/us/tools/fetch/nad.js +2 -2
  285. package/out/utils/split.d.ts +21 -0
  286. package/out/utils/split.d.ts.map +1 -1
  287. package/out/utils/split.js +49 -5
  288. package/out/utils/split.js.map +1 -1
  289. package/out/utils/wof-json.d.ts +1 -1
  290. package/out/utils/wof-json.js +1 -1
  291. package/package.json +14 -14
@@ -7,7 +7,7 @@
7
7
  * A parquet row stores component offsets in `span_starts` and `span_ends` arrays.
8
8
  * A third array, `span_tags`, identifies each component. The text comes from slicing `raw` at those offsets.
9
9
  * A query that groups or filters by a
10
- * component performs that slice in SQL instead of decoding every row in the process.
10
+ * component takes that substring in SQL instead of decoding every row in the process.
11
11
  *
12
12
  * `holdoutComponents` in `#tools/overlay/split-slice` performs the same read in JavaScript.
13
13
  * The SQL and JavaScript operations use different string indexing. The difference is described below.
@@ -24,8 +24,8 @@
24
24
  * `alignRow` records a span in UTF-16 code units.
25
25
  *
26
26
  * DuckDB's `substr` counts characters.
27
- * The two agree for the Basic Multilingual Plane and diverge by one unit per astral character,
28
- * so a row carrying one slices late by the number of astral characters before the span.
27
+ * The two agree for the Basic Multilingual Plane and diverge by one unit per astral character, so in a
28
+ * row that contains one, the substring starts late by the number of astral characters before the span.
29
29
  *
30
30
  * In the first 40 train files of `v0.6.0-register-surface`, 6,982 of 40,000,000
31
31
  * rows (0.0175%) contain an astral character.
@@ -34,15 +34,17 @@
34
34
  * `𐍀𐍂𐍉𐍆𐌹𐌳𐌰𐌹𐌽𐍃, RHODE ISLAND` read its region as `ND`, taken from `ISLAND`.
35
35
  *
36
36
  * So this is sound for an aggregate over millions of rows and unsound for a decision about one row.
37
- * A caller that acts per row narrows with this and confirms with `holdoutComponents`, which
38
- * slices with JavaScript string semantics and therefore reads the offsets as they were written.
37
+ * A caller that acts per row narrows with this and confirms with `holdoutComponents`.
38
+ *
39
+ * That function indexes with JavaScript string semantics and therefore reads
40
+ * the offsets as they were written.
39
41
  */
40
42
  export function componentAtSpanSQL(tag: string, rawColumn = "raw"): string {
41
43
  return componentAtIndexSQL(`list_position(span_tags, '${tag}')`, rawColumn)
42
44
  }
43
45
 
44
46
  /**
45
- * The same slice against a span index the caller already computed.
47
+ * The same substring against a span index the caller already computed.
46
48
  *
47
49
  * A query can hoist `list_position(span_tags, …)` into a subquery column and read it by name.
48
50
  * A second evaluation in the projection would run the search twice per row.
@@ -63,7 +63,7 @@ export interface ParquetRowStreamOptions {
63
63
  */
64
64
  columns?: readonly string[]
65
65
  /**
66
- * Stop after this many rows.
66
+ * Stop after this number of rows.
67
67
  */
68
68
  limit?: number
69
69
  }
@@ -5,7 +5,7 @@
5
5
  * @file Writes Parquet files and the manifest that describes their contents.
6
6
  *
7
7
  * This module exposes two writers. {@linkcode writeParquetFile} writes one file from rows already in memory.
8
- * {@linkcode writeParquetSplits} streams per-split row iterables into as many files as the row cap requires. It
8
+ * {@linkcode writeParquetSplits} streams per-split row iterables into the number of files the row cap requires. It
9
9
  * returns the manifest. Both writers create their parent directory, as `@mailwoman/core/fs` writers do
10
10
  * encode rather than repeat at each call site.
11
11
  *
@@ -212,7 +212,7 @@ export interface WriteParquetSplitsOptions {
212
212
  * A descriptor is appended only after its `.parquet` file closes, so each recorded file is complete.
213
213
  *
214
214
  * A resumed run rereads each descriptor's size.
215
- * It discards that many rows from the front of each split's iterable and opens the next file index.
215
+ * It discards that number of rows from the front of each split's iterable and opens the next file index.
216
216
  *
217
217
  * The caller therefore has to supply the same iterables in the same order.
218
218
  * For `buildCorpus` that means the same labeled files and the same shuffle seed.
@@ -155,7 +155,7 @@ export interface HarvestEMUiAOptions {
155
155
  */
156
156
  pageSize?: number
157
157
  /**
158
- * Stop once the manifest holds this many pages, for a probe rather than a full harvest.
158
+ * Stop once the manifest holds this number of pages, for a probe rather than a full harvest.
159
159
  */
160
160
  maxPages?: number
161
161
  /**
@@ -165,7 +165,7 @@ export interface HarvestEMUiAOptions {
165
165
  * The measurement costs about 2·log2(n) requests — 51 for a register of this size — and the
166
166
  * harvest does not need it: paging to the first empty page reads the type whole either way.
167
167
  *
168
- * It buys a denominator for the progress lines and a figure for the manifest,
168
+ * It supplies a denominator for the progress lines and a figure for the manifest,
169
169
  * and it rests on the monotone-presence assumption this module's header states.
170
170
  */
171
171
  measureCount?: boolean
@@ -170,7 +170,7 @@ export interface OATupleFields {
170
170
 
171
171
  export interface ReadOATuplesOptions<T> {
172
172
  /**
173
- * Stop after this many distinct tuples.
173
+ * Stop after this number of distinct tuples.
174
174
  *
175
175
  * The `break` closes the reader and releases the archive.
176
176
  * GB-scale countrywide extracts need this behavior.
@@ -496,7 +496,7 @@ export interface RecipeOptions {
496
496
  */
497
497
  venueNames?: PathBuilderLike
498
498
  /**
499
- * `venue`: share of locality rows that also carry the tuple's region after the locality.
499
+ * `venue`: share of locality rows that also print the tuple's region after the locality.
500
500
  *
501
501
  * @defaultValue `0.5`
502
502
  */
@@ -285,7 +285,7 @@ export const CARRIED_SOURCES: ReadonlyArray<string> = [
285
285
  "osm-bd",
286
286
  // One id per French overseas jurisdiction for the BAN department files,
287
287
  // written by `corpus run ban --source-name`.
288
- // Metropolitan rows keep `ban`, so its weight does not decide how often a territory is drawn.
288
+ // Metropolitan rows keep `ban`, so its weight does not decide the rate at which a territory is drawn.
289
289
  "ban-gp",
290
290
  "ban-mq",
291
291
  "ban-gf",
@@ -371,7 +371,7 @@ export function defaultRecipeSource(retired: string): string {
371
371
  *
372
372
  * Its `source-names.json` records the mapping applied per file with the row count
373
373
  * and the ordered-`source_id` digest verified on both sides.
374
- * `v0.7.0-de-holdout/corpus-v0.7.0-de-holdout` is assembled from those bytes over 766 slices.
374
+ * `v0.7.0-de-holdout/corpus-v0.7.0-de-holdout` is assembled from those bytes over 766 recipe-output files.
375
375
  *
376
376
  * A recipe writing the retired spelling from here on would produce an output
377
377
  * disagreeing with the corpus it joins.
@@ -391,7 +391,7 @@ export const WRITE_CURRENT_SOURCE_NAMES = true
391
391
  * throw on every row in the corpus.
392
392
  *
393
393
  * Callers of those two tables resolve the key through this, so a lookup answers under
394
- * either spelling and a genuinely unknown source still refuses.
394
+ * either spelling and a source unknown under both spellings still refuses.
395
395
  *
396
396
  * The value is returned unchanged for a source outside the table — an adapter id,
397
397
  * or an overlay source id — because those tables are keyed by whatever the producer emits.
@@ -31,7 +31,7 @@ export type Group = Piece[]
31
31
  /**
32
32
  * The case and punctuation style of a rendered row.
33
33
  *
34
- * Users often type addresses in lowercase, so every recipe output includes lowercase rows.
34
+ * Some users type addresses in lowercase, so every recipe output includes lowercase rows.
35
35
  */
36
36
  export const Register = {
37
37
  Canonical: "canonical",
@@ -330,7 +330,7 @@ const MIN_OWN_SHAPE_OBSERVATIONS = 20
330
330
  /**
331
331
  * Builds a region's identifier model from the lexicon's `identifierShapes`.
332
332
  *
333
- * The pooled fallback combines the gate, terminal and campus distributions.
333
+ * The pooled fallback combines the airport gate, terminal and campus distributions.
334
334
  */
335
335
  export function buildIdentifierModel(lexicon: SubVenueLexiconTable, region: string): IdentifierModel {
336
336
  const byDesignator = new Map<string, ShapeBucket[]>()
@@ -515,8 +515,9 @@ const POI_CONFOUND_CATEGORIES: readonly string[] = [
515
515
  ]
516
516
 
517
517
  /**
518
- * Reads the venue and confound name pools for one country from the Overture place-names file,
519
- * which holds `name`, `category` and `country` for every country the release covers.
518
+ * Reads the venue and confound name pools for one country from the Overture place-names file.
519
+ *
520
+ * That file holds `name`, `category` and `country` for every country the release covers.
520
521
  *
521
522
  * The venue categories fill the `venues` pool.
522
523
  * Every row of a venue or confound category is tested against the rejected phrases
@@ -52,7 +52,8 @@ export interface SubVenueLeg {
52
52
  /**
53
53
  * The ISO 3166-1 alpha-2 key into the lexicon's `identifierShapes`.
54
54
  *
55
- * Gate and terminal numbering differs by country, so each leg samples identifiers from its own region.
55
+ * Airport gate and terminal numbering differs by country, so each leg samples
56
+ * identifiers from its own region.
56
57
  */
57
58
  region: string
58
59
  /**
@@ -142,7 +143,7 @@ export const SUBVENUE_LEGS: readonly SubVenueLeg[] = [
142
143
  * The region whose identifier distribution the en-US leg uses.
143
144
  *
144
145
  * The en-US leg has no OSM extract.
145
- * The Overture names file carries venue names without refs.
146
+ * The Overture names file holds venue names without refs.
146
147
  * The recipe borrows the identifier distribution from GB.
147
148
  */
148
149
  export const US_IDENTIFIER_REGION_BORROWED_FROM = "GB"
@@ -514,7 +515,7 @@ function emitPositives(
514
515
  const subGroup: Group = [{ text: form.text, tag: "unit" }]
515
516
  const venueGroup: Group = [{ text: venue, tag: "venue" }]
516
517
  const r = random()
517
- // Some rows omit the street because venue addresses such as airport terminals often lack one.
518
+ // Some rows omit the street because venue addresses such as airport terminals can lack one.
518
519
  const body = addressGroups(leg.country, tuple, r >= NO_STREET_SHARE)
519
520
 
520
521
  // An empty body means that no address layout covers this country.
@@ -5,11 +5,11 @@
5
5
  *
6
6
  * `venue` recipe. A real venue name written as the whole query, and the same name followed by a
7
7
  * locality drawn from the country's admin tuples. The rows teach the model that
8
- * `Manchester Art Gallery` is a venue rather than a locality and a region, which the venue-head
9
- * prior in `@mailwoman/neural` also asserts, so the model and the prior agree.
8
+ * `Manchester Art Gallery` is a venue rather than a locality and a region. The venue-head
9
+ * prior in `@mailwoman/neural` asserts the same reading, so the model and the prior agree.
10
10
  *
11
11
  * Venue names come from the Overture place-names Parquet file the venue-head table is built
12
- * from, which holds `name`, `category` and `country` for every place at confidence 0.85 or
12
+ * from. That file holds `name`, `category` and `country` for every place at confidence 0.85 or
13
13
  * higher. The file has no locality column, so the locality row joins a name to a tuple of the
14
14
  * same country and asserts no fact about where the venue stands, so its surface is
15
15
  * `SurfaceOrigin.Composed`. The bare row is the publisher's own string, so its surface is
@@ -25,7 +25,8 @@
25
25
 
26
26
  import { dataRootPath } from "@mailwoman/core/data-root"
27
27
  import { mulberry32 as makeMulberry32 } from "@mailwoman/core/utils"
28
- import { venueHeadLexicon } from "@mailwoman/poi-taxonomy/venue-heads"
28
+ import { foldCaseWhitespace } from "@mailwoman/normalize/fold"
29
+ import { isSpacelessScriptWord, venueHeadLexicon } from "@mailwoman/poi-taxonomy/venue-heads"
29
30
  import type { PathBuilderLike } from "path-ts"
30
31
 
31
32
  import { normalizeGauntletSurface, readGauntletInputs } from "#gauntlet-inputs"
@@ -59,7 +60,7 @@ export const DEFAULT_VENUE_NAMES: PathBuilderLike = dataRootPath(
59
60
  export const DEFAULT_NAMES_PER_COUNTRY = 20_000
60
61
 
61
62
  /**
62
- * Share of locality rows that also carry the region when `--venue-region-fraction` is absent.
63
+ * Share of locality rows that also print the region when `--venue-region-fraction` is absent.
63
64
  */
64
65
  export const DEFAULT_REGION_FRACTION = 0.5
65
66
 
@@ -105,13 +106,12 @@ export interface VenueHeadSuffixLookup {
105
106
  suffix(word: string): number | null
106
107
  }
107
108
 
108
- const SPACELESS_SCRIPT_RE = /^[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Thai}]+$/u
109
-
110
109
  /**
111
110
  * Characters a spaceless-script name needs before it is written as a bare query.
112
111
  *
113
- * A two-character name such as `東京` is the length of a city name, and the head the table recognizes is
114
- * the name's last character, so a name shorter than this is a head with one character of stem.
112
+ * A two-character name such as `東京` is the length of a city name.
113
+ * The head the table recognizes is the name's last character, so a name shorter
114
+ * than this is a head with one character of stem.
115
115
  */
116
116
  export const MIN_SPACELESS_BARE_CHARACTERS = 3
117
117
 
@@ -135,7 +135,7 @@ export function isBareVenueName(name: string, heads?: VenueHeadSuffixLookup): bo
135
135
  return (
136
136
  Boolean(heads) &&
137
137
  [...word].length >= MIN_SPACELESS_BARE_CHARACTERS &&
138
- SPACELESS_SCRIPT_RE.test(word) &&
138
+ isSpacelessScriptWord(word) &&
139
139
  heads!.suffix(word) !== null
140
140
  )
141
141
  }
@@ -144,7 +144,7 @@ export function isBareVenueName(name: string, heads?: VenueHeadSuffixLookup): bo
144
144
  * The comparison key for a name against the country's localities.
145
145
  */
146
146
  export function venueNameKey(name: string): string {
147
- return name.normalize("NFC").trim().toLowerCase().replaceAll(/\s+/gu, " ")
147
+ return foldCaseWhitespace(name.normalize("NFC"))
148
148
  }
149
149
 
150
150
  /**
@@ -16,7 +16,7 @@
16
16
  * The sheet splits the address into `Strada`, `Numar`, `Cod postal` and `Localitate unitate`, so the
17
17
  * adapter splits no street line. Measured over the 2025–2026 edition's 18,022 units:
18
18
  *
19
- * - `Strada` is the street name as the school writes it, usually without the street-type word:
19
+ * - `Strada` is the street name as the school writes it, in most rows without the street-type word:
20
20
  * `REPUBLICII`, `PRINCIPALA`, `Piața 1848`. 198 values begin with `STR.` and 247 with `CALEA`.
21
21
  * The value is copied unchanged, because a street type the publisher did not write is not evidence.
22
22
  * - `Numar` holds the house number. `FN` (`fără număr`, "without number") and `-` state that the premise
@@ -36,7 +36,7 @@
36
36
  *
37
37
  * ## Identity and license
38
38
  *
39
- * The row id is content-addressed over the aligned components. A school and its kindergarten often share
39
+ * The row id is content-addressed over the aligned components. A school and its kindergarten can share
40
40
  * one address under two names, so they are two rows.
41
41
  *
42
42
  * data.gov.ro publishes the dataset under `CC-BY-4.0`, the license its CKAN record names for the
package/lib/runner.ts CHANGED
@@ -47,9 +47,9 @@ export interface RunnerProgress {
47
47
  export const DEFAULT_DEDUP_SLOTS_LOG2 = 27
48
48
 
49
49
  /**
50
- * How many distinct dedup keys a `Set`-backed run holds before it stops adding new ones.
50
+ * The number of distinct dedup keys a `Set`-backed run holds before it stops adding new ones.
51
51
  *
52
- * A V8 `Set` refuses a 16,777,216th entry outright, so this cap was a real bound rather than a preference.
52
+ * A V8 `Set` throws on a 16,777,216th entry, so this cap was a real bound rather than a preference.
53
53
  * It applies only to a run that opts out of the fingerprint table
54
54
  * through {@linkcode RunAdapterOptions.dedupMaxSize}.
55
55
  */
@@ -78,7 +78,7 @@ export interface RunAdapterOptions {
78
78
  adapterOptions: AdapterOptions
79
79
 
80
80
  /**
81
- * Hold dedup keys in a V8 `Set` capped at this many, rather than in a fingerprint table.
81
+ * Hold dedup keys in a V8 `Set` capped at this number of keys, rather than in a fingerprint table.
82
82
  *
83
83
  * The cap is what the fingerprint table replaces.
84
84
  * A run that sets this reproduces the pre-2026-09-28 behavior.
@@ -237,7 +237,7 @@ export interface HarvestSKInspireTypeOptions {
237
237
  */
238
238
  pageSize?: number
239
239
  /**
240
- * Stop once the manifest holds this many pages, for a probe rather than a full harvest.
240
+ * Stop once the manifest holds this number of pages, for a probe rather than a full harvest.
241
241
  */
242
242
  maxPages?: number
243
243
  signal?: AbortSignal
@@ -314,7 +314,7 @@ export interface FetchSKInspireOptions extends BaseFetchOptions {
314
314
  */
315
315
  pageSize?: number
316
316
  /**
317
- * Stop each type once its manifest holds this many pages, for a probe rather than a full harvest.
317
+ * Stop each type once its manifest holds this number of pages, for a probe rather than a full harvest.
318
318
  */
319
319
  maxPages?: number
320
320
  signal?: AbortSignal
@@ -339,7 +339,7 @@ export function skInspireInputPath(outRoot: BaseFetchOptions["outRoot"]): PathBu
339
339
  * for `mailwoman corpus fetch sk-inspire`.
340
340
  *
341
341
  * Each type is reported separately and a type that fails does not stop the rest, because the
342
- * documents are read together by the adapter and a partial directory is still worth resuming.
342
+ * documents are read together by the adapter and a resumed run completes a partial directory.
343
343
  * Re-runnable per type: a complete harvest whose file still hashes to its manifest's digest
344
344
  * makes no request, and an interrupted one resumes at the page after the last that reached disk.
345
345
  */
@@ -278,7 +278,7 @@ export interface EffectiveTrainingManifest {
278
278
  * Sources the epoch emitted that the corpus's frozen manifest does not name, with their emitted rows.
279
279
  *
280
280
  * `freezeTrainingManifest` runs inside `buildCorpus` and records the base build's sources.
281
- * An overlay is merged into the corpus afterwards by `overlay-manifest`,
281
+ * A corpus overlay is merged into the corpus afterwards by `overlay-manifest`,
282
282
  * so its rows are in the corpus and outside that manifest.
283
283
  *
284
284
  * Measured over `v0.6.0-register-surface` on 2026-09-28: the frozen manifest names 11 sources
@@ -329,7 +329,7 @@ export interface EpochMixtureAudit {
329
329
  /**
330
330
  * Per-source detail the audit computes from the corpus files rather than from the corpus manifest.
331
331
  *
332
- * `rows` is how many rows of that source the corpus holds.
332
+ * `rows` is the number of rows of that source the corpus holds.
333
333
  * It is the only place a source outside the frozen manifest has a corpus row count, so it is what
334
334
  * lets a reader read a source's rows in the corpus beside the rows one epoch drew and emitted.
335
335
  */
@@ -351,8 +351,8 @@ export interface ElectedLicense {
351
351
  * Creative Commons permits that.
352
352
  *
353
353
  * Where that happens, {@linkcode ElectedLicense.spdx} records the one a build filters on
354
- * and this records what the publisher actually said, so a later reviewer reads
355
- * the conflict rather than one reading presented as settled.
354
+ * and this records what the publisher said, so a later reviewer reads the conflict
355
+ * rather than one reading presented as settled.
356
356
  *
357
357
  * The engineering policy elects the strictest grant for what a released corpus may include.
358
358
  * It does not establish which grant governs, and `electedBecause` states
@@ -71,9 +71,10 @@ export interface SubVenueHarvestRow {
71
71
  /**
72
72
  * Classify an OSM `ref` into an {@link IdentifierShape} class.
73
73
  *
74
- * The classes are the ones Berlin's gates actually produced, plus the two aviation forms
74
+ * The classes are the ones Berlin's airport gates produced, plus the two aviation forms
75
75
  * the corpus task names (`Terminal 2F` is digit-letter, `Concourse B` is letter).
76
- * `range` covers both separators OSM uses for a gate serving more than one stand: `16-18` and `0/1`.
76
+ * `range` covers both separators OSM uses for a boarding gate serving more
77
+ * than one stand: `16-18` and `0/1`.
77
78
  */
78
79
  export function classifyIdentifier(ref: string): string {
79
80
  const value = ref.trim()
@@ -92,10 +93,10 @@ export function classifyIdentifier(ref: string): string {
92
93
  }
93
94
 
94
95
  /**
95
- * How many real `ref` values each {@link IdentifierShape} keeps.
96
+ * The number of real `ref` values each {@link IdentifierShape} keeps.
96
97
  *
97
98
  * Eight rather than "all" and not one.
98
- * The field exists so a recipe author can see what a class actually contains.
99
+ * The field exists so a recipe author can see what a class contains.
99
100
  *
100
101
  * GB's `other` class turned out to be semicolon multi-values (`1.2.3`, `13.14`),
101
102
  * which one example would have hidden and which the class name does not say.
@@ -128,7 +129,7 @@ export interface HarvestOptions {
128
129
  /**
129
130
  * Harvest attested phrases and identifier shapes out of a source's rows.
130
131
  *
131
- * `index` gates the name harvest.
132
+ * `index` decides whether the name harvest runs.
132
133
  * A name contributes only when it contains a phrase already in the table.
133
134
  *
134
135
  * That filter is the whole reason this function is safe to run over raw OSM:
@@ -60,8 +60,8 @@ export interface SubVenuePromotion {
60
60
  * This ledger is the only input that sets `curated: true` on a machine-derived surface.
61
61
  * Rejections stay in the ledger so the system can reject duplicate proposals until new evidence arrives.
62
62
  *
63
- * The span proposer in `packages/neural/lib/venue/structure.ts` ships its English designators
64
- * without a locale gate, so a rejection here guides recipes only and does not stop the proposer.
63
+ * The span proposer in `packages/neural/lib/venue/structure.ts` ships its English designators without
64
+ * a locale restriction, so a rejection here guides recipes only and does not stop the proposer.
65
65
  */
66
66
  export const SUBVENUE_PROMOTIONS: readonly SubVenuePromotion[] = [
67
67
  // wing
@@ -171,7 +171,7 @@ export const SUBVENUE_PROMOTIONS: readonly SubVenuePromotion[] = [
171
171
  census: "france.jsonl 2026-08-05 (251,260 rows), 40 hits; all 19 shape hits enumerated",
172
172
  },
173
173
 
174
- // gate: the English surface ships without modifier eligibility.
174
+ // The airport gate designator: the English surface ships without modifier eligibility.
175
175
  // These entries cover its localized forms.
176
176
  {
177
177
  designatorID: "gate",
@@ -104,13 +104,13 @@ export interface SubVenueSurface {
104
104
  /**
105
105
  * Whether a human has approved this surface for parsing use in its region.
106
106
  *
107
- * Machine-derived entries start `false`; only a matching {@link SubVenuePromotion}
108
- * flips it, so a consumer that gates a parse must filter on this.
107
+ * Machine-derived entries start `false`; only a matching {@link SubVenuePromotion} flips it,
108
+ * so a consumer that accepts or refuses a parse by this table must filter on this.
109
109
  */
110
110
  curated: boolean
111
111
  /**
112
- * How many source features attested this exact phrase when the source counts (OSM, Overture);
113
- * Vocabulary sources attest phrase existence and use a count of `0`.
112
+ * The number of source features that attested this exact phrase when the source counts
113
+ * (OSM, Overture); Vocabulary sources attest phrase existence and use a count of `0`.
114
114
  * OSM and Overture sources count occurrences.
115
115
  */
116
116
  observations: number
@@ -138,7 +138,7 @@ export interface IdentifierShape {
138
138
  /**
139
139
  * ISO 3166-1 alpha-2 of the extract this distribution was measured in.
140
140
  *
141
- * It is per-region because the shapes differ (GB gates are 70% bare digits, Japanese platform
141
+ * It is per-region because the shapes differ (GB airport gates are 70% bare digits, Japanese platform
142
142
  * refs a different range), so a recipe for a French address should sample France's distribution.
143
143
  */
144
144
  region: string
@@ -190,7 +190,7 @@ export interface SubVenueLexiconTable {
190
190
  * below for the module docstring's dependency-direction reason.
191
191
  *
192
192
  * `tier` is added here: the seven WOF placetypes plus `terminal`/`gate` are all venue-interior,
193
- * while `campus` and `building` name a whole venue as often as a part of one
193
+ * while `campus` and `building` name a whole venue about as frequently as a part of one
194
194
  * but are marked `subvenue` because that is the role the span proposer uses them in.
195
195
  */
196
196
  export const SHIPPED_DESIGNATOR_SEED: ReadonlyArray<{
@@ -156,7 +156,7 @@ function tokenPresent(raw: string, value: string): boolean {
156
156
  * Render one tuple into a locale-ordered `{raw, components}` row via OpenCage templates,
157
157
  * with light variation (house number and postcode may be dropped).
158
158
  *
159
- * Returns `null` when the tuple is too thin or a component would not align cleanly.
159
+ * Returns `null` when the tuple is too thin or a component would not align to an exact span.
160
160
  *
161
161
  * Region handling depends on order:
162
162
  * - native omits region for alignment reliability
@@ -16,7 +16,7 @@ import { sample } from "@mailwoman/core/random"
16
16
  /* oxlint-disable sister-software/no-unnamed-threshold -- the bare decimals below are weighted-sampler
17
17
  cutoffs rather than thresholds: `const r = random()` followed by a cascade of `r < 0.4` branches defines the
18
18
  output distribution. The cascade shows each weight from top to bottom. A separate constant for each cutoff
19
- would hide the distribution behind a wall of identifiers. Genuine thresholds in these files are
19
+ would hide the distribution behind a wall of identifiers. Decision thresholds in these files are
20
20
  extracted as constants above. */
21
21
 
22
22
  /**
@@ -20,7 +20,7 @@ import type { CanonicalRow } from "#types"
20
20
  /* oxlint-disable sister-software/no-unnamed-threshold -- the bare decimals below are weighted-sampler
21
21
  cutoffs rather than thresholds: `const r = random()` followed by a cascade of `r < 0.4` branches is the
22
22
  output distribution. The cascade shows each weight from top to bottom. A separate constant for each cutoff
23
- would hide the distribution behind identifiers. The genuine thresholds in these files are
23
+ would hide the distribution behind identifiers. The decision thresholds in these files are
24
24
  extracted as constants above. */
25
25
 
26
26
  /**
@@ -348,7 +348,8 @@ export function synthesizeBoundaryStressRow(
348
348
 
349
349
  // The layout renders the tail in the country's order: `75005 Paris` for FR
350
350
  // and `Boston, MA 02116` for the US.
351
- // Dropping the layout's commas is a surface perturbation that applies to any country.
351
+ // The synthesizer drops the layout's commas.
352
+ // That is a surface perturbation that applies to any country.
352
353
  const tail = layoutAdminTail(b.country, {
353
354
  locality: b.locality,
354
355
  region: b.region,
@@ -21,7 +21,7 @@ import type { CanonicalRow } from "#types"
21
21
  /* oxlint-disable sister-software/no-unnamed-threshold -- the bare decimals below are weighted-sampler
22
22
  cutoffs rather than thresholds: `const r = random()` followed by a cascade of `r < 0.4` branches defines the
23
23
  output distribution. The cascade shows each weight from top to bottom. A separate constant for each cutoff
24
- would hide the distribution behind a wall of identifiers. Genuine thresholds in these files are
24
+ would hide the distribution behind a wall of identifiers. Decision thresholds in these files are
25
25
  extracted as constants above. */
26
26
 
27
27
  export interface NoStreetBaseTuple {
@@ -21,7 +21,7 @@ const MIN_DIGITS_FOR_HYPHEN_GROUPING = 3
21
21
  /* oxlint-disable sister-software/no-unnamed-threshold -- the bare decimals below are weighted-sampler
22
22
  cutoffs rather than thresholds. `const r = random()` followed by `r < 0.4` branches defines the
23
23
  output distribution. The branches show each weight from top to bottom. A separate constant for each cutoff
24
- would hide the distribution behind identifiers. Genuine thresholds in these files are
24
+ would hide the distribution behind identifiers. Decision thresholds in these files are
25
25
  constants defined above. */
26
26
 
27
27
  /**
@@ -7,9 +7,9 @@
7
7
  * synthesizer writes `Chicago, IL 60613`, `75005 Paris`, `London, EC3N 1DE` or
8
8
  * `Maracaibo 4001, Zulia` from one call rather than from a template per country.
9
9
  *
10
- * The layout decides which parts print: the FR layout prints no region, so a FR tail carries none
10
+ * The layout decides which parts print: the FR layout prints no region, so a FR tail holds none
11
11
  * and the returned components say so. The lines the layout writes are joined with the country's
12
- * line join, which is the one-line form the corpus rows take.
12
+ * line join. The result is the one-line form the corpus rows take.
13
13
  */
14
14
 
15
15
  import { formatAddressRow } from "@mailwoman/codex/address/format"
@@ -70,7 +70,7 @@ export async function scratch(prefix: string, tuples: object[], surfaces: string
70
70
  export const TEST_REGISTER = "test-harness"
71
71
 
72
72
  /**
73
- * Bind a recipe and its seed to a runner the tests call with just the tuples and reserved surfaces.
73
+ * Bind a recipe and its seed to a runner the tests call with only the tuples and reserved surfaces.
74
74
  *
75
75
  * The seed is required because these suites assert on generated distributions.
76
76
  */
@@ -7,8 +7,9 @@ import { createNewlineWriter, JSONSpliterator } from "spliterator"
7
7
  *
8
8
  * Most synthetic recipe outputs are generated on demand by a recipe (parametrized by --count),
9
9
  * so re-emitting them in a new label format is a re-run.
10
- * A few are fixed corpora with a hand/DeepSeek-authored canonical source that is never regenerated,
11
- * notably `deepseek-kryptonite` (the adversarial hard-case set) and the `deepseek-translit-*` variants.
10
+ * A few are fixed corpora with a hand/DeepSeek-authored canonical source that is never regenerated.
11
+ *
12
+ * They include `deepseek-kryptonite` (the adversarial hard-case set) and the `deepseek-translit-*` variants.
12
13
  *
13
14
  * Their committed parquets use the label format that was current when they were first built.
14
15
  *
@@ -130,7 +130,7 @@ async function scanParquetFiles(corpusDir: PathBuilderLike, sampleCount: number)
130
130
  }
131
131
 
132
132
  function inferSourceFromFilename(filename: string): string {
133
- // Many corpus builds write part-<source>-<n>.parquet or part-<n>.parquet.
133
+ // Some corpus builds write part-<source>-<n>.parquet or part-<n>.parquet.
134
134
  // The latter (current build at corpus-v0.3.0) gives no source signal in the filename.
135
135
  // See manifestScan() for the authoritative path.
136
136
  // Return "<unknown>" so the caller flags this case.
@@ -57,7 +57,7 @@ export interface CorpusStatsOptions {
57
57
  parquetPath: string
58
58
  outputPath: string
59
59
  /**
60
- * Read at most this many rows per parquet file.
60
+ * Read at most this number of rows per parquet file.
61
61
  */
62
62
  limitPerFile?: number
63
63
  }
@@ -82,7 +82,7 @@ export interface SourceManifest {
82
82
  }
83
83
 
84
84
  /**
85
- * A status worth retrying: rate limiting or a server-side failure.
85
+ * A status the download retries: rate limiting or a server-side failure.
86
86
  */
87
87
  /**
88
88
  * An HTTP failure that includes its status, so callers branch on `error.status`
@@ -116,7 +116,7 @@ const GAZETTEER_DUMP_COLUMNS = 19
116
116
  * The capitals builder already holds each country dump as a string.
117
117
  *
118
118
  * A byte-oriented spliterator would UTF-8 encode that input and allocate up to
119
- * another 350 MB just to inspect the first non-empty line.
119
+ * another 350 MB only to inspect the first non-empty line.
120
120
  */
121
121
  export function looksLikeGazetteerDump(text: string): boolean {
122
122
  let start = 0
@@ -14,7 +14,7 @@
14
14
  *
15
15
  * 1. **The API's `size` is the archive's length.** It stated 507,006,221 and the host answered a
16
16
  * `HEAD` with `content-length` 507,006,221 and a one-byte range with `Content-Range: bytes
17
- * 0-9/507006221`. The transfer is checked against the API's figure, so a body cut short or a
17
+ * 0-9/507006221`. The transfer is checked against the API's figure, so a truncated body or a
18
18
  * publish replaced mid-transfer is refused rather than recorded.
19
19
  * 2. **The host honors `Range`.** An interrupted transfer resumes through
20
20
  * {@linkcode resumableDownload}. The request names `accept-encoding: identity`, because the host
@@ -6,7 +6,7 @@
6
6
  * This module reads a delimited file's header line and refuses one that drops a column an adapter
7
7
  * indexes.
8
8
  *
9
- * A fetch module checks the file it just wrote against the columns its adapter reads by name,
9
+ * A fetch module checks the file it has written against the columns its adapter reads by name,
10
10
  * because a renamed column reaches the adapter as an empty string on every row rather than as an
11
11
  * error. The check belongs here rather than in each publisher's module: every caller needs the same
12
12
  * two steps, and each one that wrote them again would also be a second answer to how the file is
@@ -131,7 +131,7 @@ export interface WFSCapabilities {
131
131
  /**
132
132
  * A value a GeoServer JSON response uses for a voidable property that holds no value.
133
133
  *
134
- * INSPIRE marks many attributes voidable.
134
+ * The INSPIRE schema marks a set of attributes voidable.
135
135
  * A voidable property must be present with either a value or a void with a reason.
136
136
  *
137
137
  * GeoServer encodes that void as an object rather than as `null`, so `String(value)`