utterplan 0.2.0__tar.gz → 0.3.1__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 (233) hide show
  1. {utterplan-0.2.0 → utterplan-0.3.1}/.github/workflows/python-publish.yml +19 -9
  2. utterplan-0.3.1/.github/workflows/tests.yml +177 -0
  3. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +12 -0
  4. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/audit/commit-audit.yaml +148 -0
  5. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0001.md +85 -0
  6. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0002.md +29 -0
  7. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0003.md +32 -0
  8. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0004.md +28 -0
  9. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0005.md +30 -0
  10. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0006.md +29 -0
  11. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/release.md +27 -0
  12. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.1/audit/commit-audit.yaml +57 -0
  13. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.1/entries/entry-0001.md +42 -0
  14. utterplan-0.3.1/.ledger/releaseledger/data/ledgers/main/releases/0.3.1/release.md +27 -0
  15. utterplan-0.3.1/.ledger/releaseledger/work/0.3.0/audit-decisions.yaml +72 -0
  16. utterplan-0.3.1/.ledger/releaseledger/work/0.3.0/audit.yaml +85 -0
  17. utterplan-0.3.1/.ledger/releaseledger/work/0.3.0/entries.yaml +160 -0
  18. utterplan-0.3.1/.ledger/releaseledger/work/0.3.0/evidence/49023f0.patch +6377 -0
  19. utterplan-0.3.1/.ledger/releaseledger/work/0.3.0/evidence/manifest.json +81 -0
  20. utterplan-0.3.1/.ledger/releaseledger/work/0.3.0/range.json +13 -0
  21. utterplan-0.3.1/.ledger/releaseledger/work/0.3.1/audit-decisions.yaml +23 -0
  22. utterplan-0.3.1/.ledger/releaseledger/work/0.3.1/audit.yaml +40 -0
  23. utterplan-0.3.1/.ledger/releaseledger/work/0.3.1/entries.yaml +37 -0
  24. utterplan-0.3.1/.ledger/releaseledger/work/0.3.1/evidence/70adac0.patch +916 -0
  25. utterplan-0.3.1/.ledger/releaseledger/work/0.3.1/evidence/manifest.json +36 -0
  26. utterplan-0.3.1/.ledger/releaseledger/work/0.3.1/range.json +13 -0
  27. utterplan-0.3.1/01_todo.md +1796 -0
  28. {utterplan-0.2.0/utterplan.egg-info → utterplan-0.3.1}/PKG-INFO +34 -8
  29. {utterplan-0.2.0 → utterplan-0.3.1}/README.md +31 -6
  30. {utterplan-0.2.0 → utterplan-0.3.1}/docs/architecture.md +8 -0
  31. {utterplan-0.2.0 → utterplan-0.3.1}/docs/changelog.md +30 -0
  32. {utterplan-0.2.0 → utterplan-0.3.1}/docs/cli.md +21 -6
  33. utterplan-0.3.1/docs/consumer-guide.md +130 -0
  34. {utterplan-0.2.0 → utterplan-0.3.1}/docs/coordinate-spaces.md +2 -0
  35. {utterplan-0.2.0 → utterplan-0.3.1}/docs/debugging.md +3 -1
  36. {utterplan-0.2.0 → utterplan-0.3.1}/docs/format.md +8 -9
  37. {utterplan-0.2.0 → utterplan-0.3.1}/docs/getting-started.md +7 -3
  38. utterplan-0.3.1/docs/python-api.md +187 -0
  39. utterplan-0.3.1/examples/chapter.ssmd +7 -0
  40. utterplan-0.3.1/plan.md +111 -0
  41. {utterplan-0.2.0 → utterplan-0.3.1}/pyproject.toml +2 -1
  42. utterplan-0.3.1/spec/schemas/v3.schema.json +407 -0
  43. {utterplan-0.2.0 → utterplan-0.3.1}/spec/utterplan.schema.json +104 -8
  44. utterplan-0.3.1/tests/fixtures/ssmd_09_comprehensive.ssmd +45 -0
  45. {utterplan-0.2.0 → utterplan-0.3.1}/tests/golden/basic_en.utterplan.json +3 -5
  46. utterplan-0.3.1/tests/golden/directives.utterplan.json +176 -0
  47. {utterplan-0.2.0 → utterplan-0.3.1}/tests/golden/markers.utterplan.json +3 -5
  48. {utterplan-0.2.0 → utterplan-0.3.1}/tests/golden/multilingual.utterplan.json +3 -5
  49. {utterplan-0.2.0 → utterplan-0.3.1}/tests/golden/parenthetical.utterplan.json +3 -5
  50. {utterplan-0.2.0 → utterplan-0.3.1}/tests/golden/spokenform_offsets.utterplan.json +3 -5
  51. utterplan-0.3.1/tests/golden/ssmd_09_comprehensive.utterplan.json +1669 -0
  52. {utterplan-0.2.0 → utterplan-0.3.1}/tests/golden/ssmd_breaks.utterplan.json +3 -5
  53. {utterplan-0.2.0 → utterplan-0.3.1}/tests/migration/cases.py +23 -7
  54. utterplan-0.3.1/tests/migration/goldens/multilingual_preparation.json +132 -0
  55. utterplan-0.3.1/tests/migration/goldens/spokenform_numbers.json +86 -0
  56. utterplan-0.3.1/tests/migration/goldens/ssmd_break.json +96 -0
  57. utterplan-0.3.1/tests/migration/goldens/ssmd_language_detection.json +77 -0
  58. utterplan-0.3.1/tests/migration/goldens/ssmd_marker.json +102 -0
  59. utterplan-0.3.1/tests/migration/goldens/ssmd_pronunciation.json +103 -0
  60. utterplan-0.3.1/tests/schema_history/README.md +9 -0
  61. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_boundaries.py +6 -2
  62. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_cli.py +13 -6
  63. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_consumer_contract.py +45 -11
  64. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_consumer_readiness.py +119 -35
  65. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_coordinates.py +6 -4
  66. utterplan-0.3.1/tests/test_directives.py +189 -0
  67. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_explain.py +34 -3
  68. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_fake_renderer.py +30 -2
  69. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_format.py +19 -1
  70. utterplan-0.3.1/tests/test_golden.py +59 -0
  71. utterplan-0.3.1/tests/test_identity_units.py +42 -0
  72. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_linguistics.py +116 -28
  73. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_migration_framework.py +35 -4
  74. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_pauses.py +31 -5
  75. utterplan-0.3.1/tests/test_planner.py +268 -0
  76. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_preparation.py +28 -7
  77. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_public_identity.py +3 -1
  78. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_schema_history.py +30 -3
  79. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_schema_registry.py +11 -6
  80. utterplan-0.3.1/tests/test_ssmd_09_parser.py +261 -0
  81. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/__init__.py +6 -0
  82. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/_version.py +3 -3
  83. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/cli.py +22 -5
  84. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/config.py +11 -16
  85. utterplan-0.3.1/utterplan/directives.py +206 -0
  86. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/explain.py +112 -16
  87. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/language.py +25 -11
  88. utterplan-0.3.1/utterplan/migrations/__init__.py +12 -0
  89. utterplan-0.3.1/utterplan/migrations/v2_to_v3.py +35 -0
  90. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/model.py +132 -21
  91. utterplan-0.3.1/utterplan/parsers.py +412 -0
  92. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/pauses.py +11 -1
  93. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/planner.py +378 -50
  94. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/preparation.py +5 -2
  95. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/schema_registry.py +1 -0
  96. utterplan-0.3.1/utterplan/schemas/v3.schema.json +407 -0
  97. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/utterplan.schema.json +104 -8
  98. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/versioning.py +2 -2
  99. {utterplan-0.2.0 → utterplan-0.3.1/utterplan.egg-info}/PKG-INFO +34 -8
  100. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan.egg-info/SOURCES.txt +33 -3
  101. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan.egg-info/requires.txt +1 -1
  102. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan.egg-info/scm_file_list.json +32 -2
  103. utterplan-0.3.1/utterplan.egg-info/scm_version.json +8 -0
  104. utterplan-0.2.0/.github/workflows/tests.yml +0 -97
  105. utterplan-0.2.0/docs/consumer-guide.md +0 -85
  106. utterplan-0.2.0/docs/python-api.md +0 -88
  107. utterplan-0.2.0/examples/chapter.ssmd +0 -1
  108. utterplan-0.2.0/tests/migration/goldens/multilingual_preparation.json +0 -29
  109. utterplan-0.2.0/tests/migration/goldens/spokenform_numbers.json +0 -6
  110. utterplan-0.2.0/tests/migration/goldens/ssmd_break.json +0 -47
  111. utterplan-0.2.0/tests/migration/goldens/ssmd_language_detection.json +0 -4
  112. utterplan-0.2.0/tests/migration/goldens/ssmd_marker.json +0 -15
  113. utterplan-0.2.0/tests/migration/goldens/ssmd_pronunciation.json +0 -35
  114. utterplan-0.2.0/tests/schema_history/README.md +0 -10
  115. utterplan-0.2.0/tests/test_directives.py +0 -97
  116. utterplan-0.2.0/tests/test_golden.py +0 -16
  117. utterplan-0.2.0/tests/test_identity_units.py +0 -16
  118. utterplan-0.2.0/tests/test_planner.py +0 -50
  119. utterplan-0.2.0/utterplan/directives.py +0 -95
  120. utterplan-0.2.0/utterplan/migrations/__init__.py +0 -6
  121. utterplan-0.2.0/utterplan/parsers.py +0 -309
  122. utterplan-0.2.0/utterplan/stages/segmentation/__init__.py +0 -0
  123. utterplan-0.2.0/utterplan/stages/segmentation/phrasplit.py +0 -35
  124. utterplan-0.2.0/utterplan.egg-info/scm_version.json +0 -8
  125. {utterplan-0.2.0 → utterplan-0.3.1}/.codecrate.toml +0 -0
  126. {utterplan-0.2.0 → utterplan-0.3.1}/.github/workflows/codecov.yml +0 -0
  127. {utterplan-0.2.0 → utterplan-0.3.1}/.github/workflows/pre-commit.yml +0 -0
  128. {utterplan-0.2.0 → utterplan-0.3.1}/.gitignore +0 -0
  129. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/ledger.toml +0 -0
  130. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/.ledger-project.toml +0 -0
  131. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/config.toml +0 -0
  132. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
  133. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0001.md +0 -0
  134. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0002.md +0 -0
  135. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0003.md +0 -0
  136. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0004.md +0 -0
  137. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/release.md +0 -0
  138. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/entries/entry-0001.md +0 -0
  139. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/release.md +0 -0
  140. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/audit/commit-audit.yaml +0 -0
  141. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0001.md +0 -0
  142. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0002.md +0 -0
  143. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0003.md +0 -0
  144. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0004.md +0 -0
  145. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0005.md +0 -0
  146. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0006.md +0 -0
  147. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/release.md +0 -0
  148. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/audit/commit-audit.yaml +0 -0
  149. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0001.md +0 -0
  150. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0002.md +0 -0
  151. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0003.md +0 -0
  152. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0004.md +0 -0
  153. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/release.md +0 -0
  154. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.1.2/audit-decisions.yaml +0 -0
  155. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.1.2/audit.yaml +0 -0
  156. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.1.2/entries.yaml +0 -0
  157. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.1.2/evidence/2c64e29.patch +0 -0
  158. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.1.2/evidence/4022753.patch +0 -0
  159. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.1.2/evidence/66a88b6.patch +0 -0
  160. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.1.2/evidence/manifest.json +0 -0
  161. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.1.2/range.json +0 -0
  162. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.2.0/audit-decisions.yaml +0 -0
  163. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.2.0/audit.yaml +0 -0
  164. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.2.0/entries.yaml +0 -0
  165. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.2.0/evidence/9637182.patch +0 -0
  166. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.2.0/evidence/c52aa68.patch +0 -0
  167. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.2.0/evidence/e49a6dd.patch +0 -0
  168. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.2.0/evidence/manifest.json +0 -0
  169. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/work/0.2.0/range.json +0 -0
  170. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/releaseledger/write.lock +0 -0
  171. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/taskledger/.ledger-project.toml +0 -0
  172. {utterplan-0.2.0 → utterplan-0.3.1}/.ledger/taskledger/config.toml +0 -0
  173. {utterplan-0.2.0 → utterplan-0.3.1}/.pre-commit-config.yaml +0 -0
  174. {utterplan-0.2.0 → utterplan-0.3.1}/AGENTS.md +0 -0
  175. {utterplan-0.2.0 → utterplan-0.3.1}/LICENSE +0 -0
  176. {utterplan-0.2.0 → utterplan-0.3.1}/NOTICE +0 -0
  177. {utterplan-0.2.0 → utterplan-0.3.1}/docs/Makefile +0 -0
  178. {utterplan-0.2.0 → utterplan-0.3.1}/docs/conf.py +0 -0
  179. {utterplan-0.2.0 → utterplan-0.3.1}/docs/index.md +0 -0
  180. {utterplan-0.2.0 → utterplan-0.3.1}/docs/make.bat +0 -0
  181. {utterplan-0.2.0 → utterplan-0.3.1}/docs/phase-a-completion.md +0 -0
  182. {utterplan-0.2.0 → utterplan-0.3.1}/docs/pykokoro-integration.md +0 -0
  183. {utterplan-0.2.0 → utterplan-0.3.1}/docs/requirements.txt +0 -0
  184. {utterplan-0.2.0 → utterplan-0.3.1}/examples/basic.py +0 -0
  185. {utterplan-0.2.0 → utterplan-0.3.1}/examples/compile_file.py +0 -0
  186. {utterplan-0.2.0 → utterplan-0.3.1}/examples/inspect_plan.py +0 -0
  187. {utterplan-0.2.0 → utterplan-0.3.1}/examples/multilingual.py +0 -0
  188. {utterplan-0.2.0 → utterplan-0.3.1}/examples/ssmd_example.py +0 -0
  189. {utterplan-0.2.0 → utterplan-0.3.1}/setup.cfg +0 -0
  190. {utterplan-0.2.0 → utterplan-0.3.1}/spec/schemas/v1.schema.json +0 -0
  191. {utterplan-0.2.0 → utterplan-0.3.1}/spec/schemas/v2.schema.json +0 -0
  192. {utterplan-0.2.0 → utterplan-0.3.1}/tests/__init__.py +0 -0
  193. {utterplan-0.2.0 → utterplan-0.3.1}/tests/migration/__init__.py +0 -0
  194. {utterplan-0.2.0 → utterplan-0.3.1}/tests/migration/test_semantic_migration_regressions.py +0 -0
  195. {utterplan-0.2.0 → utterplan-0.3.1}/tests/schema_history/v1/basic.json +0 -0
  196. {utterplan-0.2.0 → utterplan-0.3.1}/tests/schema_history/v1/directives.json +0 -0
  197. {utterplan-0.2.0 → utterplan-0.3.1}/tests/schema_history/v1/markers.json +0 -0
  198. {utterplan-0.2.0 → utterplan-0.3.1}/tests/schema_history/v1/multilingual.json +0 -0
  199. {utterplan-0.2.0 → utterplan-0.3.1}/tests/schema_history/v1/parenthetical.json +0 -0
  200. {utterplan-0.2.0 → utterplan-0.3.1}/tests/schema_history/v1/spokenform_offsets.json +0 -0
  201. {utterplan-0.2.0 → utterplan-0.3.1}/tests/schema_history/v1/ssmd_breaks.json +0 -0
  202. /utterplan-0.2.0/tests/golden/directives.utterplan.json → /utterplan-0.3.1/tests/schema_history/v2/directives.json +0 -0
  203. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_import_boundaries.py +0 -0
  204. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_language.py +0 -0
  205. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_schema_strict.py +0 -0
  206. {utterplan-0.2.0 → utterplan-0.3.1}/tests/test_version.py +0 -0
  207. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/__main__.py +0 -0
  208. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/diagnostics.py +0 -0
  209. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/exceptions.py +0 -0
  210. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/format.py +0 -0
  211. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/hashing.py +0 -0
  212. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/linguistics.py +0 -0
  213. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/migration.py +0 -0
  214. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/migrations/registry.py +0 -0
  215. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/migrations/v1_to_v2.py +0 -0
  216. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/py.typed +0 -0
  217. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/schemas/v1.schema.json +0 -0
  218. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/schemas/v2.schema.json +0 -0
  219. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/serialization.py +0 -0
  220. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/spacy_models.py +0 -0
  221. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/spans.py +0 -0
  222. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/stages/__init__.py +0 -0
  223. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/stages/document/__init__.py +0 -0
  224. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/stages/document/plain.py +0 -0
  225. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/stages/document/ssmd.py +0 -0
  226. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/stages/preparation/__init__.py +0 -0
  227. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/stages/preparation/identity.py +0 -0
  228. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/stages/preparation/spokenform.py +0 -0
  229. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/stages/protocols.py +0 -0
  230. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan/units.py +0 -0
  231. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan.egg-info/dependency_links.txt +0 -0
  232. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan.egg-info/entry_points.txt +0 -0
  233. {utterplan-0.2.0 → utterplan-0.3.1}/utterplan.egg-info/top_level.txt +0 -0
@@ -45,18 +45,21 @@ jobs:
45
45
  from packaging.requirements import Requirement
46
46
  from packaging.version import Version
47
47
 
48
- def has_minimum(requirements, name, minimum):
48
+ def has_range(requirements, name, minimum, maximum):
49
49
  minimum_version = Version(minimum)
50
+ maximum_version = Version(maximum)
50
51
  return any(
51
52
  requirement.name == name
52
53
  and any(
53
- spec.operator in (">=", ">", "==")
54
- and Version(spec.version) >= minimum_version
54
+ spec.operator == ">=" and Version(spec.version) == minimum_version
55
+ for spec in requirement.specifier
56
+ )
57
+ and any(
58
+ spec.operator == "<" and Version(spec.version) == maximum_version
55
59
  for spec in requirement.specifier
56
60
  )
57
61
  for requirement in requirements
58
62
  )
59
-
60
63
  tag_version = os.environ["RELEASE_TAG"].removeprefix("v")
61
64
  artifacts = list(Path("dist").iterdir())
62
65
  wheels = [path for path in artifacts if path.suffix == ".whl"]
@@ -76,11 +79,18 @@ jobs:
76
79
  requirements = [
77
80
  Requirement(value) for value in metadata.get_all("Requires-Dist", [])
78
81
  ]
79
- assert has_minimum(requirements, "phrasplit", "0.3.9")
80
- assert has_minimum(requirements, "ssmd", "0.8.7")
81
- assert has_minimum(requirements, "spokenform", "0.4.3")
82
- assert any(name.endswith("utterplan/py.typed") for name in archive.namelist())
83
- assert any(name.endswith("utterplan/utterplan.schema.json") for name in archive.namelist())
82
+ assert has_range(requirements, "phrasplit", "0.3.9", "0.4")
83
+ assert has_range(requirements, "ssmd", "0.9.0", "0.10")
84
+ assert has_range(requirements, "spokenform", "0.4.3", "0.5")
85
+ names = set(archive.namelist())
86
+ expected = {
87
+ "utterplan/py.typed",
88
+ "utterplan/utterplan.schema.json",
89
+ "utterplan/schemas/v1.schema.json",
90
+ "utterplan/schemas/v2.schema.json",
91
+ "utterplan/schemas/v3.schema.json",
92
+ }
93
+ assert expected <= names
84
94
  PY
85
95
 
86
96
  - name: Publish package to PyPI
@@ -0,0 +1,177 @@
1
+ name: Run tests
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ workflow_call:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ${{ matrix.os }}
11
+ strategy:
12
+ matrix:
13
+ os: [ubuntu-latest, windows-latest, macos-latest]
14
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - name: Set up Python
18
+ uses: actions/setup-python@v5
19
+ with:
20
+ python-version: ${{ matrix.python-version }}
21
+ - name: Install package
22
+ run: |
23
+ python -m pip install --upgrade pip
24
+ python -m pip install -e ".[dev]"
25
+ python -m compileall -q utterplan tests
26
+ - name: Type-check package
27
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13'
28
+ run: python -m mypy utterplan
29
+ - name: Lint package
30
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13'
31
+ run: python -m ruff check .
32
+ - name: Run tests
33
+ run: python -m pytest -q
34
+
35
+ lower-bounds:
36
+ runs-on: ubuntu-latest
37
+ steps:
38
+ - uses: actions/checkout@v4
39
+ - name: Set up Python
40
+ uses: actions/setup-python@v5
41
+ with:
42
+ python-version: "3.10"
43
+ - name: Install lower-bound dependencies
44
+ run: |
45
+ python -m pip install --upgrade pip
46
+ python -m pip install pytest jsonschema
47
+ python -m pip install \
48
+ "phrasplit==0.3.9" \
49
+ "ssmd==0.9.0" \
50
+ "spokenform==0.4.3" \
51
+ "typing_extensions>=4.0"
52
+ python -m pip install --no-deps -e .
53
+ - name: Run lower-bound tests
54
+ run: python -m pytest -q
55
+
56
+ package-smoke:
57
+ runs-on: ubuntu-latest
58
+ steps:
59
+ - uses: actions/checkout@v4
60
+ - name: Set up Python
61
+ uses: actions/setup-python@v5
62
+ with:
63
+ python-version: "3.12"
64
+ - name: Build wheel and sdist
65
+ run: |
66
+ python -m pip install --upgrade pip build
67
+ python -m build --outdir "$RUNNER_TEMP/dist"
68
+ - name: Verify wheel and sdist contents and dependency metadata
69
+ run: |
70
+ python - <<'PY'
71
+ import os
72
+ import tarfile
73
+ from email import policy
74
+ from email.parser import Parser
75
+ from pathlib import Path
76
+ from zipfile import ZipFile
77
+
78
+ from packaging.requirements import Requirement
79
+ from packaging.version import Version
80
+
81
+ artifacts = Path(os.environ["RUNNER_TEMP"]) / "dist"
82
+ wheel = next(artifacts.glob("*.whl"))
83
+ sdist = next(artifacts.glob("*.tar.gz"))
84
+ expected = {
85
+ "utterplan/py.typed",
86
+ "utterplan/utterplan.schema.json",
87
+ "utterplan/schemas/v1.schema.json",
88
+ "utterplan/schemas/v2.schema.json",
89
+ "utterplan/schemas/v3.schema.json",
90
+ }
91
+ expected_ranges = {
92
+ "phrasplit": ("0.3.9", "0.4"),
93
+ "ssmd": ("0.9.0", "0.10"),
94
+ "spokenform": ("0.4.3", "0.5"),
95
+ }
96
+
97
+ def check_metadata(contents):
98
+ metadata = Parser(policy=policy.default).parsestr(contents)
99
+ requirements = metadata.get_all("Requires-Dist", [])
100
+ for name, (minimum, maximum) in expected_ranges.items():
101
+ requirement = next(
102
+ Requirement(value)
103
+ for value in requirements
104
+ if Requirement(value).name == name
105
+ )
106
+ assert any(
107
+ spec.operator == ">=" and Version(spec.version) == Version(minimum)
108
+ for spec in requirement.specifier
109
+ ), (name, requirement)
110
+ assert any(
111
+ spec.operator == "<" and Version(spec.version) == Version(maximum)
112
+ for spec in requirement.specifier
113
+ ), (name, requirement)
114
+
115
+ with ZipFile(wheel) as archive:
116
+ wheel_names = set(archive.namelist())
117
+ assert expected <= wheel_names
118
+ metadata_name = next(
119
+ name for name in wheel_names if name.endswith("METADATA")
120
+ )
121
+ check_metadata(archive.read(metadata_name).decode("utf-8"))
122
+
123
+ with tarfile.open(sdist, "r:gz") as archive:
124
+ sdist_names = archive.getnames()
125
+ assert all(
126
+ any(name.endswith(resource) for name in sdist_names)
127
+ for resource in expected
128
+ )
129
+ metadata_name = next(
130
+ name for name in sdist_names if name.endswith("PKG-INFO")
131
+ )
132
+ check_metadata(
133
+ archive.extractfile(metadata_name).read().decode("utf-8")
134
+ )
135
+ PY
136
+ - name: Install wheel in clean environment
137
+ run: |
138
+ python -m venv "$RUNNER_TEMP/utterplan-wheel-venv"
139
+ "$RUNNER_TEMP/utterplan-wheel-venv/bin/python" -m pip install \
140
+ "$RUNNER_TEMP"/dist/utterplan-*.whl
141
+ - name: Run installed smoke checks
142
+ run: |
143
+ "$RUNNER_TEMP/utterplan-wheel-venv/bin/python" -c \
144
+ "import importlib.metadata as m; import utterplan; assert m.version('utterplan') == utterplan.__version__"
145
+ "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" --version
146
+ cat > "$RUNNER_TEMP/test.ssmd.md" <<'EOF'
147
+ ---
148
+ ssmd_version: "0.9"
149
+ language: en-US
150
+ pause_defaults:
151
+ sentence: 500ms
152
+ ---
153
+ [Hello]{voice-name="test"} ...200ms world.
154
+ EOF
155
+ "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" compile \
156
+ "$RUNNER_TEMP/test.ssmd.md" --lang en-us --text-preparation identity --json \
157
+ > "$RUNNER_TEMP/test.utterplan.json"
158
+ "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" validate \
159
+ "$RUNNER_TEMP/test.utterplan.json"
160
+ cat > "$RUNNER_TEMP/test-0.8.ssmd.md" <<'EOF'
161
+ ---
162
+ ssmd_version: "0.8"
163
+ ---
164
+ Hello.
165
+ EOF
166
+ if "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" compile \
167
+ "$RUNNER_TEMP/test-0.8.ssmd.md" --lang en-us --text-preparation identity --json \
168
+ > "$RUNNER_TEMP/test-0.8.out" 2>&1; then
169
+ cat "$RUNNER_TEMP/test-0.8.out"
170
+ echo "Installed wheel accepted an SSMD 0.8 document" >&2
171
+ exit 1
172
+ fi
173
+ grep -q "header.version_unsupported" "$RUNNER_TEMP/test-0.8.out"
174
+ "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" migrate \
175
+ "$GITHUB_WORKSPACE/tests/schema_history/v1/basic.json" --check
176
+ "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" inspect \
177
+ "$RUNNER_TEMP/test.utterplan.json" --segment 0
@@ -36,3 +36,15 @@
36
36
  {"data":{"updated_rows":3},"event":"audit.updated","event_id":"event-0036","record_revisions":{"commit_audit_sheet":3},"release_version":"0.2.0","schema_version":2}
37
37
  {"data":{"entry_ids":["entry-0001","entry-0002","entry-0003","entry-0004"],"synced_audit_rows":3},"event":"entry.batch_added","event_id":"event-0037","record_revisions":{"commit_audit_sheet":4,"entry:0.2.0/entry-0001":1,"entry:0.2.0/entry-0002":1,"entry:0.2.0/entry-0003":1,"entry:0.2.0/entry-0004":1,"release:0.2.0":3},"release_version":"0.2.0","schema_version":2}
38
38
  {"data":{"released_at":"2026-09-22"},"event":"release.finalized","event_id":"event-0038","record_revisions":{"release:0.2.0":4},"release_version":"0.2.0","schema_version":2}
39
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0039","record_revisions":{"release:0.3.0":1},"release_version":"0.3.0","schema_version":2}
40
+ {"data":{"fields":["git_base_ref","git_base_sha","git_commit_count","git_head_ref","git_head_sha","git_range"]},"event":"release.updated","event_id":"event-0040","record_revisions":{"release:0.3.0":2},"release_version":"0.3.0","schema_version":2}
41
+ {"data":{"row_count":1},"event":"audit.created","event_id":"event-0041","record_revisions":{"commit_audit_sheet":1},"release_version":"0.3.0","schema_version":2}
42
+ {"data":{"updated_rows":1},"event":"audit.updated","event_id":"event-0042","record_revisions":{"commit_audit_sheet":2},"release_version":"0.3.0","schema_version":2}
43
+ {"data":{"entry_ids":["entry-0001","entry-0002","entry-0003","entry-0004","entry-0005","entry-0006"],"synced_audit_rows":1},"event":"entry.batch_added","event_id":"event-0043","record_revisions":{"commit_audit_sheet":3,"entry:0.3.0/entry-0001":1,"entry:0.3.0/entry-0002":1,"entry:0.3.0/entry-0003":1,"entry:0.3.0/entry-0004":1,"entry:0.3.0/entry-0005":1,"entry:0.3.0/entry-0006":1,"release:0.3.0":3},"release_version":"0.3.0","schema_version":2}
44
+ {"data":{"released_at":"2026-09-24"},"event":"release.finalized","event_id":"event-0044","record_revisions":{"release:0.3.0":4},"release_version":"0.3.0","schema_version":2}
45
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0045","record_revisions":{"release:0.3.1":1},"release_version":"0.3.1","schema_version":2}
46
+ {"data":{"fields":["git_base_ref","git_base_sha","git_commit_count","git_head_ref","git_head_sha","git_range"]},"event":"release.updated","event_id":"event-0046","record_revisions":{"release:0.3.1":2},"release_version":"0.3.1","schema_version":2}
47
+ {"data":{"row_count":1},"event":"audit.created","event_id":"event-0047","record_revisions":{"commit_audit_sheet":1},"release_version":"0.3.1","schema_version":2}
48
+ {"data":{"updated_rows":1},"event":"audit.updated","event_id":"event-0048","record_revisions":{"commit_audit_sheet":2},"release_version":"0.3.1","schema_version":2}
49
+ {"data":{"entry_ids":["entry-0001"],"synced_audit_rows":1},"event":"entry.batch_added","event_id":"event-0049","record_revisions":{"commit_audit_sheet":3,"entry:0.3.1/entry-0001":1,"release:0.3.1":3},"release_version":"0.3.1","schema_version":2}
50
+ {"data":{"released_at":"2026-09-27"},"event":"release.finalized","event_id":"event-0050","record_revisions":{"release:0.3.1":4},"release_version":"0.3.1","schema_version":2}
@@ -0,0 +1,148 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 3
6
+ release_version: 0.3.0
7
+ git_base_ref: v0.2.0
8
+ git_base_sha: 215d3a4b43ccaadbf50cb40b752ae30a5b4f39e5
9
+ git_head_ref: HEAD
10
+ git_head_sha: 49023f0470950eb3b1ff9a1c9a928bac5a47575e
11
+ git_range: 215d3a4b43ccaadbf50cb40b752ae30a5b4f39e5..49023f0470950eb3b1ff9a1c9a928bac5a47575e
12
+ commit_count: 1
13
+ rows:
14
+ - sha: 49023f0470950eb3b1ff9a1c9a928bac5a47575e
15
+ source_ref: git:49023f0470950eb3b1ff9a1c9a928bac5a47575e
16
+ short_sha: 49023f0
17
+ changed_paths:
18
+ - .github/workflows/tests.yml
19
+ - README.md
20
+ - docs/architecture.md
21
+ - docs/cli.md
22
+ - docs/consumer-guide.md
23
+ - docs/coordinate-spaces.md
24
+ - docs/debugging.md
25
+ - docs/format.md
26
+ - docs/getting-started.md
27
+ - docs/python-api.md
28
+ - examples/chapter.ssmd
29
+ - pyproject.toml
30
+ - spec/schemas/v3.schema.json
31
+ - spec/utterplan.schema.json
32
+ - tests/fixtures/ssmd_09_comprehensive.ssmd
33
+ - tests/golden/ssmd_09_comprehensive.utterplan.json
34
+ - tests/migration/cases.py
35
+ - tests/migration/goldens/multilingual_preparation.json
36
+ - tests/migration/goldens/spokenform_numbers.json
37
+ - tests/migration/goldens/ssmd_break.json
38
+ - tests/migration/goldens/ssmd_language_detection.json
39
+ - tests/migration/goldens/ssmd_marker.json
40
+ - tests/migration/goldens/ssmd_pronunciation.json
41
+ - tests/schema_history/README.md
42
+ - tests/schema_history/v2/directives.json
43
+ - tests/test_cli.py
44
+ - tests/test_consumer_contract.py
45
+ - tests/test_consumer_readiness.py
46
+ - tests/test_coordinates.py
47
+ - tests/test_directives.py
48
+ - tests/test_explain.py
49
+ - tests/test_fake_renderer.py
50
+ - tests/test_format.py
51
+ - tests/test_golden.py
52
+ - tests/test_migration_framework.py
53
+ - tests/test_preparation.py
54
+ - tests/test_public_identity.py
55
+ - tests/test_schema_history.py
56
+ - tests/test_schema_registry.py
57
+ - tests/test_ssmd_09_parser.py
58
+ - utterplan/__init__.py
59
+ - utterplan/cli.py
60
+ - utterplan/directives.py
61
+ - utterplan/explain.py
62
+ - utterplan/language.py
63
+ - utterplan/migrations/__init__.py
64
+ - utterplan/migrations/v2_to_v3.py
65
+ - utterplan/model.py
66
+ - utterplan/parsers.py
67
+ - utterplan/pauses.py
68
+ - utterplan/planner.py
69
+ - utterplan/preparation.py
70
+ - utterplan/schema_registry.py
71
+ - utterplan/schemas/v3.schema.json
72
+ - utterplan/stages/segmentation/phrasplit.py
73
+ - utterplan/utterplan.schema.json
74
+ - utterplan/versioning.py
75
+ stats:
76
+ files_changed: 57
77
+ insertions: 4920
78
+ deletions: 507
79
+ inspected: true
80
+ inspected_paths:
81
+ - .github/workflows/tests.yml
82
+ - README.md
83
+ - docs/architecture.md
84
+ - docs/cli.md
85
+ - docs/consumer-guide.md
86
+ - docs/coordinate-spaces.md
87
+ - docs/debugging.md
88
+ - docs/format.md
89
+ - docs/getting-started.md
90
+ - docs/python-api.md
91
+ - examples/chapter.ssmd
92
+ - pyproject.toml
93
+ - spec/schemas/v3.schema.json
94
+ - spec/utterplan.schema.json
95
+ - tests/fixtures/ssmd_09_comprehensive.ssmd
96
+ - tests/golden/ssmd_09_comprehensive.utterplan.json
97
+ - tests/migration/cases.py
98
+ - tests/migration/goldens/multilingual_preparation.json
99
+ - tests/migration/goldens/spokenform_numbers.json
100
+ - tests/migration/goldens/ssmd_break.json
101
+ - tests/migration/goldens/ssmd_language_detection.json
102
+ - tests/migration/goldens/ssmd_marker.json
103
+ - tests/migration/goldens/ssmd_pronunciation.json
104
+ - tests/schema_history/README.md
105
+ - tests/schema_history/v2/directives.json
106
+ - tests/test_cli.py
107
+ - tests/test_consumer_contract.py
108
+ - tests/test_consumer_readiness.py
109
+ - tests/test_coordinates.py
110
+ - tests/test_directives.py
111
+ - tests/test_explain.py
112
+ - tests/test_fake_renderer.py
113
+ - tests/test_format.py
114
+ - tests/test_golden.py
115
+ - tests/test_migration_framework.py
116
+ - tests/test_preparation.py
117
+ - tests/test_public_identity.py
118
+ - tests/test_schema_history.py
119
+ - tests/test_schema_registry.py
120
+ - tests/test_ssmd_09_parser.py
121
+ - utterplan/__init__.py
122
+ - utterplan/cli.py
123
+ - utterplan/directives.py
124
+ - utterplan/explain.py
125
+ - utterplan/language.py
126
+ - utterplan/migrations/__init__.py
127
+ - utterplan/migrations/v2_to_v3.py
128
+ - utterplan/model.py
129
+ - utterplan/parsers.py
130
+ - utterplan/pauses.py
131
+ - utterplan/planner.py
132
+ - utterplan/preparation.py
133
+ - utterplan/schema_registry.py
134
+ - utterplan/schemas/v3.schema.json
135
+ - utterplan/stages/segmentation/phrasplit.py
136
+ - utterplan/utterplan.schema.json
137
+ - utterplan/versioning.py
138
+ observed_behavior:
139
+ Adds an SSMD 0.9-only parser and dependency contract, typed renderer-neutral
140
+ schema v3 semantics with source provenance, sequential v1/v2 plan migrations,
141
+ and matching CLI, documentation, and test coverage. The planner remains engine-independent
142
+ and retains deterministic sentence topology.
143
+ public_impact: public
144
+ decision: accepted
145
+ stale: false
146
+ evidence_subject: "feat: support ssmd 0.9 and prepare v3 plan"
147
+ target_entry_id: entry-0001
148
+ notes: ""
@@ -0,0 +1,85 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0001
8
+ release_version: 0.3.0
9
+ kind: changed
10
+ summary: Changed source compatibility to SSMD 0.9 with typed schema v3 plans
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs:
15
+ - git:49023f0470950eb3b1ff9a1c9a928bac5a47575e
16
+ paths:
17
+ - .github/workflows/tests.yml
18
+ - README.md
19
+ - docs/architecture.md
20
+ - docs/cli.md
21
+ - docs/consumer-guide.md
22
+ - docs/coordinate-spaces.md
23
+ - docs/debugging.md
24
+ - docs/format.md
25
+ - docs/getting-started.md
26
+ - docs/python-api.md
27
+ - examples/chapter.ssmd
28
+ - pyproject.toml
29
+ - spec/schemas/v3.schema.json
30
+ - spec/utterplan.schema.json
31
+ - tests/fixtures/ssmd_09_comprehensive.ssmd
32
+ - tests/golden/ssmd_09_comprehensive.utterplan.json
33
+ - tests/migration/cases.py
34
+ - tests/migration/goldens/multilingual_preparation.json
35
+ - tests/migration/goldens/spokenform_numbers.json
36
+ - tests/migration/goldens/ssmd_break.json
37
+ - tests/migration/goldens/ssmd_language_detection.json
38
+ - tests/migration/goldens/ssmd_marker.json
39
+ - tests/migration/goldens/ssmd_pronunciation.json
40
+ - tests/schema_history/README.md
41
+ - tests/schema_history/v2/directives.json
42
+ - tests/test_cli.py
43
+ - tests/test_consumer_contract.py
44
+ - tests/test_consumer_readiness.py
45
+ - tests/test_coordinates.py
46
+ - tests/test_directives.py
47
+ - tests/test_explain.py
48
+ - tests/test_fake_renderer.py
49
+ - tests/test_format.py
50
+ - tests/test_golden.py
51
+ - tests/test_migration_framework.py
52
+ - tests/test_preparation.py
53
+ - tests/test_public_identity.py
54
+ - tests/test_schema_history.py
55
+ - tests/test_schema_registry.py
56
+ - tests/test_ssmd_09_parser.py
57
+ - utterplan/__init__.py
58
+ - utterplan/cli.py
59
+ - utterplan/directives.py
60
+ - utterplan/explain.py
61
+ - utterplan/language.py
62
+ - utterplan/migrations/__init__.py
63
+ - utterplan/migrations/v2_to_v3.py
64
+ - utterplan/model.py
65
+ - utterplan/parsers.py
66
+ - utterplan/pauses.py
67
+ - utterplan/planner.py
68
+ - utterplan/preparation.py
69
+ - utterplan/schema_registry.py
70
+ - utterplan/schemas/v3.schema.json
71
+ - utterplan/stages/segmentation/phrasplit.py
72
+ - utterplan/utterplan.schema.json
73
+ - utterplan/versioning.py
74
+ issues: []
75
+ prs: []
76
+ sources:
77
+ - git:49023f0470950eb3b1ff9a1c9a928bac5a47575e
78
+ contributors:
79
+ - "@holgern"
80
+ breaking: true
81
+ internal: false
82
+ order: 1
83
+ ---
84
+
85
+ SSMD input uses dialect 0.9 and older source syntax is rejected. Schema v3 preserves typed renderer-neutral directives and source provenance; supported v1 and v2 plans migrate to v3 without reparsing or replanning.
@@ -0,0 +1,29 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0002
8
+ release_version: 0.3.0
9
+ kind: fixed
10
+ summary: Fixed precedence so authored SSMD breaks override generated pauses
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs: []
15
+ paths:
16
+ - utterplan/pauses.py
17
+ - tests/test_pauses.py
18
+ - tests/test_ssmd_09_parser.py
19
+ issues: []
20
+ prs: []
21
+ sources:
22
+ - tl:task-0017
23
+ contributors: []
24
+ breaking: false
25
+ internal: false
26
+ order: 2
27
+ ---
28
+
29
+ At a shared boundary, an explicit SSMD break wins over automatic or default pauses. Durations are not added, all contributing event IDs remain in provenance, and an authored zero-duration break still takes precedence.
@@ -0,0 +1,32 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0003
8
+ release_version: 0.3.0
9
+ kind: changed
10
+ summary: Changed Python input defaults and renamed SSMDConfig options
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs: []
15
+ paths:
16
+ - utterplan/config.py
17
+ - utterplan/parsers.py
18
+ - utterplan/planner.py
19
+ - docs/python-api.md
20
+ - docs/consumer-guide.md
21
+ - tests/test_consumer_readiness.py
22
+ issues: []
23
+ prs: []
24
+ sources:
25
+ - tl:task-0017
26
+ contributors: []
27
+ breaking: true
28
+ internal: false
29
+ order: 3
30
+ ---
31
+
32
+ PlannerConfig now treats strings as plain text unless SSMD is selected explicitly. The no-op strict_header and unknown_header options were removed; parse_header and the application pause_defaults option are now parse_yaml_header and pause_overrides. The source-header pause_defaults key remains unchanged.
@@ -0,0 +1,28 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0004
8
+ release_version: 0.3.0
9
+ kind: changed
10
+ summary: Changed clause enrichment to reuse provider-owned spaCy docs
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs: []
15
+ paths:
16
+ - utterplan/planner.py
17
+ - tests/test_linguistics.py
18
+ issues: []
19
+ prs: []
20
+ sources:
21
+ - tl:task-0017
22
+ contributors: []
23
+ breaking: false
24
+ internal: false
25
+ order: 4
26
+ ---
27
+
28
+ Clausal-boundary enrichment reuses the request-local provider document when available. Fallback analysis does not infer syntactic clauses, and sentence topology remains on the deterministic spaCy-free segmentation path.
@@ -0,0 +1,30 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0005
8
+ release_version: 0.3.0
9
+ kind: added
10
+ summary: Added PEP 561 metadata and SSMD 0.9 package checks
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs: []
15
+ paths:
16
+ - utterplan/py.typed
17
+ - pyproject.toml
18
+ - .github/workflows/tests.yml
19
+ - .github/workflows/python-publish.yml
20
+ issues: []
21
+ prs: []
22
+ sources:
23
+ - tl:task-0017
24
+ contributors: []
25
+ breaking: false
26
+ internal: false
27
+ order: 5
28
+ ---
29
+
30
+ Wheel and source-distribution checks require the PEP 561 marker, all schema resources, and the SSMD 0.9 dependency range. Installed-package smoke coverage accepts strict 0.9 input and rejects an explicit 0.8 header.
@@ -0,0 +1,29 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0006
8
+ release_version: 0.3.0
9
+ kind: docs
10
+ summary: Documented the 0.2-to-0.3 migration paths
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs: []
15
+ paths:
16
+ - docs/consumer-guide.md
17
+ - docs/python-api.md
18
+ - docs/format.md
19
+ issues: []
20
+ prs: []
21
+ sources:
22
+ - tl:task-0017
23
+ contributors: []
24
+ breaking: false
25
+ internal: false
26
+ order: 6
27
+ ---
28
+
29
+ The migration guide separates SSMD source conversion with ssmd migrate from UtterPlan JSON schema migration. It documents the plain Python input default, SSMDConfig renames, and continued v1/v2 plan migration to schema v3.
@@ -0,0 +1,27 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 4
7
+ version: 0.3.0
8
+ status: released
9
+ history_state: curated
10
+ title: null
11
+ released_at: "2026-09-24"
12
+ previous_version: 0.2.0
13
+ cancel_reason: null
14
+ superseded_by: null
15
+ changelog_file: docs/changelog.md
16
+ boundary_ref: null
17
+ source_refs: []
18
+ source_count: null
19
+ entry_count: 6
20
+ artifact_count: 0
21
+ git_base_ref: v0.2.0
22
+ git_base_sha: 215d3a4b43ccaadbf50cb40b752ae30a5b4f39e5
23
+ git_head_ref: HEAD
24
+ git_head_sha: 49023f0470950eb3b1ff9a1c9a928bac5a47575e
25
+ git_range: 215d3a4b43ccaadbf50cb40b752ae30a5b4f39e5..49023f0470950eb3b1ff9a1c9a928bac5a47575e
26
+ git_commit_count: 1
27
+ ---