utterplan 0.3.1__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +6 -0
  2. utterplan-0.3.2/.ledger/releaseledger/data/ledgers/main/releases/0.3.2/audit/commit-audit.yaml +105 -0
  3. utterplan-0.3.2/.ledger/releaseledger/data/ledgers/main/releases/0.3.2/entries/entry-0001.md +32 -0
  4. utterplan-0.3.2/.ledger/releaseledger/data/ledgers/main/releases/0.3.2/entries/entry-0002.md +41 -0
  5. utterplan-0.3.2/.ledger/releaseledger/data/ledgers/main/releases/0.3.2/release.md +27 -0
  6. utterplan-0.3.2/.ledger/releaseledger/work/0.3.2/audit-decisions.yaml +48 -0
  7. utterplan-0.3.2/.ledger/releaseledger/work/0.3.2/audit.yaml +75 -0
  8. utterplan-0.3.2/.ledger/releaseledger/work/0.3.2/entries.yaml +54 -0
  9. utterplan-0.3.2/.ledger/releaseledger/work/0.3.2/evidence/6c2a1ac.patch +64 -0
  10. utterplan-0.3.2/.ledger/releaseledger/work/0.3.2/evidence/a2bc20d.patch +1923 -0
  11. utterplan-0.3.2/.ledger/releaseledger/work/0.3.2/evidence/ba3b5af.patch +414 -0
  12. utterplan-0.3.2/.ledger/releaseledger/work/0.3.2/evidence/manifest.json +57 -0
  13. utterplan-0.3.2/.ledger/releaseledger/work/0.3.2/range.json +13 -0
  14. {utterplan-0.3.1/utterplan.egg-info → utterplan-0.3.2}/PKG-INFO +1 -1
  15. {utterplan-0.3.1 → utterplan-0.3.2}/docs/changelog.md +12 -0
  16. {utterplan-0.3.1 → utterplan-0.3.2}/tests/golden/ssmd_09_comprehensive.utterplan.json +2 -1
  17. {utterplan-0.3.1 → utterplan-0.3.2}/tests/migration/goldens/multilingual_preparation.json +1 -0
  18. {utterplan-0.3.1 → utterplan-0.3.2}/tests/migration/goldens/spokenform_numbers.json +1 -0
  19. {utterplan-0.3.1 → utterplan-0.3.2}/tests/migration/goldens/ssmd_break.json +1 -0
  20. {utterplan-0.3.1 → utterplan-0.3.2}/tests/migration/goldens/ssmd_language_detection.json +1 -0
  21. {utterplan-0.3.1 → utterplan-0.3.2}/tests/migration/goldens/ssmd_marker.json +1 -0
  22. {utterplan-0.3.1 → utterplan-0.3.2}/tests/migration/goldens/ssmd_pronunciation.json +1 -0
  23. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_consumer_readiness.py +31 -0
  24. utterplan-0.3.2/tests/test_preparation.py +179 -0
  25. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_ssmd_09_parser.py +17 -0
  26. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/_version.py +3 -3
  27. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/parsers.py +39 -4
  28. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/planner.py +7 -2
  29. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/preparation.py +9 -1
  30. {utterplan-0.3.1 → utterplan-0.3.2/utterplan.egg-info}/PKG-INFO +1 -1
  31. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan.egg-info/SOURCES.txt +12 -2
  32. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan.egg-info/scm_file_list.json +12 -2
  33. utterplan-0.3.2/utterplan.egg-info/scm_version.json +8 -0
  34. utterplan-0.3.1/01_todo.md +0 -1796
  35. utterplan-0.3.1/plan.md +0 -111
  36. utterplan-0.3.1/tests/test_preparation.py +0 -67
  37. utterplan-0.3.1/utterplan.egg-info/scm_version.json +0 -8
  38. {utterplan-0.3.1 → utterplan-0.3.2}/.codecrate.toml +0 -0
  39. {utterplan-0.3.1 → utterplan-0.3.2}/.github/workflows/codecov.yml +0 -0
  40. {utterplan-0.3.1 → utterplan-0.3.2}/.github/workflows/pre-commit.yml +0 -0
  41. {utterplan-0.3.1 → utterplan-0.3.2}/.github/workflows/python-publish.yml +0 -0
  42. {utterplan-0.3.1 → utterplan-0.3.2}/.github/workflows/tests.yml +0 -0
  43. {utterplan-0.3.1 → utterplan-0.3.2}/.gitignore +0 -0
  44. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/ledger.toml +0 -0
  45. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/.ledger-project.toml +0 -0
  46. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/config.toml +0 -0
  47. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
  48. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0001.md +0 -0
  49. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0002.md +0 -0
  50. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0003.md +0 -0
  51. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0004.md +0 -0
  52. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/release.md +0 -0
  53. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/entries/entry-0001.md +0 -0
  54. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/release.md +0 -0
  55. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/audit/commit-audit.yaml +0 -0
  56. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0001.md +0 -0
  57. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0002.md +0 -0
  58. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0003.md +0 -0
  59. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0004.md +0 -0
  60. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0005.md +0 -0
  61. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/entries/entry-0006.md +0 -0
  62. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.1.3/release.md +0 -0
  63. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/audit/commit-audit.yaml +0 -0
  64. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0001.md +0 -0
  65. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0002.md +0 -0
  66. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0003.md +0 -0
  67. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0004.md +0 -0
  68. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/release.md +0 -0
  69. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/audit/commit-audit.yaml +0 -0
  70. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0001.md +0 -0
  71. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0002.md +0 -0
  72. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0003.md +0 -0
  73. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0004.md +0 -0
  74. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0005.md +0 -0
  75. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/entries/entry-0006.md +0 -0
  76. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.0/release.md +0 -0
  77. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.1/audit/commit-audit.yaml +0 -0
  78. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.1/entries/entry-0001.md +0 -0
  79. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/data/ledgers/main/releases/0.3.1/release.md +0 -0
  80. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.1.2/audit-decisions.yaml +0 -0
  81. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.1.2/audit.yaml +0 -0
  82. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.1.2/entries.yaml +0 -0
  83. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.1.2/evidence/2c64e29.patch +0 -0
  84. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.1.2/evidence/4022753.patch +0 -0
  85. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.1.2/evidence/66a88b6.patch +0 -0
  86. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.1.2/evidence/manifest.json +0 -0
  87. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.1.2/range.json +0 -0
  88. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.2.0/audit-decisions.yaml +0 -0
  89. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.2.0/audit.yaml +0 -0
  90. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.2.0/entries.yaml +0 -0
  91. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.2.0/evidence/9637182.patch +0 -0
  92. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.2.0/evidence/c52aa68.patch +0 -0
  93. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.2.0/evidence/e49a6dd.patch +0 -0
  94. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.2.0/evidence/manifest.json +0 -0
  95. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.2.0/range.json +0 -0
  96. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.0/audit-decisions.yaml +0 -0
  97. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.0/audit.yaml +0 -0
  98. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.0/entries.yaml +0 -0
  99. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.0/evidence/49023f0.patch +0 -0
  100. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.0/evidence/manifest.json +0 -0
  101. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.0/range.json +0 -0
  102. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.1/audit-decisions.yaml +0 -0
  103. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.1/audit.yaml +0 -0
  104. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.1/entries.yaml +0 -0
  105. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.1/evidence/70adac0.patch +0 -0
  106. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.1/evidence/manifest.json +0 -0
  107. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/work/0.3.1/range.json +0 -0
  108. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/releaseledger/write.lock +0 -0
  109. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/taskledger/.ledger-project.toml +0 -0
  110. {utterplan-0.3.1 → utterplan-0.3.2}/.ledger/taskledger/config.toml +0 -0
  111. {utterplan-0.3.1 → utterplan-0.3.2}/.pre-commit-config.yaml +0 -0
  112. {utterplan-0.3.1 → utterplan-0.3.2}/AGENTS.md +0 -0
  113. {utterplan-0.3.1 → utterplan-0.3.2}/LICENSE +0 -0
  114. {utterplan-0.3.1 → utterplan-0.3.2}/NOTICE +0 -0
  115. {utterplan-0.3.1 → utterplan-0.3.2}/README.md +0 -0
  116. {utterplan-0.3.1 → utterplan-0.3.2}/docs/Makefile +0 -0
  117. {utterplan-0.3.1 → utterplan-0.3.2}/docs/architecture.md +0 -0
  118. {utterplan-0.3.1 → utterplan-0.3.2}/docs/cli.md +0 -0
  119. {utterplan-0.3.1 → utterplan-0.3.2}/docs/conf.py +0 -0
  120. {utterplan-0.3.1 → utterplan-0.3.2}/docs/consumer-guide.md +0 -0
  121. {utterplan-0.3.1 → utterplan-0.3.2}/docs/coordinate-spaces.md +0 -0
  122. {utterplan-0.3.1 → utterplan-0.3.2}/docs/debugging.md +0 -0
  123. {utterplan-0.3.1 → utterplan-0.3.2}/docs/format.md +0 -0
  124. {utterplan-0.3.1 → utterplan-0.3.2}/docs/getting-started.md +0 -0
  125. {utterplan-0.3.1 → utterplan-0.3.2}/docs/index.md +0 -0
  126. {utterplan-0.3.1 → utterplan-0.3.2}/docs/make.bat +0 -0
  127. {utterplan-0.3.1 → utterplan-0.3.2}/docs/phase-a-completion.md +0 -0
  128. {utterplan-0.3.1 → utterplan-0.3.2}/docs/pykokoro-integration.md +0 -0
  129. {utterplan-0.3.1 → utterplan-0.3.2}/docs/python-api.md +0 -0
  130. {utterplan-0.3.1 → utterplan-0.3.2}/docs/requirements.txt +0 -0
  131. {utterplan-0.3.1 → utterplan-0.3.2}/examples/basic.py +0 -0
  132. {utterplan-0.3.1 → utterplan-0.3.2}/examples/chapter.ssmd +0 -0
  133. {utterplan-0.3.1 → utterplan-0.3.2}/examples/compile_file.py +0 -0
  134. {utterplan-0.3.1 → utterplan-0.3.2}/examples/inspect_plan.py +0 -0
  135. {utterplan-0.3.1 → utterplan-0.3.2}/examples/multilingual.py +0 -0
  136. {utterplan-0.3.1 → utterplan-0.3.2}/examples/ssmd_example.py +0 -0
  137. {utterplan-0.3.1 → utterplan-0.3.2}/pyproject.toml +0 -0
  138. {utterplan-0.3.1 → utterplan-0.3.2}/setup.cfg +0 -0
  139. {utterplan-0.3.1 → utterplan-0.3.2}/spec/schemas/v1.schema.json +0 -0
  140. {utterplan-0.3.1 → utterplan-0.3.2}/spec/schemas/v2.schema.json +0 -0
  141. {utterplan-0.3.1 → utterplan-0.3.2}/spec/schemas/v3.schema.json +0 -0
  142. {utterplan-0.3.1 → utterplan-0.3.2}/spec/utterplan.schema.json +0 -0
  143. {utterplan-0.3.1 → utterplan-0.3.2}/tests/__init__.py +0 -0
  144. {utterplan-0.3.1 → utterplan-0.3.2}/tests/fixtures/ssmd_09_comprehensive.ssmd +0 -0
  145. {utterplan-0.3.1 → utterplan-0.3.2}/tests/golden/basic_en.utterplan.json +0 -0
  146. {utterplan-0.3.1 → utterplan-0.3.2}/tests/golden/directives.utterplan.json +0 -0
  147. {utterplan-0.3.1 → utterplan-0.3.2}/tests/golden/markers.utterplan.json +0 -0
  148. {utterplan-0.3.1 → utterplan-0.3.2}/tests/golden/multilingual.utterplan.json +0 -0
  149. {utterplan-0.3.1 → utterplan-0.3.2}/tests/golden/parenthetical.utterplan.json +0 -0
  150. {utterplan-0.3.1 → utterplan-0.3.2}/tests/golden/spokenform_offsets.utterplan.json +0 -0
  151. {utterplan-0.3.1 → utterplan-0.3.2}/tests/golden/ssmd_breaks.utterplan.json +0 -0
  152. {utterplan-0.3.1 → utterplan-0.3.2}/tests/migration/__init__.py +0 -0
  153. {utterplan-0.3.1 → utterplan-0.3.2}/tests/migration/cases.py +0 -0
  154. {utterplan-0.3.1 → utterplan-0.3.2}/tests/migration/test_semantic_migration_regressions.py +0 -0
  155. {utterplan-0.3.1 → utterplan-0.3.2}/tests/schema_history/README.md +0 -0
  156. {utterplan-0.3.1 → utterplan-0.3.2}/tests/schema_history/v1/basic.json +0 -0
  157. {utterplan-0.3.1 → utterplan-0.3.2}/tests/schema_history/v1/directives.json +0 -0
  158. {utterplan-0.3.1 → utterplan-0.3.2}/tests/schema_history/v1/markers.json +0 -0
  159. {utterplan-0.3.1 → utterplan-0.3.2}/tests/schema_history/v1/multilingual.json +0 -0
  160. {utterplan-0.3.1 → utterplan-0.3.2}/tests/schema_history/v1/parenthetical.json +0 -0
  161. {utterplan-0.3.1 → utterplan-0.3.2}/tests/schema_history/v1/spokenform_offsets.json +0 -0
  162. {utterplan-0.3.1 → utterplan-0.3.2}/tests/schema_history/v1/ssmd_breaks.json +0 -0
  163. {utterplan-0.3.1 → utterplan-0.3.2}/tests/schema_history/v2/directives.json +0 -0
  164. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_boundaries.py +0 -0
  165. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_cli.py +0 -0
  166. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_consumer_contract.py +0 -0
  167. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_coordinates.py +0 -0
  168. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_directives.py +0 -0
  169. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_explain.py +0 -0
  170. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_fake_renderer.py +0 -0
  171. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_format.py +0 -0
  172. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_golden.py +0 -0
  173. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_identity_units.py +0 -0
  174. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_import_boundaries.py +0 -0
  175. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_language.py +0 -0
  176. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_linguistics.py +0 -0
  177. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_migration_framework.py +0 -0
  178. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_pauses.py +0 -0
  179. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_planner.py +0 -0
  180. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_public_identity.py +0 -0
  181. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_schema_history.py +0 -0
  182. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_schema_registry.py +0 -0
  183. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_schema_strict.py +0 -0
  184. {utterplan-0.3.1 → utterplan-0.3.2}/tests/test_version.py +0 -0
  185. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/__init__.py +0 -0
  186. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/__main__.py +0 -0
  187. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/cli.py +0 -0
  188. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/config.py +0 -0
  189. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/diagnostics.py +0 -0
  190. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/directives.py +0 -0
  191. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/exceptions.py +0 -0
  192. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/explain.py +0 -0
  193. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/format.py +0 -0
  194. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/hashing.py +0 -0
  195. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/language.py +0 -0
  196. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/linguistics.py +0 -0
  197. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/migration.py +0 -0
  198. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/migrations/__init__.py +0 -0
  199. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/migrations/registry.py +0 -0
  200. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/migrations/v1_to_v2.py +0 -0
  201. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/migrations/v2_to_v3.py +0 -0
  202. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/model.py +0 -0
  203. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/pauses.py +0 -0
  204. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/py.typed +0 -0
  205. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/schema_registry.py +0 -0
  206. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/schemas/v1.schema.json +0 -0
  207. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/schemas/v2.schema.json +0 -0
  208. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/schemas/v3.schema.json +0 -0
  209. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/serialization.py +0 -0
  210. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/spacy_models.py +0 -0
  211. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/spans.py +0 -0
  212. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/stages/__init__.py +0 -0
  213. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/stages/document/__init__.py +0 -0
  214. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/stages/document/plain.py +0 -0
  215. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/stages/document/ssmd.py +0 -0
  216. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/stages/preparation/__init__.py +0 -0
  217. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/stages/preparation/identity.py +0 -0
  218. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/stages/preparation/spokenform.py +0 -0
  219. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/stages/protocols.py +0 -0
  220. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/units.py +0 -0
  221. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/utterplan.schema.json +0 -0
  222. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan/versioning.py +0 -0
  223. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan.egg-info/dependency_links.txt +0 -0
  224. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan.egg-info/entry_points.txt +0 -0
  225. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan.egg-info/requires.txt +0 -0
  226. {utterplan-0.3.1 → utterplan-0.3.2}/utterplan.egg-info/top_level.txt +0 -0
@@ -48,3 +48,9 @@
48
48
  {"data":{"updated_rows":1},"event":"audit.updated","event_id":"event-0048","record_revisions":{"commit_audit_sheet":2},"release_version":"0.3.1","schema_version":2}
49
49
  {"data":{"entry_ids":["entry-0001"],"synced_audit_rows":1},"event":"entry.batch_added","event_id":"event-0049","record_revisions":{"commit_audit_sheet":3,"entry:0.3.1/entry-0001":1,"release:0.3.1":3},"release_version":"0.3.1","schema_version":2}
50
50
  {"data":{"released_at":"2026-09-27"},"event":"release.finalized","event_id":"event-0050","record_revisions":{"release:0.3.1":4},"release_version":"0.3.1","schema_version":2}
51
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0051","record_revisions":{"release:0.3.2":1},"release_version":"0.3.2","schema_version":2}
52
+ {"data":{"fields":["git_base_ref","git_base_sha","git_commit_count","git_head_ref","git_head_sha","git_range"]},"event":"release.updated","event_id":"event-0052","record_revisions":{"release:0.3.2":2},"release_version":"0.3.2","schema_version":2}
53
+ {"data":{"row_count":3},"event":"audit.created","event_id":"event-0053","record_revisions":{"commit_audit_sheet":1},"release_version":"0.3.2","schema_version":2}
54
+ {"data":{"updated_rows":3},"event":"audit.updated","event_id":"event-0054","record_revisions":{"commit_audit_sheet":2},"release_version":"0.3.2","schema_version":2}
55
+ {"data":{"entry_ids":["entry-0001","entry-0002"],"synced_audit_rows":2},"event":"entry.batch_added","event_id":"event-0055","record_revisions":{"commit_audit_sheet":3,"entry:0.3.2/entry-0001":1,"entry:0.3.2/entry-0002":1,"release:0.3.2":3},"release_version":"0.3.2","schema_version":2}
56
+ {"data":{"released_at":"2026-10-03"},"event":"release.finalized","event_id":"event-0056","record_revisions":{"release:0.3.2":4},"release_version":"0.3.2","schema_version":2}
@@ -0,0 +1,105 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 3
6
+ release_version: 0.3.2
7
+ git_base_ref: v0.3.1
8
+ git_base_sha: b0415758f6c1d1890d8015ce40c1e52d6120cf46
9
+ git_head_ref: HEAD
10
+ git_head_sha: ba3b5afb6c619cf91e482db16b19d53f199eb1e2
11
+ git_range: b0415758f6c1d1890d8015ce40c1e52d6120cf46..ba3b5afb6c619cf91e482db16b19d53f199eb1e2
12
+ commit_count: 3
13
+ rows:
14
+ - sha: 6c2a1ac444c76ea183a791b59af2e92fb60dbb23
15
+ source_ref: git:6c2a1ac444c76ea183a791b59af2e92fb60dbb23
16
+ short_sha: 6c2a1ac
17
+ changed_paths:
18
+ - tests/test_preparation.py
19
+ - utterplan/preparation.py
20
+ stats:
21
+ files_changed: 2
22
+ insertions: 40
23
+ deletions: 1
24
+ inspected: true
25
+ inspected_paths:
26
+ - tests/test_preparation.py
27
+ - utterplan/preparation.py
28
+ observed_behavior:
29
+ Spoken-text preparation protects annotation spans using sub,
30
+ as, say-as, ph, or phonemes from automated replacement while preserving source
31
+ offset mappings.
32
+ public_impact: public
33
+ decision: accepted
34
+ stale: false
35
+ evidence_subject: "feat: improve prepare ssmd"
36
+ target_entry_id: entry-0001
37
+ notes: ""
38
+ - sha: a2bc20d5d25f880688886f1867f0fd398a5b8c7e
39
+ source_ref: git:a2bc20d5d25f880688886f1867f0fd398a5b8c7e
40
+ short_sha: a2bc20d
41
+ changed_paths:
42
+ - 01_todo.md
43
+ - plan.md
44
+ stats:
45
+ files_changed: 2
46
+ insertions: 0
47
+ deletions: 1907
48
+ inspected: true
49
+ inspected_paths:
50
+ - 01_todo.md
51
+ - plan.md
52
+ observed_behavior:
53
+ Removed planning-only repository files; no runtime or public
54
+ package behavior changed.
55
+ public_impact: internal
56
+ decision: internal
57
+ stale: false
58
+ evidence_subject: "chore: remove plan files"
59
+ notes: Repository planning artifacts only, with no user-facing change.
60
+ - sha: ba3b5afb6c619cf91e482db16b19d53f199eb1e2
61
+ source_ref: git:ba3b5afb6c619cf91e482db16b19d53f199eb1e2
62
+ short_sha: ba3b5af
63
+ changed_paths:
64
+ - tests/golden/ssmd_09_comprehensive.utterplan.json
65
+ - tests/migration/goldens/multilingual_preparation.json
66
+ - tests/migration/goldens/spokenform_numbers.json
67
+ - tests/migration/goldens/ssmd_break.json
68
+ - tests/migration/goldens/ssmd_language_detection.json
69
+ - tests/migration/goldens/ssmd_marker.json
70
+ - tests/migration/goldens/ssmd_pronunciation.json
71
+ - tests/test_consumer_readiness.py
72
+ - tests/test_preparation.py
73
+ - tests/test_ssmd_09_parser.py
74
+ - utterplan/parsers.py
75
+ - utterplan/planner.py
76
+ - utterplan/preparation.py
77
+ stats:
78
+ files_changed: 13
79
+ insertions: 183
80
+ deletions: 7
81
+ inspected: true
82
+ inspected_paths:
83
+ - tests/golden/ssmd_09_comprehensive.utterplan.json
84
+ - tests/migration/goldens/multilingual_preparation.json
85
+ - tests/migration/goldens/spokenform_numbers.json
86
+ - tests/migration/goldens/ssmd_break.json
87
+ - tests/migration/goldens/ssmd_language_detection.json
88
+ - tests/migration/goldens/ssmd_marker.json
89
+ - tests/migration/goldens/ssmd_pronunciation.json
90
+ - tests/test_consumer_readiness.py
91
+ - tests/test_preparation.py
92
+ - tests/test_ssmd_09_parser.py
93
+ - utterplan/parsers.py
94
+ - utterplan/planner.py
95
+ - utterplan/preparation.py
96
+ observed_behavior:
97
+ SSMD sequence_fallback_mode accepts spell or preserve, defaults
98
+ to spell, is forwarded to spoken-form preparation and serialized in plan metadata
99
+ and identity, and rejects invalid values.
100
+ public_impact: public
101
+ decision: accepted
102
+ stale: false
103
+ evidence_subject: "feat: parse fallback mode parameter from ssmdconvert settings"
104
+ target_entry_id: entry-0002
105
+ notes: ""
@@ -0,0 +1,32 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0001
8
+ release_version: 0.3.2
9
+ kind: fixed
10
+ summary:
11
+ Fixed text preparation so authored SSMD substitutions and say-as annotations
12
+ remain unchanged
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:6c2a1ac444c76ea183a791b59af2e92fb60dbb23
18
+ paths:
19
+ - tests/test_preparation.py
20
+ - utterplan/preparation.py
21
+ issues: []
22
+ prs: []
23
+ sources:
24
+ - git:6c2a1ac444c76ea183a791b59af2e92fb60dbb23
25
+ contributors:
26
+ - "@holgern"
27
+ breaking: false
28
+ internal: false
29
+ order: 1
30
+ ---
31
+
32
+ Spoken-text preparation excludes spans with `sub`, `as`, and `say-as` attributes from automatic spoken-form replacement, preserving author-provided text while retaining existing pronunciation protections.
@@ -0,0 +1,41 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0002
8
+ release_version: 0.3.2
9
+ kind: added
10
+ summary: Added SSMD sequence fallback mode controls for spoken-form preparation
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs:
15
+ - git:ba3b5afb6c619cf91e482db16b19d53f199eb1e2
16
+ paths:
17
+ - tests/golden/ssmd_09_comprehensive.utterplan.json
18
+ - tests/migration/goldens/multilingual_preparation.json
19
+ - tests/migration/goldens/spokenform_numbers.json
20
+ - tests/migration/goldens/ssmd_break.json
21
+ - tests/migration/goldens/ssmd_language_detection.json
22
+ - tests/migration/goldens/ssmd_marker.json
23
+ - tests/migration/goldens/ssmd_pronunciation.json
24
+ - tests/test_consumer_readiness.py
25
+ - tests/test_preparation.py
26
+ - tests/test_ssmd_09_parser.py
27
+ - utterplan/parsers.py
28
+ - utterplan/planner.py
29
+ - utterplan/preparation.py
30
+ issues: []
31
+ prs: []
32
+ sources:
33
+ - git:ba3b5afb6c619cf91e482db16b19d53f199eb1e2
34
+ contributors:
35
+ - "@holgern"
36
+ breaking: false
37
+ internal: false
38
+ order: 2
39
+ ---
40
+
41
+ SSMD headers can choose `spell` or `preserve` for sequence fallback behavior. The default remains `spell`; the selected mode is carried in plan metadata, and invalid values are rejected during planning.
@@ -0,0 +1,27 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 4
7
+ version: 0.3.2
8
+ status: released
9
+ history_state: curated
10
+ title: null
11
+ released_at: "2026-10-03"
12
+ previous_version: 0.3.1
13
+ cancel_reason: null
14
+ superseded_by: null
15
+ changelog_file: null
16
+ boundary_ref: null
17
+ source_refs: []
18
+ source_count: null
19
+ entry_count: 2
20
+ artifact_count: 0
21
+ git_base_ref: v0.3.1
22
+ git_base_sha: b0415758f6c1d1890d8015ce40c1e52d6120cf46
23
+ git_head_ref: HEAD
24
+ git_head_sha: ba3b5afb6c619cf91e482db16b19d53f199eb1e2
25
+ git_range: b0415758f6c1d1890d8015ce40c1e52d6120cf46..ba3b5afb6c619cf91e482db16b19d53f199eb1e2
26
+ git_commit_count: 3
27
+ ---
@@ -0,0 +1,48 @@
1
+ rows:
2
+ - sha: 6c2a1ac444c76ea183a791b59af2e92fb60dbb23
3
+ inspected: true
4
+ inspected_paths:
5
+ - tests/test_preparation.py
6
+ - utterplan/preparation.py
7
+ observed_behavior: Spoken-text preparation protects annotation spans using sub, as, say-as, ph, or phonemes from automated replacement while preserving source offset mappings.
8
+ public_impact: public
9
+ decision: accepted
10
+ target_entry_key: null
11
+ target_entry_id: null
12
+ notes: ""
13
+ stale: false
14
+ - sha: a2bc20d5d25f880688886f1867f0fd398a5b8c7e
15
+ inspected: true
16
+ inspected_paths:
17
+ - 01_todo.md
18
+ - plan.md
19
+ observed_behavior: Removed planning-only repository files; no runtime or public package behavior changed.
20
+ public_impact: internal
21
+ decision: internal
22
+ target_entry_key: null
23
+ target_entry_id: null
24
+ notes: Repository planning artifacts only, with no user-facing change.
25
+ stale: false
26
+ - sha: ba3b5afb6c619cf91e482db16b19d53f199eb1e2
27
+ inspected: true
28
+ inspected_paths:
29
+ - tests/golden/ssmd_09_comprehensive.utterplan.json
30
+ - tests/migration/goldens/multilingual_preparation.json
31
+ - tests/migration/goldens/spokenform_numbers.json
32
+ - tests/migration/goldens/ssmd_break.json
33
+ - tests/migration/goldens/ssmd_language_detection.json
34
+ - tests/migration/goldens/ssmd_marker.json
35
+ - tests/migration/goldens/ssmd_pronunciation.json
36
+ - tests/test_consumer_readiness.py
37
+ - tests/test_preparation.py
38
+ - tests/test_ssmd_09_parser.py
39
+ - utterplan/parsers.py
40
+ - utterplan/planner.py
41
+ - utterplan/preparation.py
42
+ observed_behavior: SSMD sequence_fallback_mode accepts spell or preserve, defaults to spell, is forwarded to spoken-form preparation and serialized in plan metadata and identity, and rejects invalid values.
43
+ public_impact: public
44
+ decision: accepted
45
+ target_entry_key: null
46
+ target_entry_id: null
47
+ notes: ""
48
+ stale: false
@@ -0,0 +1,75 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 1
6
+ release_version: 0.3.2
7
+ git_base_ref: v0.3.1
8
+ git_base_sha: b0415758f6c1d1890d8015ce40c1e52d6120cf46
9
+ git_head_ref: HEAD
10
+ git_head_sha: ba3b5afb6c619cf91e482db16b19d53f199eb1e2
11
+ git_range: b0415758f6c1d1890d8015ce40c1e52d6120cf46..ba3b5afb6c619cf91e482db16b19d53f199eb1e2
12
+ commit_count: 3
13
+ rows:
14
+ - sha: 6c2a1ac444c76ea183a791b59af2e92fb60dbb23
15
+ source_ref: git:6c2a1ac444c76ea183a791b59af2e92fb60dbb23
16
+ short_sha: 6c2a1ac
17
+ changed_paths:
18
+ - tests/test_preparation.py
19
+ - utterplan/preparation.py
20
+ stats:
21
+ files_changed: 2
22
+ insertions: 40
23
+ deletions: 1
24
+ inspected: false
25
+ inspected_paths: []
26
+ observed_behavior: ""
27
+ public_impact: unknown
28
+ decision: needs_review
29
+ stale: false
30
+ evidence_subject: "feat: improve prepare ssmd"
31
+ - sha: a2bc20d5d25f880688886f1867f0fd398a5b8c7e
32
+ source_ref: git:a2bc20d5d25f880688886f1867f0fd398a5b8c7e
33
+ short_sha: a2bc20d
34
+ changed_paths:
35
+ - 01_todo.md
36
+ - plan.md
37
+ stats:
38
+ files_changed: 2
39
+ insertions: 0
40
+ deletions: 1907
41
+ inspected: false
42
+ inspected_paths: []
43
+ observed_behavior: ""
44
+ public_impact: unknown
45
+ decision: needs_review
46
+ stale: false
47
+ evidence_subject: "chore: remove plan files"
48
+ - sha: ba3b5afb6c619cf91e482db16b19d53f199eb1e2
49
+ source_ref: git:ba3b5afb6c619cf91e482db16b19d53f199eb1e2
50
+ short_sha: ba3b5af
51
+ changed_paths:
52
+ - tests/golden/ssmd_09_comprehensive.utterplan.json
53
+ - tests/migration/goldens/multilingual_preparation.json
54
+ - tests/migration/goldens/spokenform_numbers.json
55
+ - tests/migration/goldens/ssmd_break.json
56
+ - tests/migration/goldens/ssmd_language_detection.json
57
+ - tests/migration/goldens/ssmd_marker.json
58
+ - tests/migration/goldens/ssmd_pronunciation.json
59
+ - tests/test_consumer_readiness.py
60
+ - tests/test_preparation.py
61
+ - tests/test_ssmd_09_parser.py
62
+ - utterplan/parsers.py
63
+ - utterplan/planner.py
64
+ - utterplan/preparation.py
65
+ stats:
66
+ files_changed: 13
67
+ insertions: 183
68
+ deletions: 7
69
+ inspected: false
70
+ inspected_paths: []
71
+ observed_behavior: ""
72
+ public_impact: unknown
73
+ decision: needs_review
74
+ stale: false
75
+ evidence_subject: "feat: parse fallback mode parameter from ssmdconvert settings"
@@ -0,0 +1,54 @@
1
+ schema: releaseledger.entry-batch.v1
2
+ operation: create
3
+ schema_version: 1
4
+ object_type: release_entry_batch
5
+ release_version: 0.3.2
6
+ git_base_ref: b0415758f6c1d1890d8015ce40c1e52d6120cf46
7
+ git_base_sha: b0415758f6c1d1890d8015ce40c1e52d6120cf46
8
+ git_head_ref: ba3b5afb6c619cf91e482db16b19d53f199eb1e2
9
+ git_head_sha: ba3b5afb6c619cf91e482db16b19d53f199eb1e2
10
+ include_merges: nontrivial
11
+ entries:
12
+ - kind: fixed
13
+ summary: Fixed text preparation so authored SSMD substitutions and say-as annotations remain unchanged
14
+ status: accepted
15
+ body: >-
16
+ Spoken-text preparation excludes spans with `sub`, `as`, and `say-as` attributes from automatic spoken-form replacement, preserving author-provided text while retaining existing pronunciation protections.
17
+ source_refs:
18
+ - git:6c2a1ac444c76ea183a791b59af2e92fb60dbb23
19
+ paths:
20
+ - tests/test_preparation.py
21
+ - utterplan/preparation.py
22
+ sources:
23
+ - git:6c2a1ac444c76ea183a791b59af2e92fb60dbb23
24
+ prs: []
25
+ issues: []
26
+ contributors:
27
+ - "@holgern"
28
+ - kind: added
29
+ summary: Added SSMD sequence fallback mode controls for spoken-form preparation
30
+ status: accepted
31
+ body: >-
32
+ SSMD headers can choose `spell` or `preserve` for sequence fallback behavior. The default remains `spell`; the selected mode is carried in plan metadata, and invalid values are rejected during planning.
33
+ source_refs:
34
+ - git:ba3b5afb6c619cf91e482db16b19d53f199eb1e2
35
+ paths:
36
+ - tests/golden/ssmd_09_comprehensive.utterplan.json
37
+ - tests/migration/goldens/multilingual_preparation.json
38
+ - tests/migration/goldens/spokenform_numbers.json
39
+ - tests/migration/goldens/ssmd_break.json
40
+ - tests/migration/goldens/ssmd_language_detection.json
41
+ - tests/migration/goldens/ssmd_marker.json
42
+ - tests/migration/goldens/ssmd_pronunciation.json
43
+ - tests/test_consumer_readiness.py
44
+ - tests/test_preparation.py
45
+ - tests/test_ssmd_09_parser.py
46
+ - utterplan/parsers.py
47
+ - utterplan/planner.py
48
+ - utterplan/preparation.py
49
+ sources:
50
+ - git:ba3b5afb6c619cf91e482db16b19d53f199eb1e2
51
+ prs: []
52
+ issues: []
53
+ contributors:
54
+ - "@holgern"
@@ -0,0 +1,64 @@
1
+ tests/test_preparation.py | 37 +++++++++++++++++++++++++++++++++++++
2
+ utterplan/preparation.py | 4 +++-
3
+ 2 files changed, 40 insertions(+), 1 deletion(-)
4
+
5
+ diff --git a/tests/test_preparation.py b/tests/test_preparation.py
6
+ index dad7957..11f777b 100644
7
+ --- a/tests/test_preparation.py
8
+ +++ b/tests/test_preparation.py
9
+ @@ -65,3 +65,40 @@ def test_zero_width_audio_annotation_maps_to_spoken_point():
10
+ assert annotation.structural_start == annotation.structural_end
11
+ assert annotation.spoken_start == annotation.spoken_end
12
+ assert plan.texts.spoken[annotation.spoken_start : annotation.spoken_end] == ""
13
+ +
14
+ +
15
+ +def test_author_speech_annotations_are_protected_and_keep_source_offsets():
16
+ + source = (
17
+ + '[H2O]{sub="water"} '
18
+ + '[31.12.2024]{as="date" format="dd.mm.yyyy"} '
19
+ + '[04/05/2024]{say-as="date" format="MM/dd/yyyy"} '
20
+ + '[tomato]{ph="təˈmeɪtoʊ"} '
21
+ + '[AWS]{phonemes="eɪ dʌbəljuː ɛs"} ordinary 5 kg.'
22
+ + )
23
+ + plan = UtterancePlanner(PlannerConfig(language="en-us", document_format="ssmd")).plan(source)
24
+ +
25
+ + assert plan.texts.spoken == ("H2O 31.12.2024 04/05/2024 tomato AWS ordinary five kilograms.")
26
+ + protected = [
27
+ + annotation
28
+ + for annotation in plan.annotations
29
+ + if any(key in annotation.attrs for key in ("sub", "as", "say-as", "ph", "phonemes"))
30
+ + ]
31
+ + assert len(protected) == 5
32
+ + for annotation in protected:
33
+ + structural = plan.texts.structural[annotation.structural_start : annotation.structural_end]
34
+ + spoken = plan.texts.spoken[annotation.spoken_start : annotation.spoken_end]
35
+ + assert spoken == structural
36
+ +
37
+ + assert any(annotation.attrs.get("sub") == "water" for annotation in protected)
38
+ + assert any(annotation.attrs.get("as") == "date" for annotation in protected)
39
+ + assert any(annotation.attrs.get("say-as") == "date" for annotation in protected)
40
+ + assert any("ph" in annotation.attrs for annotation in protected)
41
+ + assert any("phonemes" in annotation.attrs for annotation in protected)
42
+ +
43
+ + assert len(plan.preparation.replacements) == 1
44
+ + replacement = plan.preparation.replacements[0]
45
+ + assert plan.texts.structural[replacement["source_start"] : replacement["source_end"]] == "5 kg"
46
+ + assert (
47
+ + plan.texts.spoken[replacement["output_start"] : replacement["output_end"]]
48
+ + == "five kilograms"
49
+ + )
50
+ diff --git a/utterplan/preparation.py b/utterplan/preparation.py
51
+ index d11bfdb..2483738 100644
52
+ --- a/utterplan/preparation.py
53
+ +++ b/utterplan/preparation.py
54
+ @@ -50,7 +50,9 @@ class SpokenformTextPreparer:
55
+ for annotation in annotations
56
+ if annotation.structural_start >= run.spoken_start
57
+ and annotation.structural_end <= run.spoken_end
58
+ - and (annotation.attrs.get("ph") or annotation.attrs.get("phonemes"))
59
+ + and any(
60
+ + key in annotation.attrs for key in ("sub", "as", "say-as", "ph", "phonemes")
61
+ + )
62
+ ]
63
+ kwargs: dict[str, Any] = {
64
+ "language": language_lookup_key(run.language),