utterplan 0.3.7__tar.gz → 0.4.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 (308) hide show
  1. {utterplan-0.3.7 → utterplan-0.4.1}/.codecrate.toml +1 -0
  2. {utterplan-0.3.7 → utterplan-0.4.1}/.github/workflows/python-publish.yml +1 -0
  3. {utterplan-0.3.7 → utterplan-0.4.1}/.github/workflows/tests.yml +28 -7
  4. {utterplan-0.3.7 → utterplan-0.4.1}/.gitignore +1 -1
  5. utterplan-0.4.1/MANIFEST.in +1 -0
  6. {utterplan-0.3.7/utterplan.egg-info → utterplan-0.4.1}/PKG-INFO +38 -18
  7. {utterplan-0.3.7 → utterplan-0.4.1}/README.md +36 -17
  8. {utterplan-0.3.7 → utterplan-0.4.1}/docs/architecture.md +26 -33
  9. {utterplan-0.3.7 → utterplan-0.4.1}/docs/changelog.md +45 -0
  10. utterplan-0.4.1/docs/cli.md +180 -0
  11. {utterplan-0.3.7 → utterplan-0.4.1}/docs/consumer-guide.md +24 -9
  12. {utterplan-0.3.7 → utterplan-0.4.1}/docs/coordinate-spaces.md +5 -0
  13. {utterplan-0.3.7 → utterplan-0.4.1}/docs/debugging.md +4 -2
  14. utterplan-0.4.1/docs/format.md +39 -0
  15. {utterplan-0.3.7 → utterplan-0.4.1}/docs/getting-started.md +36 -15
  16. {utterplan-0.3.7 → utterplan-0.4.1}/docs/index.md +3 -3
  17. {utterplan-0.3.7 → utterplan-0.4.1}/docs/make.bat +2 -2
  18. {utterplan-0.3.7 → utterplan-0.4.1}/docs/python-api.md +115 -4
  19. {utterplan-0.3.7 → utterplan-0.4.1}/examples/basic.py +1 -1
  20. {utterplan-0.3.7 → utterplan-0.4.1}/examples/compile_file.py +1 -1
  21. {utterplan-0.3.7 → utterplan-0.4.1}/examples/inspect_plan.py +1 -1
  22. {utterplan-0.3.7 → utterplan-0.4.1}/examples/ssmd_example.py +1 -1
  23. {utterplan-0.3.7 → utterplan-0.4.1}/pyproject.toml +1 -0
  24. utterplan-0.4.1/spec/schemas/v4.schema.json +425 -0
  25. {utterplan-0.3.7 → utterplan-0.4.1}/spec/utterplan.schema.json +21 -3
  26. utterplan-0.4.1/tests/fixtures/canonical_consumer_contract.expected.toml +6 -0
  27. utterplan-0.4.1/tests/golden/basic_en.utterplan.toml +117 -0
  28. utterplan-0.4.1/tests/golden/directives.utterplan.toml +150 -0
  29. utterplan-0.4.1/tests/golden/markers.utterplan.toml +175 -0
  30. utterplan-0.4.1/tests/golden/multilingual.utterplan.toml +166 -0
  31. utterplan-0.4.1/tests/golden/parenthetical.utterplan.toml +223 -0
  32. utterplan-0.4.1/tests/golden/spokenform_offsets.utterplan.toml +150 -0
  33. utterplan-0.4.1/tests/golden/ssmd_09_comprehensive.utterplan.toml +1189 -0
  34. utterplan-0.4.1/tests/golden/ssmd_breaks.utterplan.toml +191 -0
  35. {utterplan-0.3.7 → utterplan-0.4.1}/tests/migration/cases.py +20 -5
  36. {utterplan-0.3.7/tests/golden → utterplan-0.4.1/tests/migration/fixtures/v4}/basic_en.utterplan.json +16 -6
  37. {utterplan-0.3.7/tests/golden → utterplan-0.4.1/tests/migration/fixtures/v4}/directives.utterplan.json +19 -4
  38. {utterplan-0.3.7/tests/golden → utterplan-0.4.1/tests/migration/fixtures/v4}/markers.utterplan.json +34 -25
  39. utterplan-0.4.1/tests/migration/fixtures/v4/multilingual.utterplan.json +214 -0
  40. {utterplan-0.3.7/tests/golden → utterplan-0.4.1/tests/migration/fixtures/v4}/parenthetical.utterplan.json +51 -8
  41. {utterplan-0.3.7/tests/golden → utterplan-0.4.1/tests/migration/fixtures/v4}/spokenform_offsets.utterplan.json +16 -6
  42. utterplan-0.4.1/tests/migration/fixtures/v4/ssmd_09_comprehensive.utterplan.json +1655 -0
  43. {utterplan-0.3.7/tests/golden → utterplan-0.4.1/tests/migration/fixtures/v4}/ssmd_breaks.utterplan.json +27 -24
  44. utterplan-0.4.1/tests/migration/test_legacy_json_import.py +29 -0
  45. {utterplan-0.3.7 → utterplan-0.4.1}/tests/migration/test_semantic_migration_regressions.py +1 -1
  46. {utterplan-0.3.7 → utterplan-0.4.1}/tests/schema_history/README.md +1 -1
  47. utterplan-0.4.1/tests/test_atomic_io.py +44 -0
  48. utterplan-0.4.1/tests/test_batch.py +264 -0
  49. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_boundaries.py +6 -0
  50. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_cli.py +147 -59
  51. utterplan-0.4.1/tests/test_cli_batch.py +302 -0
  52. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_consumer_contract.py +96 -6
  53. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_consumer_readiness.py +22 -3
  54. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_directives.py +1 -1
  55. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_explain.py +35 -13
  56. utterplan-0.4.1/tests/test_format.py +114 -0
  57. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_golden.py +11 -6
  58. utterplan-0.4.1/tests/test_identity_units.py +185 -0
  59. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_linguistics.py +88 -6
  60. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_migration_framework.py +4 -12
  61. utterplan-0.4.1/tests/test_migration_v3_to_v4.py +160 -0
  62. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_planner.py +1 -1
  63. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_progress.py +1 -1
  64. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_public_identity.py +2 -2
  65. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_renderability.py +12 -4
  66. utterplan-0.4.1/tests/test_renderability_repair.py +436 -0
  67. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_schema_history.py +41 -9
  68. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_schema_registry.py +12 -7
  69. utterplan-0.4.1/tests/test_semantic_boundaries.py +195 -0
  70. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_ssmd_09_parser.py +85 -5
  71. utterplan-0.4.1/tests/test_toml_format.py +179 -0
  72. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/__init__.py +22 -2
  73. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/_version.py +3 -3
  74. utterplan-0.4.1/utterplan/atomic_io.py +50 -0
  75. utterplan-0.4.1/utterplan/attempt_serialization.py +245 -0
  76. utterplan-0.4.1/utterplan/attempts.py +103 -0
  77. utterplan-0.4.1/utterplan/batch.py +407 -0
  78. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/cli.py +318 -65
  79. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/compiler.py +32 -0
  80. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/config.py +1 -1
  81. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/exceptions.py +5 -0
  82. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/explain.py +20 -0
  83. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/format.py +14 -2
  84. utterplan-0.4.1/utterplan/hashing.py +144 -0
  85. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/migration.py +0 -19
  86. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/migrations/__init__.py +2 -0
  87. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/migrations/v1_to_v2.py +6 -4
  88. utterplan-0.4.1/utterplan/migrations/v3_to_v4.py +221 -0
  89. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/model.py +244 -29
  90. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/parsers.py +179 -60
  91. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/planner.py +368 -209
  92. utterplan-0.4.1/utterplan/renderability.py +709 -0
  93. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/schema_registry.py +1 -0
  94. utterplan-0.4.1/utterplan/schemas/v4.schema.json +425 -0
  95. utterplan-0.4.1/utterplan/serialization.py +32 -0
  96. utterplan-0.4.1/utterplan/toml_codec.py +843 -0
  97. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/units.py +9 -2
  98. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/utterplan.schema.json +21 -3
  99. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/versioning.py +2 -2
  100. {utterplan-0.3.7 → utterplan-0.4.1/utterplan.egg-info}/PKG-INFO +38 -18
  101. utterplan-0.4.1/utterplan.egg-info/SOURCES.txt +176 -0
  102. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan.egg-info/requires.txt +1 -0
  103. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan.egg-info/scm_file_list.json +58 -9
  104. utterplan-0.4.1/utterplan.egg-info/scm_version.json +8 -0
  105. utterplan-0.3.7/.ledger/ledger.toml +0 -24
  106. utterplan-0.3.7/.ledger/releaseledger/.ledger-project.toml +0 -6
  107. utterplan-0.3.7/.ledger/releaseledger/config.toml +0 -56
  108. utterplan-0.3.7/.ledger/releaseledger/data/.ledger-project.toml +0 -6
  109. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +0 -81
  110. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0001.md +0 -25
  111. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0002.md +0 -25
  112. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0003.md +0 -28
  113. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0004.md +0 -25
  114. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/release.md +0 -29
  115. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/entries/entry-0001.md +0 -24
  116. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/release.md +0 -27
  117. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/audit/commit-audit.yaml +0 -257
  118. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0001.md +0 -32
  119. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0002.md +0 -33
  120. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0003.md +0 -37
  121. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0004.md +0 -25
  122. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0005.md +0 -25
  123. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0006.md +0 -27
  124. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/release.md +0 -27
  125. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/audit/commit-audit.yaml +0 -241
  126. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0001.md +0 -74
  127. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0002.md +0 -31
  128. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0003.md +0 -38
  129. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0004.md +0 -53
  130. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/release.md +0 -27
  131. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/audit/commit-audit.yaml +0 -148
  132. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0001.md +0 -85
  133. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0002.md +0 -29
  134. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0003.md +0 -32
  135. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0004.md +0 -28
  136. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0005.md +0 -30
  137. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0006.md +0 -29
  138. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/release.md +0 -27
  139. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.1/audit/commit-audit.yaml +0 -57
  140. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.1/entries/entry-0001.md +0 -42
  141. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.1/release.md +0 -27
  142. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.2/audit/commit-audit.yaml +0 -105
  143. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.2/entries/entry-0001.md +0 -32
  144. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.2/entries/entry-0002.md +0 -41
  145. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.2/release.md +0 -27
  146. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.3/audit/commit-audit.yaml +0 -90
  147. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.3/entries/entry-0001.md +0 -45
  148. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.3/entries/entry-0002.md +0 -27
  149. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.3/release.md +0 -27
  150. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.4/audit/commit-audit.yaml +0 -13
  151. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.4/entries/entry-0001.md +0 -34
  152. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.4/entries/entry-0002.md +0 -29
  153. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.4/release.md +0 -27
  154. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.5/audit/commit-audit.yaml +0 -55
  155. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.5/entries/entry-0001.md +0 -39
  156. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.5/release.md +0 -27
  157. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.6/audit/commit-audit.yaml +0 -96
  158. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.6/entries/entry-0001.md +0 -59
  159. utterplan-0.3.7/.ledger/releaseledger/data/ledgers/main/releases/0.3.6/release.md +0 -27
  160. utterplan-0.3.7/.ledger/releaseledger/work/0.1.2/audit-decisions.yaml +0 -52
  161. utterplan-0.3.7/.ledger/releaseledger/work/0.1.2/audit.yaml +0 -128
  162. utterplan-0.3.7/.ledger/releaseledger/work/0.1.2/entries.yaml +0 -56
  163. utterplan-0.3.7/.ledger/releaseledger/work/0.1.2/evidence/2c64e29.patch +0 -1740
  164. utterplan-0.3.7/.ledger/releaseledger/work/0.1.2/evidence/4022753.patch +0 -677
  165. utterplan-0.3.7/.ledger/releaseledger/work/0.1.2/evidence/66a88b6.patch +0 -2657
  166. utterplan-0.3.7/.ledger/releaseledger/work/0.1.2/evidence/manifest.json +0 -116
  167. utterplan-0.3.7/.ledger/releaseledger/work/0.1.2/range.json +0 -13
  168. utterplan-0.3.7/.ledger/releaseledger/work/0.2.0/audit-decisions.yaml +0 -131
  169. utterplan-0.3.7/.ledger/releaseledger/work/0.2.0/audit.yaml +0 -135
  170. utterplan-0.3.7/.ledger/releaseledger/work/0.2.0/entries.yaml +0 -165
  171. utterplan-0.3.7/.ledger/releaseledger/work/0.2.0/evidence/9637182.patch +0 -991
  172. utterplan-0.3.7/.ledger/releaseledger/work/0.2.0/evidence/c52aa68.patch +0 -3109
  173. utterplan-0.3.7/.ledger/releaseledger/work/0.2.0/evidence/e49a6dd.patch +0 -178
  174. utterplan-0.3.7/.ledger/releaseledger/work/0.2.0/evidence/manifest.json +0 -123
  175. utterplan-0.3.7/.ledger/releaseledger/work/0.2.0/range.json +0 -13
  176. utterplan-0.3.7/.ledger/releaseledger/work/0.3.0/audit-decisions.yaml +0 -72
  177. utterplan-0.3.7/.ledger/releaseledger/work/0.3.0/audit.yaml +0 -85
  178. utterplan-0.3.7/.ledger/releaseledger/work/0.3.0/entries.yaml +0 -160
  179. utterplan-0.3.7/.ledger/releaseledger/work/0.3.0/evidence/49023f0.patch +0 -6377
  180. utterplan-0.3.7/.ledger/releaseledger/work/0.3.0/evidence/manifest.json +0 -81
  181. utterplan-0.3.7/.ledger/releaseledger/work/0.3.0/range.json +0 -13
  182. utterplan-0.3.7/.ledger/releaseledger/work/0.3.1/audit-decisions.yaml +0 -23
  183. utterplan-0.3.7/.ledger/releaseledger/work/0.3.1/audit.yaml +0 -40
  184. utterplan-0.3.7/.ledger/releaseledger/work/0.3.1/entries.yaml +0 -37
  185. utterplan-0.3.7/.ledger/releaseledger/work/0.3.1/evidence/70adac0.patch +0 -916
  186. utterplan-0.3.7/.ledger/releaseledger/work/0.3.1/evidence/manifest.json +0 -36
  187. utterplan-0.3.7/.ledger/releaseledger/work/0.3.1/range.json +0 -13
  188. utterplan-0.3.7/.ledger/releaseledger/work/0.3.2/audit-decisions.yaml +0 -48
  189. utterplan-0.3.7/.ledger/releaseledger/work/0.3.2/audit.yaml +0 -75
  190. utterplan-0.3.7/.ledger/releaseledger/work/0.3.2/entries.yaml +0 -54
  191. utterplan-0.3.7/.ledger/releaseledger/work/0.3.2/evidence/6c2a1ac.patch +0 -64
  192. utterplan-0.3.7/.ledger/releaseledger/work/0.3.2/evidence/a2bc20d.patch +0 -1923
  193. utterplan-0.3.7/.ledger/releaseledger/work/0.3.2/evidence/ba3b5af.patch +0 -414
  194. utterplan-0.3.7/.ledger/releaseledger/work/0.3.2/evidence/manifest.json +0 -57
  195. utterplan-0.3.7/.ledger/releaseledger/work/0.3.2/range.json +0 -13
  196. utterplan-0.3.7/.ledger/releaseledger/work/0.3.3/audit-decisions.yaml +0 -39
  197. utterplan-0.3.7/.ledger/releaseledger/work/0.3.3/audit.yaml +0 -61
  198. utterplan-0.3.7/.ledger/releaseledger/work/0.3.3/entries.yaml +0 -54
  199. utterplan-0.3.7/.ledger/releaseledger/work/0.3.3/evidence/66e2d83.patch +0 -1339
  200. utterplan-0.3.7/.ledger/releaseledger/work/0.3.3/evidence/ac797e4.patch +0 -27
  201. utterplan-0.3.7/.ledger/releaseledger/work/0.3.3/evidence/manifest.json +0 -51
  202. utterplan-0.3.7/.ledger/releaseledger/work/0.3.3/range.json +0 -13
  203. utterplan-0.3.7/.ledger/releaseledger/work/0.3.4/audit-decisions.yaml +0 -1
  204. utterplan-0.3.7/.ledger/releaseledger/work/0.3.4/audit.yaml +0 -13
  205. utterplan-0.3.7/.ledger/releaseledger/work/0.3.4/entries.preview.yaml +0 -11
  206. utterplan-0.3.7/.ledger/releaseledger/work/0.3.4/entries.yaml +0 -11
  207. utterplan-0.3.7/.ledger/releaseledger/work/0.3.4/evidence/manifest.json +0 -12
  208. utterplan-0.3.7/.ledger/releaseledger/work/0.3.4/range.json +0 -13
  209. utterplan-0.3.7/.ledger/releaseledger/work/0.3.5/audit-decisions.yaml +0 -22
  210. utterplan-0.3.7/.ledger/releaseledger/work/0.3.5/audit.yaml +0 -39
  211. utterplan-0.3.7/.ledger/releaseledger/work/0.3.5/entries.yaml +0 -34
  212. utterplan-0.3.7/.ledger/releaseledger/work/0.3.5/evidence/a19ceb4.patch +0 -1226
  213. utterplan-0.3.7/.ledger/releaseledger/work/0.3.5/evidence/manifest.json +0 -35
  214. utterplan-0.3.7/.ledger/releaseledger/work/0.3.5/range.json +0 -13
  215. utterplan-0.3.7/.ledger/releaseledger/work/0.3.6/audit-decisions.yaml +0 -42
  216. utterplan-0.3.7/.ledger/releaseledger/work/0.3.6/audit.yaml +0 -59
  217. utterplan-0.3.7/.ledger/releaseledger/work/0.3.6/entries.yaml +0 -54
  218. utterplan-0.3.7/.ledger/releaseledger/work/0.3.6/evidence/7576dd2.patch +0 -3869
  219. utterplan-0.3.7/.ledger/releaseledger/work/0.3.6/evidence/manifest.json +0 -55
  220. utterplan-0.3.7/.ledger/releaseledger/work/0.3.6/range.json +0 -13
  221. utterplan-0.3.7/.ledger/releaseledger/write.lock +0 -0
  222. utterplan-0.3.7/.ledger/taskledger/.ledger-project.toml +0 -6
  223. utterplan-0.3.7/.ledger/taskledger/config.toml +0 -7
  224. utterplan-0.3.7/docs/cli.md +0 -132
  225. utterplan-0.3.7/docs/format.md +0 -32
  226. utterplan-0.3.7/tests/fixtures/canonical_consumer_contract.expected.json +0 -10
  227. utterplan-0.3.7/tests/test_format.py +0 -91
  228. utterplan-0.3.7/tests/test_identity_units.py +0 -42
  229. utterplan-0.3.7/tests/test_renderability_repair.py +0 -159
  230. utterplan-0.3.7/utterplan/hashing.py +0 -59
  231. utterplan-0.3.7/utterplan/renderability.py +0 -243
  232. utterplan-0.3.7/utterplan/serialization.py +0 -22
  233. utterplan-0.3.7/utterplan.egg-info/SOURCES.txt +0 -269
  234. utterplan-0.3.7/utterplan.egg-info/scm_version.json +0 -8
  235. {utterplan-0.3.7 → utterplan-0.4.1}/.github/workflows/codecov.yml +0 -0
  236. {utterplan-0.3.7 → utterplan-0.4.1}/.github/workflows/pre-commit.yml +0 -0
  237. {utterplan-0.3.7 → utterplan-0.4.1}/.pre-commit-config.yaml +0 -0
  238. {utterplan-0.3.7 → utterplan-0.4.1}/AGENTS.md +0 -0
  239. {utterplan-0.3.7 → utterplan-0.4.1}/LICENSE +0 -0
  240. {utterplan-0.3.7 → utterplan-0.4.1}/NOTICE +0 -0
  241. {utterplan-0.3.7 → utterplan-0.4.1}/docs/Makefile +0 -0
  242. {utterplan-0.3.7 → utterplan-0.4.1}/docs/conf.py +0 -0
  243. {utterplan-0.3.7 → utterplan-0.4.1}/docs/phase-a-completion.md +0 -0
  244. {utterplan-0.3.7 → utterplan-0.4.1}/docs/pykokoro-integration.md +0 -0
  245. {utterplan-0.3.7 → utterplan-0.4.1}/docs/requirements.txt +0 -0
  246. {utterplan-0.3.7 → utterplan-0.4.1}/examples/chapter.ssmd +0 -0
  247. {utterplan-0.3.7 → utterplan-0.4.1}/examples/multilingual.py +0 -0
  248. {utterplan-0.3.7 → utterplan-0.4.1}/setup.cfg +0 -0
  249. {utterplan-0.3.7 → utterplan-0.4.1}/spec/schemas/v1.schema.json +0 -0
  250. {utterplan-0.3.7 → utterplan-0.4.1}/spec/schemas/v2.schema.json +0 -0
  251. {utterplan-0.3.7 → utterplan-0.4.1}/spec/schemas/v3.schema.json +0 -0
  252. {utterplan-0.3.7 → utterplan-0.4.1}/tests/__init__.py +0 -0
  253. {utterplan-0.3.7 → utterplan-0.4.1}/tests/fixtures/canonical_consumer_contract.ssmd +0 -0
  254. {utterplan-0.3.7 → utterplan-0.4.1}/tests/fixtures/ssmd_09_comprehensive.ssmd +0 -0
  255. {utterplan-0.3.7 → utterplan-0.4.1}/tests/migration/__init__.py +0 -0
  256. {utterplan-0.3.7 → utterplan-0.4.1}/tests/migration/goldens/multilingual_preparation.json +0 -0
  257. {utterplan-0.3.7 → utterplan-0.4.1}/tests/migration/goldens/spokenform_numbers.json +0 -0
  258. {utterplan-0.3.7 → utterplan-0.4.1}/tests/migration/goldens/ssmd_break.json +0 -0
  259. {utterplan-0.3.7 → utterplan-0.4.1}/tests/migration/goldens/ssmd_language_detection.json +0 -0
  260. {utterplan-0.3.7 → utterplan-0.4.1}/tests/migration/goldens/ssmd_marker.json +0 -0
  261. {utterplan-0.3.7 → utterplan-0.4.1}/tests/migration/goldens/ssmd_pronunciation.json +0 -0
  262. {utterplan-0.3.7 → utterplan-0.4.1}/tests/schema_history/v1/basic.json +0 -0
  263. {utterplan-0.3.7 → utterplan-0.4.1}/tests/schema_history/v1/directives.json +0 -0
  264. {utterplan-0.3.7 → utterplan-0.4.1}/tests/schema_history/v1/markers.json +0 -0
  265. {utterplan-0.3.7 → utterplan-0.4.1}/tests/schema_history/v1/multilingual.json +0 -0
  266. {utterplan-0.3.7 → utterplan-0.4.1}/tests/schema_history/v1/parenthetical.json +0 -0
  267. {utterplan-0.3.7 → utterplan-0.4.1}/tests/schema_history/v1/spokenform_offsets.json +0 -0
  268. {utterplan-0.3.7 → utterplan-0.4.1}/tests/schema_history/v1/ssmd_breaks.json +0 -0
  269. {utterplan-0.3.7 → utterplan-0.4.1}/tests/schema_history/v2/directives.json +0 -0
  270. /utterplan-0.3.7/tests/golden/multilingual.utterplan.json → /utterplan-0.4.1/tests/schema_history/v3/multilingual.json +0 -0
  271. /utterplan-0.3.7/tests/golden/ssmd_09_comprehensive.utterplan.json → /utterplan-0.4.1/tests/schema_history/v3/ssmd_09_comprehensive.json +0 -0
  272. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_compiler.py +0 -0
  273. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_coordinates.py +0 -0
  274. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_fake_renderer.py +0 -0
  275. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_import_boundaries.py +0 -0
  276. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_language.py +0 -0
  277. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_pauses.py +0 -0
  278. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_preparation.py +0 -0
  279. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_schema_strict.py +0 -0
  280. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_segment_topology.py +0 -0
  281. {utterplan-0.3.7 → utterplan-0.4.1}/tests/test_version.py +0 -0
  282. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/__main__.py +0 -0
  283. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/diagnostics.py +0 -0
  284. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/directives.py +0 -0
  285. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/language.py +0 -0
  286. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/linguistics.py +0 -0
  287. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/migrations/registry.py +0 -0
  288. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/migrations/v2_to_v3.py +0 -0
  289. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/pauses.py +0 -0
  290. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/preparation.py +0 -0
  291. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/progress.py +0 -0
  292. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/py.typed +0 -0
  293. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/schemas/v1.schema.json +0 -0
  294. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/schemas/v2.schema.json +0 -0
  295. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/schemas/v3.schema.json +0 -0
  296. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/spacy_models.py +0 -0
  297. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/spans.py +0 -0
  298. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/stages/__init__.py +0 -0
  299. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/stages/document/__init__.py +0 -0
  300. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/stages/document/plain.py +0 -0
  301. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/stages/document/ssmd.py +0 -0
  302. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/stages/preparation/__init__.py +0 -0
  303. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/stages/preparation/identity.py +0 -0
  304. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/stages/preparation/spokenform.py +0 -0
  305. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan/stages/protocols.py +0 -0
  306. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan.egg-info/dependency_links.txt +0 -0
  307. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan.egg-info/entry_points.txt +0 -0
  308. {utterplan-0.3.7 → utterplan-0.4.1}/utterplan.egg-info/top_level.txt +0 -0
@@ -17,6 +17,7 @@ include = [
17
17
  "**/*.yaml",
18
18
  "**/*.yml",
19
19
  "**/*.ssmd",
20
+ "**/*.typed",
20
21
  "LICENSE",
21
22
  ]
22
23
  split_max_chars = 0
@@ -89,6 +89,7 @@ jobs:
89
89
  "utterplan/schemas/v1.schema.json",
90
90
  "utterplan/schemas/v2.schema.json",
91
91
  "utterplan/schemas/v3.schema.json",
92
+ "utterplan/schemas/v4.schema.json",
92
93
  }
93
94
  assert expected <= names
94
95
  PY
@@ -43,13 +43,18 @@ jobs:
43
43
  - name: Install lower-bound dependencies
44
44
  run: |
45
45
  python -m pip install --upgrade pip
46
- python -m pip install pytest jsonschema
46
+ # exceptiongroup 1.3+ requires typing_extensions >=4.6; keep the 4.0 lower-bound check viable.
47
+ # referencing 0.36+ uses TypeVar(default=...) unavailable in typing_extensions 4.0.
48
+ python -m pip install pytest jsonschema "exceptiongroup==1.2.2" "referencing<0.36"
47
49
  python -m pip install \
48
50
  "phrasplit==0.3.9" \
49
51
  "ssmd==0.9.3" \
50
52
  "spokenform==0.4.3" \
51
- "typing_extensions>=4.0"
53
+ "typing_extensions==4.0.0" \
54
+ "tomlkit==0.13.0"
52
55
  python -m pip install --no-deps -e .
56
+ - name: Verify SSMD 0.9.3 front-matter scene-break handling
57
+ run: python -m pytest -q tests/test_ssmd_09_parser.py -k front_matter_scene_break
53
58
  - name: Run lower-bound tests
54
59
  run: python -m pytest -q
55
60
 
@@ -87,6 +92,7 @@ jobs:
87
92
  "utterplan/schemas/v1.schema.json",
88
93
  "utterplan/schemas/v2.schema.json",
89
94
  "utterplan/schemas/v3.schema.json",
95
+ "utterplan/schemas/v4.schema.json",
90
96
  }
91
97
  expected_ranges = {
92
98
  "phrasplit": ("0.3.9", "0.4"),
@@ -153,10 +159,10 @@ jobs:
153
159
  [Hello]{voice-name="test"} ...200ms world.
154
160
  EOF
155
161
  "$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"
162
+ "$RUNNER_TEMP/test.ssmd.md" --lang en-us --text-preparation identity \
163
+ > "$RUNNER_TEMP/test.utterplan.toml"
158
164
  "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" validate \
159
- "$RUNNER_TEMP/test.utterplan.json"
165
+ "$RUNNER_TEMP/test.utterplan.toml"
160
166
  cat > "$RUNNER_TEMP/test-0.8.ssmd.md" <<'EOF'
161
167
  ---
162
168
  ssmd_version: "0.8"
@@ -164,7 +170,7 @@ jobs:
164
170
  Hello.
165
171
  EOF
166
172
  if "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" compile \
167
- "$RUNNER_TEMP/test-0.8.ssmd.md" --lang en-us --text-preparation identity --json \
173
+ "$RUNNER_TEMP/test-0.8.ssmd.md" --lang en-us --text-preparation identity \
168
174
  > "$RUNNER_TEMP/test-0.8.out" 2>&1; then
169
175
  cat "$RUNNER_TEMP/test-0.8.out"
170
176
  echo "Installed wheel accepted an SSMD 0.8 document" >&2
@@ -174,4 +180,19 @@ jobs:
174
180
  "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" migrate \
175
181
  "$GITHUB_WORKSPACE/tests/schema_history/v1/basic.json" --check
176
182
  "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" inspect \
177
- "$RUNNER_TEMP/test.utterplan.json" --segment 0
183
+ "$RUNNER_TEMP/test.utterplan.toml" --segment 0
184
+
185
+ docs:
186
+ runs-on: ubuntu-latest
187
+ steps:
188
+ - uses: actions/checkout@v4
189
+ - name: Set up Python
190
+ uses: actions/setup-python@v5
191
+ with:
192
+ python-version: "3.12"
193
+ - name: Install documentation dependencies
194
+ run: |
195
+ python -m pip install --upgrade pip
196
+ python -m pip install -e ".[docs]"
197
+ - name: Build documentation
198
+ run: sphinx-build -W --keep-going -b html docs docs/_build/html
@@ -221,4 +221,4 @@ context_utterplan*.*
221
221
  utterplan/_version.py
222
222
 
223
223
  # Generated outputs from the runnable examples
224
- examples/*.utterplan.json
224
+ examples/*.utterplan.toml
@@ -0,0 +1 @@
1
+ prune .ledger
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: utterplan
3
- Version: 0.3.7
3
+ Version: 0.4.1
4
4
  Summary: Engine-independent text-to-speech planning compiler and interchange format
5
5
  Author-email: Holger Nahrstaedt <nahrstaedt@gmail.com>
6
6
  License: Apache License
@@ -226,6 +226,7 @@ Requires-Dist: phrasplit<0.4,>=0.3.9
226
226
  Requires-Dist: ssmd<0.10,>=0.9.3
227
227
  Requires-Dist: spokenform<0.5,>=0.4.3
228
228
  Requires-Dist: typing_extensions>=4.0
229
+ Requires-Dist: tomlkit<1,>=0.13
229
230
  Provides-Extra: dev
230
231
  Requires-Dist: build; extra == "dev"
231
232
  Requires-Dist: jsonschema; extra == "dev"
@@ -259,13 +260,13 @@ consumer workspaces, and stops before G2P, synthesis, and audio.
259
260
  Compile literal text directly:
260
261
 
261
262
  ```bash
262
- utterplan compile "Doctor Smith bought 5 kg." --input-format plain --language en-us --json
263
+ utterplan compile "Doctor Smith bought 5 kg." --input-format plain --language en-us
263
264
  ```
264
265
 
265
266
  Compile a file to a plan file:
266
267
 
267
268
  ```bash
268
- utterplan compile examples/chapter.ssmd -o chapter.utterplan.json
269
+ utterplan compile examples/chapter.ssmd -o chapter.utterplan.toml
269
270
  ```
270
271
 
271
272
  SSMD header `language` is authoritative, so `--language` is optional when it is present. Otherwise pass `--language` as the fallback; plain input always requires a language. `--language` never forces a language over SSMD semantics.
@@ -273,21 +274,34 @@ SSMD header `language` is authoritative, so `--language` is optional when it is
273
274
  Use stdin and shell pipelines:
274
275
 
275
276
  ```bash
276
- cat examples/chapter.ssmd | utterplan compile --lang en-us --input-format ssmd | jq .
277
+ cat examples/chapter.ssmd | utterplan compile --lang en-us --input-format ssmd > chapter.utterplan.toml
277
278
  ```
278
279
 
280
+ Compile independent documents incrementally; every successful plan is saved immediately, and ordinary failures do not discard earlier outputs:
281
+
282
+ ```bash
283
+ utterplan compile-many examples/*.ssmd --output-dir build/plans
284
+ ```
285
+
286
+ This writes one `.utterplan.toml` per source plus an atomically refreshed `compile-report.toml`. Use `--fail-fast` to skip later inputs after a failure, `--force` to replace existing plans, or `--report PATH` to choose another report location.
287
+
279
288
  The CLI also provides:
280
289
 
281
290
  ```bash
282
291
  utterplan --version
283
- utterplan validate chapter.utterplan.json
284
- utterplan inspect chapter.utterplan.json --segment 0
285
- utterplan explain chapter.utterplan.json
292
+ utterplan validate chapter.utterplan.toml
293
+ utterplan inspect chapter.utterplan.toml --segment 0
294
+ utterplan inspect chapter.utterplan.toml --semantic-boundaries
295
+ utterplan explain chapter.utterplan.toml
296
+ utterplan inspect-attempt chapter.attempt.toml --issues
286
297
  ```
287
298
 
288
299
  `explain` presents the compiled plan as a human-readable speech plan, while `inspect` exposes lower-level diagnostic fields.
289
- Compile JSON is written to stdout when no output file is supplied. Status
290
- messages use stderr, and existing output files require `--force`.
300
+
301
+ `inspect-attempt` reads the separate `utterplan.planning-attempt.v1` TOML artifact,
302
+ not a canonical plan. Use it to review renderability issues and safe repair
303
+ assessments on blocked planning outcomes; such candidates remain inspect-only drafts.
304
+ Canonical plan output is TOML (`.utterplan.toml`) and is written to stdout when no output file is supplied. Status messages use stderr, and existing output files require `--force`. Safe punctuation repair is the default; use `--renderability strict` to reject every repair opportunity.
291
305
 
292
306
  ## SSMD source contract
293
307
 
@@ -303,7 +317,8 @@ command:
303
317
  ssmd migrate old.ssmd --to 0.9
304
318
  ```
305
319
 
306
- `utterplan migrate` is only for historical `.utterplan.json` schema migration. It does not migrate SSMD source.
320
+ `utterplan migrate` explicitly imports supported historical `.utterplan.json` plans and writes current TOML. It does not migrate SSMD source.
321
+ Normal plan loading is TOML-only: `UtterancePlan.load()` and plan-inspection commands reject JSON rather than auto-detecting it.
307
322
 
308
323
  ## Planning defaults
309
324
 
@@ -311,6 +326,8 @@ The minimal CLI defaults are explicit: `spokenform` is the default text-preparat
311
326
 
312
327
  Python `PlannerConfig` defaults to `document_format="plain"`; set it to `"ssmd"` when a Python string contains SSMD source.
313
328
 
329
+ Python `PlannerConfig.renderability_mode` also defaults to safe punctuation-only repair; choose `"strict"` to reject every repair opportunity. Neither mode guesses a symbol's pronunciation or crosses semantic blockers.
330
+
314
331
  `spacy auto` is opt-in. When enabled and a compatible local model is available, UtterPlan may expose richer tokenization, POS tags, lemmas, and tags; `auto` is not the default.
315
332
 
316
333
  ## Python API
@@ -332,8 +349,8 @@ result = compile_document(
332
349
  )
333
350
  plan = result.plan
334
351
  assert result.trace is not None
335
- plan.save("example.utterplan.json")
336
- assert UtterancePlan.load("example.utterplan.json") == plan
352
+ plan.save("example.utterplan.toml")
353
+ assert UtterancePlan.load("example.utterplan.toml") == plan
337
354
  ```
338
355
 
339
356
  `compile_document` is the stable public one-document API shared by consumers. The
@@ -341,7 +358,7 @@ immutable `CompileResult` contains the semantic plan, diagnostics, and optional
341
358
  explanatory trace. Trace is not serialized in the plan and does not affect its
342
359
  identity. Plain text must be explicitly selected in Python and always requires a
343
360
  language fallback. Existing `UtterancePlanner.plan` remains supported and returns
344
- only the plan; JSON is the portable persistence and interchange format.
361
+ only the plan; TOML is the portable persistence and interchange format.
345
362
 
346
363
  For operational progress from a long-running Python plan, pass `on_progress` to
347
364
  `UtterancePlanner.plan`, `UtterancePlanner.compile`, or `compile_document`. The
@@ -363,8 +380,11 @@ Callbacks run synchronously and exceptions propagate. See the [Python API guide]
363
380
 
364
381
  Renderers consume `PlanSegment.text`, which is prepared/spoken text, and use
365
382
  `spoken_start`/`spoken_end` for spoken-text coordinates. Resolved segment
366
- pauses, language, directives, annotations, boundaries, markers, units, and
367
- document metadata are public plan fields. Plans contain no phonemes, model
383
+ pauses, language, directives, annotations, boundaries, semantic boundaries,
384
+ markers, units, and
385
+ document metadata are public plan fields. Semantic boundaries are stable
386
+ engine-neutral opportunities for spoken-text subdivision; they are not pause
387
+ events and carry no duration or renderer policy. Plans contain no phonemes, model
368
388
  tokens, model sessions, renderer configuration, provider documents, or audio.
369
389
  For SSMD input, `plan.annotations` preserve declared source semantics and source
370
390
  provenance, `document_metadata` preserves portable header data, and
@@ -398,10 +418,10 @@ renderer repository rather than UtterPlan's test suite.
398
418
 
399
419
  ## Versions
400
420
 
401
- The package version is dynamically derived from Git tags by setuptools-scm. Package version and UtterPlan schema version are independent. Current plans use schema v3; released schema v1 and v2 remain immutable and supported through sequential v1-to-v2-to-v3 and direct v2-to-v3 migrations.
421
+ The package version is dynamically derived from Git tags by setuptools-scm. Package version and UtterPlan schema version are independent. Current `.utterplan.toml` plans use semantic schema v4; released schema v1, v2, and v3 remain immutable and supported through sequential migrations.
402
422
 
403
- Schema v3 adds typed renderer-neutral SSMD semantics. Migration converts serialized plan data only. It does not reparse source, replan, or rerun linguistic analysis, G2P, rendering, or audio processing. Unit hashes retain the `utterplan-unit-v2` algorithm.
404
- Schema v3 persists final pass-B token facts, including optional POS, tag, lemma, and morphology, plus per-language-run provider provenance. Unit hashes include pronunciation-relevant token semantics but exclude model/audio state.
423
+ Schema v4 adds stable `SemanticBoundary` records in spoken-text coordinates. Migration converts serialized plan data only: the registered v3-to-v4 step preserves existing evidence and derives topology where possible, but does not rerun parsing, NLP, planning, G2P, rendering, or audio processing. Unit hashes use `utterplan-unit-v3` and include relative semantic-boundary positions; older hash algorithms remain available for their historical migration paths.
424
+ Schema v4 retains typed renderer-neutral SSMD semantics, final pass-B token facts, and per-language-run provider provenance. Plans never serialize provider documents, models, sessions, phonemes, token IDs, or audio.
405
425
 
406
426
  ## Development
407
427
 
@@ -17,13 +17,13 @@ consumer workspaces, and stops before G2P, synthesis, and audio.
17
17
  Compile literal text directly:
18
18
 
19
19
  ```bash
20
- utterplan compile "Doctor Smith bought 5 kg." --input-format plain --language en-us --json
20
+ utterplan compile "Doctor Smith bought 5 kg." --input-format plain --language en-us
21
21
  ```
22
22
 
23
23
  Compile a file to a plan file:
24
24
 
25
25
  ```bash
26
- utterplan compile examples/chapter.ssmd -o chapter.utterplan.json
26
+ utterplan compile examples/chapter.ssmd -o chapter.utterplan.toml
27
27
  ```
28
28
 
29
29
  SSMD header `language` is authoritative, so `--language` is optional when it is present. Otherwise pass `--language` as the fallback; plain input always requires a language. `--language` never forces a language over SSMD semantics.
@@ -31,21 +31,34 @@ SSMD header `language` is authoritative, so `--language` is optional when it is
31
31
  Use stdin and shell pipelines:
32
32
 
33
33
  ```bash
34
- cat examples/chapter.ssmd | utterplan compile --lang en-us --input-format ssmd | jq .
34
+ cat examples/chapter.ssmd | utterplan compile --lang en-us --input-format ssmd > chapter.utterplan.toml
35
35
  ```
36
36
 
37
+ Compile independent documents incrementally; every successful plan is saved immediately, and ordinary failures do not discard earlier outputs:
38
+
39
+ ```bash
40
+ utterplan compile-many examples/*.ssmd --output-dir build/plans
41
+ ```
42
+
43
+ This writes one `.utterplan.toml` per source plus an atomically refreshed `compile-report.toml`. Use `--fail-fast` to skip later inputs after a failure, `--force` to replace existing plans, or `--report PATH` to choose another report location.
44
+
37
45
  The CLI also provides:
38
46
 
39
47
  ```bash
40
48
  utterplan --version
41
- utterplan validate chapter.utterplan.json
42
- utterplan inspect chapter.utterplan.json --segment 0
43
- utterplan explain chapter.utterplan.json
49
+ utterplan validate chapter.utterplan.toml
50
+ utterplan inspect chapter.utterplan.toml --segment 0
51
+ utterplan inspect chapter.utterplan.toml --semantic-boundaries
52
+ utterplan explain chapter.utterplan.toml
53
+ utterplan inspect-attempt chapter.attempt.toml --issues
44
54
  ```
45
55
 
46
56
  `explain` presents the compiled plan as a human-readable speech plan, while `inspect` exposes lower-level diagnostic fields.
47
- Compile JSON is written to stdout when no output file is supplied. Status
48
- messages use stderr, and existing output files require `--force`.
57
+
58
+ `inspect-attempt` reads the separate `utterplan.planning-attempt.v1` TOML artifact,
59
+ not a canonical plan. Use it to review renderability issues and safe repair
60
+ assessments on blocked planning outcomes; such candidates remain inspect-only drafts.
61
+ Canonical plan output is TOML (`.utterplan.toml`) and is written to stdout when no output file is supplied. Status messages use stderr, and existing output files require `--force`. Safe punctuation repair is the default; use `--renderability strict` to reject every repair opportunity.
49
62
 
50
63
  ## SSMD source contract
51
64
 
@@ -61,7 +74,8 @@ command:
61
74
  ssmd migrate old.ssmd --to 0.9
62
75
  ```
63
76
 
64
- `utterplan migrate` is only for historical `.utterplan.json` schema migration. It does not migrate SSMD source.
77
+ `utterplan migrate` explicitly imports supported historical `.utterplan.json` plans and writes current TOML. It does not migrate SSMD source.
78
+ Normal plan loading is TOML-only: `UtterancePlan.load()` and plan-inspection commands reject JSON rather than auto-detecting it.
65
79
 
66
80
  ## Planning defaults
67
81
 
@@ -69,6 +83,8 @@ The minimal CLI defaults are explicit: `spokenform` is the default text-preparat
69
83
 
70
84
  Python `PlannerConfig` defaults to `document_format="plain"`; set it to `"ssmd"` when a Python string contains SSMD source.
71
85
 
86
+ Python `PlannerConfig.renderability_mode` also defaults to safe punctuation-only repair; choose `"strict"` to reject every repair opportunity. Neither mode guesses a symbol's pronunciation or crosses semantic blockers.
87
+
72
88
  `spacy auto` is opt-in. When enabled and a compatible local model is available, UtterPlan may expose richer tokenization, POS tags, lemmas, and tags; `auto` is not the default.
73
89
 
74
90
  ## Python API
@@ -90,8 +106,8 @@ result = compile_document(
90
106
  )
91
107
  plan = result.plan
92
108
  assert result.trace is not None
93
- plan.save("example.utterplan.json")
94
- assert UtterancePlan.load("example.utterplan.json") == plan
109
+ plan.save("example.utterplan.toml")
110
+ assert UtterancePlan.load("example.utterplan.toml") == plan
95
111
  ```
96
112
 
97
113
  `compile_document` is the stable public one-document API shared by consumers. The
@@ -99,7 +115,7 @@ immutable `CompileResult` contains the semantic plan, diagnostics, and optional
99
115
  explanatory trace. Trace is not serialized in the plan and does not affect its
100
116
  identity. Plain text must be explicitly selected in Python and always requires a
101
117
  language fallback. Existing `UtterancePlanner.plan` remains supported and returns
102
- only the plan; JSON is the portable persistence and interchange format.
118
+ only the plan; TOML is the portable persistence and interchange format.
103
119
 
104
120
  For operational progress from a long-running Python plan, pass `on_progress` to
105
121
  `UtterancePlanner.plan`, `UtterancePlanner.compile`, or `compile_document`. The
@@ -121,8 +137,11 @@ Callbacks run synchronously and exceptions propagate. See the [Python API guide]
121
137
 
122
138
  Renderers consume `PlanSegment.text`, which is prepared/spoken text, and use
123
139
  `spoken_start`/`spoken_end` for spoken-text coordinates. Resolved segment
124
- pauses, language, directives, annotations, boundaries, markers, units, and
125
- document metadata are public plan fields. Plans contain no phonemes, model
140
+ pauses, language, directives, annotations, boundaries, semantic boundaries,
141
+ markers, units, and
142
+ document metadata are public plan fields. Semantic boundaries are stable
143
+ engine-neutral opportunities for spoken-text subdivision; they are not pause
144
+ events and carry no duration or renderer policy. Plans contain no phonemes, model
126
145
  tokens, model sessions, renderer configuration, provider documents, or audio.
127
146
  For SSMD input, `plan.annotations` preserve declared source semantics and source
128
147
  provenance, `document_metadata` preserves portable header data, and
@@ -156,10 +175,10 @@ renderer repository rather than UtterPlan's test suite.
156
175
 
157
176
  ## Versions
158
177
 
159
- The package version is dynamically derived from Git tags by setuptools-scm. Package version and UtterPlan schema version are independent. Current plans use schema v3; released schema v1 and v2 remain immutable and supported through sequential v1-to-v2-to-v3 and direct v2-to-v3 migrations.
178
+ The package version is dynamically derived from Git tags by setuptools-scm. Package version and UtterPlan schema version are independent. Current `.utterplan.toml` plans use semantic schema v4; released schema v1, v2, and v3 remain immutable and supported through sequential migrations.
160
179
 
161
- Schema v3 adds typed renderer-neutral SSMD semantics. Migration converts serialized plan data only. It does not reparse source, replan, or rerun linguistic analysis, G2P, rendering, or audio processing. Unit hashes retain the `utterplan-unit-v2` algorithm.
162
- Schema v3 persists final pass-B token facts, including optional POS, tag, lemma, and morphology, plus per-language-run provider provenance. Unit hashes include pronunciation-relevant token semantics but exclude model/audio state.
180
+ Schema v4 adds stable `SemanticBoundary` records in spoken-text coordinates. Migration converts serialized plan data only: the registered v3-to-v4 step preserves existing evidence and derives topology where possible, but does not rerun parsing, NLP, planning, G2P, rendering, or audio processing. Unit hashes use `utterplan-unit-v3` and include relative semantic-boundary positions; older hash algorithms remain available for their historical migration paths.
181
+ Schema v4 retains typed renderer-neutral SSMD semantics, final pass-B token facts, and per-language-run provider provenance. Plans never serialize provider documents, models, sessions, phonemes, token IDs, or audio.
163
182
 
164
183
  ## Development
165
184
 
@@ -35,17 +35,17 @@ Legacy `UtterancePlanner.plan` remains a compatibility API returning only the
35
35
  plan.
36
36
 
37
37
  The public `UtterancePlan` Python object is immutable in-process renderer input;
38
- the `.utterplan.json` schema is the portable persistence and semantic interchange
39
- contract. UtterPlan ends before G2P. Engine/model selection, synthesis, and audio
40
- composition happen downstream.
38
+ the `.utterplan.toml` document is the portable persistence and semantic interchange
39
+ format; it encodes semantic schema v4. UtterPlan ends before G2P. Engine/model
40
+ selection, synthesis, and audio composition happen downstream.
41
41
 
42
42
  ## SSMD source contract
43
43
 
44
44
  The document parser calls SSMD with `dialect="0.9"` for every SSMD source path,
45
45
  including unversioned fragments selected with `document_format="ssmd"`. UtterPlan
46
46
  does not parse SSMD 0.8 or migrate source. Older documents must first be converted
47
- with `ssmd migrate FILE --to 0.9`. The `utterplan migrate` command is reserved for
48
- serialized UtterPlan schema migrations.
47
+ with `ssmd migrate FILE --to 0.9`. The `utterplan migrate` command explicitly
48
+ imports legacy JSON plans and applies serialized schema migrations.
49
49
 
50
50
  SSMD header language is authoritative over a fallback language. The CLI can omit
51
51
  `--language` when the header declares a language; plain input always needs an
@@ -66,7 +66,7 @@ text. Preparation-trace source offsets address SSMD-clean structural text, while
66
66
  its transformation output offsets address prepared spoken text.
67
67
 
68
68
  Linguistic analysis and provider documents are request-local. Returned plans
69
- contain JSON-compatible semantic results only: no live parser objects, spaCy
69
+ contain plain, round-trippable semantic data only: no live parser objects, spaCy
70
70
  documents, models, sessions, provider caches, phonemes, engine token IDs, or audio.
71
71
  A reusable planner may share sequential resource caches, but concurrent use is not
72
72
  promised.
@@ -77,41 +77,34 @@ preparation can invalidate their offsets.
77
77
 
78
78
  Pause events retain provenance and resolved event IDs. Pause defaults are
79
79
  normalized to finite seconds with explicit precedence, and segments expose
80
- resolved pauses directly. Logical voices are intent references; document
81
- `voice_bindings` metadata remains separate and no concrete engine voice is
82
- selected.
80
+ resolved pauses directly. Semantic boundaries are a separate immutable
81
+ collection of stable spoken-text split opportunities; they have no duration,
82
+ activation state, or renderer choice. Logical voices are intent references;
83
+ document `voice_bindings` metadata remains separate and no concrete engine
84
+ voice is selected.
83
85
 
84
- Plan identity is deterministic and renderer-independent. It covers semantic
85
- source/configuration/metadata; it does not include renderer-only model, sample
86
+ Plan identity is deterministic and renderer-independent. It covers semantic source/configuration/metadata; it does not include renderer-only model, sample
86
87
  rate, or output-file settings. Unit hashes include ordered segment semantics,
87
88
  resolved pauses, marker content, and semantic token facts referenced by each
88
- segment. Diagnostics and producer metadata do not define unit identity. Package
89
- version is derived by setuptools-scm and is independent of the explicit UtterPlan
90
- `schema_version`.
89
+ segment. Semantic-boundary positions relative to each unit are part of the
90
+ `utterplan-unit-v3` hash; diagnostics and producer metadata do not define unit
91
+ identity. Package version is derived by setuptools-scm and is independent of
92
+ the explicit UtterPlan `schema_version`.
93
+
94
+ Current plans persist as deterministic `.utterplan.toml` files; schema v4 remains the semantic contract, and `plan_id` is derived from canonical semantic data rather than TOML bytes. `UtterancePlan.load()` accepts TOML only. Legacy JSON plan import is an explicit migration command, never a normal load fallback.
95
+
96
+ `compile-many` orchestrates independent source documents in order. Each successful plan is validated and atomically saved before the next source is processed; ordinary failures are reported and later inputs continue unless fail-fast is requested. Its atomically refreshed TOML report is operational data, not an `UtterancePlan`.
91
97
 
92
98
  ## Persistence compatibility boundary
93
99
 
94
100
  ```text
95
- .utterplan.json
96
- |
97
- v
98
- inspect schema version
99
- |
100
- +-----------+-----------+
101
- | |
102
- current old
103
- | |
104
- | migration chain
105
- | |
106
- +-----------+-----------+
107
- |
108
- v
109
- current UtterancePlan
110
- |
111
- v
112
- renderer
101
+ current plan file:
102
+ .utterplan.toml -- TOML decode / schema-v4 validation --> UtterancePlan --> renderer
103
+
104
+ legacy saved plan:
105
+ .utterplan.json -- explicit `utterplan migrate` --> current .utterplan.toml
113
106
  ```
114
107
 
115
108
  Migration is not planning. UtterPlan owns persistence, schema validation, and migration. Renderers consume only the current in-memory `UtterancePlan` and do not implement historical schema branches.
116
109
 
117
- Schema v3 is current. Released schema v1 and v2 remain frozen; v1 migration proceeds sequentially through v2 to v3, while v2 plans migrate directly to v3. These migrations transform serialized data only and never reparse or replan source.
110
+ Schema v4 is current. Released schemas v1, v2, and v3 remain frozen; supported plans migrate through the registered sequential chain to v4. The v3-to-v4 step transforms serialized data only and does not rerun parsing, NLP, planning, G2P, rendering, or audio processing. Consumers receive only the current in-memory model.
@@ -4,6 +4,51 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.4.1] - 2026-10-07
8
+
9
+ ### Added
10
+
11
+ - Added persistable planning attempts with inspectable renderability outcomes and safe repair assessments
12
+
13
+ ### Changed
14
+
15
+ - Changed planning APIs to expose blocked candidates without weakening canonical plan validation
16
+
17
+ ### Fixed
18
+
19
+ - Fixed legacy SSMD scene breaks to preserve front-matter boundaries and clean-to-source offsets
20
+
21
+ ### Documentation
22
+
23
+ - Documented planning-attempt artifacts, inspection workflows, and renderability guarantees
24
+
25
+ <!-- generated by releaseledger -->
26
+
27
+ ## [0.4.0] - 2026-10-06
28
+
29
+ ### Added
30
+
31
+ - Added stable spoken-coordinate semantic boundaries for clause, parenthetical, sentence, and paragraph splits
32
+
33
+ ### Changed
34
+
35
+ - Changed serialized plans to schema v4 with deterministic v3-to-v4 migration and boundary-sensitive unit identity
36
+ - Changed plan persistence to deterministic TOML with explicit legacy JSON import and incremental batch compilation
37
+
38
+ ### Documentation
39
+
40
+ - Documented spoken-coordinate semantics, pause separation, migration limits, and consumer lowering
41
+
42
+ <!-- generated by releaseledger -->
43
+
44
+ ## [0.3.7] - 2026-10-05
45
+
46
+ ### Quality
47
+
48
+ - Improved package publishing workflow for the release toolchain
49
+
50
+ <!-- generated by releaseledger -->
51
+
7
52
  ## [0.3.6] - 2026-10-05
8
53
 
9
54
  ### Added