readio 0.2.1__tar.gz → 0.2.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 (196) hide show
  1. {readio-0.2.1 → readio-0.2.2}/.codecrate.toml +1 -0
  2. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +14 -0
  3. readio-0.2.2/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/audit/commit-audit.yaml +213 -0
  4. readio-0.2.2/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0001.md +27 -0
  5. readio-0.2.2/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0002.md +27 -0
  6. readio-0.2.2/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0003.md +25 -0
  7. readio-0.2.2/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0004.md +25 -0
  8. readio-0.2.2/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0005.md +26 -0
  9. readio-0.2.2/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0006.md +25 -0
  10. readio-0.2.2/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0007.md +24 -0
  11. readio-0.2.2/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/release.md +27 -0
  12. readio-0.2.2/CHANGELOG.md +18 -0
  13. {readio-0.2.1/readio.egg-info → readio-0.2.2}/PKG-INFO +85 -2
  14. {readio-0.2.1 → readio-0.2.2}/README.md +83 -0
  15. {readio-0.2.1 → readio-0.2.2}/docs/changelog.md +17 -0
  16. {readio-0.2.1 → readio-0.2.2}/docs/index.md +31 -0
  17. readio-0.2.2/llm-guides/README.md +106 -0
  18. readio-0.2.2/llm-guides/ssmd/audio-drama.md +323 -0
  19. readio-0.2.2/llm-guides/ssmd/debate-pro-con.md +325 -0
  20. readio-0.2.2/llm-guides/ssmd/document-summary.md +305 -0
  21. readio-0.2.2/llm-guides/ssmd/dramatic-story.md +321 -0
  22. readio-0.2.2/llm-guides/ssmd/educational-explainer.md +311 -0
  23. readio-0.2.2/llm-guides/ssmd/funny-story.md +332 -0
  24. readio-0.2.2/llm-guides/ssmd/general-narration.md +301 -0
  25. readio-0.2.2/llm-guides/ssmd/guided-meditation.md +305 -0
  26. readio-0.2.2/llm-guides/ssmd/kids-story.md +324 -0
  27. readio-0.2.2/llm-guides/ssmd/language-learning.md +328 -0
  28. readio-0.2.2/llm-guides/ssmd/news-briefing.md +308 -0
  29. readio-0.2.2/llm-guides/ssmd/podcast-interview.md +330 -0
  30. readio-0.2.2/llm-guides/ssmd/podcast-roundtable.md +326 -0
  31. readio-0.2.2/llm-guides/ssmd/podcast-solo.md +311 -0
  32. readio-0.2.2/llm-guides/ssmd/quiz-trivia.md +310 -0
  33. {readio-0.2.1 → readio-0.2.2}/pyproject.toml +1 -1
  34. {readio-0.2.1 → readio-0.2.2}/readio/cli.py +242 -19
  35. {readio-0.2.1 → readio-0.2.2}/readio/errors.py +15 -0
  36. readio-0.2.2/readio/jsonutil.py +37 -0
  37. readio-0.2.2/readio/manifest.py +128 -0
  38. {readio-0.2.1 → readio-0.2.2}/readio/models.py +1 -1
  39. readio-0.2.2/readio/plan.py +1715 -0
  40. {readio-0.2.1 → readio-0.2.2}/readio/reader.py +106 -3
  41. {readio-0.2.1 → readio-0.2.2}/readio/ssmd.py +208 -49
  42. {readio-0.2.1 → readio-0.2.2/readio.egg-info}/PKG-INFO +85 -2
  43. {readio-0.2.1 → readio-0.2.2}/readio.egg-info/SOURCES.txt +38 -0
  44. {readio-0.2.1 → readio-0.2.2}/readio.egg-info/requires.txt +1 -1
  45. {readio-0.2.1 → readio-0.2.2}/readio.egg-info/scm_file_list.json +38 -0
  46. {readio-0.2.1 → readio-0.2.2}/readio.egg-info/scm_version.json +2 -2
  47. {readio-0.2.1 → readio-0.2.2}/skill/readio/SKILL.md +22 -1
  48. {readio-0.2.1 → readio-0.2.2}/skill/readio/references/cli.md +35 -1
  49. {readio-0.2.1 → readio-0.2.2}/skill/readio/references/ssmd.md +8 -0
  50. {readio-0.2.1 → readio-0.2.2}/skill/readio/references/troubleshooting.md +22 -0
  51. {readio-0.2.1 → readio-0.2.2}/tests/test_cli.py +47 -52
  52. readio-0.2.2/tests/test_llm_guides.py +123 -0
  53. readio-0.2.2/tests/test_manifest.py +138 -0
  54. readio-0.2.2/tests/test_plan.py +373 -0
  55. readio-0.2.2/tests/test_plan_cli.py +232 -0
  56. readio-0.2.2/tests/test_plan_no_tts_load.py +213 -0
  57. readio-0.2.2/tests/test_plan_validation.py +339 -0
  58. {readio-0.2.1 → readio-0.2.2}/tests/test_pykokoro_09_contract.py +7 -0
  59. readio-0.2.2/tests/test_render_from_plan.py +292 -0
  60. readio-0.2.2/tests/test_render_manifest_cli.py +282 -0
  61. readio-0.2.2/tests/test_ssmd_single_source.py +152 -0
  62. {readio-0.2.1 → readio-0.2.2}/.github/workflows/codecov.yml +0 -0
  63. {readio-0.2.1 → readio-0.2.2}/.github/workflows/pre-commit.yml +0 -0
  64. {readio-0.2.1 → readio-0.2.2}/.github/workflows/python-publish.yml +0 -0
  65. {readio-0.2.1 → readio-0.2.2}/.github/workflows/tests.yml +0 -0
  66. {readio-0.2.1 → readio-0.2.2}/.gitignore +0 -0
  67. {readio-0.2.1 → readio-0.2.2}/.ledger/documentledger/.ledger-project.toml +0 -0
  68. {readio-0.2.1 → readio-0.2.2}/.ledger/documentledger/config.toml +0 -0
  69. {readio-0.2.1 → readio-0.2.2}/.ledger/documentledger/data/.ledger-project.toml +0 -0
  70. {readio-0.2.1 → readio-0.2.2}/.ledger/documentledger/data/docs/docs-changelog-md-77f023b9.yaml +0 -0
  71. {readio-0.2.1 → readio-0.2.2}/.ledger/documentledger/data/docs/docs-index-md-b4d68dc8.yaml +0 -0
  72. {readio-0.2.1 → readio-0.2.2}/.ledger/documentledger/data/docs/readme-md-b3356305.yaml +0 -0
  73. {readio-0.2.1 → readio-0.2.2}/.ledger/documentledger/data/scan.yaml +0 -0
  74. {readio-0.2.1 → readio-0.2.2}/.ledger/documentledger/data/source-index.json +0 -0
  75. {readio-0.2.1 → readio-0.2.2}/.ledger/documentledger/data/storage.yaml +0 -0
  76. {readio-0.2.1 → readio-0.2.2}/.ledger/ledger.toml +0 -0
  77. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/.ledger-project.toml +0 -0
  78. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/config.toml +0 -0
  79. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
  80. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/audit/commit-audit.yaml +0 -0
  81. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0001.md +0 -0
  82. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0002.md +0 -0
  83. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0003.md +0 -0
  84. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0004.md +0 -0
  85. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0005.md +0 -0
  86. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/release.md +0 -0
  87. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.1/audit/commit-audit.yaml +0 -0
  88. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.1/entries/entry-0001.md +0 -0
  89. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.1/release.md +0 -0
  90. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/audit/commit-audit.yaml +0 -0
  91. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0001.md +0 -0
  92. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0002.md +0 -0
  93. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0003.md +0 -0
  94. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0004.md +0 -0
  95. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/release.md +0 -0
  96. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/audit/commit-audit.yaml +0 -0
  97. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/entries/entry-0001.md +0 -0
  98. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/entries/entry-0002.md +0 -0
  99. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/release.md +0 -0
  100. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/audit/commit-audit.yaml +0 -0
  101. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0001.md +0 -0
  102. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0002.md +0 -0
  103. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0003.md +0 -0
  104. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0004.md +0 -0
  105. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0005.md +0 -0
  106. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0006.md +0 -0
  107. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/release.md +0 -0
  108. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.1/audit/commit-audit.yaml +0 -0
  109. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.1/entries/entry-0001.md +0 -0
  110. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.1/release.md +0 -0
  111. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/work/v0.2.0/audit-decisions.yaml +0 -0
  112. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/work/v0.2.0/audit.yaml +0 -0
  113. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/work/v0.2.0/entries.yaml +0 -0
  114. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/work/v0.2.0/evidence/4ecf165.patch +0 -0
  115. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/work/v0.2.0/evidence/manifest.json +0 -0
  116. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/work/v0.2.0/range.json +0 -0
  117. {readio-0.2.1 → readio-0.2.2}/.ledger/releaseledger/write.lock +0 -0
  118. {readio-0.2.1 → readio-0.2.2}/.ledger/taskledger/.ledger-project.toml +0 -0
  119. {readio-0.2.1 → readio-0.2.2}/.ledger/taskledger/config.toml +0 -0
  120. {readio-0.2.1 → readio-0.2.2}/.pre-commit-config.yaml +0 -0
  121. {readio-0.2.1 → readio-0.2.2}/LICENSE +0 -0
  122. {readio-0.2.1 → readio-0.2.2}/docs/conf.py +0 -0
  123. {readio-0.2.1 → readio-0.2.2}/docs/make.py +0 -0
  124. {readio-0.2.1 → readio-0.2.2}/docs/requirements.txt +0 -0
  125. {readio-0.2.1 → readio-0.2.2}/examples/README.md +0 -0
  126. {readio-0.2.1 → readio-0.2.2}/examples/readio-podcast.ssmd +0 -0
  127. {readio-0.2.1 → readio-0.2.2}/examples/readio-prosody.ssmd +0 -0
  128. {readio-0.2.1 → readio-0.2.2}/readio/__init__.py +0 -0
  129. {readio-0.2.1 → readio-0.2.2}/readio/__main__.py +0 -0
  130. {readio-0.2.1 → readio-0.2.2}/readio/audio.py +0 -0
  131. {readio-0.2.1 → readio-0.2.2}/readio/config.py +0 -0
  132. {readio-0.2.1 → readio-0.2.2}/readio/document.py +0 -0
  133. {readio-0.2.1 → readio-0.2.2}/readio/formats.py +0 -0
  134. {readio-0.2.1 → readio-0.2.2}/readio/ingest.py +0 -0
  135. {readio-0.2.1 → readio-0.2.2}/readio/markdown.py +0 -0
  136. {readio-0.2.1 → readio-0.2.2}/readio/paths.py +0 -0
  137. {readio-0.2.1 → readio-0.2.2}/readio/progress.py +0 -0
  138. {readio-0.2.1 → readio-0.2.2}/readio/resources/__init__.py +0 -0
  139. {readio-0.2.1 → readio-0.2.2}/readio/resources/templates/__init__.py +0 -0
  140. {readio-0.2.1 → readio-0.2.2}/readio/resources/templates/briefing.ssmd +0 -0
  141. {readio-0.2.1 → readio-0.2.2}/readio/resources/templates/dialogue.ssmd +0 -0
  142. {readio-0.2.1 → readio-0.2.2}/readio/resources/templates/podcast.ssmd +0 -0
  143. {readio-0.2.1 → readio-0.2.2}/readio/spotify.py +0 -0
  144. {readio-0.2.1 → readio-0.2.2}/readio/spotify_cli.py +0 -0
  145. {readio-0.2.1 → readio-0.2.2}/readio/ssmd_authoring.py +0 -0
  146. {readio-0.2.1 → readio-0.2.2}/readio/synthesis.py +0 -0
  147. {readio-0.2.1 → readio-0.2.2}/readio/templates.py +0 -0
  148. {readio-0.2.1 → readio-0.2.2}/readio/text.py +0 -0
  149. {readio-0.2.1 → readio-0.2.2}/readio/wave.py +0 -0
  150. {readio-0.2.1 → readio-0.2.2}/readio.egg-info/dependency_links.txt +0 -0
  151. {readio-0.2.1 → readio-0.2.2}/readio.egg-info/entry_points.txt +0 -0
  152. {readio-0.2.1 → readio-0.2.2}/readio.egg-info/top_level.txt +0 -0
  153. {readio-0.2.1 → readio-0.2.2}/setup.cfg +0 -0
  154. {readio-0.2.1 → readio-0.2.2}/skill/readio/references/input-formats.md +0 -0
  155. {readio-0.2.1 → readio-0.2.2}/skill/readio/references/spotify.md +0 -0
  156. {readio-0.2.1 → readio-0.2.2}/tests/conftest.py +0 -0
  157. {readio-0.2.1 → readio-0.2.2}/tests/fixtures/architecture-review.ssmd +0 -0
  158. {readio-0.2.1 → readio-0.2.2}/tests/fixtures/markdown/all-elements.md +0 -0
  159. {readio-0.2.1 → readio-0.2.2}/tests/fixtures/markdown/all-elements.txt +0 -0
  160. {readio-0.2.1 → readio-0.2.2}/tests/test_audio.py +0 -0
  161. {readio-0.2.1 → readio-0.2.2}/tests/test_audio_formats.py +0 -0
  162. {readio-0.2.1 → readio-0.2.2}/tests/test_chapters.py +0 -0
  163. {readio-0.2.1 → readio-0.2.2}/tests/test_config.py +0 -0
  164. {readio-0.2.1 → readio-0.2.2}/tests/test_defaults_cli.py +0 -0
  165. {readio-0.2.1 → readio-0.2.2}/tests/test_doctor.py +0 -0
  166. {readio-0.2.1 → readio-0.2.2}/tests/test_document.py +0 -0
  167. {readio-0.2.1 → readio-0.2.2}/tests/test_examples.py +0 -0
  168. {readio-0.2.1 → readio-0.2.2}/tests/test_ffmpeg_sink.py +0 -0
  169. {readio-0.2.1 → readio-0.2.2}/tests/test_ingest.py +0 -0
  170. {readio-0.2.1 → readio-0.2.2}/tests/test_language_defaults_config.py +0 -0
  171. {readio-0.2.1 → readio-0.2.2}/tests/test_markdown.py +0 -0
  172. {readio-0.2.1 → readio-0.2.2}/tests/test_model_source_preference.py +0 -0
  173. {readio-0.2.1 → readio-0.2.2}/tests/test_models_cli.py +0 -0
  174. {readio-0.2.1 → readio-0.2.2}/tests/test_package_resources.py +0 -0
  175. {readio-0.2.1 → readio-0.2.2}/tests/test_paths.py +0 -0
  176. {readio-0.2.1 → readio-0.2.2}/tests/test_progress.py +0 -0
  177. {readio-0.2.1 → readio-0.2.2}/tests/test_pykokoro_09_regressions.py +0 -0
  178. {readio-0.2.1 → readio-0.2.2}/tests/test_reader_markdown.py +0 -0
  179. {readio-0.2.1 → readio-0.2.2}/tests/test_reader_selection.py +0 -0
  180. {readio-0.2.1 → readio-0.2.2}/tests/test_reader_ssmd.py +0 -0
  181. {readio-0.2.1 → readio-0.2.2}/tests/test_reader_synthesis.py +0 -0
  182. {readio-0.2.1 → readio-0.2.2}/tests/test_skill_integrity.py +0 -0
  183. {readio-0.2.1 → readio-0.2.2}/tests/test_spotify.py +0 -0
  184. {readio-0.2.1 → readio-0.2.2}/tests/test_spotify_cli.py +0 -0
  185. {readio-0.2.1 → readio-0.2.2}/tests/test_spotify_lifecycle.py +0 -0
  186. {readio-0.2.1 → readio-0.2.2}/tests/test_ssmd_cli.py +0 -0
  187. {readio-0.2.1 → readio-0.2.2}/tests/test_ssmd_integration.py +0 -0
  188. {readio-0.2.1 → readio-0.2.2}/tests/test_ssmd_model_roster.py +0 -0
  189. {readio-0.2.1 → readio-0.2.2}/tests/test_ssmd_preflight.py +0 -0
  190. {readio-0.2.1 → readio-0.2.2}/tests/test_synthesis.py +0 -0
  191. {readio-0.2.1 → readio-0.2.2}/tests/test_template_validate.py +0 -0
  192. {readio-0.2.1 → readio-0.2.2}/tests/test_templates.py +0 -0
  193. {readio-0.2.1 → readio-0.2.2}/tests/test_text.py +0 -0
  194. {readio-0.2.1 → readio-0.2.2}/tests/test_voice_resolution_workflow.py +0 -0
  195. {readio-0.2.1 → readio-0.2.2}/tests/test_voices_cli.py +0 -0
  196. {readio-0.2.1 → readio-0.2.2}/tests/test_wave.py +0 -0
@@ -9,6 +9,7 @@ include = [
9
9
  "**/*.toml",
10
10
  "**/*.rst",
11
11
  "**/*.md",
12
+ "**/*.ssmd",
12
13
  "**/*.json",
13
14
  "**/*.jsonl",
14
15
  "**/*.ipynb",
@@ -41,3 +41,17 @@
41
41
  {"data":{"updated_rows":1},"event":"audit.updated","event_id":"event-0041","record_revisions":{"commit_audit_sheet":2},"release_version":"v0.2.1","schema_version":2}
42
42
  {"data":{"entry_ids":["entry-0001"],"synced_audit_rows":1},"event":"entry.batch_added","event_id":"event-0042","record_revisions":{"commit_audit_sheet":3,"entry:v0.2.1/entry-0001":1,"release:v0.2.1":3},"release_version":"v0.2.1","schema_version":2}
43
43
  {"data":{"released_at":"2026-09-05"},"event":"release.finalized","event_id":"event-0043","record_revisions":{"release:v0.2.1":4},"release_version":"v0.2.1","schema_version":2}
44
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0044","record_revisions":{"release:v0.2.2":1},"release_version":"v0.2.2","schema_version":2}
45
+ {"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-0045","record_revisions":{"release:v0.2.2":2},"release_version":"v0.2.2","schema_version":2}
46
+ {"data":{"row_count":4},"event":"audit.created","event_id":"event-0046","record_revisions":{"commit_audit_sheet":1},"release_version":"v0.2.2","schema_version":2}
47
+ {"data":{"kind":"added","status":"accepted"},"entry_id":"entry-0001","event":"entry.added","event_id":"event-0047","record_revisions":{"entry:v0.2.2/entry-0001":1,"release:v0.2.2":3},"release_version":"v0.2.2","schema_version":2}
48
+ {"data":{"kind":"docs","status":"accepted"},"entry_id":"entry-0002","event":"entry.added","event_id":"event-0048","record_revisions":{"entry:v0.2.2/entry-0002":1,"release:v0.2.2":4},"release_version":"v0.2.2","schema_version":2}
49
+ {"data":{"kind":"added","status":"accepted"},"entry_id":"entry-0003","event":"entry.added","event_id":"event-0049","record_revisions":{"entry:v0.2.2/entry-0003":1,"release:v0.2.2":5},"release_version":"v0.2.2","schema_version":2}
50
+ {"data":{"kind":"changed","status":"accepted"},"entry_id":"entry-0004","event":"entry.added","event_id":"event-0050","record_revisions":{"entry:v0.2.2/entry-0004":1,"release:v0.2.2":6},"release_version":"v0.2.2","schema_version":2}
51
+ {"data":{"released_at":"2026-09-05"},"event":"release.finalized","event_id":"event-0051","record_revisions":{"release:v0.2.2":7},"release_version":"v0.2.2","schema_version":2}
52
+ {"data":{"updated_rows":4},"event":"audit.updated","event_id":"event-0052","record_revisions":{"commit_audit_sheet":2},"release_version":"v0.2.2","schema_version":2}
53
+ {"data":{"fields":["git_commit_count","git_head_sha","git_range"]},"event":"release.updated","event_id":"event-0053","record_revisions":{"release:v0.2.2":8},"release_version":"v0.2.2","schema_version":2}
54
+ {"data":{"new_rows":3,"preserved_reviewed_rows":4,"removed_rows":0},"event":"audit.updated","event_id":"event-0054","record_revisions":{"commit_audit_sheet":3},"release_version":"v0.2.2","schema_version":2}
55
+ {"data":{"kind":"quality","status":"accepted"},"entry_id":"entry-0005","event":"entry.added","event_id":"event-0055","record_revisions":{"entry:v0.2.2/entry-0005":1,"release:v0.2.2":9},"release_version":"v0.2.2","schema_version":2}
56
+ {"data":{"kind":"quality","status":"accepted"},"entry_id":"entry-0006","event":"entry.added","event_id":"event-0056","record_revisions":{"entry:v0.2.2/entry-0006":1,"release:v0.2.2":10},"release_version":"v0.2.2","schema_version":2}
57
+ {"data":{"kind":"internal","status":"accepted"},"entry_id":"entry-0007","event":"entry.added","event_id":"event-0057","record_revisions":{"entry:v0.2.2/entry-0007":1,"release:v0.2.2":11},"release_version":"v0.2.2","schema_version":2}
@@ -0,0 +1,213 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 3
6
+ release_version: v0.2.2
7
+ git_base_ref: v0.2.1
8
+ git_base_sha: 52c6084a8dfc3fbf46ac5fca8ff670cb1e97bf35
9
+ git_head_ref: HEAD
10
+ git_head_sha: 0302f797298f78a7f56bf85fdccd2fa977110870
11
+ git_range: 52c6084a8dfc3fbf46ac5fca8ff670cb1e97bf35..0302f797298f78a7f56bf85fdccd2fa977110870
12
+ commit_count: 7
13
+ rows:
14
+ - sha: 5827dda1b6efda39c08b3cc38da8c6ebd867e24d
15
+ source_ref: git:5827dda1b6efda39c08b3cc38da8c6ebd867e24d
16
+ short_sha: 5827dda
17
+ changed_paths:
18
+ - .codecrate.toml
19
+ - README.md
20
+ - llm-guides/README.md
21
+ - llm-guides/ssmd/audio-drama.md
22
+ - llm-guides/ssmd/debate-pro-con.md
23
+ - llm-guides/ssmd/document-summary.md
24
+ - llm-guides/ssmd/dramatic-story.md
25
+ - llm-guides/ssmd/educational-explainer.md
26
+ - llm-guides/ssmd/funny-story.md
27
+ - llm-guides/ssmd/general-narration.md
28
+ - llm-guides/ssmd/guided-meditation.md
29
+ - llm-guides/ssmd/kids-story.md
30
+ - llm-guides/ssmd/language-learning.md
31
+ - llm-guides/ssmd/news-briefing.md
32
+ - llm-guides/ssmd/podcast-interview.md
33
+ - llm-guides/ssmd/podcast-roundtable.md
34
+ - llm-guides/ssmd/podcast-solo.md
35
+ - llm-guides/ssmd/quiz-trivia.md
36
+ - tests/test_llm_guides.py
37
+ stats:
38
+ files_changed: 0
39
+ insertions: 4998
40
+ deletions: 0
41
+ inspected: true
42
+ inspected_paths:
43
+ - llm-guides/README.md
44
+ - llm-guides/ssmd/
45
+ observed_behavior:
46
+ Added comprehensive LLM guides for SSMD audio content creation
47
+ covering podcasts, stories, educational content, meditation, news, and more
48
+ public_impact: public
49
+ decision: accepted
50
+ stale: false
51
+ evidence_subject: "feat: llm guides added"
52
+ target_entry_key: entry-0002
53
+ target_entry_id: entry-0002
54
+ notes: ""
55
+ - sha: 1ef0e91959f5986fed3bc6fdffcc32982649f5f5
56
+ source_ref: git:1ef0e91959f5986fed3bc6fdffcc32982649f5f5
57
+ short_sha: 1ef0e91
58
+ changed_paths:
59
+ - pyproject.toml
60
+ - readio/cli.py
61
+ - readio/models.py
62
+ - readio/plan.py
63
+ - readio/reader.py
64
+ - readio/ssmd.py
65
+ - skill/readio/SKILL.md
66
+ - tests/test_plan.py
67
+ - tests/test_plan_cli.py
68
+ - tests/test_plan_no_tts_load.py
69
+ - tests/test_pykokoro_09_contract.py
70
+ stats:
71
+ files_changed: 0
72
+ insertions: 2804
73
+ deletions: 3
74
+ inspected: true
75
+ inspected_paths:
76
+ - readio/plan.py
77
+ - tests/test_plan.py
78
+ observed_behavior:
79
+ New synthesis plan resolution system with explicit plan domain,
80
+ resolution pipeline, validation, and comprehensive test coverage
81
+ public_impact: public
82
+ decision: accepted
83
+ stale: false
84
+ evidence_subject: "feat: new plan feature"
85
+ target_entry_key: entry-0001
86
+ target_entry_id: entry-0001
87
+ notes: ""
88
+ - sha: 6449c24426d1f4e4d318b553b4ce2fa46b0f3c1e
89
+ source_ref: git:6449c24426d1f4e4d318b553b4ce2fa46b0f3c1e
90
+ short_sha: 6449c24
91
+ changed_paths:
92
+ - README.md
93
+ - docs/index.md
94
+ - readio/cli.py
95
+ - readio/plan.py
96
+ - readio/reader.py
97
+ - readio/ssmd.py
98
+ - skill/readio/references/cli.md
99
+ - skill/readio/references/ssmd.md
100
+ - skill/readio/references/troubleshooting.md
101
+ - tests/test_cli.py
102
+ - tests/test_plan.py
103
+ - tests/test_plan_cli.py
104
+ - tests/test_plan_no_tts_load.py
105
+ - tests/test_plan_validation.py
106
+ - tests/test_render_from_plan.py
107
+ - tests/test_ssmd_single_source.py
108
+ stats:
109
+ files_changed: 0
110
+ insertions: 1428
111
+ deletions: 335
112
+ inspected: true
113
+ inspected_paths:
114
+ - readio/cli.py
115
+ - readio/plan.py
116
+ observed_behavior: Improved plan feature with enhanced CLI commands and validation
117
+ public_impact: public
118
+ decision: accepted
119
+ stale: false
120
+ evidence_subject: "feat: improve plan feature"
121
+ target_entry_key: entry-0004
122
+ target_entry_id: entry-0004
123
+ notes: ""
124
+ - sha: 33b44019d3d4899a551a6e621e8a78189bf52b60
125
+ source_ref: git:33b44019d3d4899a551a6e621e8a78189bf52b60
126
+ short_sha: 33b4401
127
+ changed_paths:
128
+ - README.md
129
+ - docs/index.md
130
+ - readio/cli.py
131
+ - readio/errors.py
132
+ - readio/jsonutil.py
133
+ - readio/manifest.py
134
+ - readio/plan.py
135
+ - skill/readio/SKILL.md
136
+ - skill/readio/references/cli.md
137
+ - skill/readio/references/troubleshooting.md
138
+ - tests/test_manifest.py
139
+ - tests/test_render_manifest_cli.py
140
+ stats:
141
+ files_changed: 0
142
+ insertions: 719
143
+ deletions: 22
144
+ inspected: true
145
+ inspected_paths:
146
+ - readio/manifest.py
147
+ - tests/test_manifest.py
148
+ observed_behavior:
149
+ Added manifest module for project metadata and package information
150
+ management
151
+ public_impact: public
152
+ decision: accepted
153
+ stale: false
154
+ evidence_subject: "feat: add manifest"
155
+ target_entry_key: entry-0003
156
+ target_entry_id: entry-0003
157
+ notes: ""
158
+ - sha: 9ec43c0c70d5badaf282547142af78fe9e986ca4
159
+ source_ref: git:9ec43c0c70d5badaf282547142af78fe9e986ca4
160
+ short_sha: 9ec43c0
161
+ changed_paths:
162
+ - .ledger/releaseledger/data/ledgers/main/events/events.jsonl
163
+ - .ledger/releaseledger/data/ledgers/main/releases/v0.2.2/audit/commit-audit.yaml
164
+ - .ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0001.md
165
+ - .ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0002.md
166
+ - .ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0003.md
167
+ - .ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0004.md
168
+ - .ledger/releaseledger/data/ledgers/main/releases/v0.2.2/release.md
169
+ - CHANGELOG.md
170
+ stats:
171
+ files_changed: 0
172
+ insertions: 315
173
+ deletions: 0
174
+ inspected: false
175
+ inspected_paths: []
176
+ observed_behavior: ""
177
+ public_impact: unknown
178
+ decision: needs_review
179
+ stale: false
180
+ evidence_subject: "doc: changelog"
181
+ - sha: 6656cdd980d30a65d403961909d5e911e3e81dbc
182
+ source_ref: git:6656cdd980d30a65d403961909d5e911e3e81dbc
183
+ short_sha: 6656cdd
184
+ changed_paths:
185
+ - tests/test_plan_no_tts_load.py
186
+ stats:
187
+ files_changed: 0
188
+ insertions: 2
189
+ deletions: 0
190
+ inspected: false
191
+ inspected_paths: []
192
+ observed_behavior: ""
193
+ public_impact: unknown
194
+ decision: needs_review
195
+ stale: false
196
+ evidence_subject: "fix: pytest"
197
+ - sha: 0302f797298f78a7f56bf85fdccd2fa977110870
198
+ source_ref: git:0302f797298f78a7f56bf85fdccd2fa977110870
199
+ short_sha: 0302f79
200
+ changed_paths:
201
+ - readio/jsonutil.py
202
+ - tests/test_plan_no_tts_load.py
203
+ stats:
204
+ files_changed: 0
205
+ insertions: 3
206
+ deletions: 2
207
+ inspected: false
208
+ inspected_paths: []
209
+ observed_behavior: ""
210
+ public_impact: unknown
211
+ decision: needs_review
212
+ stale: false
213
+ evidence_subject: "chore: pytest and pre-commit fix"
@@ -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-0001
8
+ release_version: v0.2.2
9
+ kind: added
10
+ summary:
11
+ Added synthesis plan resolution system with explicit plan domain, resolution
12
+ pipeline, and validation
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:1ef0e91959f5986fed3bc6fdffcc32982649f5f5
18
+ paths:
19
+ - readio/plan.py
20
+ issues: []
21
+ prs: []
22
+ sources: []
23
+ contributors: []
24
+ breaking: false
25
+ internal: false
26
+ order: 1
27
+ ---
@@ -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-0002
8
+ release_version: v0.2.2
9
+ kind: docs
10
+ summary:
11
+ Added comprehensive LLM guides for SSMD audio content creation including
12
+ podcasts, stories, educational content, and more
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:5827dda1b6efda39c08b3cc38da8c6ebd867e24d
18
+ paths:
19
+ - llm-guides/README.md
20
+ issues: []
21
+ prs: []
22
+ sources: []
23
+ contributors: []
24
+ breaking: false
25
+ internal: false
26
+ order: 2
27
+ ---
@@ -0,0 +1,25 @@
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: v0.2.2
9
+ kind: added
10
+ summary: Added manifest module for project metadata and package information management
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs:
15
+ - git:33b44019d3d4899a551a6e621e8a78189bf52b60
16
+ paths:
17
+ - readio/manifest.py
18
+ issues: []
19
+ prs: []
20
+ sources: []
21
+ contributors: []
22
+ breaking: false
23
+ internal: false
24
+ order: 3
25
+ ---
@@ -0,0 +1,25 @@
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: v0.2.2
9
+ kind: changed
10
+ summary: Improved plan feature with enhanced CLI commands and validation
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs:
15
+ - git:6449c24426d1f4e4d318b553b4ce2fa46b0f3c1e
16
+ paths:
17
+ - readio/cli.py
18
+ issues: []
19
+ prs: []
20
+ sources: []
21
+ contributors: []
22
+ breaking: false
23
+ internal: false
24
+ order: 4
25
+ ---
@@ -0,0 +1,26 @@
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: v0.2.2
9
+ kind: quality
10
+ summary: Fixed pytest and pre-commit configuration for plan feature tests
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs:
15
+ - git:0302f797298f78a7f56bf85fdccd2fa977110870
16
+ paths:
17
+ - readio/jsonutil.py
18
+ - tests/test_plan_no_tts_load.py
19
+ issues: []
20
+ prs: []
21
+ sources: []
22
+ contributors: []
23
+ breaking: false
24
+ internal: true
25
+ order: 5
26
+ ---
@@ -0,0 +1,25 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0006
8
+ release_version: v0.2.2
9
+ kind: quality
10
+ summary: Fixed pytest test setup for plan feature without TTS dependency
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs:
15
+ - git:6656cdd980d30a65d403961909d5e911e3e81dbc
16
+ paths:
17
+ - tests/test_plan_no_tts_load.py
18
+ issues: []
19
+ prs: []
20
+ sources: []
21
+ contributors: []
22
+ breaking: false
23
+ internal: true
24
+ order: 6
25
+ ---
@@ -0,0 +1,24 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0007
8
+ release_version: v0.2.2
9
+ kind: internal
10
+ summary: Initialized releaseledger state and changelog for v0.2.2
11
+ status: accepted
12
+ audience: null
13
+ scopes: []
14
+ source_refs:
15
+ - git:9ec43c0c70d5badaf282547142af78fe9e986ca4
16
+ paths: []
17
+ issues: []
18
+ prs: []
19
+ sources: []
20
+ contributors: []
21
+ breaking: false
22
+ internal: true
23
+ order: 7
24
+ ---
@@ -0,0 +1,27 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 11
7
+ version: v0.2.2
8
+ status: released
9
+ history_state: curated
10
+ title: Readio v0.2.2
11
+ released_at: "2026-09-05"
12
+ previous_version: v0.2.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: 7
20
+ artifact_count: 0
21
+ git_base_ref: v0.2.1
22
+ git_base_sha: 52c6084a8dfc3fbf46ac5fca8ff670cb1e97bf35
23
+ git_head_ref: HEAD
24
+ git_head_sha: 0302f797298f78a7f56bf85fdccd2fa977110870
25
+ git_range: 52c6084a8dfc3fbf46ac5fca8ff670cb1e97bf35..0302f797298f78a7f56bf85fdccd2fa977110870
26
+ git_commit_count: 7
27
+ ---
@@ -0,0 +1,18 @@
1
+ # Changelog
2
+
3
+ ## [v0.2.2] - 2026-09-05
4
+
5
+ ### Added
6
+
7
+ - Added synthesis plan resolution system with explicit plan domain, resolution pipeline, and validation
8
+ - Added manifest module for project metadata and package information management
9
+
10
+ ### Changed
11
+
12
+ - Improved plan feature with enhanced CLI commands and validation
13
+
14
+ ### Documentation
15
+
16
+ - Added comprehensive LLM guides for SSMD audio content creation including podcasts, stories, educational content, and more
17
+
18
+ <!-- generated by releaseledger -->
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: readio
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Read text aloud in the terminal with streaming TTS and an Agent Skill for LLM invocation
5
5
  License: Apache-2.0
6
6
  Requires-Python: >=3.10
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
9
- Requires-Dist: pykokoro[playback]<0.10,>=0.9.0
9
+ Requires-Dist: pykokoro[playback]<0.10,>=0.9.1
10
10
  Requires-Dist: platformdirs>=4.0
11
11
  Requires-Dist: soundfile>=0.12
12
12
  Requires-Dist: tomli>=2.0; python_version < "3.11"
@@ -143,6 +143,14 @@ draft="$(readio template use podcast)"
143
143
 
144
144
  The returned path is under the configured ingest directory. A caller can request a filename with `readio template use podcast --name weekly-review.ssmd`.
145
145
 
146
+ ## Standalone LLM authoring guides
147
+
148
+ `llm-guides/ssmd/` contains standalone Markdown instructions for generic LLMs. These guides are distinct from the runtime `.ssmd` templates managed by `readio template`.
149
+
150
+ No Readio or Python installation is needed on the authoring system: choose one guide and attach it with the task and source material. When the harness supports artifacts, ask it to create and return one downloadable `.ssmd` file; otherwise save the raw SSMD response as a file. Rendering and final validation happen later on a system where Readio is installed.
151
+
152
+ See [`llm-guides/README.md`](llm-guides/README.md) for the catalog and the authoring-to-rendering workflow.
153
+
146
154
  ## Ingest directory
147
155
 
148
156
  The ingest directory stores text, Markdown, and SSMD files created for later processing.
@@ -157,6 +165,81 @@ readio ingest list
157
165
 
158
166
  Automatic names contain a UTC artifact ID such as `20260824T111423Z-5f8ab31c`. Explicit names are relative to the ingest directory and path traversal is rejected.
159
167
 
168
+ ## Planning before rendering
169
+
170
+ Every non-live render resolves one explicit synthesis plan before any TTS work. `readio plan` and `readio render --dry-run` display that plan without loading a model, and a normal `render` executes exactly the plan it resolved — the plan is the execution contract, not a prediction:
171
+
172
+ ```bash
173
+ readio plan --file episode.ssmd --format mp3 --json
174
+ readio render --file episode.ssmd --dry-run # same plan, human output
175
+ readio render --file episode.ssmd # resolves the same plan, then executes it
176
+ ```
177
+
178
+ Planning, discovery, defaults, and render results are distinct layers:
179
+
180
+ - **`readio models` / `readio voices` (discovery)** list what the installed PyKokoro runtime _could_ provide — model IDs, languages, voices, qualities, lexicons, status.
181
+ - **`readio defaults` (defaults)** persist validated per-language policy that resolution _prefers_.
182
+ - **`readio plan` (planning)** resolves one concrete request against config, defaults, CLI options, and PyKokoro's automatic selection: a concrete model, source, quality, voice, SSMD cast, and output allocation, with provenance for every effective value. No TTS model is loaded.
183
+ - **`readio render` (render result)** executes the plan; the plan JSON's synthesis, SSMD bindings, and output path are the values actually used. A render that fails planning exits 1 with the plan and its diagnostics instead of loading TTS.
184
+
185
+ `readio.plan.v1` JSON exposes `schema`, `ok`, `input`, `synthesis` (with `model` capability metadata), `ssmd` bindings, `output` (format, encoder backend, path, path origin, `force`), `environment` (including `ffmpeg_available`), `decisions` (winning source per field), and `diagnostics`:
186
+
187
+ ```json
188
+ {
189
+ "schema": "readio.plan.v1",
190
+ "ok": true,
191
+ "operation": "render",
192
+ "synthesis": {
193
+ "engine": "pykokoro",
194
+ "language": "de",
195
+ "model": {
196
+ "id": "de-thorsten",
197
+ "source": "github",
198
+ "quality": "fp32",
199
+ "voice": "thorsten",
200
+ "status": "ready",
201
+ "runtime_available": true,
202
+ "languages": ["de"],
203
+ "experimental": false
204
+ }
205
+ },
206
+ "ssmd": { "enabled": false, "bindings": [], "unresolved": [] },
207
+ "output": {
208
+ "mode": "file",
209
+ "format": "mp3",
210
+ "encoder_backend": "soundfile",
211
+ "path": ".../episode.mp3",
212
+ "path_origin": "explicit",
213
+ "force": false
214
+ },
215
+ "decisions": [
216
+ {
217
+ "field": "synthesis.model",
218
+ "value": "de-thorsten",
219
+ "origin": "cli",
220
+ "locator": "request.model"
221
+ }
222
+ ],
223
+ "diagnostics": []
224
+ }
225
+ ```
226
+
227
+ Plans are deterministic and non-interactive: `--resolve-voices` is rejected by `plan` and `--dry-run`; use repeatable `--voice-bind ROLE=VOICE_ID` options or persisted role configuration instead. `plan` accepts `--force` so it can represent every render output request, and an invalid plan (incompatible model/language, unavailable runtime, unresolved SSMD cast, unavailable encoder, non-concrete synthesis) fails before model loading.
228
+
229
+ ## Durable render manifests
230
+
231
+ For bounded renders that will be reused, published, compared, or handed to another agent, request an opt-in post-render manifest:
232
+
233
+ ```bash
234
+ readio plan --file episode.ssmd --format mp3 --json
235
+ readio render --file episode.ssmd --format mp3 --manifest
236
+ readio render --file episode.ssmd --format mp3 --manifest --json
237
+ ```
238
+
239
+ A successful render writes the audio and a colocated `<audio>.readio.json` sidecar. The sidecar uses schema `readio.render-manifest.v1` and records the exact executed `readio.plan.v1`, its canonical SHA-256, the final encoded audio hash and byte count, render summary facts, document metadata, and final marker offsets. The plan is pre-execution intent; the manifest is post-execution evidence.
240
+
241
+ Human stdout remains only the audio path. JSON render output remains one object and adds `manifest` with the sidecar schema and path, or `null` when the flag is absent. `--manifest` is available only for bounded rendering, not `--live`, `speak`, planning, dry runs, or publishing. If sidecar writing fails, Readio preserves the committed audio and returns `render.manifest_error`.
242
+
160
243
  ## Multi-format audio output
161
244
 
162
245
  The output path is optional and WAV remains the default: