voicerender 0.2.2__tar.gz → 0.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. {voicerender-0.2.2 → voicerender-0.2.3}/.github/workflows/tests.yml +3 -0
  2. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +5 -0
  3. voicerender-0.2.3/.ledger/releaseledger/data/ledgers/main/releases/0.2.3/audit/commit-audit.yaml +74 -0
  4. voicerender-0.2.3/.ledger/releaseledger/data/ledgers/main/releases/0.2.3/entries/entry-0001.md +32 -0
  5. voicerender-0.2.3/.ledger/releaseledger/data/ledgers/main/releases/0.2.3/entries/entry-0002.md +34 -0
  6. voicerender-0.2.3/.ledger/releaseledger/data/ledgers/main/releases/0.2.3/release.md +27 -0
  7. voicerender-0.2.3/.ledger/releaseledger/work/0.2.3/audit-decisions.yaml +31 -0
  8. voicerender-0.2.3/.ledger/releaseledger/work/0.2.3/audit.yaml +53 -0
  9. voicerender-0.2.3/.ledger/releaseledger/work/0.2.3/entries.yaml +45 -0
  10. voicerender-0.2.3/.ledger/releaseledger/work/0.2.3/evidence/67e4d8e.patch +145 -0
  11. voicerender-0.2.3/.ledger/releaseledger/work/0.2.3/evidence/b17f1a9.patch +1868 -0
  12. voicerender-0.2.3/.ledger/releaseledger/work/0.2.3/evidence/manifest.json +45 -0
  13. voicerender-0.2.3/.ledger/releaseledger/work/0.2.3/range.json +13 -0
  14. {voicerender-0.2.2/voicerender.egg-info → voicerender-0.2.3}/PKG-INFO +25 -3
  15. {voicerender-0.2.2 → voicerender-0.2.3}/README.md +21 -1
  16. {voicerender-0.2.2 → voicerender-0.2.3}/docs/changelog.md +12 -0
  17. {voicerender-0.2.2 → voicerender-0.2.3}/pyproject.toml +3 -1
  18. voicerender-0.2.3/tests/test_chatterboxsynth_engine.py +668 -0
  19. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_engine_registry.py +68 -6
  20. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_kittensynth_engine.py +30 -0
  21. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_preflight.py +37 -0
  22. {voicerender-0.2.2 → voicerender-0.2.3}/tests/wheel_smoke.py +3 -0
  23. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/_version.py +3 -3
  24. voicerender-0.2.3/voicerender/engines/chatterboxsynth.py +906 -0
  25. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/kittensynth.py +5 -0
  26. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/registry.py +7 -0
  27. {voicerender-0.2.2 → voicerender-0.2.3/voicerender.egg-info}/PKG-INFO +25 -3
  28. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender.egg-info/SOURCES.txt +13 -0
  29. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender.egg-info/requires.txt +4 -1
  30. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender.egg-info/scm_file_list.json +13 -0
  31. voicerender-0.2.3/voicerender.egg-info/scm_version.json +8 -0
  32. voicerender-0.2.2/voicerender.egg-info/scm_version.json +0 -8
  33. {voicerender-0.2.2 → voicerender-0.2.3}/.codecrate.toml +0 -0
  34. {voicerender-0.2.2 → voicerender-0.2.3}/.github/workflows/codecov.yml +0 -0
  35. {voicerender-0.2.2 → voicerender-0.2.3}/.github/workflows/pre-commit.yml +0 -0
  36. {voicerender-0.2.2 → voicerender-0.2.3}/.github/workflows/python-publish.yml +0 -0
  37. {voicerender-0.2.2 → voicerender-0.2.3}/.gitignore +0 -0
  38. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/ledger.toml +0 -0
  39. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/.ledger-project.toml +0 -0
  40. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/config.toml +0 -0
  41. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
  42. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/audit/commit-audit.yaml +0 -0
  43. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/entries/entry-0001.md +0 -0
  44. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/release.md +0 -0
  45. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/audit/commit-audit.yaml +0 -0
  46. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0001.md +0 -0
  47. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0002.md +0 -0
  48. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0003.md +0 -0
  49. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0004.md +0 -0
  50. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0005.md +0 -0
  51. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0006.md +0 -0
  52. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0007.md +0 -0
  53. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/release.md +0 -0
  54. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/audit/commit-audit.yaml +0 -0
  55. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0001.md +0 -0
  56. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0002.md +0 -0
  57. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0003.md +0 -0
  58. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0004.md +0 -0
  59. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0005.md +0 -0
  60. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0006.md +0 -0
  61. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/release.md +0 -0
  62. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.2/audit/commit-audit.yaml +0 -0
  63. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.2/entries/entry-0001.md +0 -0
  64. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.2/entries/entry-0002.md +0 -0
  65. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.2/entries/entry-0003.md +0 -0
  66. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.2/entries/entry-0004.md +0 -0
  67. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/0.2.2/release.md +0 -0
  68. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/audit/commit-audit.yaml +0 -0
  69. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0001.md +0 -0
  70. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0002.md +0 -0
  71. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0003.md +0 -0
  72. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0004.md +0 -0
  73. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0005.md +0 -0
  74. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/release.md +0 -0
  75. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.1.1/audit-decisions.yaml +0 -0
  76. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.1.1/entries.yaml +0 -0
  77. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/audit-decisions.yaml +0 -0
  78. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/audit.yaml +0 -0
  79. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/entries.yaml +0 -0
  80. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/19f5b06.patch +0 -0
  81. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/245ca9f.patch +0 -0
  82. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/42a90e3.patch +0 -0
  83. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/480cbea.patch +0 -0
  84. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/4eb3c28.patch +0 -0
  85. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/50f298e.patch +0 -0
  86. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/56ae327.patch +0 -0
  87. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/57f1e24.patch +0 -0
  88. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/6dae2b6.patch +0 -0
  89. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/84f29db.patch +0 -0
  90. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/a390661.patch +0 -0
  91. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/a431dfa.patch +0 -0
  92. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/c2be7b3.patch +0 -0
  93. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/da15247.patch +0 -0
  94. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/ede34ea.patch +0 -0
  95. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/evidence/manifest.json +0 -0
  96. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.0/range.json +0 -0
  97. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.1/audit-decisions.yaml +0 -0
  98. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.1/audit.yaml +0 -0
  99. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.1/entries.yaml +0 -0
  100. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.1/evidence/3342e15.patch +0 -0
  101. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.1/evidence/3c82349.patch +0 -0
  102. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.1/evidence/7f466cc.patch +0 -0
  103. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.1/evidence/84f629e.patch +0 -0
  104. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.1/evidence/b7e1917.patch +0 -0
  105. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.1/evidence/manifest.json +0 -0
  106. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.1/range.json +0 -0
  107. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.2/audit-decisions.yaml +0 -0
  108. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.2/audit.yaml +0 -0
  109. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.2/entries.yaml +0 -0
  110. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.2/evidence/6510540.patch +0 -0
  111. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.2/evidence/8861791.patch +0 -0
  112. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.2/evidence/f093d36.patch +0 -0
  113. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.2/evidence/fdb106d.patch +0 -0
  114. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.2/evidence/manifest.json +0 -0
  115. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/0.2.2/range.json +0 -0
  116. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/v0.1.0/audit-decisions.yaml +0 -0
  117. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/v0.1.0/entries.yaml +0 -0
  118. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/v0.1.0/evidence/264eb9b.patch +0 -0
  119. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/v0.1.0/evidence/774f6f2.patch +0 -0
  120. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/v0.1.0/evidence/9e71e84.patch +0 -0
  121. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/v0.1.0/evidence/c4a2872.patch +0 -0
  122. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/v0.1.0/evidence/fb7faaf.patch +0 -0
  123. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/work/v0.1.0/evidence/manifest.json +0 -0
  124. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/releaseledger/write.lock +0 -0
  125. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/taskledger/.ledger-project.toml +0 -0
  126. {voicerender-0.2.2 → voicerender-0.2.3}/.ledger/taskledger/config.toml +0 -0
  127. {voicerender-0.2.2 → voicerender-0.2.3}/.pre-commit-config.yaml +0 -0
  128. {voicerender-0.2.2 → voicerender-0.2.3}/LICENSE +0 -0
  129. {voicerender-0.2.2 → voicerender-0.2.3}/MANIFEST.in +0 -0
  130. {voicerender-0.2.2 → voicerender-0.2.3}/docs/Makefile +0 -0
  131. {voicerender-0.2.2 → voicerender-0.2.3}/docs/conf.py +0 -0
  132. {voicerender-0.2.2 → voicerender-0.2.3}/docs/index.md +0 -0
  133. {voicerender-0.2.2 → voicerender-0.2.3}/docs/make.bat +0 -0
  134. {voicerender-0.2.2 → voicerender-0.2.3}/docs/make.py +0 -0
  135. {voicerender-0.2.2 → voicerender-0.2.3}/docs/renderprofile.md +0 -0
  136. {voicerender-0.2.2 → voicerender-0.2.3}/docs/requirements.txt +0 -0
  137. {voicerender-0.2.2 → voicerender-0.2.3}/examples/README.md +0 -0
  138. {voicerender-0.2.2 → voicerender-0.2.3}/examples/plans/chapter.renderplan.toml +0 -0
  139. {voicerender-0.2.2 → voicerender-0.2.3}/examples/plans/chapter.voiceplan.toml +0 -0
  140. {voicerender-0.2.2 → voicerender-0.2.3}/examples/voices/narration.renderprofile.toml +0 -0
  141. {voicerender-0.2.2 → voicerender-0.2.3}/examples/voices/piper.toml +0 -0
  142. {voicerender-0.2.2 → voicerender-0.2.3}/examples/voices/pocket-reference.toml +0 -0
  143. {voicerender-0.2.2 → voicerender-0.2.3}/setup.cfg +0 -0
  144. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_backends.py +0 -0
  145. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_capacity.py +0 -0
  146. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_cli.py +0 -0
  147. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_control_surface_exports.py +0 -0
  148. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_engine_contracts.py +0 -0
  149. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_engine_options.py +0 -0
  150. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_inflectsynth_engine.py +0 -0
  151. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_kokoro_reference.py +0 -0
  152. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_managed_voices.py +0 -0
  153. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_model_management_api.py +0 -0
  154. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_model_management_cli.py +0 -0
  155. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_package_metadata.py +0 -0
  156. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_pocketsynth_managed.py +0 -0
  157. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_profile_roles.py +0 -0
  158. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_profile_roles_cli.py +0 -0
  159. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_progress.py +0 -0
  160. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_qwen3_voice_design.py +0 -0
  161. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_qwen3synth_engine.py +0 -0
  162. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_render_book.py +0 -0
  163. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_renderer.py +0 -0
  164. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_renderplan_input.py +0 -0
  165. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_renderplan_render.py +0 -0
  166. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_renderprofile.py +0 -0
  167. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_soprosynth_engine.py +0 -0
  168. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_storage.py +0 -0
  169. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_voice_clone.py +0 -0
  170. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_voice_clone_cli.py +0 -0
  171. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_voice_descriptors.py +0 -0
  172. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_voice_source_cli.py +0 -0
  173. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_voice_source_codec.py +0 -0
  174. {voicerender-0.2.2 → voicerender-0.2.3}/tests/test_voice_sources.py +0 -0
  175. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/__init__.py +0 -0
  176. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/__main__.py +0 -0
  177. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/book.py +0 -0
  178. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/book_contract.py +0 -0
  179. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/book_layout.py +0 -0
  180. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/capacity.py +0 -0
  181. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/cli.py +0 -0
  182. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/__init__.py +0 -0
  183. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/api_probe.py +0 -0
  184. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/assets.py +0 -0
  185. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/base.py +0 -0
  186. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/catalog.py +0 -0
  187. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/inflectsynth.py +0 -0
  188. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/kokoro.py +0 -0
  189. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/metadata.py +0 -0
  190. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/options.py +0 -0
  191. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/piper.py +0 -0
  192. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/pipersynth.py +0 -0
  193. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/pocket.py +0 -0
  194. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/pocketsynth.py +0 -0
  195. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/profiles.py +0 -0
  196. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/qwen3synth.py +0 -0
  197. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/selection.py +0 -0
  198. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/soprosynth.py +0 -0
  199. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/engines/supertonicsynth.py +0 -0
  200. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/errors.py +0 -0
  201. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/estimates.py +0 -0
  202. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/events.py +0 -0
  203. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/lexicons.py +0 -0
  204. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/managed_voices.py +0 -0
  205. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/models.py +0 -0
  206. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/models_api.py +0 -0
  207. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/preflight.py +0 -0
  208. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/profile_roles.py +0 -0
  209. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/progress.py +0 -0
  210. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/py.typed +0 -0
  211. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/render.py +0 -0
  212. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/renderplan_input.py +0 -0
  213. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/renderplan_render.py +0 -0
  214. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/renderprofile.py +0 -0
  215. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/storage.py +0 -0
  216. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/voice_clone.py +0 -0
  217. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/voice_design.py +0 -0
  218. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/voice_source_codec.py +0 -0
  219. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/voice_sources.py +0 -0
  220. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender/voices_api.py +0 -0
  221. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender.egg-info/dependency_links.txt +0 -0
  222. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender.egg-info/entry_points.txt +0 -0
  223. {voicerender-0.2.2 → voicerender-0.2.3}/voicerender.egg-info/top_level.txt +0 -0
@@ -197,6 +197,7 @@ jobs:
197
197
  ):
198
198
  base_requirements.add(requirement.name.lower())
199
199
  engine_sdks = {
200
+ "chatterboxsynth",
200
201
  "inflectsynth", "kittensynth", "pykokoro", "pipersynth",
201
202
  "pocketsynth", "soprosynth", "supertonicsynth",
202
203
  "qwen3synth",
@@ -235,6 +236,7 @@ jobs:
235
236
  assert resources.files("voicerender").joinpath("book_layout.py").is_file()
236
237
  assert RenderPlanSet is not None
237
238
  assert {item["id"] for item in list_engines()} == {
239
+ "chatterbox",
238
240
  "inflect",
239
241
  "kitten",
240
242
  "kokoro",
@@ -246,6 +248,7 @@ jobs:
246
248
  }
247
249
  assert not any(
248
250
  name.split(".", 1)[0] in {
251
+ "chatterboxsynth",
249
252
  "inflectsynth", "kittensynth", "pykokoro", "pipersynth",
250
253
  "pocketsynth", "soprosynth", "supertonicsynth", "utterplan",
251
254
  "qwen3synth",
@@ -28,3 +28,8 @@
28
28
  {"data":{"updated_rows":4},"event":"audit.updated","event_id":"event-0028","record_revisions":{"commit_audit_sheet":2},"release_version":"0.2.2","schema_version":2}
29
29
  {"data":{"entry_ids":["entry-0001","entry-0002","entry-0003","entry-0004"],"synced_audit_rows":4},"event":"entry.batch_added","event_id":"event-0029","record_revisions":{"commit_audit_sheet":3,"entry:0.2.2/entry-0001":1,"entry:0.2.2/entry-0002":1,"entry:0.2.2/entry-0003":1,"entry:0.2.2/entry-0004":1,"release:0.2.2":3},"release_version":"0.2.2","schema_version":2}
30
30
  {"data":{"released_at":"2026-10-17"},"event":"release.finalized","event_id":"event-0030","record_revisions":{"release:0.2.2":4},"release_version":"0.2.2","schema_version":2}
31
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0031","record_revisions":{"release:0.2.3":1},"release_version":"0.2.3","schema_version":2}
32
+ {"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-0032","record_revisions":{"release:0.2.3":2},"release_version":"0.2.3","schema_version":2}
33
+ {"data":{"row_count":2},"event":"audit.created","event_id":"event-0033","record_revisions":{"commit_audit_sheet":1},"release_version":"0.2.3","schema_version":2}
34
+ {"data":{"updated_rows":2},"event":"audit.updated","event_id":"event-0034","record_revisions":{"commit_audit_sheet":2},"release_version":"0.2.3","schema_version":2}
35
+ {"data":{"entry_ids":["entry-0001","entry-0002"],"synced_audit_rows":2},"event":"entry.batch_added","event_id":"event-0035","record_revisions":{"commit_audit_sheet":3,"entry:0.2.3/entry-0001":1,"entry:0.2.3/entry-0002":1,"release:0.2.3":3},"release_version":"0.2.3","schema_version":2}
@@ -0,0 +1,74 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 3
6
+ release_version: 0.2.3
7
+ git_base_ref: v0.2.2
8
+ git_base_sha: aecc0461fdecf55f60f20991e796efd1c240679a
9
+ git_head_ref: HEAD
10
+ git_head_sha: b17f1a9010849b0e6aec846f222e12a86f04ad79
11
+ git_range: aecc0461fdecf55f60f20991e796efd1c240679a..b17f1a9010849b0e6aec846f222e12a86f04ad79
12
+ commit_count: 2
13
+ rows:
14
+ - sha: 67e4d8ec44e04f96d7041afa8c87c762bec87b6f
15
+ source_ref: git:67e4d8ec44e04f96d7041afa8c87c762bec87b6f
16
+ short_sha: 67e4d8e
17
+ changed_paths:
18
+ - pyproject.toml
19
+ - tests/test_kittensynth_engine.py
20
+ - tests/test_preflight.py
21
+ - voicerender/engines/kittensynth.py
22
+ stats:
23
+ files_changed: 4
24
+ insertions: 73
25
+ deletions: 1
26
+ inspected: true
27
+ inspected_paths:
28
+ - pyproject.toml
29
+ - tests/test_kittensynth_engine.py
30
+ - tests/test_preflight.py
31
+ - voicerender/engines/kittensynth.py
32
+ observed_behavior:
33
+ Preflight now classifies managed model dependency failures as
34
+ non-replanable runtime rejects, preserving native error context instead of treating
35
+ the failure as a text-capacity issue; the KittenSynth optional dependency floor
36
+ is raised to 0.1.6.
37
+ public_impact: public
38
+ decision: accepted
39
+ stale: false
40
+ evidence_subject: "feat: raise kittensynth floor"
41
+ target_entry_id: entry-0001
42
+ notes: ""
43
+ - sha: b17f1a9010849b0e6aec846f222e12a86f04ad79
44
+ source_ref: git:b17f1a9010849b0e6aec846f222e12a86f04ad79
45
+ short_sha: b17f1a9
46
+ changed_paths:
47
+ - README.md
48
+ - pyproject.toml
49
+ - tests/test_chatterboxsynth_engine.py
50
+ - tests/test_engine_registry.py
51
+ - voicerender/engines/chatterboxsynth.py
52
+ - voicerender/engines/registry.py
53
+ stats:
54
+ files_changed: 6
55
+ insertions: 1672
56
+ deletions: 7
57
+ inspected: true
58
+ inspected_paths:
59
+ - README.md
60
+ - pyproject.toml
61
+ - tests/test_chatterboxsynth_engine.py
62
+ - tests/test_engine_registry.py
63
+ - voicerender/engines/chatterboxsynth.py
64
+ - voicerender/engines/registry.py
65
+ observed_behavior:
66
+ Adds optional English-only ChatterboxSynth rendering with installed-model
67
+ discovery, pinned local or managed reference voices, exact preflight measurement,
68
+ and lazy voice preparation.
69
+ public_impact: public
70
+ decision: accepted
71
+ stale: false
72
+ evidence_subject: "feat: add chatterbox"
73
+ target_entry_id: entry-0002
74
+ 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.2.3
9
+ kind: changed
10
+ summary:
11
+ Changed preflight handling so unavailable managed KittenSynth dependencies
12
+ reject without scheduling a replan
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:67e4d8ec44e04f96d7041afa8c87c762bec87b6f
18
+ paths:
19
+ - pyproject.toml
20
+ - tests/test_kittensynth_engine.py
21
+ - tests/test_preflight.py
22
+ - voicerender/engines/kittensynth.py
23
+ issues: []
24
+ prs: []
25
+ sources:
26
+ - git:67e4d8ec44e04f96d7041afa8c87c762bec87b6f
27
+ contributors:
28
+ - "@holgern"
29
+ breaking: false
30
+ internal: false
31
+ order: 1
32
+ ---
@@ -0,0 +1,34 @@
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.2.3
9
+ kind: added
10
+ summary:
11
+ Added optional ChatterboxSynth rendering with pinned reference voices and
12
+ installed-model discovery
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:b17f1a9010849b0e6aec846f222e12a86f04ad79
18
+ paths:
19
+ - README.md
20
+ - pyproject.toml
21
+ - tests/test_chatterboxsynth_engine.py
22
+ - tests/test_engine_registry.py
23
+ - voicerender/engines/chatterboxsynth.py
24
+ - voicerender/engines/registry.py
25
+ issues: []
26
+ prs: []
27
+ sources:
28
+ - git:b17f1a9010849b0e6aec846f222e12a86f04ad79
29
+ contributors:
30
+ - "@holgern"
31
+ breaking: false
32
+ internal: false
33
+ order: 2
34
+ ---
@@ -0,0 +1,27 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 3
7
+ version: 0.2.3
8
+ status: planned
9
+ history_state: curated
10
+ title: null
11
+ released_at: null
12
+ previous_version: 0.2.2
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.2.2
22
+ git_base_sha: aecc0461fdecf55f60f20991e796efd1c240679a
23
+ git_head_ref: HEAD
24
+ git_head_sha: b17f1a9010849b0e6aec846f222e12a86f04ad79
25
+ git_range: aecc0461fdecf55f60f20991e796efd1c240679a..b17f1a9010849b0e6aec846f222e12a86f04ad79
26
+ git_commit_count: 2
27
+ ---
@@ -0,0 +1,31 @@
1
+ rows:
2
+ - sha: 67e4d8ec44e04f96d7041afa8c87c762bec87b6f
3
+ inspected: true
4
+ inspected_paths:
5
+ - pyproject.toml
6
+ - tests/test_kittensynth_engine.py
7
+ - tests/test_preflight.py
8
+ - voicerender/engines/kittensynth.py
9
+ observed_behavior: Preflight now classifies managed model dependency failures as non-replanable runtime rejects, preserving native error context instead of treating the failure as a text-capacity issue; the KittenSynth optional dependency floor is raised to 0.1.6.
10
+ public_impact: public
11
+ decision: accepted
12
+ target_entry_key: null
13
+ target_entry_id: null
14
+ notes: ""
15
+ stale: false
16
+ - sha: b17f1a9010849b0e6aec846f222e12a86f04ad79
17
+ inspected: true
18
+ inspected_paths:
19
+ - README.md
20
+ - pyproject.toml
21
+ - tests/test_chatterboxsynth_engine.py
22
+ - tests/test_engine_registry.py
23
+ - voicerender/engines/chatterboxsynth.py
24
+ - voicerender/engines/registry.py
25
+ observed_behavior: Adds optional English-only ChatterboxSynth rendering with installed-model discovery, pinned local or managed reference voices, exact preflight measurement, and lazy voice preparation.
26
+ public_impact: public
27
+ decision: accepted
28
+ target_entry_key: null
29
+ target_entry_id: null
30
+ notes: ""
31
+ stale: false
@@ -0,0 +1,53 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 1
6
+ release_version: 0.2.3
7
+ git_base_ref: v0.2.2
8
+ git_base_sha: aecc0461fdecf55f60f20991e796efd1c240679a
9
+ git_head_ref: HEAD
10
+ git_head_sha: b17f1a9010849b0e6aec846f222e12a86f04ad79
11
+ git_range: aecc0461fdecf55f60f20991e796efd1c240679a..b17f1a9010849b0e6aec846f222e12a86f04ad79
12
+ commit_count: 2
13
+ rows:
14
+ - sha: 67e4d8ec44e04f96d7041afa8c87c762bec87b6f
15
+ source_ref: git:67e4d8ec44e04f96d7041afa8c87c762bec87b6f
16
+ short_sha: 67e4d8e
17
+ changed_paths:
18
+ - pyproject.toml
19
+ - tests/test_kittensynth_engine.py
20
+ - tests/test_preflight.py
21
+ - voicerender/engines/kittensynth.py
22
+ stats:
23
+ files_changed: 4
24
+ insertions: 73
25
+ deletions: 1
26
+ inspected: false
27
+ inspected_paths: []
28
+ observed_behavior: ""
29
+ public_impact: unknown
30
+ decision: needs_review
31
+ stale: false
32
+ evidence_subject: "feat: raise kittensynth floor"
33
+ - sha: b17f1a9010849b0e6aec846f222e12a86f04ad79
34
+ source_ref: git:b17f1a9010849b0e6aec846f222e12a86f04ad79
35
+ short_sha: b17f1a9
36
+ changed_paths:
37
+ - README.md
38
+ - pyproject.toml
39
+ - tests/test_chatterboxsynth_engine.py
40
+ - tests/test_engine_registry.py
41
+ - voicerender/engines/chatterboxsynth.py
42
+ - voicerender/engines/registry.py
43
+ stats:
44
+ files_changed: 6
45
+ insertions: 1672
46
+ deletions: 7
47
+ inspected: false
48
+ inspected_paths: []
49
+ observed_behavior: ""
50
+ public_impact: unknown
51
+ decision: needs_review
52
+ stale: false
53
+ evidence_subject: "feat: add chatterbox"
@@ -0,0 +1,45 @@
1
+ schema: releaseledger.entry-batch.v1
2
+ operation: create
3
+ schema_version: 1
4
+ object_type: release_entry_batch
5
+ release_version: 0.2.3
6
+ git_base_ref: aecc0461fdecf55f60f20991e796efd1c240679a
7
+ git_base_sha: aecc0461fdecf55f60f20991e796efd1c240679a
8
+ git_head_ref: b17f1a9010849b0e6aec846f222e12a86f04ad79
9
+ git_head_sha: b17f1a9010849b0e6aec846f222e12a86f04ad79
10
+ include_merges: nontrivial
11
+ entries:
12
+ - kind: changed
13
+ summary: Changed preflight handling so unavailable managed KittenSynth dependencies reject without scheduling a replan
14
+ status: accepted
15
+ source_refs:
16
+ - git:67e4d8ec44e04f96d7041afa8c87c762bec87b6f
17
+ paths:
18
+ - pyproject.toml
19
+ - tests/test_kittensynth_engine.py
20
+ - tests/test_preflight.py
21
+ - voicerender/engines/kittensynth.py
22
+ sources:
23
+ - git:67e4d8ec44e04f96d7041afa8c87c762bec87b6f
24
+ prs: []
25
+ issues: []
26
+ contributors:
27
+ - "@holgern"
28
+ - kind: added
29
+ summary: Added optional ChatterboxSynth rendering with pinned reference voices and installed-model discovery
30
+ status: accepted
31
+ source_refs:
32
+ - git:b17f1a9010849b0e6aec846f222e12a86f04ad79
33
+ paths:
34
+ - README.md
35
+ - pyproject.toml
36
+ - tests/test_chatterboxsynth_engine.py
37
+ - tests/test_engine_registry.py
38
+ - voicerender/engines/chatterboxsynth.py
39
+ - voicerender/engines/registry.py
40
+ sources:
41
+ - git:b17f1a9010849b0e6aec846f222e12a86f04ad79
42
+ prs: []
43
+ issues: []
44
+ contributors:
45
+ - "@holgern"
@@ -0,0 +1,145 @@
1
+ pyproject.toml | 2 +-
2
+ tests/test_kittensynth_engine.py | 30 ++++++++++++++++++++++++++++++
3
+ tests/test_preflight.py | 37 +++++++++++++++++++++++++++++++++++++
4
+ voicerender/engines/kittensynth.py | 5 +++++
5
+ 4 files changed, 73 insertions(+), 1 deletion(-)
6
+
7
+ diff --git a/pyproject.toml b/pyproject.toml
8
+ index 5aa5811..17b50ff 100644
9
+ --- a/pyproject.toml
10
+ +++ b/pyproject.toml
11
+ @@ -21,7 +21,7 @@ dependencies = [
12
+
13
+ [project.optional-dependencies]
14
+ inflect = ["inflectsynth[cpu]>=0.1.1,<0.2"]
15
+ -kitten = ["kittensynth[cpu]>=0.1.4,<0.2"]
16
+ +kitten = ["kittensynth[cpu]>=0.1.6,<0.2"]
17
+ kokoro = ["pykokoro>=0.10.5,<0.11"]
18
+ piper = ["pipersynth>=0.2.5,<0.3"]
19
+ pocket = ["pocketsynth[cpu]>=0.2.5,<0.3"]
20
+ diff --git a/tests/test_kittensynth_engine.py b/tests/test_kittensynth_engine.py
21
+ index 8c437ec..9fb2279 100644
22
+ --- a/tests/test_kittensynth_engine.py
23
+ +++ b/tests/test_kittensynth_engine.py
24
+ @@ -301,6 +301,36 @@ def test_synthesis_too_long_error_translates_with_replan_details(
25
+ assert outcome.measurement.maximum == 512
26
+
27
+
28
+ +def test_managed_dependency_error_is_a_non_replanable_runtime_reject(
29
+ + monkeypatch: pytest.MonkeyPatch,
30
+ +) -> None:
31
+ + module = ModuleType("kittensynth")
32
+ + native_error_type = type("ManagedModelDependencyError", (Exception,), {})
33
+ + module.ManagedModelDependencyError = native_error_type # type: ignore[attr-defined]
34
+ + native_error = native_error_type("managed download transport unavailable")
35
+ +
36
+ + class FailingKittenVoice:
37
+ + @classmethod
38
+ + def from_pretrained(cls, *args: Any, **kwargs: Any) -> Any:
39
+ + raise native_error
40
+ +
41
+ + module.KittenVoice = FailingKittenVoice # type: ignore[attr-defined]
42
+ + monkeypatch.setitem(sys.modules, "kittensynth", module)
43
+ + selection = EngineSelection(
44
+ + engine="kitten",
45
+ + target_id="nano-0.8-int8",
46
+ + language="en-US",
47
+ + voice="Jasper",
48
+ + )
49
+ +
50
+ + with pytest.raises(EngineBackendError) as caught:
51
+ + KittenSynthEngineAdapter().open(selection)
52
+ +
53
+ + assert caught.value.code == "kitten.runtime_dependency_error"
54
+ + assert caught.value.native_error_type == "ManagedModelDependencyError"
55
+ + assert classify_measurement(caught.value).disposition is PreflightDisposition.REJECT
56
+ +
57
+ +
58
+ def _synthesis_result(audio: Any) -> SimpleNamespace:
59
+ return SimpleNamespace(
60
+ audio=audio,
61
+ diff --git a/tests/test_preflight.py b/tests/test_preflight.py
62
+ index 3303c9e..1fde38b 100644
63
+ --- a/tests/test_preflight.py
64
+ +++ b/tests/test_preflight.py
65
+ @@ -281,6 +281,7 @@ def _install_fake_kittensynth(
66
+ amount: int,
67
+ maximum: int | None,
68
+ fits: bool | None,
69
+ + open_error: Exception | None = None,
70
+ ) -> list[tuple[str, Any]]:
71
+ events: list[tuple[str, Any]] = []
72
+ model = SimpleNamespace(
73
+ @@ -310,6 +311,9 @@ def _install_fake_kittensynth(
74
+ @classmethod
75
+ def from_pretrained(cls, target_id: str, **kwargs: Any) -> FakeVoice:
76
+ assert target_id == "kitten-test-model"
77
+ + if open_error is not None:
78
+ + events.append(("open", target_id))
79
+ + raise open_error
80
+ return cls()
81
+
82
+ def measure_prepared(self, text: str) -> Any:
83
+ @@ -341,6 +345,8 @@ def _install_fake_kittensynth(
84
+ "measurement_metric": "model_tokens",
85
+ }
86
+ module.KittenVoice = FakeVoice
87
+ + if open_error is not None:
88
+ + module.ManagedModelDependencyError = type(open_error) # type: ignore[attr-defined]
89
+ module.SynthesisMeasure = object
90
+ module.SynthesisConfig = object
91
+ module.SynthesisResult = object
92
+ @@ -521,6 +527,37 @@ def test_kitten_preflight_uses_exact_frontend_measurement_without_synthesis(
93
+ assert events[0][1] == "Kitten preflight"
94
+
95
+
96
+ +def test_kitten_managed_dependency_error_rejects_preflight_before_measurement(
97
+ + monkeypatch: pytest.MonkeyPatch, tmp_path: Path
98
+ +) -> None:
99
+ + native_error_type = type("ManagedModelDependencyError", (Exception,), {})
100
+ + native_error = native_error_type("managed download transport unavailable")
101
+ + events = _install_fake_kittensynth(
102
+ + monkeypatch,
103
+ + amount=180,
104
+ + maximum=256,
105
+ + fits=True,
106
+ + open_error=native_error,
107
+ + )
108
+ + binding = {
109
+ + "renderer": "kitten",
110
+ + "target_id": "kitten-test-model",
111
+ + "voice": "Jasper",
112
+ + }
113
+ + plan = _plan(
114
+ + ("Kitten preflight dependency failure", True, "sentence"), binding=binding
115
+ + )
116
+ +
117
+ + report = preflight_render_plan(plan, tmp_path / "kitten-dependency-error.toml")
118
+ +
119
+ + check = report.checks[0]
120
+ + assert report.status == "reject"
121
+ + assert check.status == "error"
122
+ + assert check.source == "kitten.runtime_dependency_error"
123
+ + assert report.replan == ()
124
+ + assert [event[0] for event in events] == ["open"]
125
+ +
126
+ +
127
+ def test_kitten_preflight_defers_emphasis_to_composition(
128
+ monkeypatch: pytest.MonkeyPatch, tmp_path: Path
129
+ ) -> None:
130
+ diff --git a/voicerender/engines/kittensynth.py b/voicerender/engines/kittensynth.py
131
+ index 9383225..cb87622 100644
132
+ --- a/voicerender/engines/kittensynth.py
133
+ +++ b/voicerender/engines/kittensynth.py
134
+ @@ -171,6 +171,11 @@ def _translate_kitten_error(
135
+ ("InvalidSpeedError", InvalidEngineOptionError, "kitten.invalid_speed"),
136
+ ("InvalidVoiceError", InvalidEngineVoiceError, "kitten.voice_unavailable"),
137
+ ("UnsupportedModelError", InvalidEngineModelError, "kitten.model_unsupported"),
138
+ + (
139
+ + "ManagedModelDependencyError",
140
+ + EngineBackendError,
141
+ + "kitten.runtime_dependency_error",
142
+ + ),
143
+ ("OnnxVoiceContractError", EngineBackendError, "kitten.runtime_contract_error"),
144
+ )
145
+ error_type: type[EngineError] = EngineBackendError