utterplan 0.6.1__tar.gz → 0.6.3__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 (230) hide show
  1. utterplan-0.6.3/AGENTS.md +29 -0
  2. {utterplan-0.6.1 → utterplan-0.6.3}/PKG-INFO +36 -1
  3. {utterplan-0.6.1 → utterplan-0.6.3}/README.md +35 -0
  4. {utterplan-0.6.1 → utterplan-0.6.3}/docs/changelog.md +24 -0
  5. {utterplan-0.6.1 → utterplan-0.6.3}/docs/cli.md +70 -0
  6. {utterplan-0.6.1 → utterplan-0.6.3}/docs/python-api.md +22 -0
  7. {utterplan-0.6.1 → utterplan-0.6.3}/docs/ssmdbook.md +30 -0
  8. utterplan-0.6.3/tests/test_book_api.py +483 -0
  9. utterplan-0.6.3/tests/test_book_replan.py +471 -0
  10. utterplan-0.6.3/tests/test_cli_replan_book.py +261 -0
  11. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_renderplan_dependency_contract.py +10 -0
  12. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/__init__.py +46 -0
  13. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/_version.py +3 -3
  14. utterplan-0.6.3/utterplan/book.py +598 -0
  15. utterplan-0.6.3/utterplan/book_replan.py +761 -0
  16. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/cli.py +324 -318
  17. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan.egg-info/PKG-INFO +36 -1
  18. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan.egg-info/SOURCES.txt +5 -0
  19. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan.egg-info/scm_file_list.json +45 -0
  20. utterplan-0.6.3/utterplan.egg-info/scm_version.json +8 -0
  21. utterplan-0.6.1/AGENTS.md +0 -20
  22. utterplan-0.6.1/utterplan.egg-info/scm_version.json +0 -8
  23. {utterplan-0.6.1 → utterplan-0.6.3}/.codecrate.toml +0 -0
  24. {utterplan-0.6.1 → utterplan-0.6.3}/.github/workflows/codecov.yml +0 -0
  25. {utterplan-0.6.1 → utterplan-0.6.3}/.github/workflows/pre-commit.yml +0 -0
  26. {utterplan-0.6.1 → utterplan-0.6.3}/.github/workflows/python-publish.yml +0 -0
  27. {utterplan-0.6.1 → utterplan-0.6.3}/.github/workflows/tests.yml +0 -0
  28. {utterplan-0.6.1 → utterplan-0.6.3}/.gitignore +0 -0
  29. {utterplan-0.6.1 → utterplan-0.6.3}/.pre-commit-config.yaml +0 -0
  30. {utterplan-0.6.1 → utterplan-0.6.3}/LICENSE +0 -0
  31. {utterplan-0.6.1 → utterplan-0.6.3}/MANIFEST.in +0 -0
  32. {utterplan-0.6.1 → utterplan-0.6.3}/NOTICE +0 -0
  33. {utterplan-0.6.1 → utterplan-0.6.3}/docs/Makefile +0 -0
  34. {utterplan-0.6.1 → utterplan-0.6.3}/docs/architecture.md +0 -0
  35. {utterplan-0.6.1 → utterplan-0.6.3}/docs/conf.py +0 -0
  36. {utterplan-0.6.1 → utterplan-0.6.3}/docs/consumer-guide.md +0 -0
  37. {utterplan-0.6.1 → utterplan-0.6.3}/docs/coordinate-spaces.md +0 -0
  38. {utterplan-0.6.1 → utterplan-0.6.3}/docs/debugging.md +0 -0
  39. {utterplan-0.6.1 → utterplan-0.6.3}/docs/format.md +0 -0
  40. {utterplan-0.6.1 → utterplan-0.6.3}/docs/getting-started.md +0 -0
  41. {utterplan-0.6.1 → utterplan-0.6.3}/docs/index.md +0 -0
  42. {utterplan-0.6.1 → utterplan-0.6.3}/docs/make.bat +0 -0
  43. {utterplan-0.6.1 → utterplan-0.6.3}/docs/phase-a-completion.md +0 -0
  44. {utterplan-0.6.1 → utterplan-0.6.3}/docs/pykokoro-integration.md +0 -0
  45. {utterplan-0.6.1 → utterplan-0.6.3}/docs/requirements.txt +0 -0
  46. {utterplan-0.6.1 → utterplan-0.6.3}/examples/basic.py +0 -0
  47. {utterplan-0.6.1 → utterplan-0.6.3}/examples/chapter.ssmd +0 -0
  48. {utterplan-0.6.1 → utterplan-0.6.3}/examples/compile_file.py +0 -0
  49. {utterplan-0.6.1 → utterplan-0.6.3}/examples/inspect_plan.py +0 -0
  50. {utterplan-0.6.1 → utterplan-0.6.3}/examples/multilingual.py +0 -0
  51. {utterplan-0.6.1 → utterplan-0.6.3}/examples/ssmd_example.py +0 -0
  52. {utterplan-0.6.1 → utterplan-0.6.3}/pyproject.toml +0 -0
  53. {utterplan-0.6.1 → utterplan-0.6.3}/setup.cfg +0 -0
  54. {utterplan-0.6.1 → utterplan-0.6.3}/spec/schemas/v1.schema.json +0 -0
  55. {utterplan-0.6.1 → utterplan-0.6.3}/spec/schemas/v2.schema.json +0 -0
  56. {utterplan-0.6.1 → utterplan-0.6.3}/spec/schemas/v3.schema.json +0 -0
  57. {utterplan-0.6.1 → utterplan-0.6.3}/spec/schemas/v4.schema.json +0 -0
  58. {utterplan-0.6.1 → utterplan-0.6.3}/spec/utterplan.schema.json +0 -0
  59. {utterplan-0.6.1 → utterplan-0.6.3}/tests/__init__.py +0 -0
  60. {utterplan-0.6.1 → utterplan-0.6.3}/tests/compiler_helpers.py +0 -0
  61. {utterplan-0.6.1 → utterplan-0.6.3}/tests/fixtures/canonical_consumer_contract.expected.toml +0 -0
  62. {utterplan-0.6.1 → utterplan-0.6.3}/tests/fixtures/canonical_consumer_contract.ssmd +0 -0
  63. {utterplan-0.6.1 → utterplan-0.6.3}/tests/fixtures/ssmd_09_comprehensive.ssmd +0 -0
  64. {utterplan-0.6.1 → utterplan-0.6.3}/tests/golden/basic_en.utterplan.toml +0 -0
  65. {utterplan-0.6.1 → utterplan-0.6.3}/tests/golden/directives.utterplan.toml +0 -0
  66. {utterplan-0.6.1 → utterplan-0.6.3}/tests/golden/markers.utterplan.toml +0 -0
  67. {utterplan-0.6.1 → utterplan-0.6.3}/tests/golden/multilingual.utterplan.toml +0 -0
  68. {utterplan-0.6.1 → utterplan-0.6.3}/tests/golden/parenthetical.utterplan.toml +0 -0
  69. {utterplan-0.6.1 → utterplan-0.6.3}/tests/golden/spokenform_offsets.utterplan.toml +0 -0
  70. {utterplan-0.6.1 → utterplan-0.6.3}/tests/golden/ssmd_09_comprehensive.utterplan.toml +0 -0
  71. {utterplan-0.6.1 → utterplan-0.6.3}/tests/golden/ssmd_breaks.utterplan.toml +0 -0
  72. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/__init__.py +0 -0
  73. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/cases.py +0 -0
  74. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/fixtures/v4/basic_en.utterplan.json +0 -0
  75. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/fixtures/v4/directives.utterplan.json +0 -0
  76. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/fixtures/v4/markers.utterplan.json +0 -0
  77. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/fixtures/v4/multilingual.utterplan.json +0 -0
  78. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/fixtures/v4/parenthetical.utterplan.json +0 -0
  79. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/fixtures/v4/spokenform_offsets.utterplan.json +0 -0
  80. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/fixtures/v4/ssmd_09_comprehensive.utterplan.json +0 -0
  81. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/fixtures/v4/ssmd_breaks.utterplan.json +0 -0
  82. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/goldens/multilingual_preparation.json +0 -0
  83. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/goldens/spokenform_numbers.json +0 -0
  84. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/goldens/ssmd_break.json +0 -0
  85. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/goldens/ssmd_language_detection.json +0 -0
  86. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/goldens/ssmd_marker.json +0 -0
  87. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/goldens/ssmd_pronunciation.json +0 -0
  88. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/test_legacy_json_import.py +0 -0
  89. {utterplan-0.6.1 → utterplan-0.6.3}/tests/migration/test_semantic_migration_regressions.py +0 -0
  90. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/README.md +0 -0
  91. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v1/basic.json +0 -0
  92. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v1/directives.json +0 -0
  93. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v1/markers.json +0 -0
  94. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v1/multilingual.json +0 -0
  95. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v1/parenthetical.json +0 -0
  96. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v1/spokenform_offsets.json +0 -0
  97. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v1/ssmd_breaks.json +0 -0
  98. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v2/directives.json +0 -0
  99. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v3/multilingual.json +0 -0
  100. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v3/ssmd_09_comprehensive.json +0 -0
  101. {utterplan-0.6.1 → utterplan-0.6.3}/tests/schema_history/v5/canonical_consumer_contract.toml +0 -0
  102. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_atomic_io.py +0 -0
  103. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_batch.py +0 -0
  104. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_boundaries.py +0 -0
  105. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_cli.py +0 -0
  106. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_cli_batch.py +0 -0
  107. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_cli_render_book.py +0 -0
  108. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_cli_ssmdbook.py +0 -0
  109. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_compiler.py +0 -0
  110. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_consumer_contract.py +0 -0
  111. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_consumer_readiness.py +0 -0
  112. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_coordinates.py +0 -0
  113. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_dependency_architecture.py +0 -0
  114. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_directives.py +0 -0
  115. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_explain.py +0 -0
  116. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_fake_renderer.py +0 -0
  117. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_flow_compilation.py +0 -0
  118. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_format.py +0 -0
  119. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_golden.py +0 -0
  120. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_identity_units.py +0 -0
  121. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_import_boundaries.py +0 -0
  122. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_language.py +0 -0
  123. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_linguistics.py +0 -0
  124. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_migration_framework.py +0 -0
  125. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_migration_v3_to_v4.py +0 -0
  126. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_migration_v4_to_v5.py +0 -0
  127. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_pauses.py +0 -0
  128. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_planner.py +0 -0
  129. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_preparation.py +0 -0
  130. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_preview.py +0 -0
  131. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_progress.py +0 -0
  132. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_public_identity.py +0 -0
  133. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_renderability.py +0 -0
  134. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_renderability_repair.py +0 -0
  135. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_renderplan_batch.py +0 -0
  136. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_renderplan_export.py +0 -0
  137. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_renderplan_replan.py +0 -0
  138. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_renderplan_v7_contract.py +0 -0
  139. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_replacement_provenance.py +0 -0
  140. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_schema_history.py +0 -0
  141. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_schema_registry.py +0 -0
  142. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_schema_strict.py +0 -0
  143. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_schema_v6_source.py +0 -0
  144. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_schema_v7.py +0 -0
  145. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_segment_topology.py +0 -0
  146. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_segmentation_adapter.py +0 -0
  147. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_segmentation_recovery.py +0 -0
  148. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_semantic_boundaries.py +0 -0
  149. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_sentence_topology.py +0 -0
  150. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_ssmd_09_parser.py +0 -0
  151. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_ssmd_substitution_preparation.py +0 -0
  152. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_ssmdbook.py +0 -0
  153. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_token_topology.py +0 -0
  154. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_toml_format.py +0 -0
  155. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_ttsready_preparation_adapter.py +0 -0
  156. {utterplan-0.6.1 → utterplan-0.6.3}/tests/test_version.py +0 -0
  157. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/__main__.py +0 -0
  158. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/atomic_io.py +0 -0
  159. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/attempt_serialization.py +0 -0
  160. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/attempts.py +0 -0
  161. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/batch.py +0 -0
  162. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/boundaries.py +0 -0
  163. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/codecs/__init__.py +0 -0
  164. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/codecs/v4_toml.py +0 -0
  165. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/codecs/v5_toml.py +0 -0
  166. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/codecs/v6_toml.py +0 -0
  167. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/codecs/v7_toml.py +0 -0
  168. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/compiler.py +0 -0
  169. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/config.py +0 -0
  170. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/diagnostics.py +0 -0
  171. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/directives.py +0 -0
  172. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/exceptions.py +0 -0
  173. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/explain.py +0 -0
  174. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/flow_projection.py +0 -0
  175. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/format.py +0 -0
  176. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/hashing.py +0 -0
  177. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/language.py +0 -0
  178. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/linguistics.py +0 -0
  179. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/migration.py +0 -0
  180. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/migrations/__init__.py +0 -0
  181. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/migrations/registry.py +0 -0
  182. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/migrations/v1_to_v2.py +0 -0
  183. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/migrations/v2_to_v3.py +0 -0
  184. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/migrations/v3_to_v4.py +0 -0
  185. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/migrations/v4_to_v5.py +0 -0
  186. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/migrations/v5_to_v6.py +0 -0
  187. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/migrations/v6_to_v7.py +0 -0
  188. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/model.py +0 -0
  189. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/parsers.py +0 -0
  190. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/pauses.py +0 -0
  191. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/planner.py +0 -0
  192. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/preparation.py +0 -0
  193. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/preview.py +0 -0
  194. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/progress.py +0 -0
  195. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/py.typed +0 -0
  196. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/renderability.py +0 -0
  197. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/renderplan_batch.py +0 -0
  198. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/renderplan_export.py +0 -0
  199. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/renderplan_grouping.py +0 -0
  200. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/renderplan_projection.py +0 -0
  201. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/renderplan_replan.py +0 -0
  202. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/schema_registry.py +0 -0
  203. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/schemas/v1.schema.json +0 -0
  204. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/schemas/v2.schema.json +0 -0
  205. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/schemas/v3.schema.json +0 -0
  206. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/schemas/v4.schema.json +0 -0
  207. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/segmentation.py +0 -0
  208. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/serialization.py +0 -0
  209. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/spacy_models.py +0 -0
  210. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/spans.py +0 -0
  211. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/ssmdbook.py +0 -0
  212. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/stages/__init__.py +0 -0
  213. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/stages/document/__init__.py +0 -0
  214. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/stages/document/plain.py +0 -0
  215. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/stages/document/ssmd.py +0 -0
  216. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/stages/preparation/__init__.py +0 -0
  217. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/stages/preparation/identity.py +0 -0
  218. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/stages/preparation/ssmd.py +0 -0
  219. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/stages/preparation/ttsready.py +0 -0
  220. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/stages/protocols.py +0 -0
  221. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/token_topology.py +0 -0
  222. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/toml_codec.py +0 -0
  223. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/trace_codec.py +0 -0
  224. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/units.py +0 -0
  225. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/utterplan.schema.json +0 -0
  226. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan/versioning.py +0 -0
  227. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan.egg-info/dependency_links.txt +0 -0
  228. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan.egg-info/entry_points.txt +0 -0
  229. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan.egg-info/requires.txt +0 -0
  230. {utterplan-0.6.1 → utterplan-0.6.3}/utterplan.egg-info/top_level.txt +0 -0
@@ -0,0 +1,29 @@
1
+ # AGENTS.md
2
+
3
+ <!-- Generated by memoryledger. Do not edit directly. -->
4
+ <!-- Source: memoryledger records; regenerate with `memoryledger render` and `memoryledger export`. -->
5
+
6
+ ## Project memory policy
7
+
8
+ This file contains reviewed long-term project memory.
9
+
10
+ ## Rules
11
+
12
+ - UtterPlan is engine-independent. Core code must not import PyKokoro, PiperSynth, kokorog2p, piperg2p, ONNX Runtime, audio packages, or any consumer package.
13
+ - UtterPlan ends before G2P. Engine/model selection, synthesis, and audio composition happen downstream.
14
+ - `.utterplan.toml` schema v7 is the current inter-package contract; schema-v5/v6 TOML and historical JSON schemas v1–v4 remain sequential migration inputs only, and only the current schema version is natively supported.
15
+ - Python objects may not contain semantic state that cannot survive file roundtrip.
16
+ - Public FlowPlan objects contain no phonemes, model token IDs, models, sessions, or audio; completed plans must not retain spaCy or provider documents.
17
+ - Every offset has a documented coordinate space.
18
+ - Default planning is deterministic; the same source and configuration always produce the same executable plan and `plan_id`.
19
+ - Schema changes require explicit compatibility review, frozen historical fixture coverage, deterministic migration tests, and package artifact checks.
20
+ - Released schema files are immutable and retained under versioned paths; schemas v5, v6, and v7 have no JSON Schema resources.
21
+ - Every supported older schema must retain a sequential migration path to current (v1 through v6 feed v7).
22
+ - Migrations operate on serialized plain data and may not call parser, planner, G2P, renderer, or audio stages.
23
+ - Package version and schema version remain independent. Migration preserves a compiled plan; replanning is a separate operation.
24
+ - Optional compiler traces are sidecars; they must never alter executable plan content or identity.
25
+ - UtterPlan parses SSMD 0.9 only; it does not parse SSMD 0.8 or migrate source documents (`ssmd migrate` owns that).
26
+ - Book commands (`compile-book`, `render-book`) read the SSMDBook manifest only for chapter discovery, never modify the manifest or source chapters, write derived plans to separate directories, and never build book-level combined plans.
27
+ - RenderPlan projection is optional: VoiceRender creates and validates engine-backed RenderProfiles, while UtterPlan projects stored schema-v7 FlowPlans into profile-specific RenderPlans (with `renderplan-set.toml` and reports) and performs deterministic replan refinement only.
28
+ - UtterPlan depends directly on SSMD, PhraseSplit, TTSReady, and the renderplan contract package only; production code does not import Spokenform, and spaCy stays optional best-effort enrichment.
29
+ - Repository tests must be self-contained and must not require sibling consumer checkouts; consumer-specific compatibility testing belongs in the consumer repository.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: utterplan
3
- Version: 0.6.1
3
+ Version: 0.6.3
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
@@ -353,6 +353,41 @@ creates or refreshes engine-backed profiles, then preflights and renders the
353
353
  resulting RenderPlans. The single-file `utterplan render-plan` command remains the
354
354
  low-level projection and deterministic replan primitive.
355
355
 
356
+ When VoiceRender reports `preflight.replan`, use the new `replan-book` command to
357
+ refine the exact active chapter plan. The operation reads the RenderProfile snapshot
358
+ from the selected variant, writes a fingerprinted child RenderPlan, and updates only
359
+ that chapter's active set entry. It does not replace the parent plan or rerun initial
360
+ projection:
361
+
362
+ ```bash
363
+ # VoiceRender measures the active plans; suppose chapter 5 returns preflight.replan.
364
+ voicerender render-book . \
365
+ --variant narration4--28f616b6fe3b \
366
+ --chapters 5 \
367
+ --emphasis-policy defer-to-compose
368
+
369
+ utterplan replan-book . \
370
+ --variant narration4--28f616b6fe3b \
371
+ --chapters 5
372
+
373
+ # Measure/render the newly active child. Repeat these last two commands if it
374
+ # still reports preflight.replan; each cycle must use feedback for the active plan.
375
+ voicerender render-book . \
376
+ --variant narration4--28f616b6fe3b \
377
+ --chapters 5 \
378
+ --emphasis-policy defer-to-compose
379
+ ```
380
+
381
+ Use the exact variant directory name (including its profile fingerprint). `replan-book`
382
+ searches `preflight-recheck.toml` before `preflight.toml` and refuses stale feedback,
383
+ so a report for a parent can never be applied to its child. The single-file
384
+ `render-plan --previous ... --preflight ...` operation remains available for
385
+ low-level replanning.
386
+
387
+ This orchestration does not add a splitter, renderer-specific capacity estimate, or
388
+ engine dependency. VoiceRender supplies preflight measurements and remains responsible
389
+ for synthesis and audio composition.
390
+
356
391
  Related packages: [RenderPlan](https://pypi.org/project/renderplan/) defines the
357
392
  shared profile and plan contracts; [VoiceRender](https://pypi.org/project/voicerender/)
358
393
  creates engine-backed profiles and performs preflight and synthesis.
@@ -109,6 +109,41 @@ creates or refreshes engine-backed profiles, then preflights and renders the
109
109
  resulting RenderPlans. The single-file `utterplan render-plan` command remains the
110
110
  low-level projection and deterministic replan primitive.
111
111
 
112
+ When VoiceRender reports `preflight.replan`, use the new `replan-book` command to
113
+ refine the exact active chapter plan. The operation reads the RenderProfile snapshot
114
+ from the selected variant, writes a fingerprinted child RenderPlan, and updates only
115
+ that chapter's active set entry. It does not replace the parent plan or rerun initial
116
+ projection:
117
+
118
+ ```bash
119
+ # VoiceRender measures the active plans; suppose chapter 5 returns preflight.replan.
120
+ voicerender render-book . \
121
+ --variant narration4--28f616b6fe3b \
122
+ --chapters 5 \
123
+ --emphasis-policy defer-to-compose
124
+
125
+ utterplan replan-book . \
126
+ --variant narration4--28f616b6fe3b \
127
+ --chapters 5
128
+
129
+ # Measure/render the newly active child. Repeat these last two commands if it
130
+ # still reports preflight.replan; each cycle must use feedback for the active plan.
131
+ voicerender render-book . \
132
+ --variant narration4--28f616b6fe3b \
133
+ --chapters 5 \
134
+ --emphasis-policy defer-to-compose
135
+ ```
136
+
137
+ Use the exact variant directory name (including its profile fingerprint). `replan-book`
138
+ searches `preflight-recheck.toml` before `preflight.toml` and refuses stale feedback,
139
+ so a report for a parent can never be applied to its child. The single-file
140
+ `render-plan --previous ... --preflight ...` operation remains available for
141
+ low-level replanning.
142
+
143
+ This orchestration does not add a splitter, renderer-specific capacity estimate, or
144
+ engine dependency. VoiceRender supplies preflight measurements and remains responsible
145
+ for synthesis and audio composition.
146
+
112
147
  Related packages: [RenderPlan](https://pypi.org/project/renderplan/) defines the
113
148
  shared profile and plan contracts; [VoiceRender](https://pypi.org/project/voicerender/)
114
149
  creates engine-backed profiles and performs preflight and synthesis.
@@ -4,6 +4,30 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [v0.6.3] - Unreleased
8
+
9
+ ### Added
10
+
11
+ - Added replan-book to refine active book RenderPlans from matching VoiceRender preflight feedback
12
+
13
+ <!-- generated by releaseledger -->
14
+
15
+ ## [v0.6.2] - 2026-10-14
16
+
17
+ ### Added
18
+
19
+ - Added public book compilation and RenderPlan projection services with safe chapter selection and per-chapter reporting
20
+
21
+ <!-- generated by releaseledger -->
22
+
23
+ ## [0.6.1] - 2026-10-13
24
+
25
+ ### Documentation
26
+
27
+ - Documented the arc42 system architecture, structure, and boundaries
28
+
29
+ <!-- generated by releaseledger -->
30
+
7
31
  ## [v0.6.0] - 2026-10-13
8
32
 
9
33
  ### Added
@@ -205,6 +205,76 @@ are rejected before chapter processing. Exit status is 0 when all selected
205
205
  chapters succeed, 1 when any chapter fails, and 2 for usage or shared-configuration
206
206
  errors. See the [SSMDBook workflow guide](ssmdbook.md) for end-to-end and multi-voice examples.
207
207
 
208
+ ## Replan active RenderPlans for selected chapters
209
+
210
+ `replan-book` is the book/variant orchestration for VoiceRender's capacity feedback.
211
+ It loads the profile snapshot owned by the existing RenderPlanSet; callers must select
212
+ the exact variant directory, not supply another profile:
213
+
214
+ VoiceRender supplies capacity feedback: UtterPlan does not add renderer-specific
215
+ metrics, a splitter, engine selection, synthesis, or audio composition.
216
+
217
+ ```text
218
+ utterplan replan-book INPUT --variant VARIANT [--chapters SELECTOR]
219
+ [--renderplan-root PATH] [--voicerender-root PATH] [--report PATH]
220
+ [--dry-run] [--fail-fast] [--explain] [--json]
221
+ ```
222
+
223
+ Example repeatable lifecycle:
224
+
225
+ ```bash
226
+ # Initial projection and exact renderer preflight/render
227
+ utterplan render-book . --profile narration4.renderprofile.toml --variant narration4 --chapters 5
228
+ voicerender render-book . --variant narration4--28f616b6fe3b --chapters 5 \
229
+ --emphasis-policy defer-to-compose
230
+
231
+ # If VoiceRender returns preflight.replan, refine only the active chapter plan
232
+ utterplan replan-book . --variant narration4--28f616b6fe3b --chapters 5
233
+
234
+ # Preflight/render the new active plan; repeat replan-book and this command if needed
235
+ voicerender render-book . --variant narration4--28f616b6fe3b --chapters 5 \
236
+ --emphasis-policy defer-to-compose
237
+ ```
238
+
239
+ `INPUT` is an SSMDBook root or its canonical `chapters/` directory. Chapter selectors
240
+ use manifest source numbers and retain manifest order. The default RenderPlan root is
241
+ `<book-root>/renderplan`; the default VoiceRender root is `<book-root>/voicerender`.
242
+ The command reads `<variant>/renderprofile.toml` and the selected active plan paths
243
+ from `renderplan-set.toml`. It discovers reports under
244
+ `<voicerender-root>/<variant>/<chapter-id>/`, preferring `preflight-recheck.toml`
245
+ over `preflight.toml` when both fully validate against the exact active RenderPlan.
246
+
247
+ Only a matching `status="replan"` report is accepted. Missing reports, stale parent
248
+ reports, mismatched profile/plan identities, and `ok`/`reject` statuses fail that
249
+ chapter; the command never falls back to an initial RenderPlan projection. A successful
250
+ replan writes a deterministic immutable child plan first, then atomically changes only
251
+ the selected chapter's active set entry. Parent plans, source UtterPlans, profile
252
+ identity, and unselected set entries remain unchanged. Run VoiceRender again after
253
+ each replan; repeat the two feedback steps until preflight is `ok`.
254
+
255
+ Defaults and behavior:
256
+
257
+ - `--variant` is required and must name the existing full variant directory, including
258
+ its profile fingerprint. The profile snapshot is loaded from that collection.
259
+ - `--chapters`: `all`, one source number, an inclusive range, or comma-separated
260
+ selections; default is `all`.
261
+ - `--renderplan-root` and `--voicerender-root` override the collection/data roots,
262
+ not the selected variant or chapter paths recorded by the contracts.
263
+ - `--report`: defaults to `<variant-dir>/replan-report.toml`; progress is persisted
264
+ after each chapter and the final report is marked complete.
265
+ - `--dry-run`: validates and plans children without writing child RenderPlans or
266
+ changing the set index. It writes the operational report and reports successful
267
+ items as `planned`.
268
+ - `--fail-fast`: later chapters are recorded as skipped after the first failure;
269
+ without it, later selected chapters continue.
270
+ - `--explain` uses the existing per-request RenderPlan explanation; `--json` emits
271
+ structured outcome paths, identities, replacement counts, errors, and optional
272
+ explanations.
273
+
274
+ Re-running with a stale report after activating a child fails with
275
+ `renderplan.replan.book.preflight_stale`. VoiceRender must first measure the active
276
+ child to produce its own matching feedback report.
277
+
208
278
  ## Explain a plan
209
279
 
210
280
  Explain an existing compiled plan as a human-readable speech narrative:
@@ -187,6 +187,28 @@ from utterplan.renderplan_batch import RenderRequest, new_renderplan_set, render
187
187
 
188
188
  `render_to_files()` projects schema-v7 `FlowPlan` inputs; grouping, source mapping, export, and replan logic remain UtterPlan-owned.
189
189
 
190
+ ## Public SSMDBook services
191
+
192
+ `compile_book()` and `render_book()` are the public Python counterparts of the `compile-book` and `render-book` commands. They take paths and keyword options directly; callers do not construct `argparse.Namespace`, spawn a subprocess, or reproduce chapter selection, path safety, variant naming, snapshot/set initialization, or report logic. The CLI delegates to these same services.
193
+
194
+ ```python
195
+ from utterplan import compile_book, render_book
196
+
197
+ compiled = compile_book(".", chapters="5-17")
198
+ projected = render_book(
199
+ ".",
200
+ profile="narration.renderprofile.toml",
201
+ chapters="5-17",
202
+ )
203
+
204
+ assert compiled.exit_code == projected.exit_code == 0
205
+ print(projected.variant) # resolved <label>--<profile fingerprint>
206
+ ```
207
+
208
+ `BookCompileRequest` / `BookRenderRequest` are immutable option records. Their corresponding result records expose the workspace, selector, selected chapter IDs, artifact and report paths, per-chapter outcomes, `failed`, and `exit_code`; the render result also includes `profile_id`, `variant`, `variant_dir`, snapshot, and set paths. `variant` is authoritative: do not duplicate the label normalization or profile fingerprint algorithm downstream.
209
+
210
+ Optional `on_progress` callbacks receive the existing `CompileOutcome` or `RenderOutcome` for each chapter. Optional `on_start` callbacks receive a resolved book-start record before batch processing. Services do not print. They preserve schema-v7 output and CLI filesystem/report behavior; workspace/path safety errors raise `BookServiceError`, and chapter-level failures are returned as outcomes. Pass `language=` to provide the fallback/required-language override, or supply a `PlannerConfig` with `planner_config=`. See the [SSMDBook guide](ssmdbook) for layouts, safety rules, and CLI/Python examples.
211
+
190
212
  ## Planner progress callbacks
191
213
 
192
214
  `UtterancePlanner.plan`, `UtterancePlanner.compile`, and `compile_document` accept an optional keyword-only `on_progress` callback. It receives typed `PlannerProgressEvent` objects synchronously in the planner thread. Progress is operational only: it is not added to `PlannerConfig` or the plan, and enabling a callback does not change plan identity or serialization.
@@ -137,3 +137,33 @@ the collection's snapshot remains available for inspection and reproducible
137
137
  replanning. See the [CLI reference](cli.md#produce-renderplans-for-selected-ssmdbook-chapters),
138
138
  [RenderPlan](https://pypi.org/project/renderplan/), and
139
139
  [VoiceRender](https://pypi.org/project/voicerender/).
140
+
141
+ ## Python API for SSMDBook workspaces
142
+
143
+ The Python API and CLI share the same book orchestration and artifact layout. The public services read the manifest for chapter discovery, select by original `source_number`, validate safe workspace paths, and write the same reports and per-chapter plans as the commands above. They do not print to the console or retain CLI argument objects.
144
+
145
+ CLI:
146
+
147
+ ```bash
148
+ utterplan compile-book . --chapters 5-17
149
+ utterplan render-book . --profile narration.renderprofile.toml --chapters 5-17
150
+ ```
151
+
152
+ Equivalent Python:
153
+
154
+ ```python
155
+ from utterplan import compile_book, render_book
156
+
157
+ compiled = compile_book(".", chapters="5-17")
158
+ projected = render_book(
159
+ ".",
160
+ profile="narration.renderprofile.toml",
161
+ chapters="5-17",
162
+ )
163
+
164
+ print(projected.variant) # exact profile-specific RenderPlan directory name
165
+ ```
166
+
167
+ `BookCompileResult` and `BookRenderResult` expose the resolved workspace, selector, selected chapter IDs, artifact/report paths, per-chapter outcomes, `failed`, and `exit_code`. `BookRenderResult.variant` is the final sanitized label plus profile fingerprint; consumers should use it rather than reproduce the naming algorithm. Optional `on_progress` callbacks receive each compile or projection outcome, and `on_start` callbacks receive resolved selection and output metadata. A chapter must declare its language unless `language=` is explicitly supplied to `compile_book()`; compiler behavior can otherwise be configured with `planner_config=`. Invalid workspaces and unsafe paths raise `BookServiceError`, while ordinary per-chapter failures are represented in outcomes.
168
+
169
+ The public request models `BookCompileRequest` and `BookRenderRequest` capture the corresponding service options. These APIs remain engine-independent: they neither inspect TTS engines nor synthesize or compose audio.