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