utterplan 0.6.2__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 (229) hide show
  1. {utterplan-0.6.2 → utterplan-0.6.3}/PKG-INFO +36 -1
  2. {utterplan-0.6.2 → utterplan-0.6.3}/README.md +35 -0
  3. {utterplan-0.6.2 → utterplan-0.6.3}/docs/changelog.md +8 -0
  4. {utterplan-0.6.2 → utterplan-0.6.3}/docs/cli.md +70 -0
  5. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_book_api.py +44 -0
  6. utterplan-0.6.3/tests/test_book_replan.py +471 -0
  7. utterplan-0.6.3/tests/test_cli_replan_book.py +261 -0
  8. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/__init__.py +20 -0
  9. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/_version.py +3 -3
  10. utterplan-0.6.3/utterplan/book_replan.py +761 -0
  11. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/cli.py +204 -0
  12. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan.egg-info/PKG-INFO +36 -1
  13. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan.egg-info/SOURCES.txt +3 -0
  14. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan.egg-info/scm_file_list.json +5 -0
  15. utterplan-0.6.3/utterplan.egg-info/scm_version.json +8 -0
  16. utterplan-0.6.2/utterplan.egg-info/scm_version.json +0 -8
  17. {utterplan-0.6.2 → utterplan-0.6.3}/.codecrate.toml +0 -0
  18. {utterplan-0.6.2 → utterplan-0.6.3}/.github/workflows/codecov.yml +0 -0
  19. {utterplan-0.6.2 → utterplan-0.6.3}/.github/workflows/pre-commit.yml +0 -0
  20. {utterplan-0.6.2 → utterplan-0.6.3}/.github/workflows/python-publish.yml +0 -0
  21. {utterplan-0.6.2 → utterplan-0.6.3}/.github/workflows/tests.yml +0 -0
  22. {utterplan-0.6.2 → utterplan-0.6.3}/.gitignore +0 -0
  23. {utterplan-0.6.2 → utterplan-0.6.3}/.pre-commit-config.yaml +0 -0
  24. {utterplan-0.6.2 → utterplan-0.6.3}/AGENTS.md +0 -0
  25. {utterplan-0.6.2 → utterplan-0.6.3}/LICENSE +0 -0
  26. {utterplan-0.6.2 → utterplan-0.6.3}/MANIFEST.in +0 -0
  27. {utterplan-0.6.2 → utterplan-0.6.3}/NOTICE +0 -0
  28. {utterplan-0.6.2 → utterplan-0.6.3}/docs/Makefile +0 -0
  29. {utterplan-0.6.2 → utterplan-0.6.3}/docs/architecture.md +0 -0
  30. {utterplan-0.6.2 → utterplan-0.6.3}/docs/conf.py +0 -0
  31. {utterplan-0.6.2 → utterplan-0.6.3}/docs/consumer-guide.md +0 -0
  32. {utterplan-0.6.2 → utterplan-0.6.3}/docs/coordinate-spaces.md +0 -0
  33. {utterplan-0.6.2 → utterplan-0.6.3}/docs/debugging.md +0 -0
  34. {utterplan-0.6.2 → utterplan-0.6.3}/docs/format.md +0 -0
  35. {utterplan-0.6.2 → utterplan-0.6.3}/docs/getting-started.md +0 -0
  36. {utterplan-0.6.2 → utterplan-0.6.3}/docs/index.md +0 -0
  37. {utterplan-0.6.2 → utterplan-0.6.3}/docs/make.bat +0 -0
  38. {utterplan-0.6.2 → utterplan-0.6.3}/docs/phase-a-completion.md +0 -0
  39. {utterplan-0.6.2 → utterplan-0.6.3}/docs/pykokoro-integration.md +0 -0
  40. {utterplan-0.6.2 → utterplan-0.6.3}/docs/python-api.md +0 -0
  41. {utterplan-0.6.2 → utterplan-0.6.3}/docs/requirements.txt +0 -0
  42. {utterplan-0.6.2 → utterplan-0.6.3}/docs/ssmdbook.md +0 -0
  43. {utterplan-0.6.2 → utterplan-0.6.3}/examples/basic.py +0 -0
  44. {utterplan-0.6.2 → utterplan-0.6.3}/examples/chapter.ssmd +0 -0
  45. {utterplan-0.6.2 → utterplan-0.6.3}/examples/compile_file.py +0 -0
  46. {utterplan-0.6.2 → utterplan-0.6.3}/examples/inspect_plan.py +0 -0
  47. {utterplan-0.6.2 → utterplan-0.6.3}/examples/multilingual.py +0 -0
  48. {utterplan-0.6.2 → utterplan-0.6.3}/examples/ssmd_example.py +0 -0
  49. {utterplan-0.6.2 → utterplan-0.6.3}/pyproject.toml +0 -0
  50. {utterplan-0.6.2 → utterplan-0.6.3}/setup.cfg +0 -0
  51. {utterplan-0.6.2 → utterplan-0.6.3}/spec/schemas/v1.schema.json +0 -0
  52. {utterplan-0.6.2 → utterplan-0.6.3}/spec/schemas/v2.schema.json +0 -0
  53. {utterplan-0.6.2 → utterplan-0.6.3}/spec/schemas/v3.schema.json +0 -0
  54. {utterplan-0.6.2 → utterplan-0.6.3}/spec/schemas/v4.schema.json +0 -0
  55. {utterplan-0.6.2 → utterplan-0.6.3}/spec/utterplan.schema.json +0 -0
  56. {utterplan-0.6.2 → utterplan-0.6.3}/tests/__init__.py +0 -0
  57. {utterplan-0.6.2 → utterplan-0.6.3}/tests/compiler_helpers.py +0 -0
  58. {utterplan-0.6.2 → utterplan-0.6.3}/tests/fixtures/canonical_consumer_contract.expected.toml +0 -0
  59. {utterplan-0.6.2 → utterplan-0.6.3}/tests/fixtures/canonical_consumer_contract.ssmd +0 -0
  60. {utterplan-0.6.2 → utterplan-0.6.3}/tests/fixtures/ssmd_09_comprehensive.ssmd +0 -0
  61. {utterplan-0.6.2 → utterplan-0.6.3}/tests/golden/basic_en.utterplan.toml +0 -0
  62. {utterplan-0.6.2 → utterplan-0.6.3}/tests/golden/directives.utterplan.toml +0 -0
  63. {utterplan-0.6.2 → utterplan-0.6.3}/tests/golden/markers.utterplan.toml +0 -0
  64. {utterplan-0.6.2 → utterplan-0.6.3}/tests/golden/multilingual.utterplan.toml +0 -0
  65. {utterplan-0.6.2 → utterplan-0.6.3}/tests/golden/parenthetical.utterplan.toml +0 -0
  66. {utterplan-0.6.2 → utterplan-0.6.3}/tests/golden/spokenform_offsets.utterplan.toml +0 -0
  67. {utterplan-0.6.2 → utterplan-0.6.3}/tests/golden/ssmd_09_comprehensive.utterplan.toml +0 -0
  68. {utterplan-0.6.2 → utterplan-0.6.3}/tests/golden/ssmd_breaks.utterplan.toml +0 -0
  69. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/__init__.py +0 -0
  70. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/cases.py +0 -0
  71. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/fixtures/v4/basic_en.utterplan.json +0 -0
  72. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/fixtures/v4/directives.utterplan.json +0 -0
  73. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/fixtures/v4/markers.utterplan.json +0 -0
  74. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/fixtures/v4/multilingual.utterplan.json +0 -0
  75. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/fixtures/v4/parenthetical.utterplan.json +0 -0
  76. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/fixtures/v4/spokenform_offsets.utterplan.json +0 -0
  77. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/fixtures/v4/ssmd_09_comprehensive.utterplan.json +0 -0
  78. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/fixtures/v4/ssmd_breaks.utterplan.json +0 -0
  79. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/goldens/multilingual_preparation.json +0 -0
  80. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/goldens/spokenform_numbers.json +0 -0
  81. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/goldens/ssmd_break.json +0 -0
  82. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/goldens/ssmd_language_detection.json +0 -0
  83. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/goldens/ssmd_marker.json +0 -0
  84. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/goldens/ssmd_pronunciation.json +0 -0
  85. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/test_legacy_json_import.py +0 -0
  86. {utterplan-0.6.2 → utterplan-0.6.3}/tests/migration/test_semantic_migration_regressions.py +0 -0
  87. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/README.md +0 -0
  88. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v1/basic.json +0 -0
  89. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v1/directives.json +0 -0
  90. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v1/markers.json +0 -0
  91. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v1/multilingual.json +0 -0
  92. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v1/parenthetical.json +0 -0
  93. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v1/spokenform_offsets.json +0 -0
  94. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v1/ssmd_breaks.json +0 -0
  95. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v2/directives.json +0 -0
  96. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v3/multilingual.json +0 -0
  97. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v3/ssmd_09_comprehensive.json +0 -0
  98. {utterplan-0.6.2 → utterplan-0.6.3}/tests/schema_history/v5/canonical_consumer_contract.toml +0 -0
  99. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_atomic_io.py +0 -0
  100. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_batch.py +0 -0
  101. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_boundaries.py +0 -0
  102. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_cli.py +0 -0
  103. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_cli_batch.py +0 -0
  104. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_cli_render_book.py +0 -0
  105. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_cli_ssmdbook.py +0 -0
  106. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_compiler.py +0 -0
  107. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_consumer_contract.py +0 -0
  108. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_consumer_readiness.py +0 -0
  109. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_coordinates.py +0 -0
  110. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_dependency_architecture.py +0 -0
  111. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_directives.py +0 -0
  112. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_explain.py +0 -0
  113. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_fake_renderer.py +0 -0
  114. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_flow_compilation.py +0 -0
  115. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_format.py +0 -0
  116. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_golden.py +0 -0
  117. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_identity_units.py +0 -0
  118. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_import_boundaries.py +0 -0
  119. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_language.py +0 -0
  120. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_linguistics.py +0 -0
  121. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_migration_framework.py +0 -0
  122. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_migration_v3_to_v4.py +0 -0
  123. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_migration_v4_to_v5.py +0 -0
  124. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_pauses.py +0 -0
  125. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_planner.py +0 -0
  126. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_preparation.py +0 -0
  127. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_preview.py +0 -0
  128. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_progress.py +0 -0
  129. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_public_identity.py +0 -0
  130. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_renderability.py +0 -0
  131. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_renderability_repair.py +0 -0
  132. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_renderplan_batch.py +0 -0
  133. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_renderplan_dependency_contract.py +0 -0
  134. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_renderplan_export.py +0 -0
  135. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_renderplan_replan.py +0 -0
  136. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_renderplan_v7_contract.py +0 -0
  137. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_replacement_provenance.py +0 -0
  138. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_schema_history.py +0 -0
  139. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_schema_registry.py +0 -0
  140. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_schema_strict.py +0 -0
  141. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_schema_v6_source.py +0 -0
  142. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_schema_v7.py +0 -0
  143. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_segment_topology.py +0 -0
  144. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_segmentation_adapter.py +0 -0
  145. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_segmentation_recovery.py +0 -0
  146. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_semantic_boundaries.py +0 -0
  147. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_sentence_topology.py +0 -0
  148. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_ssmd_09_parser.py +0 -0
  149. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_ssmd_substitution_preparation.py +0 -0
  150. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_ssmdbook.py +0 -0
  151. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_token_topology.py +0 -0
  152. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_toml_format.py +0 -0
  153. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_ttsready_preparation_adapter.py +0 -0
  154. {utterplan-0.6.2 → utterplan-0.6.3}/tests/test_version.py +0 -0
  155. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/__main__.py +0 -0
  156. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/atomic_io.py +0 -0
  157. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/attempt_serialization.py +0 -0
  158. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/attempts.py +0 -0
  159. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/batch.py +0 -0
  160. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/book.py +0 -0
  161. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/boundaries.py +0 -0
  162. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/codecs/__init__.py +0 -0
  163. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/codecs/v4_toml.py +0 -0
  164. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/codecs/v5_toml.py +0 -0
  165. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/codecs/v6_toml.py +0 -0
  166. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/codecs/v7_toml.py +0 -0
  167. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/compiler.py +0 -0
  168. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/config.py +0 -0
  169. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/diagnostics.py +0 -0
  170. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/directives.py +0 -0
  171. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/exceptions.py +0 -0
  172. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/explain.py +0 -0
  173. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/flow_projection.py +0 -0
  174. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/format.py +0 -0
  175. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/hashing.py +0 -0
  176. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/language.py +0 -0
  177. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/linguistics.py +0 -0
  178. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/migration.py +0 -0
  179. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/migrations/__init__.py +0 -0
  180. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/migrations/registry.py +0 -0
  181. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/migrations/v1_to_v2.py +0 -0
  182. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/migrations/v2_to_v3.py +0 -0
  183. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/migrations/v3_to_v4.py +0 -0
  184. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/migrations/v4_to_v5.py +0 -0
  185. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/migrations/v5_to_v6.py +0 -0
  186. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/migrations/v6_to_v7.py +0 -0
  187. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/model.py +0 -0
  188. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/parsers.py +0 -0
  189. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/pauses.py +0 -0
  190. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/planner.py +0 -0
  191. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/preparation.py +0 -0
  192. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/preview.py +0 -0
  193. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/progress.py +0 -0
  194. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/py.typed +0 -0
  195. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/renderability.py +0 -0
  196. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/renderplan_batch.py +0 -0
  197. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/renderplan_export.py +0 -0
  198. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/renderplan_grouping.py +0 -0
  199. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/renderplan_projection.py +0 -0
  200. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/renderplan_replan.py +0 -0
  201. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/schema_registry.py +0 -0
  202. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/schemas/v1.schema.json +0 -0
  203. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/schemas/v2.schema.json +0 -0
  204. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/schemas/v3.schema.json +0 -0
  205. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/schemas/v4.schema.json +0 -0
  206. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/segmentation.py +0 -0
  207. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/serialization.py +0 -0
  208. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/spacy_models.py +0 -0
  209. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/spans.py +0 -0
  210. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/ssmdbook.py +0 -0
  211. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/stages/__init__.py +0 -0
  212. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/stages/document/__init__.py +0 -0
  213. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/stages/document/plain.py +0 -0
  214. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/stages/document/ssmd.py +0 -0
  215. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/stages/preparation/__init__.py +0 -0
  216. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/stages/preparation/identity.py +0 -0
  217. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/stages/preparation/ssmd.py +0 -0
  218. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/stages/preparation/ttsready.py +0 -0
  219. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/stages/protocols.py +0 -0
  220. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/token_topology.py +0 -0
  221. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/toml_codec.py +0 -0
  222. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/trace_codec.py +0 -0
  223. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/units.py +0 -0
  224. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/utterplan.schema.json +0 -0
  225. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan/versioning.py +0 -0
  226. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan.egg-info/dependency_links.txt +0 -0
  227. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan.egg-info/entry_points.txt +0 -0
  228. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan.egg-info/requires.txt +0 -0
  229. {utterplan-0.6.2 → utterplan-0.6.3}/utterplan.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: utterplan
3
- Version: 0.6.2
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,14 @@
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
+
7
15
  ## [v0.6.2] - 2026-10-14
8
16
 
9
17
  ### 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:
@@ -16,9 +16,15 @@ from utterplan import (
16
16
  BookCompileResult,
17
17
  BookRenderRequest,
18
18
  BookRenderResult,
19
+ BookReplanError,
20
+ BookReplanRequest,
21
+ BookReplanResult,
22
+ BookReplanStart,
19
23
  BookServiceError,
24
+ ReplanOutcome,
20
25
  compile_book,
21
26
  render_book,
27
+ replan_book,
22
28
  )
23
29
  from utterplan.config import LinguisticsConfig, PlannerConfig
24
30
  from utterplan.model import FlowPlan
@@ -95,9 +101,47 @@ def test_public_request_and_result_models_are_available_at_package_root() -> Non
95
101
  selected_chapter_ids=(),
96
102
  outcomes=(),
97
103
  )
104
+ replan_request = BookReplanRequest(Path("book"), variant="narration--abc")
105
+ replan_outcome = ReplanOutcome(
106
+ index=1,
107
+ id="chapter-0005",
108
+ source_number=5,
109
+ status="failed",
110
+ utterplan=None,
111
+ previous_renderplan=None,
112
+ previous_render_plan_id=None,
113
+ preflight=None,
114
+ )
115
+ replan_result = BookReplanResult(
116
+ workspace=Path("book"),
117
+ variant="narration--abc",
118
+ variant_dir=Path("book/renderplan/narration--abc"),
119
+ set_path=Path("book/renderplan/narration--abc/renderplan-set.toml"),
120
+ profile_path=Path("book/renderplan/narration--abc/renderprofile.toml"),
121
+ report_path=Path("book/renderplan/narration--abc/replan-report.toml"),
122
+ selected_chapter_ids=("chapter-0005",),
123
+ dry_run=False,
124
+ outcomes=(replan_outcome,),
125
+ )
126
+ replan_start = BookReplanStart(
127
+ workspace=Path("book"),
128
+ chapter_selector="5",
129
+ selected_chapter_ids=("chapter-0005",),
130
+ variant="narration--abc",
131
+ variant_dir=replan_result.variant_dir,
132
+ set_path=replan_result.set_path,
133
+ profile_path=replan_result.profile_path,
134
+ voicerender_dir=Path("book/voicerender/narration--abc"),
135
+ report_path=replan_result.report_path,
136
+ )
98
137
  assert compile_request.book == Path("book")
99
138
  assert render_request.profile == Path("profile.renderprofile.toml")
100
139
  assert compile_result.exit_code == render_result.exit_code == 0
140
+ assert replan_request.book == Path("book")
141
+ assert replan_result.exit_code == 1 and replan_result.failed == 1
142
+ assert replan_start.variant == replan_request.variant
143
+ assert callable(replan_book)
144
+ assert issubclass(BookReplanError, BookServiceError)
101
145
  assert compile_result.failed == render_result.failed == 0
102
146
 
103
147