ipakit 0.3.0__tar.gz → 0.4.0__tar.gz

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 (770) hide show
  1. {ipakit-0.3.0 → ipakit-0.4.0}/.github/workflows/ci.yml +1 -1
  2. {ipakit-0.3.0 → ipakit-0.4.0}/.pre-commit-config.yaml +1 -1
  3. {ipakit-0.3.0 → ipakit-0.4.0}/CHANGELOG.md +54 -1
  4. {ipakit-0.3.0 → ipakit-0.4.0}/MANIFEST.in +7 -3
  5. {ipakit-0.3.0 → ipakit-0.4.0}/Makefile +11 -4
  6. {ipakit-0.3.0 → ipakit-0.4.0}/PKG-INFO +27 -8
  7. {ipakit-0.3.0 → ipakit-0.4.0}/README.md +24 -6
  8. {ipakit-0.3.0 → ipakit-0.4.0}/conftest.py +24 -0
  9. {ipakit-0.3.0 → ipakit-0.4.0}/docs/README.md +3 -2
  10. {ipakit-0.3.0 → ipakit-0.4.0}/docs/capabilities.md +6 -5
  11. {ipakit-0.3.0 → ipakit-0.4.0}/docs/cli-api-sync.md +1 -1
  12. {ipakit-0.3.0 → ipakit-0.4.0}/docs/clts-audit.md +2 -2
  13. ipakit-0.4.0/docs/clts-gaps.md +379 -0
  14. ipakit-0.4.0/docs/clts-import.md +99 -0
  15. {ipakit-0.3.0 → ipakit-0.4.0}/docs/clts-mapping.md +30 -22
  16. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/samprosa.md +1 -0
  17. {ipakit-0.3.0 → ipakit-0.4.0}/docs/development-sources.md +8 -3
  18. {ipakit-0.3.0 → ipakit-0.4.0}/docs/distance.md +20 -3
  19. {ipakit-0.3.0 → ipakit-0.4.0}/docs/espeak-vocabularies.md +3 -3
  20. {ipakit-0.3.0 → ipakit-0.4.0}/docs/feature-transforms.md +12 -12
  21. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/derived-from-boundaries.dot +1 -1
  22. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/perhaps-i-am-a-bad-man.dot +1 -1
  23. {ipakit-0.3.0 → ipakit-0.4.0}/docs/house-style-exhibits.md +2 -2
  24. {ipakit-0.3.0 → ipakit-0.4.0}/docs/inventories.md +18 -18
  25. {ipakit-0.3.0 → ipakit-0.4.0}/docs/inventories.src.md +8 -7
  26. {ipakit-0.3.0 → ipakit-0.4.0}/docs/inventory-operations.md +22 -8
  27. {ipakit-0.3.0 → ipakit-0.4.0}/docs/model-operations.md +31 -3
  28. {ipakit-0.3.0 → ipakit-0.4.0}/docs/phoible.md +31 -25
  29. {ipakit-0.3.0 → ipakit-0.4.0}/docs/releasing.md +6 -3
  30. {ipakit-0.3.0 → ipakit-0.4.0}/docs/representation.md +14 -13
  31. {ipakit-0.3.0 → ipakit-0.4.0}/docs/reviewing.md +1 -1
  32. {ipakit-0.3.0 → ipakit-0.4.0}/docs/rules.md +6 -4
  33. {ipakit-0.3.0 → ipakit-0.4.0}/docs/similarity.md +1 -1
  34. ipakit-0.4.0/docs/source-receipts.md +61 -0
  35. {ipakit-0.3.0 → ipakit-0.4.0}/docs/tiergraph-acceptance.md +1 -1
  36. {ipakit-0.3.0 → ipakit-0.4.0}/docs/ties.md +17 -1
  37. {ipakit-0.3.0 → ipakit-0.4.0}/docs/tract-anatomy.md +17 -1
  38. {ipakit-0.3.0 → ipakit-0.4.0}/docs/tutorial.md +10 -0
  39. {ipakit-0.3.0 → ipakit-0.4.0}/docs/tutorial.src.md +10 -0
  40. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/__init__.py +3 -1
  41. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_base.py +4 -0
  42. ipakit-0.4.0/ipakit/_clts_import.py +600 -0
  43. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_clts_input.py +17 -0
  44. ipakit-0.4.0/ipakit/_clts_profile.py +1155 -0
  45. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_convert.py +9 -5
  46. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_corpus.py +7 -1
  47. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_provenance.py +41 -1
  48. ipakit-0.4.0/ipakit/_source_receipt.py +230 -0
  49. ipakit-0.4.0/ipakit/_warning_policy.py +56 -0
  50. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/analysis.py +28 -22
  51. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/__init__.py +2 -2
  52. ipakit-0.4.0/ipakit/bridges/espeak.py +39 -0
  53. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/phoible.py +44 -13
  54. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/vocabulary.py +10 -4
  55. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/__init__.py +8 -0
  56. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/analyze.py +13 -1
  57. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/base.py +42 -4
  58. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/convert.py +5 -0
  59. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/corpus.py +7 -1
  60. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/graph_json.py +2 -1
  61. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/hierarchy.py +4 -1
  62. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/info.py +2 -1
  63. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/inventory.py +11 -1
  64. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/metrics.py +3 -1
  65. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/model.py +178 -2
  66. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/notebook.py +2 -1
  67. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/phoible.py +4 -1
  68. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/policy.py +1 -62
  69. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/query.py +6 -0
  70. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/rules.py +3 -0
  71. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/textgrid.py +9 -2
  72. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/tract.py +9 -1
  73. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/clts.py +20 -3
  74. ipakit-0.4.0/ipakit/clts_mapping.py +838 -0
  75. ipakit-0.4.0/ipakit/data/clts/import-result.schema.json +208 -0
  76. ipakit-0.4.0/ipakit/data/clts/manifest.json +131 -0
  77. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/clts/semantic-mapping.json +1360 -470
  78. ipakit-0.4.0/ipakit/data/clts/semantic-rules.json +166 -0
  79. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/confusion.json +1 -1
  80. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/feature-models/NOTICE.md +8 -7
  81. ipakit-0.4.0/ipakit/data/feature-models/panphon-receipt.json +40 -0
  82. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/feature-models/panphon.xml +1 -1
  83. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/heads.rng +14 -7
  84. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/inventory-cards.xml +1 -1
  85. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/ipa.rng +4 -0
  86. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/ipa.xml +12 -1
  87. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/phoible/NOTICE.txt +9 -15
  88. ipakit-0.4.0/ipakit/data/phoible/manifest.json +48 -0
  89. ipakit-0.4.0/ipakit/data/phonemaps/timit.xml +96 -0
  90. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/phonemaps/xsampa.xml +1 -0
  91. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/rules/american-english.rules +5 -8
  92. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/distance_model.py +2 -1
  93. ipakit-0.4.0/ipakit/espeak_source.py +761 -0
  94. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/extraction/phoible.py +35 -15
  95. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/feature_models.py +4 -0
  96. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/features.py +100 -29
  97. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/form.py +58 -7
  98. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/inventories.py +49 -36
  99. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/metric.py +5 -0
  100. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/notebooks/ipakit-tutorial.ipynb +20 -0
  101. ipakit-0.4.0/ipakit/panphon_source.py +113 -0
  102. ipakit-0.4.0/ipakit/phoible_source.py +193 -0
  103. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/rules.py +108 -12
  104. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/tract.py +16 -0
  105. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit.egg-info/PKG-INFO +27 -8
  106. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit.egg-info/SOURCES.txt +38 -133
  107. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit.egg-info/requires.txt +2 -1
  108. {ipakit-0.3.0 → ipakit-0.4.0}/pyproject.toml +10 -8
  109. ipakit-0.4.0/scripts/clts_import_fixtures.py +81 -0
  110. ipakit-0.4.0/scripts/clts_manifest.py +24 -0
  111. ipakit-0.4.0/scripts/clts_profile_example.py +62 -0
  112. ipakit-0.4.0/scripts/consolidation_parity.sha256 +1 -0
  113. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/dev_sources.py +24 -4
  114. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/espeak_vocabularies.py +6 -41
  115. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/inventory_cards.py +52 -4
  116. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/panphon_geometry.py +143 -29
  117. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/tiergraph_capture.py +3 -0
  118. ipakit-0.4.0/scripts/timit_map.py +240 -0
  119. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/xsampa_table.py +10 -0
  120. ipakit-0.4.0/tests/data/form_operation_classification.json +191 -0
  121. ipakit-0.4.0/tests/fixtures/clts_import/complete.json +1 -0
  122. ipakit-0.4.0/tests/fixtures/clts_import/empty.json +1 -0
  123. ipakit-0.4.0/tests/fixtures/clts_import/error.json +1 -0
  124. ipakit-0.4.0/tests/fixtures/clts_import/preserved.json +1 -0
  125. ipakit-0.4.0/tests/fixtures/clts_import/refused.json +1 -0
  126. ipakit-0.4.0/tests/fixtures/phoible/README.md +15 -0
  127. ipakit-0.4.0/tests/fixtures/phoible/mappings/InventoryID-Bibtex.csv +3 -0
  128. ipakit-0.4.0/tests/fixtures/phoible/mappings/InventoryID-LanguageCodes.csv +3 -0
  129. ipakit-0.4.0/tests/license-classes.json +168 -0
  130. {ipakit-0.3.0 → ipakit-0.4.0}/tests/panphon/panphon.rng +1 -14
  131. ipakit-0.4.0/tests/test_bilabial_nasal_release.py +64 -0
  132. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_bridges.py +37 -20
  133. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_cli_hygiene.py +314 -22
  134. ipakit-0.4.0/tests/test_cli_model_transform_compare.py +170 -0
  135. ipakit-0.4.0/tests/test_cli_version.py +17 -0
  136. ipakit-0.4.0/tests/test_clts_import.py +911 -0
  137. ipakit-0.4.0/tests/test_clts_import_schema.py +123 -0
  138. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_clts_input.py +58 -0
  139. ipakit-0.4.0/tests/test_clts_manifest.py +307 -0
  140. ipakit-0.4.0/tests/test_clts_mapping.py +1191 -0
  141. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_clts_packaging.py +19 -2
  142. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_clts_snapshot.py +7 -0
  143. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_coherent_composition.py +117 -45
  144. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_confusion.py +2 -2
  145. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_declared_not_hardcoded.py +1 -0
  146. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_dev_sources.py +61 -1
  147. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_feature_models.py +6 -13
  148. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_finite_model.py +11 -2
  149. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_form.py +6 -0
  150. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_form_native_profile.py +12 -13
  151. ipakit-0.4.0/tests/test_form_operation_classification.py +174 -0
  152. ipakit-0.4.0/tests/test_form_reader_admission.py +134 -0
  153. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_inventories.py +5 -5
  154. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_inventory_cards.py +4 -4
  155. ipakit-0.4.0/tests/test_library_hygiene.py +458 -0
  156. ipakit-0.4.0/tests/test_license_classes.py +457 -0
  157. ipakit-0.4.0/tests/test_overlong.py +50 -0
  158. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_packaging.py +78 -9
  159. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_panphon_geometry.py +7 -7
  160. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_panphon_live_geometry.py +34 -0
  161. ipakit-0.4.0/tests/test_panphon_receipt.py +110 -0
  162. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_phoible.py +5 -10
  163. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_phoible_packaging.py +15 -8
  164. ipakit-0.4.0/tests/test_phoible_receipt.py +128 -0
  165. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_phoible_source.py +44 -27
  166. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_query.py +25 -17
  167. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_query_dsl.py +52 -0
  168. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_rule_sets.py +5 -4
  169. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_rules.py +57 -5
  170. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_scalar_reads.py +1 -1
  171. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_schema.py +40 -22
  172. ipakit-0.4.0/tests/test_superscript_releases.py +81 -0
  173. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_supplements.py +4 -2
  174. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tap_duration.py +7 -5
  175. ipakit-0.4.0/tests/test_timit_map.py +66 -0
  176. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tract_figures.py +12 -0
  177. ipakit-0.4.0/tests/test_unspelled_anchor.py +64 -0
  178. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_xsampa.py +310 -0
  179. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/baselines/MANIFEST.sha256 +10 -10
  180. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/baselines/capture-metadata.json +2 -2
  181. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/baselines/coordinates.json +6 -6
  182. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/baselines/derived-artifacts.json +25 -10
  183. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/baselines/perturbation-proof.json +5 -5
  184. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/baselines/piece1-canonical-store.json +8 -8
  185. ipakit-0.4.0/tests/tiergraph/fixtures/clts_core_bipa_profile.json +2106 -0
  186. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/fixtures/hot_bridge_projection.json +1 -1
  187. ipakit-0.4.0/tests/tiergraph/test_clts_profile.py +996 -0
  188. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_fixture_wellformedness.py +2 -1
  189. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_form_store.py +31 -0
  190. ipakit-0.3.0/docs/clts-gaps.md +0 -352
  191. ipakit-0.3.0/ipakit/_clts_profile.py +0 -471
  192. ipakit-0.3.0/ipakit/bridges/espeak.py +0 -25
  193. ipakit-0.3.0/ipakit/clts_mapping.py +0 -461
  194. ipakit-0.3.0/ipakit/data/bridges/espeak/af.xml +0 -181
  195. ipakit-0.3.0/ipakit/data/bridges/espeak/am.xml +0 -133
  196. ipakit-0.3.0/ipakit/data/bridges/espeak/an.xml +0 -164
  197. ipakit-0.3.0/ipakit/data/bridges/espeak/ar.xml +0 -139
  198. ipakit-0.3.0/ipakit/data/bridges/espeak/as.xml +0 -191
  199. ipakit-0.3.0/ipakit/data/bridges/espeak/az.xml +0 -164
  200. ipakit-0.3.0/ipakit/data/bridges/espeak/ba.xml +0 -147
  201. ipakit-0.3.0/ipakit/data/bridges/espeak/be.xml +0 -164
  202. ipakit-0.3.0/ipakit/data/bridges/espeak/bg.xml +0 -149
  203. ipakit-0.3.0/ipakit/data/bridges/espeak/bn.xml +0 -191
  204. ipakit-0.3.0/ipakit/data/bridges/espeak/bpy.xml +0 -191
  205. ipakit-0.3.0/ipakit/data/bridges/espeak/ca-ba.xml +0 -172
  206. ipakit-0.3.0/ipakit/data/bridges/espeak/ca-nw.xml +0 -172
  207. ipakit-0.3.0/ipakit/data/bridges/espeak/ca-va.xml +0 -172
  208. ipakit-0.3.0/ipakit/data/bridges/espeak/ca.xml +0 -172
  209. ipakit-0.3.0/ipakit/data/bridges/espeak/chr.xml +0 -192
  210. ipakit-0.3.0/ipakit/data/bridges/espeak/cmn.xml +0 -204
  211. ipakit-0.3.0/ipakit/data/bridges/espeak/cs.xml +0 -170
  212. ipakit-0.3.0/ipakit/data/bridges/espeak/cv.xml +0 -168
  213. ipakit-0.3.0/ipakit/data/bridges/espeak/cy.xml +0 -173
  214. ipakit-0.3.0/ipakit/data/bridges/espeak/da.xml +0 -181
  215. ipakit-0.3.0/ipakit/data/bridges/espeak/de.xml +0 -181
  216. ipakit-0.3.0/ipakit/data/bridges/espeak/el.xml +0 -157
  217. ipakit-0.3.0/ipakit/data/bridges/espeak/en-n.xml +0 -230
  218. ipakit-0.3.0/ipakit/data/bridges/espeak/en-rp.xml +0 -230
  219. ipakit-0.3.0/ipakit/data/bridges/espeak/en-sc.xml +0 -232
  220. ipakit-0.3.0/ipakit/data/bridges/espeak/en-us-nyc.xml +0 -229
  221. ipakit-0.3.0/ipakit/data/bridges/espeak/en-us.xml +0 -229
  222. ipakit-0.3.0/ipakit/data/bridges/espeak/en-wi.xml +0 -230
  223. ipakit-0.3.0/ipakit/data/bridges/espeak/en-wm.xml +0 -230
  224. ipakit-0.3.0/ipakit/data/bridges/espeak/en.xml +0 -70
  225. ipakit-0.3.0/ipakit/data/bridges/espeak/eo.xml +0 -140
  226. ipakit-0.3.0/ipakit/data/bridges/espeak/es-la.xml +0 -161
  227. ipakit-0.3.0/ipakit/data/bridges/espeak/es.xml +0 -161
  228. ipakit-0.3.0/ipakit/data/bridges/espeak/et.xml +0 -166
  229. ipakit-0.3.0/ipakit/data/bridges/espeak/eu.xml +0 -162
  230. ipakit-0.3.0/ipakit/data/bridges/espeak/fa.xml +0 -133
  231. ipakit-0.3.0/ipakit/data/bridges/espeak/fi.xml +0 -178
  232. ipakit-0.3.0/ipakit/data/bridges/espeak/fo.xml +0 -193
  233. ipakit-0.3.0/ipakit/data/bridges/espeak/fr.xml +0 -177
  234. ipakit-0.3.0/ipakit/data/bridges/espeak/ga.xml +0 -171
  235. ipakit-0.3.0/ipakit/data/bridges/espeak/gd.xml +0 -176
  236. ipakit-0.3.0/ipakit/data/bridges/espeak/gn.xml +0 -141
  237. ipakit-0.3.0/ipakit/data/bridges/espeak/grc.xml +0 -165
  238. ipakit-0.3.0/ipakit/data/bridges/espeak/gu.xml +0 -192
  239. ipakit-0.3.0/ipakit/data/bridges/espeak/hak.xml +0 -168
  240. ipakit-0.3.0/ipakit/data/bridges/espeak/haw.xml +0 -148
  241. ipakit-0.3.0/ipakit/data/bridges/espeak/he.xml +0 -127
  242. ipakit-0.3.0/ipakit/data/bridges/espeak/hi.xml +0 -188
  243. ipakit-0.3.0/ipakit/data/bridges/espeak/hr.xml +0 -179
  244. ipakit-0.3.0/ipakit/data/bridges/espeak/ht.xml +0 -177
  245. ipakit-0.3.0/ipakit/data/bridges/espeak/hu.xml +0 -146
  246. ipakit-0.3.0/ipakit/data/bridges/espeak/hy.xml +0 -144
  247. ipakit-0.3.0/ipakit/data/bridges/espeak/ia.xml +0 -140
  248. ipakit-0.3.0/ipakit/data/bridges/espeak/id.xml +0 -163
  249. ipakit-0.3.0/ipakit/data/bridges/espeak/is.xml +0 -171
  250. ipakit-0.3.0/ipakit/data/bridges/espeak/it.xml +0 -176
  251. ipakit-0.3.0/ipakit/data/bridges/espeak/ja.xml +0 -138
  252. ipakit-0.3.0/ipakit/data/bridges/espeak/jbo.xml +0 -140
  253. ipakit-0.3.0/ipakit/data/bridges/espeak/ka.xml +0 -134
  254. ipakit-0.3.0/ipakit/data/bridges/espeak/kaa.xml +0 -144
  255. ipakit-0.3.0/ipakit/data/bridges/espeak/kk.xml +0 -144
  256. ipakit-0.3.0/ipakit/data/bridges/espeak/kl.xml +0 -145
  257. ipakit-0.3.0/ipakit/data/bridges/espeak/kn.xml +0 -188
  258. ipakit-0.3.0/ipakit/data/bridges/espeak/ko.xml +0 -140
  259. ipakit-0.3.0/ipakit/data/bridges/espeak/kok.xml +0 -191
  260. ipakit-0.3.0/ipakit/data/bridges/espeak/ku.xml +0 -166
  261. ipakit-0.3.0/ipakit/data/bridges/espeak/ky.xml +0 -136
  262. ipakit-0.3.0/ipakit/data/bridges/espeak/la.xml +0 -154
  263. ipakit-0.3.0/ipakit/data/bridges/espeak/lb.xml +0 -171
  264. ipakit-0.3.0/ipakit/data/bridges/espeak/lt.xml +0 -179
  265. ipakit-0.3.0/ipakit/data/bridges/espeak/lv.xml +0 -164
  266. ipakit-0.3.0/ipakit/data/bridges/espeak/mi.xml +0 -163
  267. ipakit-0.3.0/ipakit/data/bridges/espeak/mk.xml +0 -180
  268. ipakit-0.3.0/ipakit/data/bridges/espeak/ml.xml +0 -193
  269. ipakit-0.3.0/ipakit/data/bridges/espeak/mr.xml +0 -192
  270. ipakit-0.3.0/ipakit/data/bridges/espeak/ms.xml +0 -163
  271. ipakit-0.3.0/ipakit/data/bridges/espeak/mt.xml +0 -167
  272. ipakit-0.3.0/ipakit/data/bridges/espeak/mto.xml +0 -170
  273. ipakit-0.3.0/ipakit/data/bridges/espeak/my.xml +0 -246
  274. ipakit-0.3.0/ipakit/data/bridges/espeak/nci.xml +0 -157
  275. ipakit-0.3.0/ipakit/data/bridges/espeak/ne.xml +0 -204
  276. ipakit-0.3.0/ipakit/data/bridges/espeak/nl.xml +0 -164
  277. ipakit-0.3.0/ipakit/data/bridges/espeak/no.xml +0 -168
  278. ipakit-0.3.0/ipakit/data/bridges/espeak/nog.xml +0 -144
  279. ipakit-0.3.0/ipakit/data/bridges/espeak/nso.xml +0 -133
  280. ipakit-0.3.0/ipakit/data/bridges/espeak/om.xml +0 -144
  281. ipakit-0.3.0/ipakit/data/bridges/espeak/or.xml +0 -191
  282. ipakit-0.3.0/ipakit/data/bridges/espeak/pa.xml +0 -191
  283. ipakit-0.3.0/ipakit/data/bridges/espeak/piqd.xml +0 -176
  284. ipakit-0.3.0/ipakit/data/bridges/espeak/pl.xml +0 -147
  285. ipakit-0.3.0/ipakit/data/bridges/espeak/prs.xml +0 -135
  286. ipakit-0.3.0/ipakit/data/bridges/espeak/pt-pt.xml +0 -185
  287. ipakit-0.3.0/ipakit/data/bridges/espeak/pt.xml +0 -185
  288. ipakit-0.3.0/ipakit/data/bridges/espeak/py.xml +0 -144
  289. ipakit-0.3.0/ipakit/data/bridges/espeak/qdb.xml +0 -230
  290. ipakit-0.3.0/ipakit/data/bridges/espeak/qu.xml +0 -132
  291. ipakit-0.3.0/ipakit/data/bridges/espeak/quc.xml +0 -127
  292. ipakit-0.3.0/ipakit/data/bridges/espeak/qya.xml +0 -159
  293. ipakit-0.3.0/ipakit/data/bridges/espeak/ro.xml +0 -191
  294. ipakit-0.3.0/ipakit/data/bridges/espeak/ru-lv.xml +0 -177
  295. ipakit-0.3.0/ipakit/data/bridges/espeak/ru.xml +0 -177
  296. ipakit-0.3.0/ipakit/data/bridges/espeak/sd.xml +0 -188
  297. ipakit-0.3.0/ipakit/data/bridges/espeak/shn.xml +0 -171
  298. ipakit-0.3.0/ipakit/data/bridges/espeak/si.xml +0 -194
  299. ipakit-0.3.0/ipakit/data/bridges/espeak/sjn.xml +0 -161
  300. ipakit-0.3.0/ipakit/data/bridges/espeak/sk.xml +0 -170
  301. ipakit-0.3.0/ipakit/data/bridges/espeak/sl.xml +0 -150
  302. ipakit-0.3.0/ipakit/data/bridges/espeak/smj.xml +0 -189
  303. ipakit-0.3.0/ipakit/data/bridges/espeak/sq.xml +0 -159
  304. ipakit-0.3.0/ipakit/data/bridges/espeak/sr.xml +0 -181
  305. ipakit-0.3.0/ipakit/data/bridges/espeak/sv.xml +0 -160
  306. ipakit-0.3.0/ipakit/data/bridges/espeak/sw.xml +0 -127
  307. ipakit-0.3.0/ipakit/data/bridges/espeak/ta.xml +0 -194
  308. ipakit-0.3.0/ipakit/data/bridges/espeak/te.xml +0 -188
  309. ipakit-0.3.0/ipakit/data/bridges/espeak/th.xml +0 -171
  310. ipakit-0.3.0/ipakit/data/bridges/espeak/ti.xml +0 -134
  311. ipakit-0.3.0/ipakit/data/bridges/espeak/tk.xml +0 -173
  312. ipakit-0.3.0/ipakit/data/bridges/espeak/tn.xml +0 -145
  313. ipakit-0.3.0/ipakit/data/bridges/espeak/tr.xml +0 -164
  314. ipakit-0.3.0/ipakit/data/bridges/espeak/tt.xml +0 -147
  315. ipakit-0.3.0/ipakit/data/bridges/espeak/ug.xml +0 -166
  316. ipakit-0.3.0/ipakit/data/bridges/espeak/uk.xml +0 -133
  317. ipakit-0.3.0/ipakit/data/bridges/espeak/ur.xml +0 -188
  318. ipakit-0.3.0/ipakit/data/bridges/espeak/uz.xml +0 -147
  319. ipakit-0.3.0/ipakit/data/bridges/espeak/vi-hue.xml +0 -193
  320. ipakit-0.3.0/ipakit/data/bridges/espeak/vi-sgn.xml +0 -191
  321. ipakit-0.3.0/ipakit/data/bridges/espeak/vi.xml +0 -200
  322. ipakit-0.3.0/ipakit/data/bridges/espeak/yue.xml +0 -180
  323. ipakit-0.3.0/ipakit/data/clts/semantic-rules.json +0 -41
  324. ipakit-0.3.0/ipakit/data/phoible/GPL-3.0.txt +0 -674
  325. ipakit-0.3.0/ipakit/data/phoible/manifest.json +0 -27
  326. ipakit-0.3.0/ipakit/data/phoible/mappings/InventoryID-Bibtex.csv.gz +0 -0
  327. ipakit-0.3.0/ipakit/data/phoible/mappings/InventoryID-LanguageCodes.csv.gz +0 -0
  328. ipakit-0.3.0/ipakit/data/phoible-policy.json +0 -12
  329. ipakit-0.3.0/ipakit/data/phonemaps/timit.xml +0 -96
  330. ipakit-0.3.0/ipakit/phoible_source.py +0 -83
  331. ipakit-0.3.0/scripts/consolidation_parity.sha256 +0 -1
  332. ipakit-0.3.0/tests/fixtures/phoible/README.md +0 -7
  333. ipakit-0.3.0/tests/fixtures/phoible/mappings/InventoryID-Bibtex.csv +0 -3
  334. ipakit-0.3.0/tests/fixtures/phoible/mappings/InventoryID-LanguageCodes.csv +0 -3
  335. ipakit-0.3.0/tests/test_clts_mapping.py +0 -232
  336. ipakit-0.3.0/tests/tiergraph/test_clts_profile.py +0 -456
  337. {ipakit-0.3.0 → ipakit-0.4.0}/.github/workflows/publish.yml +0 -0
  338. {ipakit-0.3.0 → ipakit-0.4.0}/LICENSE +0 -0
  339. {ipakit-0.3.0 → ipakit-0.4.0}/docs/anchor-study.md +0 -0
  340. {ipakit-0.3.0 → ipakit-0.4.0}/docs/articulatory-data.md +0 -0
  341. {ipakit-0.3.0 → ipakit-0.4.0}/docs/calculus.md +0 -0
  342. {ipakit-0.3.0 → ipakit-0.4.0}/docs/corpus-scaling-report.json +0 -0
  343. {ipakit-0.3.0 → ipakit-0.4.0}/docs/corpus.md +0 -0
  344. {ipakit-0.3.0 → ipakit-0.4.0}/docs/data/english-syllable-curation-2026-08-11.json +0 -0
  345. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/README.md +0 -0
  346. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/archive/README.md +0 -0
  347. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/archive/ip-p1-store-approach.md +0 -0
  348. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/archive/piece1-canonical-store.md +0 -0
  349. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/braces.md +0 -0
  350. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/captures.md +0 -0
  351. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/conlang.md +0 -0
  352. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/ecosystem.md +0 -0
  353. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/frontal-view.md +0 -0
  354. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/historical-linguistics.md +0 -0
  355. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/interop.md +0 -0
  356. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/mass-budget.md +0 -0
  357. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/morph-boundary.md +0 -0
  358. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/residency-allowlist.json +0 -0
  359. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/supplement-bridges.md +0 -0
  360. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/tiers.md +0 -0
  361. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/tract-validation.md +0 -0
  362. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/vowel-chart-geometry.md +0 -0
  363. {ipakit-0.3.0 → ipakit-0.4.0}/docs/design/vowel-constriction.md +0 -0
  364. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/frontal-a.svg +0 -0
  365. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/frontal-i.svg +0 -0
  366. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/frontal-m.svg +0 -0
  367. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/frontal-reference.svg +0 -0
  368. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/frontal-rest.svg +0 -0
  369. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/frontal-t.svg +0 -0
  370. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/frontal-u.svg +0 -0
  371. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-a.svg +0 -0
  372. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-eng.svg +0 -0
  373. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-esh.svg +0 -0
  374. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-i.svg +0 -0
  375. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-k.svg +0 -0
  376. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-m.svg +0 -0
  377. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-n.svg +0 -0
  378. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-reference.svg +0 -0
  379. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-s.svg +0 -0
  380. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-silence.svg +0 -0
  381. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-t.svg +0 -0
  382. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-theta.svg +0 -0
  383. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/tract-u.svg +0 -0
  384. {ipakit-0.3.0 → ipakit-0.4.0}/docs/figures/two-pane-timed.html +0 -0
  385. {ipakit-0.3.0 → ipakit-0.4.0}/docs/form.md +0 -0
  386. {ipakit-0.3.0 → ipakit-0.4.0}/docs/gestural-model.md +0 -0
  387. {ipakit-0.3.0 → ipakit-0.4.0}/docs/glossary.md +0 -0
  388. {ipakit-0.3.0 → ipakit-0.4.0}/docs/house-style.md +0 -0
  389. {ipakit-0.3.0 → ipakit-0.4.0}/docs/kana.md +0 -0
  390. {ipakit-0.3.0 → ipakit-0.4.0}/docs/mfa-vocabularies.md +0 -0
  391. {ipakit-0.3.0 → ipakit-0.4.0}/docs/perceptual-validation-exhibits.md +0 -0
  392. {ipakit-0.3.0 → ipakit-0.4.0}/docs/pinyin.md +0 -0
  393. {ipakit-0.3.0 → ipakit-0.4.0}/docs/reading.md +0 -0
  394. {ipakit-0.3.0 → ipakit-0.4.0}/docs/state-of-the-work.md +0 -0
  395. {ipakit-0.3.0 → ipakit-0.4.0}/docs/supplements.md +0 -0
  396. {ipakit-0.3.0 → ipakit-0.4.0}/docs/syllabification.md +0 -0
  397. {ipakit-0.3.0 → ipakit-0.4.0}/docs/systems.md +0 -0
  398. {ipakit-0.3.0 → ipakit-0.4.0}/docs/textgrid.md +0 -0
  399. {ipakit-0.3.0 → ipakit-0.4.0}/docs/tone.md +0 -0
  400. {ipakit-0.3.0 → ipakit-0.4.0}/docs/tract-figures.md +0 -0
  401. {ipakit-0.3.0 → ipakit-0.4.0}/docs/tract-reference.md +0 -0
  402. {ipakit-0.3.0 → ipakit-0.4.0}/docs/tutorial-basics.md +0 -0
  403. {ipakit-0.3.0 → ipakit-0.4.0}/docs/tutorial-basics.src.md +0 -0
  404. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/__main__.py +0 -0
  405. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_cmu_graph.py +0 -0
  406. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_codecs.py +0 -0
  407. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_containment_projection.py +0 -0
  408. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_corpus_cmudict.py +0 -0
  409. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_corpus_query.py +0 -0
  410. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_fact_builder.py +0 -0
  411. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_form_profile.py +0 -0
  412. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_gesture_backend.py +0 -0
  413. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_gesture_graph.py +0 -0
  414. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_graph_facts.py +0 -0
  415. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_identity.py +0 -0
  416. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_ipa_graph.py +0 -0
  417. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_katakana_codec.py +0 -0
  418. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_mora_graph.py +0 -0
  419. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_moraic.py +0 -0
  420. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_notebook.py +0 -0
  421. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_panphon_graph.py +0 -0
  422. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_pinyin_graph.py +0 -0
  423. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_rewrite_graph.py +0 -0
  424. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_rule_model.py +0 -0
  425. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_scalar_attribute.py +0 -0
  426. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_textgrid_graph.py +0 -0
  427. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/_token_corpus.py +0 -0
  428. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/align.py +0 -0
  429. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/anatomy.py +0 -0
  430. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/binary_cost.py +0 -0
  431. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/base.py +0 -0
  432. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/costmodel.py +0 -0
  433. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/generator.py +0 -0
  434. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/ipa_dict.py +0 -0
  435. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/kana.py +0 -0
  436. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/mfa.py +0 -0
  437. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/notation.py +0 -0
  438. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/pinyin.py +0 -0
  439. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/bridges/provider.py +0 -0
  440. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/__main__.py +0 -0
  441. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/analysis_cmds.py +0 -0
  442. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/distance.py +0 -0
  443. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/features.py +0 -0
  444. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/syllabify.py +0 -0
  445. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/cli/tiergraph.py +0 -0
  446. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/closure.py +0 -0
  447. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/constants.py +0 -0
  448. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/corpus.py +0 -0
  449. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/attested/miller_nicely_1955.json +0 -0
  450. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/kana/kana.xml +0 -0
  451. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/arabic.xml +0 -0
  452. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/bulgarian.xml +0 -0
  453. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/croatian.xml +0 -0
  454. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/czech.xml +0 -0
  455. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/english.xml +0 -0
  456. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/english_india.xml +0 -0
  457. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/english_nigeria.xml +0 -0
  458. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/english_nonnative.xml +0 -0
  459. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/english_uk.xml +0 -0
  460. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/english_us.xml +0 -0
  461. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/french.xml +0 -0
  462. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/german.xml +0 -0
  463. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/hausa.xml +0 -0
  464. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/japanese.xml +0 -0
  465. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/korean.xml +0 -0
  466. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/korean_jamo.xml +0 -0
  467. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/mandarin.xml +0 -0
  468. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/mandarin_china.xml +0 -0
  469. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/mandarin_erhua.xml +0 -0
  470. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/mandarin_taiwan.xml +0 -0
  471. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/mfa.xml +0 -0
  472. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/polish.xml +0 -0
  473. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/portuguese.xml +0 -0
  474. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/portuguese_brazil.xml +0 -0
  475. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/portuguese_portugal.xml +0 -0
  476. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/russian.xml +0 -0
  477. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/serbocroatian.xml +0 -0
  478. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/spanish.xml +0 -0
  479. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/spanish_latin_america.xml +0 -0
  480. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/spanish_spain.xml +0 -0
  481. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/swahili.xml +0 -0
  482. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/swedish.xml +0 -0
  483. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/tamil.xml +0 -0
  484. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/thai.xml +0 -0
  485. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/turkish.xml +0 -0
  486. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/ukrainian.xml +0 -0
  487. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/vietnamese.xml +0 -0
  488. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/vietnamese_hanoi.xml +0 -0
  489. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/vietnamese_ho_chi_minh_city.xml +0 -0
  490. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/mfa/vietnamese_hue.xml +0 -0
  491. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/pinyin/pinyin.xml +0 -0
  492. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/bridges/vocabulary.rng +0 -0
  493. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/clts/MAPPING-NOTICE.txt +0 -0
  494. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/clts/NOTICE.txt +0 -0
  495. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/clts/core.json +0 -0
  496. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/clts/source.json +0 -0
  497. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/feature-models/PANPHON-LICENSE.txt +0 -0
  498. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/heads.xml +0 -0
  499. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/inventory-cards.rng +0 -0
  500. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/mfa-curation.json +0 -0
  501. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/phoible/CC-BY-SA-3.0.txt +0 -0
  502. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/phoible/MIT-upstream.txt +0 -0
  503. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/phoible/data/phoible-references.bib.gz +0 -0
  504. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/phoible/data/phoible.csv.gz +0 -0
  505. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/phonemaps/cmu.xml +0 -0
  506. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/phonemaps/kirshenbaum.xml +0 -0
  507. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/phonemaps/lookalikes.xml +0 -0
  508. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/phonemaps/phonemap.rng +0 -0
  509. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/rules/french-liaison.rules +0 -0
  510. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/rules/german-final-devoicing.rules +0 -0
  511. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/rules/japanese-moraic.rules +0 -0
  512. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/rules/spanish-accented-english.rules +0 -0
  513. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/supplements/aspirated-stops.xml +0 -0
  514. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/supplements/supplement.rng +0 -0
  515. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/syllables/english.xml +0 -0
  516. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/syllables/japanese.xml +0 -0
  517. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/syllables/mandarin.xml +0 -0
  518. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/syllables/spanish.xml +0 -0
  519. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/syllables/syllables.rng +0 -0
  520. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/textgrid/mfa.json +0 -0
  521. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/textgrid/prosody.json +0 -0
  522. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/textgrid/segments.json +0 -0
  523. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/data/textgrid/words.json +0 -0
  524. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/disagreement.py +0 -0
  525. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/distance.py +0 -0
  526. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/distance_registry.py +0 -0
  527. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/experiment.py +0 -0
  528. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/extraction/__init__.py +0 -0
  529. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/extraction/mfa.py +0 -0
  530. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/feature_experiment.py +0 -0
  531. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/feature_sets.py +0 -0
  532. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/feature_transform.py +0 -0
  533. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/finite_declaration.py +0 -0
  534. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/finite_model.py +0 -0
  535. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/graph_json.py +0 -0
  536. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/hierarchy.py +0 -0
  537. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/inventory_operations.py +0 -0
  538. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/mapper.py +0 -0
  539. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/model_graph.py +0 -0
  540. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/models.py +0 -0
  541. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/phonemaps.py +0 -0
  542. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/phoneset_map.py +0 -0
  543. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/py.typed +0 -0
  544. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/segment.py +0 -0
  545. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/syllable.py +0 -0
  546. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/textgrid.py +0 -0
  547. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/tiergraph_dot.py +0 -0
  548. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/tract_svg.py +0 -0
  549. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/validation.py +0 -0
  550. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit/xsampa.py +0 -0
  551. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit.egg-info/dependency_links.txt +0 -0
  552. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit.egg-info/entry_points.txt +0 -0
  553. {ipakit-0.3.0 → ipakit-0.4.0}/ipakit.egg-info/top_level.txt +0 -0
  554. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/_comparison_order.py +0 -0
  555. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/anchor_study.py +0 -0
  556. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/areafunctions.py +0 -0
  557. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/articulatory.py +0 -0
  558. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/check_hrefs.py +0 -0
  559. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/compare_inventories.py +0 -0
  560. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/confusion.py +0 -0
  561. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/consolidation_parity.py +0 -0
  562. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/containment_oracle.py +0 -0
  563. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/corpus_scaling.py +0 -0
  564. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/costmodel_compare.py +0 -0
  565. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/disagreement_demo.py +0 -0
  566. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/docexamples.py +0 -0
  567. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/docquotes.py +0 -0
  568. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/frontal_figures.py +0 -0
  569. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/gate_subject.py +0 -0
  570. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/geometry.py +0 -0
  571. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/house_style.py +0 -0
  572. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/interop.py +0 -0
  573. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/invariants.py +0 -0
  574. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/mfa_vocabularies.py +0 -0
  575. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/perceptual_validation.py +0 -0
  576. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/piece1_oracle.py +0 -0
  577. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/projection_cache_characterization.py +0 -0
  578. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/state_of_work.py +0 -0
  579. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/sweep.py +0 -0
  580. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/syllable_curation.py +0 -0
  581. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/tiergraph_example.py +0 -0
  582. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/tract_svg.py +0 -0
  583. {ipakit-0.3.0 → ipakit-0.4.0}/scripts/tutorial.py +0 -0
  584. {ipakit-0.3.0 → ipakit-0.4.0}/setup.cfg +0 -0
  585. {ipakit-0.3.0 → ipakit-0.4.0}/tests/ANIMATION_LIMITS.md +0 -0
  586. {ipakit-0.3.0 → ipakit-0.4.0}/tests/__init__.py +0 -0
  587. {ipakit-0.3.0 → ipakit-0.4.0}/tests/_renderers.py +0 -0
  588. {ipakit-0.3.0 → ipakit-0.4.0}/tests/conftest.py +0 -0
  589. {ipakit-0.3.0 → ipakit-0.4.0}/tests/corpus.py +0 -0
  590. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/_capture_animation_sha256.py +0 -0
  591. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/_capture_epiglottal_constriction.py +0 -0
  592. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/_capture_posture_golden.py +0 -0
  593. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/_capture_velic_contrast.py +0 -0
  594. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/alignment/README.md +0 -0
  595. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/alignment/hello-world.json +0 -0
  596. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/alignment/hello-world.wav +0 -0
  597. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/animation_sha256.json +0 -0
  598. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/cmudict_excerpt.dict +0 -0
  599. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/epiglottal_constriction.json +0 -0
  600. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/espeak_cmn_1_52_0.txt +0 -0
  601. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/espeak_en_1_52_0.txt +0 -0
  602. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/ipa_dict_en_US.txt +0 -0
  603. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/mfa_english_us_v3_1_0.dict +0 -0
  604. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/phoible/data/phoible.csv +0 -0
  605. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/posture_golden.json +0 -0
  606. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/reference_landmark_distances.json +0 -0
  607. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/textgrid/cmudict.TextGrid +0 -0
  608. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/textgrid/cmudict_stress.TextGrid +0 -0
  609. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/textgrid/mfa_two_words.TextGrid +0 -0
  610. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/textgrid/mfa_untied.TextGrid +0 -0
  611. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/textgrid/prosody_hello.TextGrid +0 -0
  612. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/velic_contrast.json +0 -0
  613. {ipakit-0.3.0 → ipakit-0.4.0}/tests/fixtures/xrmb_anchor_prompts.json +0 -0
  614. {ipakit-0.3.0 → ipakit-0.4.0}/tests/panphon/shared-corpus.txt +0 -0
  615. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_agreement.py +0 -0
  616. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_align.py +0 -0
  617. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_analysis.py +0 -0
  618. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_anchor_study.py +0 -0
  619. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_animation_rest.py +0 -0
  620. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_api.py +0 -0
  621. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_api_contracts.py +0 -0
  622. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_boundary_distance.py +0 -0
  623. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_calculus.py +0 -0
  624. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_capture_scripts.py +0 -0
  625. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_ci_contract.py +0 -0
  626. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_cli.py +0 -0
  627. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_cli_distance_registry.py +0 -0
  628. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_cli_model.py +0 -0
  629. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_cli_model_query.py +0 -0
  630. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_cli_model_rules.py +0 -0
  631. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_cli_query.py +0 -0
  632. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_closure.py +0 -0
  633. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_clts_audit.py +0 -0
  634. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_cmu.py +0 -0
  635. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_comparison_example.py +0 -0
  636. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_constriction_location.py +0 -0
  637. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_corpus_cmudict.py +0 -0
  638. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_corpus_kernel.py +0 -0
  639. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_corpus_query.py +0 -0
  640. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_costmodel.py +0 -0
  641. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_costmodel_accumulation.py +0 -0
  642. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_costmodel_admission.py +0 -0
  643. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_costmodel_normalization.py +0 -0
  644. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_degenerate_boundaries.py +0 -0
  645. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_denominator.py +0 -0
  646. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_descriptions.py +0 -0
  647. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_determinism.py +0 -0
  648. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_disagreement.py +0 -0
  649. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_distance.py +0 -0
  650. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_distance_model.py +0 -0
  651. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_distance_registry.py +0 -0
  652. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_distinctive_difference.py +0 -0
  653. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_doc_citations.py +0 -0
  654. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_docquotes.py +0 -0
  655. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_espeak_binary.py +0 -0
  656. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_espeak_generator.py +0 -0
  657. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_experiment.py +0 -0
  658. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_extraction.py +0 -0
  659. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_feature_experiment.py +0 -0
  660. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_feature_reads.py +0 -0
  661. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_feature_realization.py +0 -0
  662. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_feature_transform.py +0 -0
  663. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_features.py +0 -0
  664. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_features_narrowing.py +0 -0
  665. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_fortis.py +0 -0
  666. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_frontal.py +0 -0
  667. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_geometry_doc.py +0 -0
  668. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_head_arcs.py +0 -0
  669. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_hierarchy.py +0 -0
  670. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_indel_costs.py +0 -0
  671. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_intervals.py +0 -0
  672. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_inventory_operations.py +0 -0
  673. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_invertibility.py +0 -0
  674. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_ipa_dict.py +0 -0
  675. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_japanese_mora_regressions.py +0 -0
  676. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_jaw_hinge.py +0 -0
  677. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_kana_provenance.py +0 -0
  678. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_license.py +0 -0
  679. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_ligature_aliases.py +0 -0
  680. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_linking_and_agreement.py +0 -0
  681. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_metric.py +0 -0
  682. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_mfa_vocabularies.py +0 -0
  683. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_model_graph.py +0 -0
  684. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_model_rules.py +0 -0
  685. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_models.py +0 -0
  686. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_modifier_modes.py +0 -0
  687. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_multi_constriction.py +0 -0
  688. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_nearest_pronunciation.py +0 -0
  689. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_nonfinal_modifiers.py +0 -0
  690. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_notation.py +0 -0
  691. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_notebook.py +0 -0
  692. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_one_classification.py +0 -0
  693. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_one_composition.py +0 -0
  694. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_panphon_facts.py +0 -0
  695. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_perceptual_validation.py +0 -0
  696. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_phonemaps.py +0 -0
  697. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_phoneset_comparison.py +0 -0
  698. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_phoneset_map.py +0 -0
  699. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_posture_animation.py +0 -0
  700. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_posture_no_side_channel.py +0 -0
  701. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_projection_cache.py +0 -0
  702. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_projection_coherence.py +0 -0
  703. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_prosodic_riders.py +0 -0
  704. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_rank_agreement.py +0 -0
  705. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_redundant_marks.py +0 -0
  706. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_scoring_parameters.py +0 -0
  707. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_search.py +0 -0
  708. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_segment.py +0 -0
  709. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_sentinels.py +0 -0
  710. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_sequence_scoring.py +0 -0
  711. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_stress.py +0 -0
  712. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_strict.py +0 -0
  713. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_surface_wave2.py +0 -0
  714. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_syllable_docs.py +0 -0
  715. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_syllable_english.py +0 -0
  716. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_syllable_japanese.py +0 -0
  717. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_syllable_mandarin.py +0 -0
  718. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_syllable_mechanism.py +0 -0
  719. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_syllable_spanish.py +0 -0
  720. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_textgrid.py +0 -0
  721. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tie_convergence.py +0 -0
  722. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tie_sense.py +0 -0
  723. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tier_context.py +0 -0
  724. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tier_rebase.py +0 -0
  725. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tiergraph_acceptance_docs.py +0 -0
  726. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tiers.py +0 -0
  727. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tokenization.py +0 -0
  728. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tone_contours.py +0 -0
  729. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_tract_blend.py +0 -0
  730. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_trajectory_track.py +0 -0
  731. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_transcription_distance.py +0 -0
  732. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_two_marks.py +0 -0
  733. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_unicode_normalization.py +0 -0
  734. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_unicode_recomposition.py +0 -0
  735. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_unplaced_marks.py +0 -0
  736. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_validation.py +0 -0
  737. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_variable_width.py +0 -0
  738. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_vowel_tract_limit.py +0 -0
  739. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_wiki.py +0 -0
  740. {ipakit-0.3.0 → ipakit-0.4.0}/tests/test_zero.py +0 -0
  741. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/baselines/README.md +0 -0
  742. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/baselines/containment-navigation.json +0 -0
  743. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/baselines/distance-alignments.json +0 -0
  744. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/choice_selection_v1.json +0 -0
  745. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/cmudict/pocketsphinx.tsv +0 -0
  746. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/cmudict/upstream.json +0 -0
  747. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/fixtures/choices_and_containment.json +0 -0
  748. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/fixtures/clock_and_ordering.json +0 -0
  749. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/fixtures/duration_and_relation_endpoints.json +0 -0
  750. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/fixtures/endpoints.json +0 -0
  751. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/fixtures/index.json +0 -0
  752. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/fixtures/prosodic_deliveries.json +0 -0
  753. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/fixtures/signature_edits.json +0 -0
  754. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/fixtures/unit_coordinates.json +0 -0
  755. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/structured_segment_v3.json +0 -0
  756. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_choice_selection_golden.py +0 -0
  757. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_codecs.py +0 -0
  758. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_consolidation_parity.py +0 -0
  759. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_declared_values.py +0 -0
  760. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_dot.py +0 -0
  761. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_gesture_integration.py +0 -0
  762. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_ipa_graph.py +0 -0
  763. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_j_panphon.py +0 -0
  764. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_j_profiles.py +0 -0
  765. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_lane_m_stabilization.py +0 -0
  766. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_piece1_oracle.py +0 -0
  767. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_pinyin_correctness.py +0 -0
  768. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_prominence.py +0 -0
  769. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_rewrite_bridge.py +0 -0
  770. {ipakit-0.3.0 → ipakit-0.4.0}/tests/tiergraph/test_scalar_attribute.py +0 -0
@@ -209,7 +209,7 @@ jobs:
209
209
  - name: CLTS snapshot regeneration and exhaustive scorer parity
210
210
  env:
211
211
  IPAKIT_CLTS_DIR: ${{ github.workspace }}/.clts-source
212
- run: pytest tests/test_clts_snapshot.py
212
+ run: pytest tests/test_clts_snapshot.py tests/test_clts_mapping.py tests/tiergraph/test_clts_profile.py
213
213
  - name: Comparison extras tests (partition check skips in the matrix job)
214
214
  run: pytest tests/test_comparison_example.py
215
215
 
@@ -53,7 +53,7 @@ repos:
53
53
  - id: mypy
54
54
  # Native GraphProfile subclasses need the same runtime types CI installs.
55
55
  # tests/test_ci_contract.py keeps this requirement equal to pyproject.
56
- additional_dependencies: ["tiergraph>=0.3.0,<0.4.0"]
56
+ additional_dependencies: ["tiergraph>=0.4.0"]
57
57
  # NOT widened to match the others. `pyproject.toml` sets
58
58
  # `files = ["ipakit"]` deliberately, because the lint job installs
59
59
  # `.[lint]`, which has no pytest -- a scope reaching a test file
@@ -7,6 +7,58 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.0] - 2026-09-29
11
+
12
+ ### Added
13
+
14
+ - A JSON Schema and five canonical fixtures define the public CLTS import envelopes.
15
+ - `unsupported="preserve"` keeps unsupported CLTS occurrences as source material instead of refusing the import.
16
+ - `load_import` reloads a saved strict import only when a fresh import reproduces it exactly.
17
+ - Public strict CLTS import now accepts explicit tokens; only reviewed plain stops (`p b t d`) import successfully, and every other occurrence is reported.
18
+ - `InputLossWarning` is exported for callers that need to classify lossy public reads.
19
+ - The CLTS mapping records its reviewed source-profile basis, and import compatibility refuses a different profile.
20
+ - A final, verified CLTS core-BIPA receipt ships as `manifest.json`.
21
+ - `ˢ`, `ʳ`, and `ʶ` write distinct sibilant, trilled, and uvular release values.
22
+ - `ᵐ` writes the distinct `bilabial-nasal` release value; `ⁿ` remains generic nasal release.
23
+ - `ipakit --version` prints the installed version.
24
+ - `ipakit model transform` applies an explicit finite ternary-to-binary encoding and reports its preimage and loss evidence.
25
+ - `ipakit model compare` compares original and explicitly selected binary encodings over exact token corpora.
26
+ - Written `ːː` is the `overlong` value on the length scale. Each length step is now a quarter of the scale rather than a third; `confusion.json` and `metric_fingerprint` move, so a distance matrix saved before this change is read as a different feature space.
27
+ - CLTS vowel and consonant duration declarations map to distinct house length values when the source asserts them.
28
+ - The CLTS gap report records enhancement candidates, their evidence and dispositions, including the additions accepted for lane H.
29
+
30
+ ### Changed
31
+
32
+ - The TIMIT map is generated from ipakit's transcription of NISTIR 4930 §4.3: `epi` is silence, the closures are unreleased stops, and `ux` and `ax-h` are mapped.
33
+ - Requires tiergraph 0.4.0 or later.
34
+ - eSpeak inventories are built from the user's eSpeak NG checkout (`IPAKIT_ESPEAK_NG` or an explicit path); no eSpeak-derived data ships.
35
+ - PHOIBLE's GPL mapping tables are read from the user's PHOIBLE (`IPAKIT_PHOIBLE`); the CC BY-SA main data keeps shipping.
36
+ - CLTS input documents refuse a second host for one tone, a duplicate relation, an unencodable raw, and an out-of-range integer time, each at its location.
37
+ - Profile-bound CLTS eligibility now derives reviewed plain-stop projections and affricate-juncture refusals.
38
+ - Profile-bound CLTS eligibility reports unattempted occurrences with the `not-attempted` reason.
39
+ - Public soft-reader warnings are classified as input loss even when their warning location names the library caller.
40
+ - PHOIBLE's shipped `manifest.json` now uses the shared source-receipt schema, and Panphon provenance lives only in its adjacent receipt.
41
+ - Every CLI command declares the notation it reads, or that it reads none; the fourteen that read one without saying so now name it in their help.
42
+
43
+ ### Fixed
44
+
45
+ - Rule changes can assign a declared feature value spelled `0`.
46
+ - The X-SAMPA round-trip exception list covers every composition where a table key spans a unit boundary, and the README states the swept spaces exactly.
47
+ - Postfix brace constraints conjoin with their base instead of overwriting it.
48
+ - Reads refuse declared unspelled values instead of silently matching every unit or none.
49
+ - Feature-valued CLTS release rules now state and enforce their source-assertion condition.
50
+ - The public Form reader refuses declared source facts on a tier with no house unit.
51
+ - Source-profile host relations preserve their supplied order through native graph restoration.
52
+ - CLTS mapping dispositions use the reviewed audit classes, and segmental-release sequences state and enforce their host and juncture limits.
53
+ - The CLTS declaration census refuses a same-kind value spelling declared under multiple features.
54
+ - `ipakit corpus validate` exits 3 when a stored form holds a symbol the inventory does not register.
55
+ - Assigning the declared unmarked `stress=none` value removes a written stress mark.
56
+ - Empty and boundary-only forms return no inferred tier intervals instead of crashing.
57
+ - Rest-posture lip, jaw and velum states reject unknown spellings.
58
+ - The tract-anatomy guide describes and measures the current structured drawings.
59
+ - Forms constructed from units use those units' custom inventory declarations in their graph facts.
60
+ - An inventory refuses a declared unspelled value that one of its marks spells, and the metric anchors a prosodic feature at its declared unspelled value.
61
+
10
62
  ## [0.3.0] - 2026-09-23
11
63
 
12
64
  ### Added
@@ -389,6 +441,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
389
441
  - Precomposed characters (`ã`) were dropped at ingest; decomposed `ç` misparsed as bare `c` (#8).
390
442
  - `docs/distance.md` states plainly that `distance` is not a metric.
391
443
 
392
- [Unreleased]: https://github.com/lenzo-ka/ipakit/compare/v0.3.0...HEAD
444
+ [Unreleased]: https://github.com/lenzo-ka/ipakit/compare/v0.4.0...HEAD
445
+ [0.4.0]: https://github.com/lenzo-ka/ipakit/compare/v0.3.0...v0.4.0
393
446
  [0.3.0]: https://github.com/lenzo-ka/ipakit/compare/v0.2.0...v0.3.0
394
447
  [0.2.0]: https://github.com/lenzo-ka/ipakit/releases/tag/v0.2.0
@@ -46,7 +46,11 @@ global-exclude *.py[cod] .DS_Store
46
46
  prune tests/.pytest_cache
47
47
 
48
48
  # Bridge declarations and the grammars stating their shape.
49
- recursive-include ipakit/data/bridges *.xml *.rng
49
+ include ipakit/data/bridges/vocabulary.rng
50
+ recursive-include ipakit/data/bridges/kana *.xml
51
+ recursive-include ipakit/data/bridges/mfa *.xml
52
+ recursive-include ipakit/data/bridges/pinyin *.xml
50
53
  recursive-include ipakit/data/textgrid *.json
51
- recursive-include ipakit/data/feature-models *.xml *.txt *.md
52
- recursive-include ipakit/data/phoible *.gz *.txt *.json
54
+ recursive-include ipakit/data/feature-models *.xml *.txt *.md *-receipt.json
55
+ recursive-include ipakit/data/phoible *.txt *.json
56
+ recursive-include ipakit/data/phoible/data *.gz
@@ -16,12 +16,12 @@ HEAD ?= adult-male
16
16
  # put IPA; the symbol it draws is in the second column.
17
17
  FIGURES := m:m n:n eng:ŋ t:t k:k theta:θ s:s esh:ʃ a:a i:i u:u silence:␣
18
18
 
19
- .PHONY: figures figures-clean tutorial tutorial-basics notebook inventory-cards inventory-cards-check house-style perceptual-validation state-of-work espeak-vocabularies espeak-vocabularies-check mfa-vocabularies mfa-vocabularies-check panphon-geometry-check lint check gate-subject
19
+ .PHONY: figures figures-clean tutorial tutorial-basics notebook inventory-cards inventory-cards-check house-style perceptual-validation state-of-work espeak-vocabularies espeak-vocabularies-check mfa-vocabularies mfa-vocabularies-check timit-map timit-map-check panphon-geometry-check lint check gate-subject
20
20
 
21
21
  ESPEAK_NG ?= $(HOME)/dev/other/espeak-ng
22
22
  MFA_MODELS ?= $(HOME)/.cache/ipakit/mfa-models
23
23
 
24
- ## espeak-vocabularies: regenerate every language-scoped eSpeak declaration
24
+ ## espeak-vocabularies: validate user-sourced declarations and refresh the summary
25
25
  espeak-vocabularies:
26
26
  @if test ! -d "$(ESPEAK_NG)/.git"; then \
27
27
  echo "espeak-vocabularies: pinned checkout absent; nothing regenerated"; \
@@ -51,19 +51,25 @@ mfa-vocabularies-check:
51
51
  $(PYTHON) scripts/mfa_vocabularies.py check --source "$(MFA_MODELS)"; \
52
52
  fi
53
53
 
54
+ timit-map:
55
+ @$(PYTHON) scripts/timit_map.py generate --write
56
+
57
+ timit-map-check:
58
+ @$(PYTHON) scripts/timit_map.py check
59
+
54
60
  ## inventory-cards: regenerate docs/inventories.md from declarations and counts
55
61
  inventory-cards:
56
62
  @if test ! -f "$(MFA_MODELS)/dictionary/english/us_mfa/english_us_mfa.dict"; then \
57
63
  echo "inventory-cards: pinned MFA dictionary absent; nothing regenerated"; \
58
64
  else \
59
- $(PYTHON) scripts/inventory_cards.py build --mfa-models "$(MFA_MODELS)"; \
65
+ IPAKIT_ESPEAK_NG="$(ESPEAK_NG)" $(PYTHON) scripts/inventory_cards.py build --mfa-models "$(MFA_MODELS)"; \
60
66
  fi
61
67
 
62
68
  inventory-cards-check:
63
69
  @if test ! -f "$(MFA_MODELS)/dictionary/english/us_mfa/english_us_mfa.dict"; then \
64
70
  echo "inventory-cards: pinned MFA dictionary absent; generated-document check skipped"; \
65
71
  else \
66
- $(PYTHON) scripts/inventory_cards.py check --mfa-models "$(MFA_MODELS)"; \
72
+ IPAKIT_ESPEAK_NG="$(ESPEAK_NG)" $(PYTHON) scripts/inventory_cards.py check --mfa-models "$(MFA_MODELS)"; \
67
73
  fi
68
74
 
69
75
  panphon-geometry-check:
@@ -177,6 +183,7 @@ check: gate-subject lint
177
183
  @$(NICE) $(PYTHON) scripts/state_of_work.py check
178
184
  @$(MAKE) --no-print-directory espeak-vocabularies-check
179
185
  @$(MAKE) --no-print-directory mfa-vocabularies-check
186
+ @$(MAKE) --no-print-directory timit-map-check
180
187
  @$(MAKE) --no-print-directory panphon-geometry-check
181
188
  @$(MAKE) --no-print-directory inventory-cards-check
182
189
  @PYTHONHASHSEED=0 $(NICE) $(PYTHON) scripts/tutorial.py check all
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ipakit
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: IPA toolkit: phonetic features, distance, tokenization, rules, and conversions
5
5
  Author: Kevin Lenzo
6
6
  License-Expression: BSD-2-Clause
@@ -22,11 +22,12 @@ Classifier: Typing :: Typed
22
22
  Requires-Python: >=3.12
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
- Requires-Dist: tiergraph<0.4.0,>=0.3.0
25
+ Requires-Dist: tiergraph>=0.4.0
26
26
  Provides-Extra: test
27
27
  Requires-Dist: pytest>=9.1.1; extra == "test"
28
28
  Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
29
29
  Requires-Dist: lxml>=6.1.2; extra == "test"
30
+ Requires-Dist: jsonschema>=4.26.0; extra == "test"
30
31
  Requires-Dist: packaging>=24.2; extra == "test"
31
32
  Requires-Dist: PyYAML<7,>=6.0.3; extra == "test"
32
33
  Requires-Dist: setuptools>=84.0.0; extra == "test"
@@ -88,7 +89,7 @@ derived forms, expose structural queries at the shell, and test rule systems
88
89
  against paired forms. That is also the substrate on which rule induction can
89
90
  run; the inducer itself remains a separate concern.
90
91
 
91
- Praat TextGrids enter and leave through named tier profiles, including an MFA alignment profile. The shipped [inventory registry](https://github.com/lenzo-ka/ipakit/blob/main/docs/inventories.md) includes the pinned MFA phone declarations and eSpeak NG vocabularies, and [TextGrid interchange](https://github.com/lenzo-ka/ipakit/blob/main/docs/textgrid.md) applies those inventory styles to tier labels without guessing.
92
+ Praat TextGrids enter and leave through named tier profiles, including an MFA alignment profile. The [inventory registry](https://github.com/lenzo-ka/ipakit/blob/main/docs/inventories.md) includes pinned MFA phone declarations and adds eSpeak NG vocabularies from a user-supplied checkout, while [TextGrid interchange](https://github.com/lenzo-ka/ipakit/blob/main/docs/textgrid.md) applies those inventory styles to tier labels without guessing.
92
93
 
93
94
  The package uses tiergraph for graph navigation; its phonetic data and geometry
94
95
  ship as declarations. It is typed, and the Python API and `ipakit` command expose the
@@ -305,11 +306,27 @@ A word comparison reports `coverage` — the shorter token count over the longer
305
306
  onset: `from_cmu(["K", "AE1", "T"])` → `kˈæt`. Syllabification is preserved
306
307
  across round trips (`W AO1 T ER0` ↔ `wˈɔtɚ`).
307
308
  - **Ties are typed** (house convention; see [docs/ties.md](https://github.com/lenzo-ka/ipakit/blob/main/docs/ties.md)): the over-tie fuses constituents into one timing slot (affricates and double articulations: `t͡ʃ`, `k͡p`), the under-tie binds a sequence into one unit (diphthongs, morae: `e͜ɪ`, `a͜ɪ͜ə`), and the over-tie binds tighter in mixed chains (`t͡s͜a`). The glyph is authoritative everywhere; text written in other conventions (where the glyphs are typographic variants, and where the keyboard stands in for the phonetic alphabet) imports explicitly via `ipakit.from_wild` — default parsing never rewrites its input. Tie *presence* is contrastive: `t͡s` is one segment, `ts` is a cluster.
308
- - **Round-trip guarantee (X-SAMPA only):** IPA written in these conventions round-trips through X-SAMPA (`ipa → xsampa → ipa`), **up to tie sense**: X-SAMPA has a single tie encoding, so the under-tie projects onto the over-tie at the boundary and round trips return canonical over-tie spellings (`t͜s → t_s → t͡s`); the sequential/simultaneous distinction survives only in IPA. Every other exception is enumerated here, and the suite asserts the round-trip failure set is *exactly* this list over two spaces — the registered inventory, and the composed forms built from it (every registered base carrying one registered mark, in either position; every adjacent pair of bases) — so nothing can join it in silence. The accepted ligature alias spellings (`ʧ`, `ʦ`, `ƛ`) convert as the thing they spell and come back canonical; they sit outside that inventory, so a second test sweeps the alias map to keep them out of the dropped set.
309
+ - **Round-trip guarantee (X-SAMPA only):** IPA written in these conventions round-trips through X-SAMPA (`ipa → xsampa → ipa`), **up to tie sense**: X-SAMPA has a single tie encoding, so the under-tie projects onto the over-tie at the boundary and round trips return canonical over-tie spellings (`t͜s → t_s → t͡s`); the sequential/simultaneous distinction survives only in IPA. Every exception in the tested spaces is enumerated here, and the suite asserts the failure set is *exactly* this list. Those spaces are the registered inventory; every registered base with one registered mark in either position; every ordered pair of registered bases; and the finite local boundary-spanning windows derived from the X-SAMPA table. A local window factors each reverse key across two or more forward-table outputs of registered bases and encodable marks (the structural ties and boundaries are left to the composed-form space), keeps an overshooting final output and every factorization of the result, and admits the resulting base run, base-plus-marks unit, or mark run on neutral carrier `a`; runs are bounded by those factorizations. An exhaustive check of every two- and three-atom sequence made from the participating bases and marks also verifies that a greedy match which starts inside an output follows an already enumerated first divergence. This is a claim about those finite spaces, not arbitrary surrounding context. The accepted ligature alias spellings (`ʧ`, `ʦ`, `ƛ`) convert as the thing they spell and come back canonical; they sit outside the registered inventory, so a separate test sweeps the alias map to keep them out of the dropped set.
309
310
  - *Ambiguous* — `b͡v`, `t͡θ`, `ŋ͡m` come back as `b̬`, `t˥`, `ŋ̻`: the tie encoding `_` collides with a diacritic/tone encoding (`_v`, `_T`, `_m`). Inherent to X-SAMPA; ICU shares it.
310
- - *Ambiguous on composition* (see [docs/ties.md](https://github.com/lenzo-ka/ipakit/blob/main/docs/ties.md)) — the table is not prefix-free, so a join between two encodings can spell a key a third entry already claims and longest-match reads that one. `` ` `` is both the rhotacized modifier and X-SAMPA's retroflex suffix, so a base plus `ʴ` spells the retroflex phone and the sound changes: `dʴ lʴ nʴ rʴ sʴ tʴ zʴ ɹʴ t͡sʴ d͡zʴ` come back `ɖ ɭ ɳ ɽ ʂ ʈ ʐ ɻ t͡ʂ d͡ʐ`. `ǀǀ → ǁ` and `ǀǁ → ǁǀ`, because `|\|\` (the alveolar lateral click) is two `|\` (the dental one). In three more the sound survives and only a redundant spelling of it does not — `əʴ → ɚ`, `ɜʴ → ɝ`, `tʼ → ť` — which is the canonicalization `from_wild` is there to do, X-SAMPA being an ASCII convention for writing IPA rather than a phoneset beside it. Writing loses nothing at a join (`to_xsampa` of a join is the join of the `to_xsampa`s, over both spaces), so each of these is the reader re-segmenting, not the writer dropping.
311
+ - *Ambiguous on composition* (see [docs/ties.md](https://github.com/lenzo-ka/ipakit/blob/main/docs/ties.md)) — the table is not prefix-free, so a join between two encodings can spell a key a third entry already claims and longest-match reads that one. `` ` `` is both the rhotacized modifier and X-SAMPA's retroflex suffix, so a base plus `ʴ` spells the retroflex phone and the sound changes: `dʴ lʴ nʴ rʴ sʴ tʴ zʴ ɹʴ t͡sʴ d͡zʴ` come back `ɖ ɭ ɳ ɽ ʂ ʈ ʐ ɻ t͡ʂ d͡ʐ`. `ǀǀ → ǁ`, `ǀǁ → ǁǀ`, and `ǀǀǀ → ǁǀ`, because `|\|\` (the alveolar lateral click) is two `|\` (the dental one). The length marks collide the same way: `aːˑ → aːː`: the extra-long key `::` consumes the long mark `:` and the colon of the following half-long `:\`, and the reader reports the leftover backslash as input loss. The retroflex and click keys are X-SAMPA's own.
312
+ - *Redundant on composition* — in three existing cases the sound survives and only a redundant spelling of it does not: `əʴ → ɚ`, `ɜʴ → ɝ`, `tʼ → ť`. The table-derived tone windows below do the same thing: each returned contour spelling declares exactly the same ordered tone levels as its source. The keys that cause them (`_M_H`, `_H_M`, `_L_M`, `_M_L`, `_L_H_L`, `_H_L_H`) are ipakit's own spellings for the contour diacritics, written as the runs of level bars they name; standard X-SAMPA and ICU spell those contours differently. Unlike `_hh` below, they change no value, so they stay. These are the canonicalization `from_wild` is there to do, X-SAMPA being an ASCII convention for writing IPA rather than a phoneset beside it. Writing loses nothing at the joins in the swept spaces, so each is the reader re-segmenting, not the writer dropping.
313
+
314
+ ```text
315
+ a˦˧ → a᷇ a˦˧˦ → a᷇˦ a˦˧˨ → a᷇˨
316
+ a˦˨˦ → a᷉ a˦˨˦˧ → a᷉˧ a˦˨˦˨ → a᷉˨
317
+ a˦˨˦˨˦ → a᷉˨˦ a˦˨᷇ → a᷉˧ a˦˨᷉ → a᷉˨˦
318
+ a˦᷄ → a᷇˦ a˦᷆ → a᷇˨ a˦᷈ → a᷉˨
319
+ a˦᷈˦ → a᷉˨˦ a˧˦ → a᷄ a˧˦˧ → a᷄˧
320
+ a˧˦˨˦ → a᷄˨˦ a˧˨ → a᷆ a˧˨˦˨ → a᷆˦˨
321
+ a˧˨˧ → a᷆˧ a˧᷅ → a᷆˧ a˧᷇ → a᷄˧
322
+ a˧᷈ → a᷆˦˨ a˧᷉ → a᷄˨˦ a˨˦˨ → a᷈
323
+ a˨˦˨˦ → a᷈˦ a˨˦˨˦˨ → a᷈˦˨ a˨˦˨˧ → a᷈˧
324
+ a˨˦᷅ → a᷈˧ a˨˦᷈ → a᷈˦˨ a˨˧ → a᷅
325
+ a˨˧˦ → a᷅˦ a˨˧˨ → a᷅˨ a˨᷄ → a᷅˦
326
+ a˨᷆ → a᷅˨ a˨᷉ → a᷈˦ a˨᷉˨ → a᷈˦˨
327
+ ```
311
328
  - *Redundant spelling* — `˞`, `̀`, `́`, `̄`, `ʻ` are dropped: X-SAMPA has one encoding where IPA has two, and in a bijective table it belongs to the house-canonical spelling — `ʴ` (`` ` ``), the tone bars `˨`/`˦`/`˧` (`_L`/`_H`/`_M`), `ʰ` (`_h`). Written that way, the sound round-trips exactly.
312
- - *Unencodable* — `ⱱ`, `ˀ`, `ᵊ`, `͈`, `^` are dropped: X-SAMPA has no notation for the labiodental flap (X-SAMPA predates the IPA's 2005 adoption of the symbol, and the standard chart marks that cell as having none), for glottalization, schwa release, or extIPA strong articulation, and unit prominence is house IPA notation that X-SAMPA never had. An invented spelling would collide with notation already in use, so these stay unmapped rather than approximated.
329
+ - *Unencodable* — `ⱱ`, `ˀ`, `ᵊ`, `ᵐ`, `ˢ`, `ʳ`, `ʶ`, `͈`, `^` are dropped: X-SAMPA has no notation for the labiodental flap (X-SAMPA predates the IPA's 2005 adoption of the symbol, and the standard chart marks that cell as having none), for glottalization, schwa release, bilabial nasal release, sibilant release, trilled release, uvular release, or extIPA strong articulation, and unit prominence is house IPA notation that X-SAMPA never had. `_n` already means generic nasal release and `_m` means laminal, so neither can preserve `ᵐ`'s distinction; existing s, r, and uvular spellings describe whole segments rather than these release phases. Invented spellings would collide with notation already in use, so these stay unmapped rather than approximated.
313
330
  - *Declined rather than impossible* — `ʱ` is dropped too, and for a different reason worth keeping separate from the four above. It had a curated encoding, `_hh`, which extended X-SAMPA's `_h`, so `ʰh` and `ʰɦ` both read back as `ʱ`: an ambiguity ipakit introduced rather than one the standard has. IPA is the primary notation and X-SAMPA a convenience, so declining to spell one mark there costs less than inventing an ambiguity to keep it.
314
331
 
315
332
  A dropped symbol takes its neighbors' adjacency with it (`kⱱt → kt`), which is what `strict=True` is for: `to_xsampa("kⱱt", strict=True)` raises `ValueError` naming the symbol instead. The CMU, TIMIT, and Kirshenbaum mappings are lossy (they collapse IPA distinctions) and carry no round-trip guarantee; Kirshenbaum has no labiodental-flap notation either.
@@ -376,5 +393,7 @@ table and the phone-distance matrix) against their generators in `scripts/`.
376
393
  ## License
377
394
 
378
395
  BSD 2-Clause — see [LICENSE](https://github.com/lenzo-ka/ipakit/blob/main/LICENSE).
379
- Third-party data retain their separate terms; the shipped PHOIBLE source
380
- aggregate carries [file-scoped notices and licenses](ipakit/data/phoible/NOTICE.txt).
396
+ Third-party data retain their separate terms; the shipped PHOIBLE dataset and
397
+ bibliography carry [file-scoped notices and licenses](ipakit/data/phoible/NOTICE.txt).
398
+ PHOIBLE mapping tables and eSpeak phoneme tables are read from user-supplied
399
+ sources and are not included in the wheel.
@@ -37,7 +37,7 @@ derived forms, expose structural queries at the shell, and test rule systems
37
37
  against paired forms. That is also the substrate on which rule induction can
38
38
  run; the inducer itself remains a separate concern.
39
39
 
40
- Praat TextGrids enter and leave through named tier profiles, including an MFA alignment profile. The shipped [inventory registry](https://github.com/lenzo-ka/ipakit/blob/main/docs/inventories.md) includes the pinned MFA phone declarations and eSpeak NG vocabularies, and [TextGrid interchange](https://github.com/lenzo-ka/ipakit/blob/main/docs/textgrid.md) applies those inventory styles to tier labels without guessing.
40
+ Praat TextGrids enter and leave through named tier profiles, including an MFA alignment profile. The [inventory registry](https://github.com/lenzo-ka/ipakit/blob/main/docs/inventories.md) includes pinned MFA phone declarations and adds eSpeak NG vocabularies from a user-supplied checkout, while [TextGrid interchange](https://github.com/lenzo-ka/ipakit/blob/main/docs/textgrid.md) applies those inventory styles to tier labels without guessing.
41
41
 
42
42
  The package uses tiergraph for graph navigation; its phonetic data and geometry
43
43
  ship as declarations. It is typed, and the Python API and `ipakit` command expose the
@@ -254,11 +254,27 @@ A word comparison reports `coverage` — the shorter token count over the longer
254
254
  onset: `from_cmu(["K", "AE1", "T"])` → `kˈæt`. Syllabification is preserved
255
255
  across round trips (`W AO1 T ER0` ↔ `wˈɔtɚ`).
256
256
  - **Ties are typed** (house convention; see [docs/ties.md](https://github.com/lenzo-ka/ipakit/blob/main/docs/ties.md)): the over-tie fuses constituents into one timing slot (affricates and double articulations: `t͡ʃ`, `k͡p`), the under-tie binds a sequence into one unit (diphthongs, morae: `e͜ɪ`, `a͜ɪ͜ə`), and the over-tie binds tighter in mixed chains (`t͡s͜a`). The glyph is authoritative everywhere; text written in other conventions (where the glyphs are typographic variants, and where the keyboard stands in for the phonetic alphabet) imports explicitly via `ipakit.from_wild` — default parsing never rewrites its input. Tie *presence* is contrastive: `t͡s` is one segment, `ts` is a cluster.
257
- - **Round-trip guarantee (X-SAMPA only):** IPA written in these conventions round-trips through X-SAMPA (`ipa → xsampa → ipa`), **up to tie sense**: X-SAMPA has a single tie encoding, so the under-tie projects onto the over-tie at the boundary and round trips return canonical over-tie spellings (`t͜s → t_s → t͡s`); the sequential/simultaneous distinction survives only in IPA. Every other exception is enumerated here, and the suite asserts the round-trip failure set is *exactly* this list over two spaces — the registered inventory, and the composed forms built from it (every registered base carrying one registered mark, in either position; every adjacent pair of bases) — so nothing can join it in silence. The accepted ligature alias spellings (`ʧ`, `ʦ`, `ƛ`) convert as the thing they spell and come back canonical; they sit outside that inventory, so a second test sweeps the alias map to keep them out of the dropped set.
257
+ - **Round-trip guarantee (X-SAMPA only):** IPA written in these conventions round-trips through X-SAMPA (`ipa → xsampa → ipa`), **up to tie sense**: X-SAMPA has a single tie encoding, so the under-tie projects onto the over-tie at the boundary and round trips return canonical over-tie spellings (`t͜s → t_s → t͡s`); the sequential/simultaneous distinction survives only in IPA. Every exception in the tested spaces is enumerated here, and the suite asserts the failure set is *exactly* this list. Those spaces are the registered inventory; every registered base with one registered mark in either position; every ordered pair of registered bases; and the finite local boundary-spanning windows derived from the X-SAMPA table. A local window factors each reverse key across two or more forward-table outputs of registered bases and encodable marks (the structural ties and boundaries are left to the composed-form space), keeps an overshooting final output and every factorization of the result, and admits the resulting base run, base-plus-marks unit, or mark run on neutral carrier `a`; runs are bounded by those factorizations. An exhaustive check of every two- and three-atom sequence made from the participating bases and marks also verifies that a greedy match which starts inside an output follows an already enumerated first divergence. This is a claim about those finite spaces, not arbitrary surrounding context. The accepted ligature alias spellings (`ʧ`, `ʦ`, `ƛ`) convert as the thing they spell and come back canonical; they sit outside the registered inventory, so a separate test sweeps the alias map to keep them out of the dropped set.
258
258
  - *Ambiguous* — `b͡v`, `t͡θ`, `ŋ͡m` come back as `b̬`, `t˥`, `ŋ̻`: the tie encoding `_` collides with a diacritic/tone encoding (`_v`, `_T`, `_m`). Inherent to X-SAMPA; ICU shares it.
259
- - *Ambiguous on composition* (see [docs/ties.md](https://github.com/lenzo-ka/ipakit/blob/main/docs/ties.md)) — the table is not prefix-free, so a join between two encodings can spell a key a third entry already claims and longest-match reads that one. `` ` `` is both the rhotacized modifier and X-SAMPA's retroflex suffix, so a base plus `ʴ` spells the retroflex phone and the sound changes: `dʴ lʴ nʴ rʴ sʴ tʴ zʴ ɹʴ t͡sʴ d͡zʴ` come back `ɖ ɭ ɳ ɽ ʂ ʈ ʐ ɻ t͡ʂ d͡ʐ`. `ǀǀ → ǁ` and `ǀǁ → ǁǀ`, because `|\|\` (the alveolar lateral click) is two `|\` (the dental one). In three more the sound survives and only a redundant spelling of it does not — `əʴ → ɚ`, `ɜʴ → ɝ`, `tʼ → ť` — which is the canonicalization `from_wild` is there to do, X-SAMPA being an ASCII convention for writing IPA rather than a phoneset beside it. Writing loses nothing at a join (`to_xsampa` of a join is the join of the `to_xsampa`s, over both spaces), so each of these is the reader re-segmenting, not the writer dropping.
259
+ - *Ambiguous on composition* (see [docs/ties.md](https://github.com/lenzo-ka/ipakit/blob/main/docs/ties.md)) — the table is not prefix-free, so a join between two encodings can spell a key a third entry already claims and longest-match reads that one. `` ` `` is both the rhotacized modifier and X-SAMPA's retroflex suffix, so a base plus `ʴ` spells the retroflex phone and the sound changes: `dʴ lʴ nʴ rʴ sʴ tʴ zʴ ɹʴ t͡sʴ d͡zʴ` come back `ɖ ɭ ɳ ɽ ʂ ʈ ʐ ɻ t͡ʂ d͡ʐ`. `ǀǀ → ǁ`, `ǀǁ → ǁǀ`, and `ǀǀǀ → ǁǀ`, because `|\|\` (the alveolar lateral click) is two `|\` (the dental one). The length marks collide the same way: `aːˑ → aːː`: the extra-long key `::` consumes the long mark `:` and the colon of the following half-long `:\`, and the reader reports the leftover backslash as input loss. The retroflex and click keys are X-SAMPA's own.
260
+ - *Redundant on composition* — in three existing cases the sound survives and only a redundant spelling of it does not: `əʴ → ɚ`, `ɜʴ → ɝ`, `tʼ → ť`. The table-derived tone windows below do the same thing: each returned contour spelling declares exactly the same ordered tone levels as its source. The keys that cause them (`_M_H`, `_H_M`, `_L_M`, `_M_L`, `_L_H_L`, `_H_L_H`) are ipakit's own spellings for the contour diacritics, written as the runs of level bars they name; standard X-SAMPA and ICU spell those contours differently. Unlike `_hh` below, they change no value, so they stay. These are the canonicalization `from_wild` is there to do, X-SAMPA being an ASCII convention for writing IPA rather than a phoneset beside it. Writing loses nothing at the joins in the swept spaces, so each is the reader re-segmenting, not the writer dropping.
261
+
262
+ ```text
263
+ a˦˧ → a᷇ a˦˧˦ → a᷇˦ a˦˧˨ → a᷇˨
264
+ a˦˨˦ → a᷉ a˦˨˦˧ → a᷉˧ a˦˨˦˨ → a᷉˨
265
+ a˦˨˦˨˦ → a᷉˨˦ a˦˨᷇ → a᷉˧ a˦˨᷉ → a᷉˨˦
266
+ a˦᷄ → a᷇˦ a˦᷆ → a᷇˨ a˦᷈ → a᷉˨
267
+ a˦᷈˦ → a᷉˨˦ a˧˦ → a᷄ a˧˦˧ → a᷄˧
268
+ a˧˦˨˦ → a᷄˨˦ a˧˨ → a᷆ a˧˨˦˨ → a᷆˦˨
269
+ a˧˨˧ → a᷆˧ a˧᷅ → a᷆˧ a˧᷇ → a᷄˧
270
+ a˧᷈ → a᷆˦˨ a˧᷉ → a᷄˨˦ a˨˦˨ → a᷈
271
+ a˨˦˨˦ → a᷈˦ a˨˦˨˦˨ → a᷈˦˨ a˨˦˨˧ → a᷈˧
272
+ a˨˦᷅ → a᷈˧ a˨˦᷈ → a᷈˦˨ a˨˧ → a᷅
273
+ a˨˧˦ → a᷅˦ a˨˧˨ → a᷅˨ a˨᷄ → a᷅˦
274
+ a˨᷆ → a᷅˨ a˨᷉ → a᷈˦ a˨᷉˨ → a᷈˦˨
275
+ ```
260
276
  - *Redundant spelling* — `˞`, `̀`, `́`, `̄`, `ʻ` are dropped: X-SAMPA has one encoding where IPA has two, and in a bijective table it belongs to the house-canonical spelling — `ʴ` (`` ` ``), the tone bars `˨`/`˦`/`˧` (`_L`/`_H`/`_M`), `ʰ` (`_h`). Written that way, the sound round-trips exactly.
261
- - *Unencodable* — `ⱱ`, `ˀ`, `ᵊ`, `͈`, `^` are dropped: X-SAMPA has no notation for the labiodental flap (X-SAMPA predates the IPA's 2005 adoption of the symbol, and the standard chart marks that cell as having none), for glottalization, schwa release, or extIPA strong articulation, and unit prominence is house IPA notation that X-SAMPA never had. An invented spelling would collide with notation already in use, so these stay unmapped rather than approximated.
277
+ - *Unencodable* — `ⱱ`, `ˀ`, `ᵊ`, `ᵐ`, `ˢ`, `ʳ`, `ʶ`, `͈`, `^` are dropped: X-SAMPA has no notation for the labiodental flap (X-SAMPA predates the IPA's 2005 adoption of the symbol, and the standard chart marks that cell as having none), for glottalization, schwa release, bilabial nasal release, sibilant release, trilled release, uvular release, or extIPA strong articulation, and unit prominence is house IPA notation that X-SAMPA never had. `_n` already means generic nasal release and `_m` means laminal, so neither can preserve `ᵐ`'s distinction; existing s, r, and uvular spellings describe whole segments rather than these release phases. Invented spellings would collide with notation already in use, so these stay unmapped rather than approximated.
262
278
  - *Declined rather than impossible* — `ʱ` is dropped too, and for a different reason worth keeping separate from the four above. It had a curated encoding, `_hh`, which extended X-SAMPA's `_h`, so `ʰh` and `ʰɦ` both read back as `ʱ`: an ambiguity ipakit introduced rather than one the standard has. IPA is the primary notation and X-SAMPA a convenience, so declining to spell one mark there costs less than inventing an ambiguity to keep it.
263
279
 
264
280
  A dropped symbol takes its neighbors' adjacency with it (`kⱱt → kt`), which is what `strict=True` is for: `to_xsampa("kⱱt", strict=True)` raises `ValueError` naming the symbol instead. The CMU, TIMIT, and Kirshenbaum mappings are lossy (they collapse IPA distinctions) and carry no round-trip guarantee; Kirshenbaum has no labiodental-flap notation either.
@@ -325,5 +341,7 @@ table and the phone-distance matrix) against their generators in `scripts/`.
325
341
  ## License
326
342
 
327
343
  BSD 2-Clause — see [LICENSE](https://github.com/lenzo-ka/ipakit/blob/main/LICENSE).
328
- Third-party data retain their separate terms; the shipped PHOIBLE source
329
- aggregate carries [file-scoped notices and licenses](ipakit/data/phoible/NOTICE.txt).
344
+ Third-party data retain their separate terms; the shipped PHOIBLE dataset and
345
+ bibliography carry [file-scoped notices and licenses](ipakit/data/phoible/NOTICE.txt).
346
+ PHOIBLE mapping tables and eSpeak phoneme tables are read from user-supplied
347
+ sources and are not included in the wheel.
@@ -9,10 +9,34 @@ per session (rather than once per test) keeps the suite fast. The instances are
9
9
  treated as read-only by the tests, so sharing them across tests is safe.
10
10
  """
11
11
 
12
+ import os
13
+
12
14
  import pytest
13
15
  from ipakit import CMUMapper, IPAFeatures
14
16
 
15
17
 
18
+ def pytest_collection_modifyitems(items): # type: ignore[no-untyped-def]
19
+ """Skip source-dependent eSpeak integration tests when no source is supplied."""
20
+ if os.environ.get("IPAKIT_ESPEAK_NG"):
21
+ return
22
+ reason = "set IPAKIT_ESPEAK_NG to run tests requiring eSpeak NG source"
23
+ for item in items:
24
+ path = item.path.name
25
+ if (
26
+ path == "test_espeak_binary.py"
27
+ or (
28
+ path in {"test_bridges.py", "test_inventories.py"}
29
+ and (
30
+ "espeak" in item.name
31
+ or item.name == "test_styles_normalize_canonically_equivalent_input"
32
+ )
33
+ and item.name != "test_espeak_requires_user_source"
34
+ )
35
+ or (path == "test_phoneset_comparison.py" and "espeak" in item.nodeid)
36
+ ):
37
+ item.add_marker(pytest.mark.skip(reason=reason))
38
+
39
+
16
40
  @pytest.fixture(autouse=True)
17
41
  def _doctest_ipakit(doctest_namespace): # type: ignore[no-untyped-def]
18
42
  import ipakit
@@ -40,18 +40,19 @@ keep source distinctions, coverage and conversion losses explicit.
40
40
  | --- | --- |
41
41
  | [Comparative systems](systems.md) | Compare organizing principles and implemented boundaries across models. |
42
42
  | [Inventories and styles](inventories.md) | Named vocabularies, strict reading/spelling and dictionary-derived inventories. |
43
- | [PHOIBLE source inventories](phoible.md) | Shipped complete source catalog, explicit checkout overrides, doculect provenance and import refusals. |
43
+ | [PHOIBLE source inventories](phoible.md) | Shipped main catalog, user-supplied mapping tables, doculect provenance and import refusals. |
44
44
  | [Inventory supplements](supplements.md) | Extend the house declaration and understand the effects on realization and comparison. |
45
45
  | [Pinyin](pinyin.md) | Syllable-hosted tone, orthographic rendering and the internal graph-constructor boundary. |
46
46
  | [Kana](kana.md) | Mora-tier rendering and bounded curated-adaptation API/CLI support. |
47
47
  | [CLTS/BIPA](clts-audit.md) | Frozen native feature-set/Jaccard scoring, shared cost comparisons, source extraction and provenance; semantic mapping remains unresolved. |
48
+ | [CLTS import](clts-import.md) | Import explicit source tokens into a native graph, inspect refusals and preservation, and reload same-provenance envelopes. |
48
49
  | [CLTS/BIPA coverage gaps](clts-gaps.md) | Generated coverage and refusal counts for the frozen CLTS/BIPA snapshot. |
49
50
  | [CLTS mapping table](clts-mapping.md) | Generated directional mapping evidence for the bounded CLTS correspondence. |
50
51
  | [Finite model operations](model-operations.md) | Typed declarations, explicit model CLI selection, feature edits and exact realization candidates; links to finite rules and transforms. |
51
52
  | [Operations across inventories](inventory-operations.md) | House and Panphon matching and respelling, custom declarations, and all-pairs comparisons across named cost models. |
52
53
  | [Feature transformations](feature-transforms.md) | Declared finite re-encoding, explicit loss and preimages, and binary comparison through shared cost/alignment machinery. |
53
54
  | [MFA vocabulary exhibit](mfa-vocabularies.md) | Generated declarations, source pins and refusal classes. |
54
- | [eSpeak vocabulary exhibit](espeak-vocabularies.md) | Generated language-scoped and union vocabulary coverage. |
55
+ | [eSpeak vocabulary exhibit](espeak-vocabularies.md) | User-source-generated language-scoped and union vocabulary coverage. |
55
56
  | [House declaration exhibits](house-style-exhibits.md) | Generated tie, boundary and character-class inventories behind the house conventions. |
56
57
 
57
58
  ## Rules and comparison
@@ -221,11 +221,12 @@ and comparison tooling are usable today. The [CLTS/BIPA library](clts-audit.md)
221
221
  provides a frozen finite core feature snapshot, native Jaccard scoring, shared
222
222
  alignment cost packs, and a declaration census. Runtime scoring uses the shipped
223
223
  snapshot; development extraction has separate source pins and validation.
224
- The CLTS source-preserving runtime bridge remains in development. A public
225
- importer that retains source-only CLTS claims safely in `Form` still requires
226
- an adaptation/restoration boundary, guarded incomplete projections, and
227
- directional mapping artifacts. The existing scripts provide auditing and
228
- approximation. Full native graph persistence and the public `Form.to_json()`
224
+ The [CLTS import](clts-import.md) turns explicitly segmented CLTS tokens into
225
+ a house `Form` for the reviewed plain stops `p b t d` and refuses every other
226
+ occurrence with a per-occurrence report; preserve mode keeps the native source
227
+ graph instead. A house `Form` does not carry source-only CLTS claims: a
228
+ preserved import is source-complete and house-incomplete, and `house_form()`
229
+ refuses it. The existing scripts provide auditing and approximation. Full native graph persistence and the public `Form.to_json()`
229
230
  linear projection have separate fidelity contracts.
230
231
 
231
232
  The [historical ecosystem assessment](design/ecosystem.md) retains the
@@ -11,7 +11,7 @@ objects or require caller-supplied graph structure and linguistic choices.
11
11
  | Module implementation support imports | `annotations`, `Any`, `Iterable`, `Path`, `Sequence` | **Library-only by decision:** these are non-underscored bindings used by the flat module's implementation and type annotations, not ipakit capabilities suitable for CLI commands. |
12
12
  | Canonical forms, graph construction, containment, serialization, and DOT rendering | `Form`, `FormBuilder`, `FormProjectionError`, `Attribute`, `Boundary`, `Interval`, `Node`, `Timing`, `Unit`, `levels`, `tier_names`, `units`, `read`, `read_json`, `read_graph_json`, `write_graph_json`, `to_dot`, `Form.graph`, `Form.at`, `Form.to_dot` | **CLI-reachable:** `convert to-json [--pretty]`, `convert from-json`, `graph-json`, `rules units`, and `tiergraph IPA` / `tiergraph --from-json PATH`; graph editing is available through the library constructors. |
13
13
  | Segments and normalization | `Constituent`, `Kind`, `Segment`, `Sense`, `tokenize`, `segmented`, `segments`, `segment`, `to_ipa`, `normalize`, `from_wild`, `normalize_lookalikes`, `add_ties` | **CLI-reachable:** `convert tokenize`, `normalize`, and `add-ties`; `features` intentionally offers interactive lookalike reading. |
14
- | Feature lookup, querying, and respelling | `Feature`, `FeatureNarrowingWarning`, `FeatureQuery`, `Phone`, `PhoneMapping`, `Phoneset`, `features`, `feature_values`, `features_from_cmu`, `features_from_xsampa`, `feature_bundles`, `phones_matching`, `to_phone`, `respell`, `find`, `features_to_shorts`, `shorts_to_features`, `import_phoneset` | **CLI-reachable:** `features`; `query match`, `list`, `features`, `classes`, and `shorts` provide the terminal views and searches. The warning type is the Python control surface for narrowing reads. |
14
+ | Feature lookup, querying, and respelling | `Feature`, `FeatureNarrowingWarning`, `InputLossWarning`, `FeatureQuery`, `Phone`, `PhoneMapping`, `Phoneset`, `features`, `feature_values`, `features_from_cmu`, `features_from_xsampa`, `feature_bundles`, `phones_matching`, `to_phone`, `respell`, `find`, `features_to_shorts`, `shorts_to_features`, `import_phoneset` | **CLI-reachable:** `features`; `query match`, `list`, `features`, `classes`, and `shorts` provide the terminal views and searches. The warning types are the Python control surface for narrowing reads and input loss. |
15
15
  | Description, references, validation, and hierarchy | `wiki`, `wiki_ref`, `wiki_refs`, `describe`, `natural_class`, `minimal_pairs`, `nearest_phones`, `hierarchy`, `hierarchy_text`, `hierarchy_dot`, `stress_markers`, `validate_ipa`, `is_valid_ipa`, `extensions_in`, `is_pure_ipa` | **CLI-reachable:** `describe`; `analysis`; `hierarchy`; `info stress`; and `analyze` provide the useful terminal reports. |
16
16
  | Raw distance and inventory-relative percentile positions | `Alignment`, `AlignmentStep`, `CostSchedule`, `Correspondence`, `Coverage`, `PhoneCost`, `PhonePosition`, `UnusableReferenceWarning`, `PhonesetMapping`, `PhonesetComparison`, `PronunciationMatch`, `ScoringParameters`, `SequenceMatch`, `TranscriptionDistanceResult`, `DistanceModel`, `distance`, `segment_distance`, `pairwise_distances`, `transcription_distance`, `directional_transcription_distance`, `transcription_similarity`, `explain_transcription_distance`, `nearest_pronunciation`, `rank_pronunciations`, `sequence_distance`, `sequence_similarity`, `rank_sequences`, `distance_position`, `similarity_position`, `distance_model`, `phoneset_mapping`, `phoneset_comparison` | **CLI-reachable:** `distance pair`, `segment`, `matrix`, `positions`, `transcription`, `nearest`, `seq`, `map`, and `compare`, including alignment/explanation output. `positions` emits `similarity_position` and `distance_position`; `map` relates two phonesets in one selected way; `compare` reports the ordered sets, nearest mappings both ways, similarity matrix, source terms, directional means and worst cases, asymmetry, and caller-chosen `--coverage-at` thresholds. |
17
17
  | Inventory lookup and construction | `Inventory`, `Style`, `inventories`, `inventory`, `inventory_from_dictionary` | **CLI-reachable:** `inventory list`, `inventory show`, and `inventory from-dict`, including `min_entries` as `--min-entries` and `refuse_unreadable` as `--refuse-unreadable`. |
@@ -37,9 +37,9 @@ upstream resolver may support additional sounds.
37
37
  Inspect `requested`, `entries` and `excluded` for the exact generated
38
38
  population. The full CLTS-to-Form importer and general semantic feature mapping
39
39
  remain separate work. The [bounded correspondence authority](clts-mapping.md)
40
- records four exact plain-stop witnesses; its
40
+ records profile-bound reviewed plain-stop projections; its
41
41
  [generated gap report](clts-gaps.md) accounts for master declarations while
42
- keeping unresolved mappings and pending structural-profile binding explicit.
42
+ keeping unresolved mappings and the bounded profile context explicit.
43
43
 
44
44
  <a id="substitute-the-cost-model-not-the-aligner"></a>
45
45