voicerender 0.2.0__tar.gz → 0.2.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.
Files changed (176) hide show
  1. {voicerender-0.2.0 → voicerender-0.2.1}/.github/workflows/tests.yml +3 -0
  2. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +6 -0
  3. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/release.md +4 -4
  4. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/audit/commit-audit.yaml +176 -0
  5. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0001.md +48 -0
  6. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0002.md +34 -0
  7. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0003.md +28 -0
  8. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0004.md +27 -0
  9. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0005.md +31 -0
  10. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/release.md +27 -0
  11. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/audit-decisions.yaml +85 -0
  12. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/audit.yaml +122 -0
  13. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/entries.yaml +107 -0
  14. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/3342e15.patch +50 -0
  15. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/3c82349.patch +4812 -0
  16. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/7f466cc.patch +163 -0
  17. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/84f629e.patch +675 -0
  18. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/b7e1917.patch +147 -0
  19. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/manifest.json +100 -0
  20. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/range.json +13 -0
  21. {voicerender-0.2.0 → voicerender-0.2.1}/PKG-INFO +58 -2
  22. {voicerender-0.2.0 → voicerender-0.2.1}/README.md +55 -1
  23. {voicerender-0.2.0 → voicerender-0.2.1}/docs/changelog.md +14 -1
  24. {voicerender-0.2.0 → voicerender-0.2.1}/docs/renderprofile.md +54 -0
  25. {voicerender-0.2.0 → voicerender-0.2.1}/pyproject.toml +2 -0
  26. voicerender-0.2.1/tests/test_cli.py +624 -0
  27. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_engine_registry.py +78 -8
  28. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_kittensynth_engine.py +152 -1
  29. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_pocketsynth_managed.py +75 -1
  30. voicerender-0.2.1/tests/test_qwen3_voice_design.py +185 -0
  31. voicerender-0.2.1/tests/test_qwen3synth_engine.py +688 -0
  32. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_renderplan_input.py +267 -1
  33. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_renderplan_render.py +37 -1
  34. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_renderprofile.py +121 -0
  35. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_soprosynth_engine.py +26 -1
  36. voicerender-0.2.1/tests/test_voice_source_codec.py +182 -0
  37. {voicerender-0.2.0 → voicerender-0.2.1}/tests/wheel_smoke.py +8 -1
  38. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/__init__.py +9 -0
  39. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/_version.py +3 -3
  40. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/cli.py +395 -2
  41. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/kittensynth.py +32 -3
  42. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/profiles.py +1 -1
  43. voicerender-0.2.1/voicerender/engines/qwen3synth.py +967 -0
  44. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/registry.py +4 -0
  45. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/renderplan_input.py +20 -1
  46. voicerender-0.2.1/voicerender/voice_design.py +357 -0
  47. voicerender-0.2.1/voicerender/voice_source_codec.py +196 -0
  48. voicerender-0.2.1/voicerender/voice_sources.py +887 -0
  49. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender.egg-info/PKG-INFO +58 -2
  50. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender.egg-info/SOURCES.txt +23 -0
  51. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender.egg-info/requires.txt +3 -0
  52. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender.egg-info/scm_file_list.json +23 -0
  53. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender.egg-info/scm_version.json +2 -2
  54. voicerender-0.2.0/tests/test_cli.py +0 -268
  55. voicerender-0.2.0/voicerender/voice_sources.py +0 -426
  56. {voicerender-0.2.0 → voicerender-0.2.1}/.codecrate.toml +0 -0
  57. {voicerender-0.2.0 → voicerender-0.2.1}/.github/workflows/codecov.yml +0 -0
  58. {voicerender-0.2.0 → voicerender-0.2.1}/.github/workflows/pre-commit.yml +0 -0
  59. {voicerender-0.2.0 → voicerender-0.2.1}/.github/workflows/python-publish.yml +0 -0
  60. {voicerender-0.2.0 → voicerender-0.2.1}/.gitignore +0 -0
  61. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/ledger.toml +0 -0
  62. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/.ledger-project.toml +0 -0
  63. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/config.toml +0 -0
  64. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
  65. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/audit/commit-audit.yaml +0 -0
  66. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/entries/entry-0001.md +0 -0
  67. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/release.md +0 -0
  68. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/audit/commit-audit.yaml +0 -0
  69. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0001.md +0 -0
  70. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0002.md +0 -0
  71. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0003.md +0 -0
  72. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0004.md +0 -0
  73. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0005.md +0 -0
  74. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0006.md +0 -0
  75. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0007.md +0 -0
  76. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/audit/commit-audit.yaml +0 -0
  77. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0001.md +0 -0
  78. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0002.md +0 -0
  79. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0003.md +0 -0
  80. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0004.md +0 -0
  81. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0005.md +0 -0
  82. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/release.md +0 -0
  83. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.1.1/audit-decisions.yaml +0 -0
  84. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.1.1/entries.yaml +0 -0
  85. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/audit-decisions.yaml +0 -0
  86. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/audit.yaml +0 -0
  87. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/entries.yaml +0 -0
  88. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/19f5b06.patch +0 -0
  89. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/245ca9f.patch +0 -0
  90. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/42a90e3.patch +0 -0
  91. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/480cbea.patch +0 -0
  92. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/4eb3c28.patch +0 -0
  93. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/50f298e.patch +0 -0
  94. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/56ae327.patch +0 -0
  95. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/57f1e24.patch +0 -0
  96. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/6dae2b6.patch +0 -0
  97. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/84f29db.patch +0 -0
  98. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/a390661.patch +0 -0
  99. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/a431dfa.patch +0 -0
  100. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/c2be7b3.patch +0 -0
  101. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/da15247.patch +0 -0
  102. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/ede34ea.patch +0 -0
  103. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/evidence/manifest.json +0 -0
  104. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/0.2.0/range.json +0 -0
  105. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/audit-decisions.yaml +0 -0
  106. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/entries.yaml +0 -0
  107. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/264eb9b.patch +0 -0
  108. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/774f6f2.patch +0 -0
  109. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/9e71e84.patch +0 -0
  110. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/c4a2872.patch +0 -0
  111. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/fb7faaf.patch +0 -0
  112. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/manifest.json +0 -0
  113. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/releaseledger/write.lock +0 -0
  114. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/taskledger/.ledger-project.toml +0 -0
  115. {voicerender-0.2.0 → voicerender-0.2.1}/.ledger/taskledger/config.toml +0 -0
  116. {voicerender-0.2.0 → voicerender-0.2.1}/.pre-commit-config.yaml +0 -0
  117. {voicerender-0.2.0 → voicerender-0.2.1}/LICENSE +0 -0
  118. {voicerender-0.2.0 → voicerender-0.2.1}/MANIFEST.in +0 -0
  119. {voicerender-0.2.0 → voicerender-0.2.1}/docs/Makefile +0 -0
  120. {voicerender-0.2.0 → voicerender-0.2.1}/docs/conf.py +0 -0
  121. {voicerender-0.2.0 → voicerender-0.2.1}/docs/index.md +0 -0
  122. {voicerender-0.2.0 → voicerender-0.2.1}/docs/make.bat +0 -0
  123. {voicerender-0.2.0 → voicerender-0.2.1}/docs/make.py +0 -0
  124. {voicerender-0.2.0 → voicerender-0.2.1}/docs/requirements.txt +0 -0
  125. {voicerender-0.2.0 → voicerender-0.2.1}/examples/README.md +0 -0
  126. {voicerender-0.2.0 → voicerender-0.2.1}/examples/plans/chapter.renderplan.toml +0 -0
  127. {voicerender-0.2.0 → voicerender-0.2.1}/examples/plans/chapter.voiceplan.toml +0 -0
  128. {voicerender-0.2.0 → voicerender-0.2.1}/examples/voices/narration.renderprofile.toml +0 -0
  129. {voicerender-0.2.0 → voicerender-0.2.1}/examples/voices/piper.toml +0 -0
  130. {voicerender-0.2.0 → voicerender-0.2.1}/examples/voices/pocket-reference.toml +0 -0
  131. {voicerender-0.2.0 → voicerender-0.2.1}/setup.cfg +0 -0
  132. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_backends.py +0 -0
  133. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_capacity.py +0 -0
  134. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_engine_contracts.py +0 -0
  135. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_inflectsynth_engine.py +0 -0
  136. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_kokoro_reference.py +0 -0
  137. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_managed_voices.py +0 -0
  138. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_package_metadata.py +0 -0
  139. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_preflight.py +0 -0
  140. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_render_book.py +0 -0
  141. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_renderer.py +0 -0
  142. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_storage.py +0 -0
  143. {voicerender-0.2.0 → voicerender-0.2.1}/tests/test_voice_sources.py +0 -0
  144. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/__main__.py +0 -0
  145. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/book.py +0 -0
  146. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/book_contract.py +0 -0
  147. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/book_layout.py +0 -0
  148. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/capacity.py +0 -0
  149. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/__init__.py +0 -0
  150. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/api_probe.py +0 -0
  151. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/base.py +0 -0
  152. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/catalog.py +0 -0
  153. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/inflectsynth.py +0 -0
  154. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/kokoro.py +0 -0
  155. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/metadata.py +0 -0
  156. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/piper.py +0 -0
  157. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/pipersynth.py +0 -0
  158. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/pocket.py +0 -0
  159. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/pocketsynth.py +0 -0
  160. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/selection.py +0 -0
  161. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/soprosynth.py +0 -0
  162. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/engines/supertonicsynth.py +0 -0
  163. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/errors.py +0 -0
  164. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/events.py +0 -0
  165. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/lexicons.py +0 -0
  166. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/managed_voices.py +0 -0
  167. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/models.py +0 -0
  168. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/preflight.py +0 -0
  169. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/py.typed +0 -0
  170. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/render.py +0 -0
  171. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/renderplan_render.py +0 -0
  172. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/renderprofile.py +0 -0
  173. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender/storage.py +0 -0
  174. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender.egg-info/dependency_links.txt +0 -0
  175. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender.egg-info/entry_points.txt +0 -0
  176. {voicerender-0.2.0 → voicerender-0.2.1}/voicerender.egg-info/top_level.txt +0 -0
@@ -199,6 +199,7 @@ jobs:
199
199
  engine_sdks = {
200
200
  "inflectsynth", "kittensynth", "pykokoro", "pipersynth",
201
201
  "pocketsynth", "soprosynth", "supertonicsynth",
202
+ "qwen3synth",
202
203
  }
203
204
  assert not engine_sdks & base_requirements
204
205
  assert "utterplan" not in base_requirements
@@ -239,6 +240,7 @@ jobs:
239
240
  "kokoro",
240
241
  "piper",
241
242
  "pocket",
243
+ "qwen3",
242
244
  "sopro",
243
245
  "supertonic",
244
246
  }
@@ -246,6 +248,7 @@ jobs:
246
248
  name.split(".", 1)[0] in {
247
249
  "inflectsynth", "kittensynth", "pykokoro", "pipersynth",
248
250
  "pocketsynth", "soprosynth", "supertonicsynth", "utterplan",
251
+ "qwen3synth",
249
252
  }
250
253
  for name in sys.modules
251
254
  )
@@ -15,3 +15,9 @@
15
15
  {"data":{"row_count":15},"event":"audit.created","event_id":"event-0015","record_revisions":{"commit_audit_sheet":1},"release_version":"0.2.0","schema_version":2}
16
16
  {"data":{"updated_rows":15},"event":"audit.updated","event_id":"event-0016","record_revisions":{"commit_audit_sheet":2},"release_version":"0.2.0","schema_version":2}
17
17
  {"data":{"entry_ids":["entry-0001","entry-0002","entry-0003","entry-0004","entry-0005","entry-0006","entry-0007"],"synced_audit_rows":14},"event":"entry.batch_added","event_id":"event-0017","record_revisions":{"commit_audit_sheet":3,"entry:0.2.0/entry-0001":1,"entry:0.2.0/entry-0002":1,"entry:0.2.0/entry-0003":1,"entry:0.2.0/entry-0004":1,"entry:0.2.0/entry-0005":1,"entry:0.2.0/entry-0006":1,"entry:0.2.0/entry-0007":1,"release:0.2.0":3},"release_version":"0.2.0","schema_version":2}
18
+ {"data":{"released_at":"2026-10-16"},"event":"release.finalized","event_id":"event-0018","record_revisions":{"release:0.2.0":4},"release_version":"0.2.0","schema_version":2}
19
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0019","record_revisions":{"release:0.2.1":1},"release_version":"0.2.1","schema_version":2}
20
+ {"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-0020","record_revisions":{"release:0.2.1":2},"release_version":"0.2.1","schema_version":2}
21
+ {"data":{"row_count":5},"event":"audit.created","event_id":"event-0021","record_revisions":{"commit_audit_sheet":1},"release_version":"0.2.1","schema_version":2}
22
+ {"data":{"updated_rows":5},"event":"audit.updated","event_id":"event-0022","record_revisions":{"commit_audit_sheet":2},"release_version":"0.2.1","schema_version":2}
23
+ {"data":{"entry_ids":["entry-0001","entry-0002","entry-0003","entry-0004","entry-0005"],"synced_audit_rows":5},"event":"entry.batch_added","event_id":"event-0023","record_revisions":{"commit_audit_sheet":3,"entry:0.2.1/entry-0001":1,"entry:0.2.1/entry-0002":1,"entry:0.2.1/entry-0003":1,"entry:0.2.1/entry-0004":1,"entry:0.2.1/entry-0005":1,"release:0.2.1":3},"release_version":"0.2.1","schema_version":2}
@@ -3,16 +3,16 @@ schema_version: 2
3
3
  object_type: release
4
4
  versioning:
5
5
  schema_version: 1
6
- revision: 3
6
+ revision: 4
7
7
  version: 0.2.0
8
- status: planned
8
+ status: released
9
9
  history_state: curated
10
10
  title: null
11
- released_at: null
11
+ released_at: "2026-10-16"
12
12
  previous_version: 0.1.1
13
13
  cancel_reason: null
14
14
  superseded_by: null
15
- changelog_file: null
15
+ changelog_file: docs/changelog.md
16
16
  boundary_ref: null
17
17
  source_refs: []
18
18
  source_count: null
@@ -0,0 +1,176 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 3
6
+ release_version: 0.2.1
7
+ git_base_ref: v0.2.0
8
+ git_base_sha: a627d2d625bc3e6daae8e3bee58abb77231918ec
9
+ git_head_ref: HEAD
10
+ git_head_sha: 7f466cc98bb9644372a562b621411ba778a9dba5
11
+ git_range: a627d2d625bc3e6daae8e3bee58abb77231918ec..7f466cc98bb9644372a562b621411ba778a9dba5
12
+ commit_count: 5
13
+ rows:
14
+ - sha: 3c82349993e1adc0073141215848ce0d3c10817c
15
+ source_ref: git:3c82349993e1adc0073141215848ce0d3c10817c
16
+ short_sha: 3c82349
17
+ changed_paths:
18
+ - README.md
19
+ - docs/renderprofile.md
20
+ - pyproject.toml
21
+ - tests/test_cli.py
22
+ - tests/test_engine_registry.py
23
+ - tests/test_pocketsynth_managed.py
24
+ - tests/test_qwen3_voice_design.py
25
+ - tests/test_qwen3synth_engine.py
26
+ - tests/test_renderprofile.py
27
+ - tests/test_soprosynth_engine.py
28
+ - tests/test_voice_source_codec.py
29
+ - tests/wheel_smoke.py
30
+ - voicerender/__init__.py
31
+ - voicerender/cli.py
32
+ - voicerender/engines/profiles.py
33
+ - voicerender/engines/qwen3synth.py
34
+ - voicerender/engines/registry.py
35
+ - voicerender/voice_design.py
36
+ - voicerender/voice_source_codec.py
37
+ - voicerender/voice_sources.py
38
+ stats:
39
+ files_changed: 20
40
+ insertions: 4180
41
+ deletions: 24
42
+ inspected: true
43
+ inspected_paths:
44
+ - README.md
45
+ - docs/renderprofile.md
46
+ - pyproject.toml
47
+ - tests/test_cli.py
48
+ - tests/test_engine_registry.py
49
+ - tests/test_pocketsynth_managed.py
50
+ - tests/test_qwen3_voice_design.py
51
+ - tests/test_qwen3synth_engine.py
52
+ - tests/test_renderprofile.py
53
+ - tests/test_soprosynth_engine.py
54
+ - tests/test_voice_source_codec.py
55
+ - tests/wheel_smoke.py
56
+ - voicerender/__init__.py
57
+ - voicerender/cli.py
58
+ - voicerender/engines/profiles.py
59
+ - voicerender/engines/qwen3synth.py
60
+ - voicerender/engines/registry.py
61
+ - voicerender/voice_design.py
62
+ - voicerender/voice_source_codec.py
63
+ - voicerender/voice_sources.py
64
+ observed_behavior:
65
+ Adds optional Qwen3Synth support, including VoiceDesign reference
66
+ generation, prepared voice profiles, CLI commands, engine registration, and documentation.
67
+ public_impact: public
68
+ decision: accepted
69
+ stale: false
70
+ evidence_subject: "feat: add qwen3 engine"
71
+ target_entry_id: entry-0001
72
+ notes: ""
73
+ - sha: 84f629eb7c691e0d2025de4ea8018ec0dd56f3e6
74
+ source_ref: git:84f629eb7c691e0d2025de4ea8018ec0dd56f3e6
75
+ short_sha: 84f629e
76
+ changed_paths:
77
+ - tests/test_kittensynth_engine.py
78
+ - tests/test_renderplan_input.py
79
+ - tests/test_renderplan_render.py
80
+ - tests/test_renderprofile.py
81
+ - voicerender/engines/kittensynth.py
82
+ - voicerender/renderplan_input.py
83
+ stats:
84
+ files_changed: 6
85
+ insertions: 476
86
+ deletions: 3
87
+ inspected: true
88
+ inspected_paths:
89
+ - tests/test_kittensynth_engine.py
90
+ - tests/test_renderplan_input.py
91
+ - tests/test_renderplan_render.py
92
+ - tests/test_renderprofile.py
93
+ - voicerender/engines/kittensynth.py
94
+ - voicerender/renderplan_input.py
95
+ observed_behavior:
96
+ Carries KittenSynth maximum-token metadata into RenderPlan request
97
+ measurement and validates token capability handling.
98
+ public_impact: public
99
+ decision: accepted
100
+ stale: false
101
+ evidence_subject: "feat: add maximum token field for kittensynth"
102
+ target_entry_id: entry-0002
103
+ notes: ""
104
+ - sha: b7e1917fea29831344af3900a3e26a49530fb21f
105
+ source_ref: git:b7e1917fea29831344af3900a3e26a49530fb21f
106
+ short_sha: b7e1917
107
+ changed_paths:
108
+ - tests/test_kittensynth_engine.py
109
+ - voicerender/engines/kittensynth.py
110
+ stats:
111
+ files_changed: 2
112
+ insertions: 76
113
+ deletions: 4
114
+ inspected: true
115
+ inspected_paths:
116
+ - tests/test_kittensynth_engine.py
117
+ - voicerender/engines/kittensynth.py
118
+ observed_behavior:
119
+ Maps KittenSynth input-too-long failures to a typed replanable
120
+ error with measured amount, maximum, unit, and request context.
121
+ public_impact: public
122
+ decision: accepted
123
+ stale: false
124
+ evidence_subject: "fix: kittensynth"
125
+ target_entry_id: entry-0003
126
+ notes: ""
127
+ - sha: 3342e1569de143e9170971f38c4d3a22d2dedb1b
128
+ source_ref: git:3342e1569de143e9170971f38c4d3a22d2dedb1b
129
+ short_sha: 3342e15
130
+ changed_paths:
131
+ - tests/test_qwen3synth_engine.py
132
+ stats:
133
+ files_changed: 1
134
+ insertions: 5
135
+ deletions: 3
136
+ inspected: true
137
+ inspected_paths:
138
+ - tests/test_qwen3synth_engine.py
139
+ observed_behavior:
140
+ Adjusts a Qwen3Synth test fixture path without changing product
141
+ behavior.
142
+ public_impact: internal
143
+ decision: internal
144
+ stale: false
145
+ evidence_subject: "chore: fix path"
146
+ target_entry_id: entry-0004
147
+ notes: ""
148
+ - sha: 7f466cc98bb9644372a562b621411ba778a9dba5
149
+ source_ref: git:7f466cc98bb9644372a562b621411ba778a9dba5
150
+ short_sha: 7f466cc
151
+ changed_paths:
152
+ - .github/workflows/tests.yml
153
+ - tests/test_kittensynth_engine.py
154
+ - tests/test_renderplan_input.py
155
+ - tests/test_renderplan_render.py
156
+ - tests/test_renderprofile.py
157
+ stats:
158
+ files_changed: 5
159
+ insertions: 21
160
+ deletions: 15
161
+ inspected: true
162
+ inspected_paths:
163
+ - .github/workflows/tests.yml
164
+ - tests/test_kittensynth_engine.py
165
+ - tests/test_renderplan_input.py
166
+ - tests/test_renderplan_render.py
167
+ - tests/test_renderprofile.py
168
+ observed_behavior:
169
+ Refines backend test cases and CI dependency checks; no product
170
+ behavior change.
171
+ public_impact: internal
172
+ decision: internal
173
+ stale: false
174
+ evidence_subject: "chore: pytest fix"
175
+ target_entry_id: entry-0005
176
+ notes: ""
@@ -0,0 +1,48 @@
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.1
9
+ kind: added
10
+ summary:
11
+ Added optional Qwen3Synth support for VoiceDesign references, prepared voice
12
+ profiles, and Qwen Base rendering
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:3c82349993e1adc0073141215848ce0d3c10817c
18
+ paths:
19
+ - README.md
20
+ - docs/renderprofile.md
21
+ - pyproject.toml
22
+ - tests/test_cli.py
23
+ - tests/test_engine_registry.py
24
+ - tests/test_pocketsynth_managed.py
25
+ - tests/test_qwen3_voice_design.py
26
+ - tests/test_qwen3synth_engine.py
27
+ - tests/test_renderprofile.py
28
+ - tests/test_soprosynth_engine.py
29
+ - tests/test_voice_source_codec.py
30
+ - tests/wheel_smoke.py
31
+ - voicerender/__init__.py
32
+ - voicerender/cli.py
33
+ - voicerender/engines/profiles.py
34
+ - voicerender/engines/qwen3synth.py
35
+ - voicerender/engines/registry.py
36
+ - voicerender/voice_design.py
37
+ - voicerender/voice_source_codec.py
38
+ - voicerender/voice_sources.py
39
+ issues: []
40
+ prs: []
41
+ sources:
42
+ - git:3c82349993e1adc0073141215848ce0d3c10817c
43
+ contributors:
44
+ - "@holgern"
45
+ breaking: false
46
+ internal: false
47
+ order: 1
48
+ ---
@@ -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.1
9
+ kind: added
10
+ summary:
11
+ Added KittenSynth model-token capacity metadata and preflight-aware request
12
+ handling
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:84f629eb7c691e0d2025de4ea8018ec0dd56f3e6
18
+ paths:
19
+ - tests/test_kittensynth_engine.py
20
+ - tests/test_renderplan_input.py
21
+ - tests/test_renderplan_render.py
22
+ - tests/test_renderprofile.py
23
+ - voicerender/engines/kittensynth.py
24
+ - voicerender/renderplan_input.py
25
+ issues: []
26
+ prs: []
27
+ sources:
28
+ - git:84f629eb7c691e0d2025de4ea8018ec0dd56f3e6
29
+ contributors:
30
+ - "@holgern"
31
+ breaking: false
32
+ internal: false
33
+ order: 2
34
+ ---
@@ -0,0 +1,28 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0003
8
+ release_version: 0.2.1
9
+ kind: fixed
10
+ summary: Fixed KittenSynth over-limit error reporting with replan details
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs:
15
+ - git:b7e1917fea29831344af3900a3e26a49530fb21f
16
+ paths:
17
+ - tests/test_kittensynth_engine.py
18
+ - voicerender/engines/kittensynth.py
19
+ issues: []
20
+ prs: []
21
+ sources:
22
+ - git:b7e1917fea29831344af3900a3e26a49530fb21f
23
+ contributors:
24
+ - "@holgern"
25
+ breaking: false
26
+ internal: false
27
+ order: 3
28
+ ---
@@ -0,0 +1,27 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0004
8
+ release_version: 0.2.1
9
+ kind: internal
10
+ summary: Changed a Qwen3Synth test fixture path
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs:
15
+ - git:3342e1569de143e9170971f38c4d3a22d2dedb1b
16
+ paths:
17
+ - tests/test_qwen3synth_engine.py
18
+ issues: []
19
+ prs: []
20
+ sources:
21
+ - git:3342e1569de143e9170971f38c4d3a22d2dedb1b
22
+ contributors:
23
+ - "@holgern"
24
+ breaking: false
25
+ internal: true
26
+ order: 4
27
+ ---
@@ -0,0 +1,31 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0005
8
+ release_version: 0.2.1
9
+ kind: internal
10
+ summary: Changed backend tests and CI dependency checks
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs:
15
+ - git:7f466cc98bb9644372a562b621411ba778a9dba5
16
+ paths:
17
+ - .github/workflows/tests.yml
18
+ - tests/test_kittensynth_engine.py
19
+ - tests/test_renderplan_input.py
20
+ - tests/test_renderplan_render.py
21
+ - tests/test_renderprofile.py
22
+ issues: []
23
+ prs: []
24
+ sources:
25
+ - git:7f466cc98bb9644372a562b621411ba778a9dba5
26
+ contributors:
27
+ - "@holgern"
28
+ breaking: false
29
+ internal: true
30
+ order: 5
31
+ ---
@@ -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.1
8
+ status: planned
9
+ history_state: curated
10
+ title: null
11
+ released_at: null
12
+ previous_version: 0.2.0
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: 5
20
+ artifact_count: 0
21
+ git_base_ref: v0.2.0
22
+ git_base_sha: a627d2d625bc3e6daae8e3bee58abb77231918ec
23
+ git_head_ref: HEAD
24
+ git_head_sha: 7f466cc98bb9644372a562b621411ba778a9dba5
25
+ git_range: a627d2d625bc3e6daae8e3bee58abb77231918ec..7f466cc98bb9644372a562b621411ba778a9dba5
26
+ git_commit_count: 5
27
+ ---
@@ -0,0 +1,85 @@
1
+ rows:
2
+ - sha: 3c82349993e1adc0073141215848ce0d3c10817c
3
+ inspected: true
4
+ inspected_paths:
5
+ - README.md
6
+ - docs/renderprofile.md
7
+ - pyproject.toml
8
+ - tests/test_cli.py
9
+ - tests/test_engine_registry.py
10
+ - tests/test_pocketsynth_managed.py
11
+ - tests/test_qwen3_voice_design.py
12
+ - tests/test_qwen3synth_engine.py
13
+ - tests/test_renderprofile.py
14
+ - tests/test_soprosynth_engine.py
15
+ - tests/test_voice_source_codec.py
16
+ - tests/wheel_smoke.py
17
+ - voicerender/__init__.py
18
+ - voicerender/cli.py
19
+ - voicerender/engines/profiles.py
20
+ - voicerender/engines/qwen3synth.py
21
+ - voicerender/engines/registry.py
22
+ - voicerender/voice_design.py
23
+ - voicerender/voice_source_codec.py
24
+ - voicerender/voice_sources.py
25
+ observed_behavior: "Adds optional Qwen3Synth support, including VoiceDesign reference generation, prepared voice profiles, CLI commands, engine registration, and documentation."
26
+ public_impact: public
27
+ decision: accepted
28
+ target_entry_key: null
29
+ target_entry_id: null
30
+ notes: ""
31
+ stale: false
32
+ - sha: 84f629eb7c691e0d2025de4ea8018ec0dd56f3e6
33
+ inspected: true
34
+ inspected_paths:
35
+ - tests/test_kittensynth_engine.py
36
+ - tests/test_renderplan_input.py
37
+ - tests/test_renderplan_render.py
38
+ - tests/test_renderprofile.py
39
+ - voicerender/engines/kittensynth.py
40
+ - voicerender/renderplan_input.py
41
+ observed_behavior: "Carries KittenSynth maximum-token metadata into RenderPlan request measurement and validates token capability handling."
42
+ public_impact: public
43
+ decision: accepted
44
+ target_entry_key: null
45
+ target_entry_id: null
46
+ notes: ""
47
+ stale: false
48
+ - sha: b7e1917fea29831344af3900a3e26a49530fb21f
49
+ inspected: true
50
+ inspected_paths:
51
+ - tests/test_kittensynth_engine.py
52
+ - voicerender/engines/kittensynth.py
53
+ observed_behavior: "Maps KittenSynth input-too-long failures to a typed replanable error with measured amount, maximum, unit, and request context."
54
+ public_impact: public
55
+ decision: accepted
56
+ target_entry_key: null
57
+ target_entry_id: null
58
+ notes: ""
59
+ stale: false
60
+ - sha: 3342e1569de143e9170971f38c4d3a22d2dedb1b
61
+ inspected: true
62
+ inspected_paths:
63
+ - tests/test_qwen3synth_engine.py
64
+ observed_behavior: "Adjusts a Qwen3Synth test fixture path without changing product behavior."
65
+ public_impact: internal
66
+ decision: internal
67
+ target_entry_key: null
68
+ target_entry_id: null
69
+ notes: ""
70
+ stale: false
71
+ - sha: 7f466cc98bb9644372a562b621411ba778a9dba5
72
+ inspected: true
73
+ inspected_paths:
74
+ - .github/workflows/tests.yml
75
+ - tests/test_kittensynth_engine.py
76
+ - tests/test_renderplan_input.py
77
+ - tests/test_renderplan_render.py
78
+ - tests/test_renderprofile.py
79
+ observed_behavior: "Refines backend test cases and CI dependency checks; no product behavior change."
80
+ public_impact: internal
81
+ decision: internal
82
+ target_entry_key: null
83
+ target_entry_id: null
84
+ notes: ""
85
+ stale: false
@@ -0,0 +1,122 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 1
6
+ release_version: 0.2.1
7
+ git_base_ref: v0.2.0
8
+ git_base_sha: a627d2d625bc3e6daae8e3bee58abb77231918ec
9
+ git_head_ref: HEAD
10
+ git_head_sha: 7f466cc98bb9644372a562b621411ba778a9dba5
11
+ git_range: a627d2d625bc3e6daae8e3bee58abb77231918ec..7f466cc98bb9644372a562b621411ba778a9dba5
12
+ commit_count: 5
13
+ rows:
14
+ - sha: 3c82349993e1adc0073141215848ce0d3c10817c
15
+ source_ref: git:3c82349993e1adc0073141215848ce0d3c10817c
16
+ short_sha: 3c82349
17
+ changed_paths:
18
+ - README.md
19
+ - docs/renderprofile.md
20
+ - pyproject.toml
21
+ - tests/test_cli.py
22
+ - tests/test_engine_registry.py
23
+ - tests/test_pocketsynth_managed.py
24
+ - tests/test_qwen3_voice_design.py
25
+ - tests/test_qwen3synth_engine.py
26
+ - tests/test_renderprofile.py
27
+ - tests/test_soprosynth_engine.py
28
+ - tests/test_voice_source_codec.py
29
+ - tests/wheel_smoke.py
30
+ - voicerender/__init__.py
31
+ - voicerender/cli.py
32
+ - voicerender/engines/profiles.py
33
+ - voicerender/engines/qwen3synth.py
34
+ - voicerender/engines/registry.py
35
+ - voicerender/voice_design.py
36
+ - voicerender/voice_source_codec.py
37
+ - voicerender/voice_sources.py
38
+ stats:
39
+ files_changed: 20
40
+ insertions: 4180
41
+ deletions: 24
42
+ inspected: false
43
+ inspected_paths: []
44
+ observed_behavior: ""
45
+ public_impact: unknown
46
+ decision: needs_review
47
+ stale: false
48
+ evidence_subject: "feat: add qwen3 engine"
49
+ - sha: 84f629eb7c691e0d2025de4ea8018ec0dd56f3e6
50
+ source_ref: git:84f629eb7c691e0d2025de4ea8018ec0dd56f3e6
51
+ short_sha: 84f629e
52
+ changed_paths:
53
+ - tests/test_kittensynth_engine.py
54
+ - tests/test_renderplan_input.py
55
+ - tests/test_renderplan_render.py
56
+ - tests/test_renderprofile.py
57
+ - voicerender/engines/kittensynth.py
58
+ - voicerender/renderplan_input.py
59
+ stats:
60
+ files_changed: 6
61
+ insertions: 476
62
+ deletions: 3
63
+ inspected: false
64
+ inspected_paths: []
65
+ observed_behavior: ""
66
+ public_impact: unknown
67
+ decision: needs_review
68
+ stale: false
69
+ evidence_subject: "feat: add maximum token field for kittensynth"
70
+ - sha: b7e1917fea29831344af3900a3e26a49530fb21f
71
+ source_ref: git:b7e1917fea29831344af3900a3e26a49530fb21f
72
+ short_sha: b7e1917
73
+ changed_paths:
74
+ - tests/test_kittensynth_engine.py
75
+ - voicerender/engines/kittensynth.py
76
+ stats:
77
+ files_changed: 2
78
+ insertions: 76
79
+ deletions: 4
80
+ inspected: false
81
+ inspected_paths: []
82
+ observed_behavior: ""
83
+ public_impact: unknown
84
+ decision: needs_review
85
+ stale: false
86
+ evidence_subject: "fix: kittensynth"
87
+ - sha: 3342e1569de143e9170971f38c4d3a22d2dedb1b
88
+ source_ref: git:3342e1569de143e9170971f38c4d3a22d2dedb1b
89
+ short_sha: 3342e15
90
+ changed_paths:
91
+ - tests/test_qwen3synth_engine.py
92
+ stats:
93
+ files_changed: 1
94
+ insertions: 5
95
+ deletions: 3
96
+ inspected: false
97
+ inspected_paths: []
98
+ observed_behavior: ""
99
+ public_impact: unknown
100
+ decision: needs_review
101
+ stale: false
102
+ evidence_subject: "chore: fix path"
103
+ - sha: 7f466cc98bb9644372a562b621411ba778a9dba5
104
+ source_ref: git:7f466cc98bb9644372a562b621411ba778a9dba5
105
+ short_sha: 7f466cc
106
+ changed_paths:
107
+ - .github/workflows/tests.yml
108
+ - tests/test_kittensynth_engine.py
109
+ - tests/test_renderplan_input.py
110
+ - tests/test_renderplan_render.py
111
+ - tests/test_renderprofile.py
112
+ stats:
113
+ files_changed: 5
114
+ insertions: 21
115
+ deletions: 15
116
+ inspected: false
117
+ inspected_paths: []
118
+ observed_behavior: ""
119
+ public_impact: unknown
120
+ decision: needs_review
121
+ stale: false
122
+ evidence_subject: "chore: pytest fix"