utterplan 0.6.4__tar.gz → 0.6.6__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 (257) hide show
  1. {utterplan-0.6.4 → utterplan-0.6.6}/.github/workflows/tests.yml +12 -12
  2. {utterplan-0.6.4 → utterplan-0.6.6}/AGENTS.md +1 -1
  3. utterplan-0.6.6/MANIFEST.in +2 -0
  4. {utterplan-0.6.4 → utterplan-0.6.6}/PKG-INFO +91 -58
  5. {utterplan-0.6.4 → utterplan-0.6.6}/README.md +90 -57
  6. {utterplan-0.6.4 → utterplan-0.6.6}/docs/architecture.md +105 -91
  7. utterplan-0.6.6/docs/bundles.md +82 -0
  8. {utterplan-0.6.4 → utterplan-0.6.6}/docs/changelog.md +29 -0
  9. {utterplan-0.6.4 → utterplan-0.6.6}/docs/cli.md +23 -152
  10. {utterplan-0.6.4 → utterplan-0.6.6}/docs/getting-started.md +12 -28
  11. {utterplan-0.6.4 → utterplan-0.6.6}/docs/index.md +2 -4
  12. {utterplan-0.6.4 → utterplan-0.6.6}/docs/python-api.md +37 -10
  13. {utterplan-0.6.4 → utterplan-0.6.6}/pyproject.toml +1 -1
  14. utterplan-0.6.4/tests/test_book_replan.py → utterplan-0.6.6/tests/test_bundle_book_replan.py +6 -5
  15. utterplan-0.6.4/tests/test_book_api.py → utterplan-0.6.6/tests/test_bundle_book_services.py +54 -89
  16. utterplan-0.6.4/tests/test_document_workspace.py → utterplan-0.6.6/tests/test_bundle_document_compile.py +51 -42
  17. utterplan-0.6.6/tests/test_bundle_document_render.py +121 -0
  18. utterplan-0.6.6/tests/test_bundle_replan.py +135 -0
  19. utterplan-0.6.6/tests/test_bundle_services.py +136 -0
  20. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_cli.py +23 -24
  21. utterplan-0.6.4/tests/test_cli_ssmdbook.py → utterplan-0.6.6/tests/test_cli_bundle_compile_book.py +60 -66
  22. utterplan-0.6.4/tests/test_cli_ssmdoc.py → utterplan-0.6.6/tests/test_cli_bundle_document.py +76 -72
  23. utterplan-0.6.4/tests/test_cli_render_book.py → utterplan-0.6.6/tests/test_cli_bundle_render_book.py +81 -21
  24. utterplan-0.6.6/tests/test_cli_bundle_render_document.py +345 -0
  25. utterplan-0.6.4/tests/test_cli_replan_book.py → utterplan-0.6.6/tests/test_cli_bundle_replan_book.py +20 -17
  26. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_import_boundaries.py +1 -1
  27. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderplan_export.py +133 -0
  28. utterplan-0.6.6/tests/test_role_coverage.py +126 -0
  29. utterplan-0.6.6/tests/test_source_input.py +52 -0
  30. utterplan-0.6.6/tests/test_ssmd_bundle.py +211 -0
  31. utterplan-0.6.4/tests/test_ssmdbook.py → utterplan-0.6.6/tests/test_ssmd_bundle_book.py +83 -78
  32. utterplan-0.6.6/tests/test_ssmd_bundle_document.py +200 -0
  33. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/__init__.py +59 -59
  34. utterplan-0.6.4/utterplan/book_replan.py → utterplan-0.6.6/utterplan/_book_replan.py +12 -12
  35. utterplan-0.6.4/utterplan/book.py → utterplan-0.6.6/utterplan/_book_service.py +50 -44
  36. utterplan-0.6.6/utterplan/_document_service.py +464 -0
  37. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/_version.py +3 -3
  38. utterplan-0.6.6/utterplan/bundle.py +344 -0
  39. utterplan-0.6.6/utterplan/bundle_replan.py +662 -0
  40. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/cli.py +172 -383
  41. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderplan_export.py +3 -2
  42. utterplan-0.6.6/utterplan/renderplan_workspace.py +23 -0
  43. utterplan-0.6.6/utterplan/role_coverage.py +99 -0
  44. utterplan-0.6.6/utterplan/source_input.py +77 -0
  45. utterplan-0.6.6/utterplan/ssmd_bundle.py +328 -0
  46. utterplan-0.6.6/utterplan/workspace_paths.py +27 -0
  47. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/PKG-INFO +91 -58
  48. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/SOURCES.txt +27 -18
  49. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/scm_file_list.json +55 -19
  50. utterplan-0.6.6/utterplan.egg-info/scm_version.json +8 -0
  51. utterplan-0.6.4/MANIFEST.in +0 -2
  52. utterplan-0.6.4/docs/ssmdbook.md +0 -169
  53. utterplan-0.6.4/docs/ssmdoc.md +0 -64
  54. utterplan-0.6.4/tests/test_source_input.py +0 -104
  55. utterplan-0.6.4/tests/test_ssmdoc.py +0 -250
  56. utterplan-0.6.4/utterplan/document_workspace.py +0 -194
  57. utterplan-0.6.4/utterplan/source_input.py +0 -121
  58. utterplan-0.6.4/utterplan/ssmdbook.py +0 -259
  59. utterplan-0.6.4/utterplan/ssmdoc.py +0 -191
  60. utterplan-0.6.4/utterplan.egg-info/scm_version.json +0 -8
  61. {utterplan-0.6.4 → utterplan-0.6.6}/.codecrate.toml +0 -0
  62. {utterplan-0.6.4 → utterplan-0.6.6}/.github/workflows/codecov.yml +0 -0
  63. {utterplan-0.6.4 → utterplan-0.6.6}/.github/workflows/pre-commit.yml +0 -0
  64. {utterplan-0.6.4 → utterplan-0.6.6}/.github/workflows/python-publish.yml +0 -0
  65. {utterplan-0.6.4 → utterplan-0.6.6}/.gitignore +0 -0
  66. {utterplan-0.6.4 → utterplan-0.6.6}/.pre-commit-config.yaml +0 -0
  67. {utterplan-0.6.4 → utterplan-0.6.6}/LICENSE +0 -0
  68. {utterplan-0.6.4 → utterplan-0.6.6}/NOTICE +0 -0
  69. {utterplan-0.6.4 → utterplan-0.6.6}/docs/Makefile +0 -0
  70. {utterplan-0.6.4 → utterplan-0.6.6}/docs/conf.py +0 -0
  71. {utterplan-0.6.4 → utterplan-0.6.6}/docs/consumer-guide.md +0 -0
  72. {utterplan-0.6.4 → utterplan-0.6.6}/docs/coordinate-spaces.md +0 -0
  73. {utterplan-0.6.4 → utterplan-0.6.6}/docs/debugging.md +0 -0
  74. {utterplan-0.6.4 → utterplan-0.6.6}/docs/format.md +0 -0
  75. {utterplan-0.6.4 → utterplan-0.6.6}/docs/make.bat +0 -0
  76. {utterplan-0.6.4 → utterplan-0.6.6}/docs/phase-a-completion.md +0 -0
  77. {utterplan-0.6.4 → utterplan-0.6.6}/docs/pykokoro-integration.md +0 -0
  78. {utterplan-0.6.4 → utterplan-0.6.6}/docs/requirements.txt +0 -0
  79. {utterplan-0.6.4 → utterplan-0.6.6}/examples/basic.py +0 -0
  80. {utterplan-0.6.4 → utterplan-0.6.6}/examples/chapter.ssmd +0 -0
  81. {utterplan-0.6.4 → utterplan-0.6.6}/examples/compile_file.py +0 -0
  82. {utterplan-0.6.4 → utterplan-0.6.6}/examples/inspect_plan.py +0 -0
  83. {utterplan-0.6.4 → utterplan-0.6.6}/examples/multilingual.py +0 -0
  84. {utterplan-0.6.4 → utterplan-0.6.6}/examples/ssmd_example.py +0 -0
  85. {utterplan-0.6.4 → utterplan-0.6.6}/setup.cfg +0 -0
  86. {utterplan-0.6.4 → utterplan-0.6.6}/spec/schemas/v1.schema.json +0 -0
  87. {utterplan-0.6.4 → utterplan-0.6.6}/spec/schemas/v2.schema.json +0 -0
  88. {utterplan-0.6.4 → utterplan-0.6.6}/spec/schemas/v3.schema.json +0 -0
  89. {utterplan-0.6.4 → utterplan-0.6.6}/spec/schemas/v4.schema.json +0 -0
  90. {utterplan-0.6.4 → utterplan-0.6.6}/spec/utterplan.schema.json +0 -0
  91. {utterplan-0.6.4 → utterplan-0.6.6}/tests/__init__.py +0 -0
  92. {utterplan-0.6.4 → utterplan-0.6.6}/tests/compiler_helpers.py +0 -0
  93. {utterplan-0.6.4 → utterplan-0.6.6}/tests/fixtures/canonical_consumer_contract.expected.toml +0 -0
  94. {utterplan-0.6.4 → utterplan-0.6.6}/tests/fixtures/canonical_consumer_contract.ssmd +0 -0
  95. {utterplan-0.6.4/tests/fixtures/ssmdoc-v1/story.ssmdoc → utterplan-0.6.6/tests/fixtures/document-bundle-v1/story.ssmd-bundle}/document.ssmd.md +0 -0
  96. {utterplan-0.6.4/tests/fixtures/ssmdoc-v1/story.ssmdoc → utterplan-0.6.6/tests/fixtures/document-bundle-v1/story.ssmd-bundle}/manifest.json +0 -0
  97. {utterplan-0.6.4 → utterplan-0.6.6}/tests/fixtures/ssmd_09_comprehensive.ssmd +0 -0
  98. {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/basic_en.utterplan.toml +0 -0
  99. {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/directives.utterplan.toml +0 -0
  100. {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/markers.utterplan.toml +0 -0
  101. {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/multilingual.utterplan.toml +0 -0
  102. {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/parenthetical.utterplan.toml +0 -0
  103. {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/spokenform_offsets.utterplan.toml +0 -0
  104. {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/ssmd_09_comprehensive.utterplan.toml +0 -0
  105. {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/ssmd_breaks.utterplan.toml +0 -0
  106. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/__init__.py +0 -0
  107. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/cases.py +0 -0
  108. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/basic_en.utterplan.json +0 -0
  109. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/directives.utterplan.json +0 -0
  110. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/markers.utterplan.json +0 -0
  111. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/multilingual.utterplan.json +0 -0
  112. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/parenthetical.utterplan.json +0 -0
  113. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/spokenform_offsets.utterplan.json +0 -0
  114. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/ssmd_09_comprehensive.utterplan.json +0 -0
  115. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/ssmd_breaks.utterplan.json +0 -0
  116. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/multilingual_preparation.json +0 -0
  117. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/spokenform_numbers.json +0 -0
  118. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/ssmd_break.json +0 -0
  119. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/ssmd_language_detection.json +0 -0
  120. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/ssmd_marker.json +0 -0
  121. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/ssmd_pronunciation.json +0 -0
  122. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/test_legacy_json_import.py +0 -0
  123. {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/test_semantic_migration_regressions.py +0 -0
  124. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/README.md +0 -0
  125. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/basic.json +0 -0
  126. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/directives.json +0 -0
  127. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/markers.json +0 -0
  128. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/multilingual.json +0 -0
  129. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/parenthetical.json +0 -0
  130. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/spokenform_offsets.json +0 -0
  131. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/ssmd_breaks.json +0 -0
  132. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v2/directives.json +0 -0
  133. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v3/multilingual.json +0 -0
  134. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v3/ssmd_09_comprehensive.json +0 -0
  135. {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v5/canonical_consumer_contract.toml +0 -0
  136. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_atomic_io.py +0 -0
  137. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_batch.py +0 -0
  138. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_boundaries.py +0 -0
  139. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_cli_batch.py +0 -0
  140. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_compiler.py +0 -0
  141. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_consumer_contract.py +0 -0
  142. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_consumer_readiness.py +0 -0
  143. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_coordinates.py +0 -0
  144. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_dependency_architecture.py +0 -0
  145. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_directives.py +0 -0
  146. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_explain.py +0 -0
  147. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_fake_renderer.py +0 -0
  148. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_flow_compilation.py +0 -0
  149. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_format.py +0 -0
  150. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_golden.py +0 -0
  151. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_identity_units.py +0 -0
  152. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_language.py +0 -0
  153. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_linguistics.py +0 -0
  154. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_migration_framework.py +0 -0
  155. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_migration_v3_to_v4.py +0 -0
  156. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_migration_v4_to_v5.py +0 -0
  157. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_pauses.py +0 -0
  158. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_planner.py +0 -0
  159. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_preparation.py +0 -0
  160. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_preview.py +0 -0
  161. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_progress.py +0 -0
  162. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_public_identity.py +0 -0
  163. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderability.py +0 -0
  164. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderability_repair.py +0 -0
  165. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderplan_batch.py +0 -0
  166. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderplan_dependency_contract.py +0 -0
  167. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderplan_replan.py +0 -0
  168. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderplan_v7_contract.py +0 -0
  169. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_replacement_provenance.py +0 -0
  170. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_schema_history.py +0 -0
  171. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_schema_registry.py +0 -0
  172. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_schema_strict.py +0 -0
  173. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_schema_v6_source.py +0 -0
  174. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_schema_v7.py +0 -0
  175. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_segment_topology.py +0 -0
  176. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_segmentation_adapter.py +0 -0
  177. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_segmentation_recovery.py +0 -0
  178. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_semantic_boundaries.py +0 -0
  179. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_sentence_topology.py +0 -0
  180. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_ssmd_09_parser.py +0 -0
  181. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_ssmd_substitution_preparation.py +0 -0
  182. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_token_topology.py +0 -0
  183. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_toml_format.py +0 -0
  184. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_ttsready_preparation_adapter.py +0 -0
  185. {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_version.py +0 -0
  186. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/__main__.py +0 -0
  187. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/atomic_io.py +0 -0
  188. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/attempt_serialization.py +0 -0
  189. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/attempts.py +0 -0
  190. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/batch.py +0 -0
  191. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/boundaries.py +0 -0
  192. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/codecs/__init__.py +0 -0
  193. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/codecs/v4_toml.py +0 -0
  194. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/codecs/v5_toml.py +0 -0
  195. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/codecs/v6_toml.py +0 -0
  196. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/codecs/v7_toml.py +0 -0
  197. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/compiler.py +0 -0
  198. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/config.py +0 -0
  199. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/diagnostics.py +0 -0
  200. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/directives.py +0 -0
  201. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/exceptions.py +0 -0
  202. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/explain.py +0 -0
  203. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/flow_projection.py +0 -0
  204. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/format.py +0 -0
  205. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/hashing.py +0 -0
  206. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/language.py +0 -0
  207. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/linguistics.py +0 -0
  208. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migration.py +0 -0
  209. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/__init__.py +0 -0
  210. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/registry.py +0 -0
  211. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v1_to_v2.py +0 -0
  212. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v2_to_v3.py +0 -0
  213. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v3_to_v4.py +0 -0
  214. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v4_to_v5.py +0 -0
  215. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v5_to_v6.py +0 -0
  216. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v6_to_v7.py +0 -0
  217. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/model.py +0 -0
  218. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/parsers.py +0 -0
  219. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/pauses.py +0 -0
  220. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/planner.py +0 -0
  221. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/preparation.py +0 -0
  222. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/preview.py +0 -0
  223. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/progress.py +0 -0
  224. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/py.typed +0 -0
  225. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderability.py +0 -0
  226. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderplan_batch.py +0 -0
  227. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderplan_grouping.py +0 -0
  228. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderplan_projection.py +0 -0
  229. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderplan_replan.py +0 -0
  230. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/schema_registry.py +0 -0
  231. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/schemas/v1.schema.json +0 -0
  232. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/schemas/v2.schema.json +0 -0
  233. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/schemas/v3.schema.json +0 -0
  234. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/schemas/v4.schema.json +0 -0
  235. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/segmentation.py +0 -0
  236. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/serialization.py +0 -0
  237. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/spacy_models.py +0 -0
  238. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/spans.py +0 -0
  239. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/__init__.py +0 -0
  240. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/document/__init__.py +0 -0
  241. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/document/plain.py +0 -0
  242. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/document/ssmd.py +0 -0
  243. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/preparation/__init__.py +0 -0
  244. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/preparation/identity.py +0 -0
  245. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/preparation/ssmd.py +0 -0
  246. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/preparation/ttsready.py +0 -0
  247. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/protocols.py +0 -0
  248. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/token_topology.py +0 -0
  249. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/toml_codec.py +0 -0
  250. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/trace_codec.py +0 -0
  251. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/units.py +0 -0
  252. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/utterplan.schema.json +0 -0
  253. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/versioning.py +0 -0
  254. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/dependency_links.txt +0 -0
  255. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/entry_points.txt +0 -0
  256. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/requires.txt +0 -0
  257. {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/top_level.txt +0 -0
@@ -78,7 +78,7 @@ jobs:
78
78
  tests/test_renderplan_batch.py
79
79
  tests/test_renderplan_export.py
80
80
  tests/test_renderplan_replan.py
81
- tests/test_cli_render_book.py
81
+ tests/test_cli_bundle_render_book.py
82
82
  tests/test_renderplan_dependency_contract.py
83
83
  package-smoke:
84
84
  runs-on: ubuntu-latest
@@ -189,16 +189,16 @@ jobs:
189
189
  > "$RUNNER_TEMP/test.utterplan.toml"
190
190
  "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" validate \
191
191
  "$RUNNER_TEMP/test.utterplan.toml"
192
- BOOK="$RUNNER_TEMP/render-book.smoke.ssmdbook"
193
- mkdir -p "$BOOK/chapters" "$BOOK/utterplan"
194
- cat > "$BOOK/chapters/chapter-0001.ssmd.md" <<'EOF'
192
+ BUNDLE="$RUNNER_TEMP/render-bundle.smoke.ssmd-bundle"
193
+ mkdir -p "$BUNDLE/chapters" "$BUNDLE/utterplan"
194
+ cat > "$BUNDLE/chapters/chapter-0001.ssmd.md" <<'EOF'
195
195
  ---
196
196
  ssmd_version: "0.9"
197
197
  language: en-US
198
198
  ---
199
- Installed wheel render-book smoke.
199
+ Installed wheel bundle render smoke.
200
200
  EOF
201
- cat > "$BOOK/manifest.json" <<'EOF'
201
+ cat > "$BUNDLE/manifest.json" <<'EOF'
202
202
  {
203
203
  "format": "ssmdconvert.book",
204
204
  "schema_version": 1,
@@ -214,9 +214,9 @@ jobs:
214
214
  }
215
215
  EOF
216
216
  "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" compile \
217
- "$BOOK/chapters/chapter-0001.ssmd.md" --lang en-us --text-preparation identity \
218
- -o "$BOOK/utterplan/chapter-0001.utterplan.toml"
219
- "$RUNNER_TEMP/utterplan-wheel-venv/bin/python" - "$BOOK/narration.renderprofile.toml" <<'PY'
217
+ "$BUNDLE/chapters/chapter-0001.ssmd.md" --lang en-us --text-preparation identity \
218
+ -o "$BUNDLE/utterplan/chapter-0001.utterplan.toml"
219
+ "$RUNNER_TEMP/utterplan-wheel-venv/bin/python" - "$BUNDLE/narration.renderprofile.toml" <<'PY'
220
220
  import sys
221
221
  from pathlib import Path
222
222
 
@@ -231,9 +231,9 @@ jobs:
231
231
  )
232
232
  codec.save_profile(profile, Path(sys.argv[1]))
233
233
  PY
234
- "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" render-book \
235
- "$BOOK" --profile "$BOOK/narration.renderprofile.toml" --chapters 1
236
- "$RUNNER_TEMP/utterplan-wheel-venv/bin/python" - "$BOOK" <<'PY'
234
+ "$RUNNER_TEMP/utterplan-wheel-venv/bin/utterplan" bundle render \
235
+ "$BUNDLE" --profile "$BUNDLE/narration.renderprofile.toml" --chapters 1
236
+ "$RUNNER_TEMP/utterplan-wheel-venv/bin/python" - "$BUNDLE" <<'PY'
237
237
  import sys
238
238
  from pathlib import Path
239
239
 
@@ -23,7 +23,7 @@ This file contains reviewed long-term project memory.
23
23
  - Package version and schema version remain independent. Migration preserves a compiled plan; replanning is a separate operation.
24
24
  - Optional compiler traces are sidecars; they must never alter executable plan content or identity.
25
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.
26
+ - Bundle commands accept only a canonical <name>.ssmd-bundle/ root and select book or document behavior from manifest.json. Book items are selected by manifest source_number and produce independent plans; document bundles contain one item and support only the all selector. Compilation, RenderPlan projection, and replan leave manifests and source content unchanged and never create a book-level combined plan.
27
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
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
29
  - Repository tests must be self-contained and must not require sibling consumer checkouts; consumer-specific compatibility testing belongs in the consumer repository.
@@ -0,0 +1,2 @@
1
+ prune .ledger
2
+ include docs/bundles.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: utterplan
3
- Version: 0.6.4
3
+ Version: 0.6.6
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
@@ -251,9 +251,13 @@ Dynamic: license-file
251
251
 
252
252
  UtterPlan is the canonical, engine-independent semantic compiler from one SSMD
253
253
  document (or explicitly selected plain-text document) to an executable speech
254
- plan. It produces deterministic prepared text, paragraph-local flow units, safe boundary opportunities, authored pause intents, and segment-local
255
- semantics, portable document metadata, and typed directives for
256
- independent downstream consumers such as Readio, VoiceRender, and other FlowPlan users. Its book commands read the SSMDBook manifest only for chapter discovery, never modify the manifest or source chapters, and write derived plans to separate directories. It uses TTSReady for written-to-spoken preparation and stops before G2P, synthesis, and audio.
254
+ plan. It produces deterministic prepared text, paragraph-local flow units, safe
255
+ boundary opportunities, authored pause intents, segment-local semantics,
256
+ portable document metadata, and typed directives for independent downstream
257
+ FlowPlan consumers. Its `bundle` lifecycle accepts canonical `.ssmd-bundle/`
258
+ roots and dispatches book or document behavior from `manifest.json`, without
259
+ modifying source manifests or chapters. It uses TTSReady for written-to-spoken
260
+ preparation and stops before G2P, synthesis, and audio.
257
261
 
258
262
  ## CLI
259
263
 
@@ -285,42 +289,84 @@ utterplan compile-many examples/*.ssmd --output-dir build/plans
285
289
 
286
290
  This writes one `.utterplan.toml` per source plus an atomically refreshed `compile-report.toml`. Terminal diagnostics default to warnings; `--diagnostics all` also prints informational records, while `--diagnostics none` suppresses non-failure details. Failures are always reported, and the operational report retains every diagnostic. Use `--fail-fast` to skip later inputs after a failure, `--force` to replace existing plans, or `--report PATH` to choose another report location.
287
291
 
288
- ## Compile an SSMDDoc workspace
292
+ ## Manifest-driven bundle lifecycle
289
293
 
290
- Compile one editable `.ssmdoc` directory as one SSMD document and one FlowPlan:
294
+ Use the canonical `<name>.ssmd-bundle/` directory for either a book or a single-document bundle. UtterPlan reads `manifest.json` to determine the bundle kind; chapter directories and source files are not alternate bundle roots.
291
295
 
292
296
  ```bash
293
- utterplan compile-document story.ssmdoc
297
+ utterplan bundle compile novel.ssmd-bundle --chapters 5-17
298
+ utterplan bundle compile story.ssmd-bundle
299
+ utterplan bundle render novel.ssmd-bundle --chapters 5-17 --profile narration.renderprofile.toml
300
+ utterplan bundle render story.ssmd-bundle --profile narration.renderprofile.toml
294
301
  ```
295
302
 
296
- By default this writes `story.ssmdoc/.readio/utterplan/document-0001.utterplan.toml` and a `compile-report.toml`. The current `document.ssmd.md` is authoritative even if its manifest digest is stale; UtterPlan leaves the source and manifest untouched. This is separate from the multi-chapter SSMDBook workflow below. See the [SSMDDoc workspace guide](docs/ssmdoc.md) for manifest safety, output options, and the Python API.
303
+ Book manifests support source-number selectors such as `5-17` or `1,3-5`; omit `--chapters` to select all chapters. A document bundle accepts only `--chapters all`. Compilation writes independent FlowPlans and an operational report under `<bundle>/utterplan/`; rendering projects saved plans into profile-specific RenderPlans under `<bundle>/renderplan/`. Source manifests and source documents remain untouched. See the [bundle guide](docs/bundles.md) for manifest contracts, safe paths, reports, and examples.
297
304
 
298
- Compile a selected chapter range directly from an editable SSMDBook workspace:
305
+ When rendering feedback requests deterministic replanning, refine the active bundle variant and the selected book items (or the full document bundle):
299
306
 
300
307
  ```bash
301
- cd "Platform Decay - Martha Wells.ssmdbook"
308
+ utterplan bundle replan novel.ssmd-bundle --chapters 5 --variant narration--28f616b6fe3b
309
+ ```
310
+
311
+ Replanning uses stored profile snapshots and matching preflight feedback; it does not run synthesis or modify source content.
312
+
313
+ ## Logical roles and complete RenderProfiles
314
+
315
+ An SSMD `voice` reference is a **logical role**: a renderer-independent name such as `narrator`, `host`, or `guest`. A **role binding** is the concrete renderer configuration for that name in a RenderProfile. One RenderProfile is the complete cast for one render variant, together with shared planning and pause policy; it may bind different roles to different engines. UtterPlan accepts one `--profile` per projection, not one profile per role, and does not discover engines or voices.
316
+
317
+ A profile can define a default for speech without an explicit role reference and explicit bindings for other roles:
302
318
 
303
- utterplan compile-book chapters --chapters 5-17
319
+ In SSMD, the source remains renderer-independent; for example:
320
+
321
+ ```markdown
322
+ :::{voice="host"}
323
+ Host line.
324
+ :::
304
325
  ```
305
326
 
306
- The command reads the workspace manifest to discover chapters and writes independent v7 plans and a report under `utterplan/`:
327
+ ```toml
328
+ default_role = "narrator"
307
329
 
308
- ```text
309
- utterplan/
310
- ├── compile-report.toml
311
- ├── chapter-0005.utterplan.toml
312
- ├── chapter-0006.utterplan.toml
313
- ├── ...
314
- └── chapter-0017.utterplan.toml
330
+ [roles.narrator]
331
+ language = "en-US"
332
+
333
+ [roles.narrator.binding]
334
+ renderer = "kokoro"
335
+ target_id = "v1.0"
336
+ voice = "af_heart"
337
+
338
+ [roles.host]
339
+ language = "en-US"
340
+
341
+ [roles.host.binding]
342
+ renderer = "kitten"
343
+ target_id = "mini-0.8"
344
+ voice = "Jasper"
345
+
346
+ [roles.guest]
347
+ language = "en-US"
348
+
349
+ [roles.guest.binding]
350
+ renderer = "piper"
351
+ target_id = "en_US-amy-medium"
352
+ voice = "en_US-amy-medium"
315
353
  ```
316
354
 
317
- Omit `--chapters` to compile all manifest chapters. Use comma-separated source-number selections for non-contiguous ranges, for example `utterplan compile-book chapters --chapters 1,3-5`. `--diagnostics warnings|all|none` defaults to warnings; failures are always shown and reports retain complete diagnostics. The book root itself is also accepted as input; see the [SSMDBook guide](docs/ssmdbook.md).
355
+ Inspect symbolic role usage without a profile, then project a document or selected book chapters with the same complete cast:
318
356
 
319
- ## From an SSMDBook to RenderPlans
357
+ ```bash
358
+ utterplan inspect story.utterplan.toml --roles
359
+ utterplan bundle render story.ssmd-bundle --profile printer-cast.renderprofile.toml
360
+ utterplan bundle render novel.ssmd-bundle --profile novel-cast.renderprofile.toml
361
+ ```
320
362
 
321
- UtterPlan keeps one canonical semantic plan per chapter. A RenderProfile is a
363
+ Projection reports required and available roles and rejects incomplete coverage before writing the RenderPlan variant. The profile and its concrete role bindings remain separate from the source SSMD.
364
+
365
+ ## From bundles to RenderPlans
366
+
367
+ UtterPlan keeps one canonical semantic plan per source item. A RenderProfile is a
322
368
  separate renderer configuration; create and validate it with VoiceRender, then
323
- project the selected saved plans into a profile-specific RenderPlan collection:
369
+ project saved plans from a canonical `.ssmd-bundle/` root:
324
370
 
325
371
  ```bash
326
372
  voicerender profile create \
@@ -331,12 +377,11 @@ voicerender profile create \
331
377
  --output narration.renderprofile.toml
332
378
  voicerender profile validate narration.renderprofile.toml
333
379
 
334
- utterplan compile-book . --chapters 5-17
335
- utterplan render-book . --chapters 5-17 --profile narration.renderprofile.toml
380
+ utterplan bundle compile novel.ssmd-bundle --chapters 5-17
381
+ utterplan bundle render novel.ssmd-bundle --chapters 5-17 --profile narration.renderprofile.toml
336
382
  ```
337
383
 
338
- The book's `utterplan/` directory remains the shared semantic source. The new
339
- command writes independent renderer-specific plans into a deterministic variant:
384
+ The shared `renderplan/` area contains a profile-specific variant:
340
385
 
341
386
  ```text
342
387
  renderplan/
@@ -353,45 +398,33 @@ first 12 hexadecimal characters of the canonical RenderProfile `profile_id`.
353
398
  Changing identity-bearing profile semantics selects a different directory, so
354
399
  multiple voices or planning policies can coexist without replacing one another.
355
400
  Each variant snapshots the canonical profile; `renderplan-set.toml` records its
356
- full identity, source profile reference, and chapter plan IDs. `--variant` changes
401
+ full identity, source profile reference, and source plan IDs. `--variant` changes
357
402
  the human label without removing the fingerprint, and `--output-root` changes the
358
403
  collection root while retaining the automatic variant directory.
359
404
 
360
- `render-book` consumes only the existing schema-v7 UtterPlans and shared
361
- RenderProfile/RenderPlan contract. VoiceRender is not required to run it: VoiceRender
362
- creates or refreshes engine-backed profiles, then preflights and renders the
363
- resulting RenderPlans. The single-file `utterplan render-plan` command remains the
364
- low-level projection and deterministic replan primitive.
405
+ `utterplan bundle render` consumes only existing schema-v7 FlowPlans and the
406
+ shared RenderProfile/RenderPlan contract. VoiceRender creates or refreshes
407
+ engine-backed profiles, then preflights and renders the resulting RenderPlans.
408
+ UtterPlan's single-file `render-plan` command remains the low-level projection and
409
+ deterministic replan primitive.
365
410
 
366
- When VoiceRender reports `preflight.replan`, use the new `replan-book` command to
367
- refine the exact active chapter plan. The operation reads the RenderProfile snapshot
368
- from the selected variant, writes a fingerprinted child RenderPlan, and updates only
369
- that chapter's active set entry. It does not replace the parent plan or rerun initial
370
- projection:
411
+ When VoiceRender reports `preflight.replan`, refine the active bundle variant
412
+ using matching feedback:
371
413
 
372
414
  ```bash
373
- # VoiceRender measures the active plans; suppose chapter 5 returns preflight.replan.
374
- voicerender render-book . \
375
- --variant narration4--28f616b6fe3b \
376
- --chapters 5 \
377
- --emphasis-policy defer-to-compose
378
-
379
- utterplan replan-book . \
380
- --variant narration4--28f616b6fe3b \
415
+ # After VoiceRender reports preflight.replan for chapter 5:
416
+ utterplan bundle replan novel.ssmd-bundle \
417
+ --variant narration--28f616b6fe3b \
381
418
  --chapters 5
382
-
383
- # Measure/render the newly active child. Repeat these last two commands if it
384
- # still reports preflight.replan; each cycle must use feedback for the active plan.
385
- voicerender render-book . \
386
- --variant narration4--28f616b6fe3b \
387
- --chapters 5 \
388
- --emphasis-policy defer-to-compose
389
419
  ```
390
420
 
391
- Use the exact variant directory name (including its profile fingerprint). `replan-book`
392
- searches `preflight-recheck.toml` before `preflight.toml` and refuses stale feedback,
393
- so a report for a parent can never be applied to its child. The single-file
394
- `render-plan --previous ... --preflight ...` operation remains available for
421
+ Ask VoiceRender to measure and render the newly active plan. If it still reports
422
+ `preflight.replan`, repeat the feedback cycle against the active child.
423
+
424
+ Use the exact variant directory name (including its profile fingerprint). Bundle
425
+ replanning searches `preflight-recheck.toml` before `preflight.toml` and refuses
426
+ stale feedback, so a report for a parent can never be applied to its child. The
427
+ single-file `render-plan --previous ... --preflight ...` operation remains available for
395
428
  low-level replanning.
396
429
 
397
430
  This orchestration does not add a splitter, renderer-specific capacity estimate, or
@@ -540,7 +573,7 @@ renderer repository rather than UtterPlan's test suite.
540
573
 
541
574
  - [Getting started](docs/getting-started.md)
542
575
  - [CLI](docs/cli.md)
543
- - [SSMDBook workflows](docs/ssmdbook.md)
576
+ - [Bundle workflows](docs/bundles.md)
544
577
  - [Format and schema](docs/format.md)
545
578
  - [Consumer guide](docs/consumer-guide.md)
546
579
  - [Architecture](docs/architecture.md)
@@ -7,9 +7,13 @@
7
7
 
8
8
  UtterPlan is the canonical, engine-independent semantic compiler from one SSMD
9
9
  document (or explicitly selected plain-text document) to an executable speech
10
- plan. It produces deterministic prepared text, paragraph-local flow units, safe boundary opportunities, authored pause intents, and segment-local
11
- semantics, portable document metadata, and typed directives for
12
- independent downstream consumers such as Readio, VoiceRender, and other FlowPlan users. Its book commands read the SSMDBook manifest only for chapter discovery, never modify the manifest or source chapters, and write derived plans to separate directories. It uses TTSReady for written-to-spoken preparation and stops before G2P, synthesis, and audio.
10
+ plan. It produces deterministic prepared text, paragraph-local flow units, safe
11
+ boundary opportunities, authored pause intents, segment-local semantics,
12
+ portable document metadata, and typed directives for independent downstream
13
+ FlowPlan consumers. Its `bundle` lifecycle accepts canonical `.ssmd-bundle/`
14
+ roots and dispatches book or document behavior from `manifest.json`, without
15
+ modifying source manifests or chapters. It uses TTSReady for written-to-spoken
16
+ preparation and stops before G2P, synthesis, and audio.
13
17
 
14
18
  ## CLI
15
19
 
@@ -41,42 +45,84 @@ utterplan compile-many examples/*.ssmd --output-dir build/plans
41
45
 
42
46
  This writes one `.utterplan.toml` per source plus an atomically refreshed `compile-report.toml`. Terminal diagnostics default to warnings; `--diagnostics all` also prints informational records, while `--diagnostics none` suppresses non-failure details. Failures are always reported, and the operational report retains every diagnostic. Use `--fail-fast` to skip later inputs after a failure, `--force` to replace existing plans, or `--report PATH` to choose another report location.
43
47
 
44
- ## Compile an SSMDDoc workspace
48
+ ## Manifest-driven bundle lifecycle
45
49
 
46
- Compile one editable `.ssmdoc` directory as one SSMD document and one FlowPlan:
50
+ Use the canonical `<name>.ssmd-bundle/` directory for either a book or a single-document bundle. UtterPlan reads `manifest.json` to determine the bundle kind; chapter directories and source files are not alternate bundle roots.
47
51
 
48
52
  ```bash
49
- utterplan compile-document story.ssmdoc
53
+ utterplan bundle compile novel.ssmd-bundle --chapters 5-17
54
+ utterplan bundle compile story.ssmd-bundle
55
+ utterplan bundle render novel.ssmd-bundle --chapters 5-17 --profile narration.renderprofile.toml
56
+ utterplan bundle render story.ssmd-bundle --profile narration.renderprofile.toml
50
57
  ```
51
58
 
52
- By default this writes `story.ssmdoc/.readio/utterplan/document-0001.utterplan.toml` and a `compile-report.toml`. The current `document.ssmd.md` is authoritative even if its manifest digest is stale; UtterPlan leaves the source and manifest untouched. This is separate from the multi-chapter SSMDBook workflow below. See the [SSMDDoc workspace guide](docs/ssmdoc.md) for manifest safety, output options, and the Python API.
59
+ Book manifests support source-number selectors such as `5-17` or `1,3-5`; omit `--chapters` to select all chapters. A document bundle accepts only `--chapters all`. Compilation writes independent FlowPlans and an operational report under `<bundle>/utterplan/`; rendering projects saved plans into profile-specific RenderPlans under `<bundle>/renderplan/`. Source manifests and source documents remain untouched. See the [bundle guide](docs/bundles.md) for manifest contracts, safe paths, reports, and examples.
53
60
 
54
- Compile a selected chapter range directly from an editable SSMDBook workspace:
61
+ When rendering feedback requests deterministic replanning, refine the active bundle variant and the selected book items (or the full document bundle):
55
62
 
56
63
  ```bash
57
- cd "Platform Decay - Martha Wells.ssmdbook"
64
+ utterplan bundle replan novel.ssmd-bundle --chapters 5 --variant narration--28f616b6fe3b
65
+ ```
66
+
67
+ Replanning uses stored profile snapshots and matching preflight feedback; it does not run synthesis or modify source content.
68
+
69
+ ## Logical roles and complete RenderProfiles
70
+
71
+ An SSMD `voice` reference is a **logical role**: a renderer-independent name such as `narrator`, `host`, or `guest`. A **role binding** is the concrete renderer configuration for that name in a RenderProfile. One RenderProfile is the complete cast for one render variant, together with shared planning and pause policy; it may bind different roles to different engines. UtterPlan accepts one `--profile` per projection, not one profile per role, and does not discover engines or voices.
72
+
73
+ A profile can define a default for speech without an explicit role reference and explicit bindings for other roles:
58
74
 
59
- utterplan compile-book chapters --chapters 5-17
75
+ In SSMD, the source remains renderer-independent; for example:
76
+
77
+ ```markdown
78
+ :::{voice="host"}
79
+ Host line.
80
+ :::
60
81
  ```
61
82
 
62
- The command reads the workspace manifest to discover chapters and writes independent v7 plans and a report under `utterplan/`:
83
+ ```toml
84
+ default_role = "narrator"
63
85
 
64
- ```text
65
- utterplan/
66
- ├── compile-report.toml
67
- ├── chapter-0005.utterplan.toml
68
- ├── chapter-0006.utterplan.toml
69
- ├── ...
70
- └── chapter-0017.utterplan.toml
86
+ [roles.narrator]
87
+ language = "en-US"
88
+
89
+ [roles.narrator.binding]
90
+ renderer = "kokoro"
91
+ target_id = "v1.0"
92
+ voice = "af_heart"
93
+
94
+ [roles.host]
95
+ language = "en-US"
96
+
97
+ [roles.host.binding]
98
+ renderer = "kitten"
99
+ target_id = "mini-0.8"
100
+ voice = "Jasper"
101
+
102
+ [roles.guest]
103
+ language = "en-US"
104
+
105
+ [roles.guest.binding]
106
+ renderer = "piper"
107
+ target_id = "en_US-amy-medium"
108
+ voice = "en_US-amy-medium"
71
109
  ```
72
110
 
73
- Omit `--chapters` to compile all manifest chapters. Use comma-separated source-number selections for non-contiguous ranges, for example `utterplan compile-book chapters --chapters 1,3-5`. `--diagnostics warnings|all|none` defaults to warnings; failures are always shown and reports retain complete diagnostics. The book root itself is also accepted as input; see the [SSMDBook guide](docs/ssmdbook.md).
111
+ Inspect symbolic role usage without a profile, then project a document or selected book chapters with the same complete cast:
74
112
 
75
- ## From an SSMDBook to RenderPlans
113
+ ```bash
114
+ utterplan inspect story.utterplan.toml --roles
115
+ utterplan bundle render story.ssmd-bundle --profile printer-cast.renderprofile.toml
116
+ utterplan bundle render novel.ssmd-bundle --profile novel-cast.renderprofile.toml
117
+ ```
76
118
 
77
- UtterPlan keeps one canonical semantic plan per chapter. A RenderProfile is a
119
+ Projection reports required and available roles and rejects incomplete coverage before writing the RenderPlan variant. The profile and its concrete role bindings remain separate from the source SSMD.
120
+
121
+ ## From bundles to RenderPlans
122
+
123
+ UtterPlan keeps one canonical semantic plan per source item. A RenderProfile is a
78
124
  separate renderer configuration; create and validate it with VoiceRender, then
79
- project the selected saved plans into a profile-specific RenderPlan collection:
125
+ project saved plans from a canonical `.ssmd-bundle/` root:
80
126
 
81
127
  ```bash
82
128
  voicerender profile create \
@@ -87,12 +133,11 @@ voicerender profile create \
87
133
  --output narration.renderprofile.toml
88
134
  voicerender profile validate narration.renderprofile.toml
89
135
 
90
- utterplan compile-book . --chapters 5-17
91
- utterplan render-book . --chapters 5-17 --profile narration.renderprofile.toml
136
+ utterplan bundle compile novel.ssmd-bundle --chapters 5-17
137
+ utterplan bundle render novel.ssmd-bundle --chapters 5-17 --profile narration.renderprofile.toml
92
138
  ```
93
139
 
94
- The book's `utterplan/` directory remains the shared semantic source. The new
95
- command writes independent renderer-specific plans into a deterministic variant:
140
+ The shared `renderplan/` area contains a profile-specific variant:
96
141
 
97
142
  ```text
98
143
  renderplan/
@@ -109,45 +154,33 @@ first 12 hexadecimal characters of the canonical RenderProfile `profile_id`.
109
154
  Changing identity-bearing profile semantics selects a different directory, so
110
155
  multiple voices or planning policies can coexist without replacing one another.
111
156
  Each variant snapshots the canonical profile; `renderplan-set.toml` records its
112
- full identity, source profile reference, and chapter plan IDs. `--variant` changes
157
+ full identity, source profile reference, and source plan IDs. `--variant` changes
113
158
  the human label without removing the fingerprint, and `--output-root` changes the
114
159
  collection root while retaining the automatic variant directory.
115
160
 
116
- `render-book` consumes only the existing schema-v7 UtterPlans and shared
117
- RenderProfile/RenderPlan contract. VoiceRender is not required to run it: VoiceRender
118
- creates or refreshes engine-backed profiles, then preflights and renders the
119
- resulting RenderPlans. The single-file `utterplan render-plan` command remains the
120
- low-level projection and deterministic replan primitive.
161
+ `utterplan bundle render` consumes only existing schema-v7 FlowPlans and the
162
+ shared RenderProfile/RenderPlan contract. VoiceRender creates or refreshes
163
+ engine-backed profiles, then preflights and renders the resulting RenderPlans.
164
+ UtterPlan's single-file `render-plan` command remains the low-level projection and
165
+ deterministic replan primitive.
121
166
 
122
- When VoiceRender reports `preflight.replan`, use the new `replan-book` command to
123
- refine the exact active chapter plan. The operation reads the RenderProfile snapshot
124
- from the selected variant, writes a fingerprinted child RenderPlan, and updates only
125
- that chapter's active set entry. It does not replace the parent plan or rerun initial
126
- projection:
167
+ When VoiceRender reports `preflight.replan`, refine the active bundle variant
168
+ using matching feedback:
127
169
 
128
170
  ```bash
129
- # VoiceRender measures the active plans; suppose chapter 5 returns preflight.replan.
130
- voicerender render-book . \
131
- --variant narration4--28f616b6fe3b \
132
- --chapters 5 \
133
- --emphasis-policy defer-to-compose
134
-
135
- utterplan replan-book . \
136
- --variant narration4--28f616b6fe3b \
171
+ # After VoiceRender reports preflight.replan for chapter 5:
172
+ utterplan bundle replan novel.ssmd-bundle \
173
+ --variant narration--28f616b6fe3b \
137
174
  --chapters 5
138
-
139
- # Measure/render the newly active child. Repeat these last two commands if it
140
- # still reports preflight.replan; each cycle must use feedback for the active plan.
141
- voicerender render-book . \
142
- --variant narration4--28f616b6fe3b \
143
- --chapters 5 \
144
- --emphasis-policy defer-to-compose
145
175
  ```
146
176
 
147
- Use the exact variant directory name (including its profile fingerprint). `replan-book`
148
- searches `preflight-recheck.toml` before `preflight.toml` and refuses stale feedback,
149
- so a report for a parent can never be applied to its child. The single-file
150
- `render-plan --previous ... --preflight ...` operation remains available for
177
+ Ask VoiceRender to measure and render the newly active plan. If it still reports
178
+ `preflight.replan`, repeat the feedback cycle against the active child.
179
+
180
+ Use the exact variant directory name (including its profile fingerprint). Bundle
181
+ replanning searches `preflight-recheck.toml` before `preflight.toml` and refuses
182
+ stale feedback, so a report for a parent can never be applied to its child. The
183
+ single-file `render-plan --previous ... --preflight ...` operation remains available for
151
184
  low-level replanning.
152
185
 
153
186
  This orchestration does not add a splitter, renderer-specific capacity estimate, or
@@ -296,7 +329,7 @@ renderer repository rather than UtterPlan's test suite.
296
329
 
297
330
  - [Getting started](docs/getting-started.md)
298
331
  - [CLI](docs/cli.md)
299
- - [SSMDBook workflows](docs/ssmdbook.md)
332
+ - [Bundle workflows](docs/bundles.md)
300
333
  - [Format and schema](docs/format.md)
301
334
  - [Consumer guide](docs/consumer-guide.md)
302
335
  - [Architecture](docs/architecture.md)