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.
- {utterplan-0.6.4 → utterplan-0.6.6}/.github/workflows/tests.yml +12 -12
- {utterplan-0.6.4 → utterplan-0.6.6}/AGENTS.md +1 -1
- utterplan-0.6.6/MANIFEST.in +2 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/PKG-INFO +91 -58
- {utterplan-0.6.4 → utterplan-0.6.6}/README.md +90 -57
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/architecture.md +105 -91
- utterplan-0.6.6/docs/bundles.md +82 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/changelog.md +29 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/cli.md +23 -152
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/getting-started.md +12 -28
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/index.md +2 -4
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/python-api.md +37 -10
- {utterplan-0.6.4 → utterplan-0.6.6}/pyproject.toml +1 -1
- utterplan-0.6.4/tests/test_book_replan.py → utterplan-0.6.6/tests/test_bundle_book_replan.py +6 -5
- utterplan-0.6.4/tests/test_book_api.py → utterplan-0.6.6/tests/test_bundle_book_services.py +54 -89
- utterplan-0.6.4/tests/test_document_workspace.py → utterplan-0.6.6/tests/test_bundle_document_compile.py +51 -42
- utterplan-0.6.6/tests/test_bundle_document_render.py +121 -0
- utterplan-0.6.6/tests/test_bundle_replan.py +135 -0
- utterplan-0.6.6/tests/test_bundle_services.py +136 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_cli.py +23 -24
- utterplan-0.6.4/tests/test_cli_ssmdbook.py → utterplan-0.6.6/tests/test_cli_bundle_compile_book.py +60 -66
- utterplan-0.6.4/tests/test_cli_ssmdoc.py → utterplan-0.6.6/tests/test_cli_bundle_document.py +76 -72
- utterplan-0.6.4/tests/test_cli_render_book.py → utterplan-0.6.6/tests/test_cli_bundle_render_book.py +81 -21
- utterplan-0.6.6/tests/test_cli_bundle_render_document.py +345 -0
- utterplan-0.6.4/tests/test_cli_replan_book.py → utterplan-0.6.6/tests/test_cli_bundle_replan_book.py +20 -17
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_import_boundaries.py +1 -1
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderplan_export.py +133 -0
- utterplan-0.6.6/tests/test_role_coverage.py +126 -0
- utterplan-0.6.6/tests/test_source_input.py +52 -0
- utterplan-0.6.6/tests/test_ssmd_bundle.py +211 -0
- utterplan-0.6.4/tests/test_ssmdbook.py → utterplan-0.6.6/tests/test_ssmd_bundle_book.py +83 -78
- utterplan-0.6.6/tests/test_ssmd_bundle_document.py +200 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/__init__.py +59 -59
- utterplan-0.6.4/utterplan/book_replan.py → utterplan-0.6.6/utterplan/_book_replan.py +12 -12
- utterplan-0.6.4/utterplan/book.py → utterplan-0.6.6/utterplan/_book_service.py +50 -44
- utterplan-0.6.6/utterplan/_document_service.py +464 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/_version.py +3 -3
- utterplan-0.6.6/utterplan/bundle.py +344 -0
- utterplan-0.6.6/utterplan/bundle_replan.py +662 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/cli.py +172 -383
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderplan_export.py +3 -2
- utterplan-0.6.6/utterplan/renderplan_workspace.py +23 -0
- utterplan-0.6.6/utterplan/role_coverage.py +99 -0
- utterplan-0.6.6/utterplan/source_input.py +77 -0
- utterplan-0.6.6/utterplan/ssmd_bundle.py +328 -0
- utterplan-0.6.6/utterplan/workspace_paths.py +27 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/PKG-INFO +91 -58
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/SOURCES.txt +27 -18
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/scm_file_list.json +55 -19
- utterplan-0.6.6/utterplan.egg-info/scm_version.json +8 -0
- utterplan-0.6.4/MANIFEST.in +0 -2
- utterplan-0.6.4/docs/ssmdbook.md +0 -169
- utterplan-0.6.4/docs/ssmdoc.md +0 -64
- utterplan-0.6.4/tests/test_source_input.py +0 -104
- utterplan-0.6.4/tests/test_ssmdoc.py +0 -250
- utterplan-0.6.4/utterplan/document_workspace.py +0 -194
- utterplan-0.6.4/utterplan/source_input.py +0 -121
- utterplan-0.6.4/utterplan/ssmdbook.py +0 -259
- utterplan-0.6.4/utterplan/ssmdoc.py +0 -191
- utterplan-0.6.4/utterplan.egg-info/scm_version.json +0 -8
- {utterplan-0.6.4 → utterplan-0.6.6}/.codecrate.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/.github/workflows/codecov.yml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/.github/workflows/pre-commit.yml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/.github/workflows/python-publish.yml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/.gitignore +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/.pre-commit-config.yaml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/LICENSE +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/NOTICE +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/Makefile +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/conf.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/consumer-guide.md +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/coordinate-spaces.md +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/debugging.md +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/format.md +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/make.bat +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/phase-a-completion.md +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/pykokoro-integration.md +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/docs/requirements.txt +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/examples/basic.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/examples/chapter.ssmd +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/examples/compile_file.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/examples/inspect_plan.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/examples/multilingual.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/examples/ssmd_example.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/setup.cfg +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/spec/schemas/v1.schema.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/spec/schemas/v2.schema.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/spec/schemas/v3.schema.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/spec/schemas/v4.schema.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/spec/utterplan.schema.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/__init__.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/compiler_helpers.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/fixtures/canonical_consumer_contract.expected.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/fixtures/canonical_consumer_contract.ssmd +0 -0
- {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
- {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
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/fixtures/ssmd_09_comprehensive.ssmd +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/basic_en.utterplan.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/directives.utterplan.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/markers.utterplan.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/multilingual.utterplan.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/parenthetical.utterplan.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/spokenform_offsets.utterplan.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/ssmd_09_comprehensive.utterplan.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/golden/ssmd_breaks.utterplan.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/__init__.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/cases.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/basic_en.utterplan.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/directives.utterplan.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/markers.utterplan.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/multilingual.utterplan.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/parenthetical.utterplan.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/spokenform_offsets.utterplan.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/ssmd_09_comprehensive.utterplan.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/fixtures/v4/ssmd_breaks.utterplan.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/multilingual_preparation.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/spokenform_numbers.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/ssmd_break.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/ssmd_language_detection.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/ssmd_marker.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/goldens/ssmd_pronunciation.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/test_legacy_json_import.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/migration/test_semantic_migration_regressions.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/README.md +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/basic.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/directives.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/markers.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/multilingual.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/parenthetical.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/spokenform_offsets.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v1/ssmd_breaks.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v2/directives.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v3/multilingual.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v3/ssmd_09_comprehensive.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/schema_history/v5/canonical_consumer_contract.toml +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_atomic_io.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_batch.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_boundaries.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_cli_batch.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_compiler.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_consumer_contract.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_consumer_readiness.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_coordinates.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_dependency_architecture.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_directives.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_explain.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_fake_renderer.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_flow_compilation.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_format.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_golden.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_identity_units.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_language.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_linguistics.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_migration_framework.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_migration_v3_to_v4.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_migration_v4_to_v5.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_pauses.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_planner.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_preparation.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_preview.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_progress.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_public_identity.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderability.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderability_repair.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderplan_batch.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderplan_dependency_contract.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderplan_replan.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_renderplan_v7_contract.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_replacement_provenance.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_schema_history.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_schema_registry.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_schema_strict.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_schema_v6_source.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_schema_v7.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_segment_topology.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_segmentation_adapter.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_segmentation_recovery.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_semantic_boundaries.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_sentence_topology.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_ssmd_09_parser.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_ssmd_substitution_preparation.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_token_topology.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_toml_format.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_ttsready_preparation_adapter.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/tests/test_version.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/__main__.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/atomic_io.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/attempt_serialization.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/attempts.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/batch.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/boundaries.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/codecs/__init__.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/codecs/v4_toml.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/codecs/v5_toml.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/codecs/v6_toml.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/codecs/v7_toml.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/compiler.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/config.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/diagnostics.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/directives.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/exceptions.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/explain.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/flow_projection.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/format.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/hashing.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/language.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/linguistics.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migration.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/__init__.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/registry.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v1_to_v2.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v2_to_v3.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v3_to_v4.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v4_to_v5.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v5_to_v6.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/migrations/v6_to_v7.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/model.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/parsers.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/pauses.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/planner.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/preparation.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/preview.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/progress.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/py.typed +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderability.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderplan_batch.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderplan_grouping.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderplan_projection.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/renderplan_replan.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/schema_registry.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/schemas/v1.schema.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/schemas/v2.schema.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/schemas/v3.schema.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/schemas/v4.schema.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/segmentation.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/serialization.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/spacy_models.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/spans.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/__init__.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/document/__init__.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/document/plain.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/document/ssmd.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/preparation/__init__.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/preparation/identity.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/preparation/ssmd.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/preparation/ttsready.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/stages/protocols.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/token_topology.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/toml_codec.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/trace_codec.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/units.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/utterplan.schema.json +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan/versioning.py +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/dependency_links.txt +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/entry_points.txt +0 -0
- {utterplan-0.6.4 → utterplan-0.6.6}/utterplan.egg-info/requires.txt +0 -0
- {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/
|
|
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
|
-
|
|
193
|
-
mkdir -p "$
|
|
194
|
-
cat > "$
|
|
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
|
|
199
|
+
Installed wheel bundle render smoke.
|
|
200
200
|
EOF
|
|
201
|
-
cat > "$
|
|
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
|
-
"$
|
|
218
|
-
-o "$
|
|
219
|
-
"$RUNNER_TEMP/utterplan-wheel-venv/bin/python" - "$
|
|
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
|
|
235
|
-
"$
|
|
236
|
-
"$RUNNER_TEMP/utterplan-wheel-venv/bin/python" - "$
|
|
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
|
-
-
|
|
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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: utterplan
|
|
3
|
-
Version: 0.6.
|
|
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
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
##
|
|
292
|
+
## Manifest-driven bundle lifecycle
|
|
289
293
|
|
|
290
|
-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
327
|
+
```toml
|
|
328
|
+
default_role = "narrator"
|
|
307
329
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
-
|
|
355
|
+
Inspect symbolic role usage without a profile, then project a document or selected book chapters with the same complete cast:
|
|
318
356
|
|
|
319
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
335
|
-
utterplan render
|
|
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
|
|
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
|
|
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
|
|
361
|
-
RenderProfile/RenderPlan contract. VoiceRender
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
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`,
|
|
367
|
-
|
|
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
|
|
374
|
-
|
|
375
|
-
--variant
|
|
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
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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
|
-
- [
|
|
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
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
##
|
|
48
|
+
## Manifest-driven bundle lifecycle
|
|
45
49
|
|
|
46
|
-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
83
|
+
```toml
|
|
84
|
+
default_role = "narrator"
|
|
63
85
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
111
|
+
Inspect symbolic role usage without a profile, then project a document or selected book chapters with the same complete cast:
|
|
74
112
|
|
|
75
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
91
|
-
utterplan render
|
|
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
|
|
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
|
|
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
|
|
117
|
-
RenderProfile/RenderPlan contract. VoiceRender
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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`,
|
|
123
|
-
|
|
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
|
|
130
|
-
|
|
131
|
-
--variant
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
- [
|
|
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)
|