readio 0.3.2__tar.gz → 0.3.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 (375) hide show
  1. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +6 -0
  2. readio-0.3.3/.ledger/releaseledger/data/ledgers/main/releases/v0.3.3/audit/commit-audit.yaml +80 -0
  3. readio-0.3.3/.ledger/releaseledger/data/ledgers/main/releases/v0.3.3/entries/entry-0001.md +36 -0
  4. readio-0.3.3/.ledger/releaseledger/data/ledgers/main/releases/v0.3.3/entries/entry-0002.md +33 -0
  5. readio-0.3.3/.ledger/releaseledger/data/ledgers/main/releases/v0.3.3/release.md +27 -0
  6. readio-0.3.3/.ledger/releaseledger/work/v0.3.3/audit-decisions.yaml +34 -0
  7. readio-0.3.3/.ledger/releaseledger/work/v0.3.3/audit.yaml +56 -0
  8. readio-0.3.3/.ledger/releaseledger/work/v0.3.3/entries.yaml +48 -0
  9. readio-0.3.3/.ledger/releaseledger/work/v0.3.3/evidence/05f8940.patch +211 -0
  10. readio-0.3.3/.ledger/releaseledger/work/v0.3.3/evidence/3dbc57b.patch +826 -0
  11. readio-0.3.3/.ledger/releaseledger/work/v0.3.3/evidence/manifest.json +48 -0
  12. readio-0.3.3/.ledger/releaseledger/work/v0.3.3/range.json +13 -0
  13. {readio-0.3.2/readio.egg-info → readio-0.3.3}/PKG-INFO +14 -1
  14. {readio-0.3.2 → readio-0.3.3}/README.md +12 -0
  15. {readio-0.3.2 → readio-0.3.3}/docs/api.md +4 -2
  16. {readio-0.3.2 → readio-0.3.3}/docs/changelog.md +9 -0
  17. {readio-0.3.2 → readio-0.3.3}/docs/cli.md +15 -0
  18. {readio-0.3.2 → readio-0.3.3}/pyproject.toml +1 -0
  19. {readio-0.3.2 → readio-0.3.3}/readio/api/projects.py +14 -0
  20. {readio-0.3.2 → readio-0.3.3}/readio/api/types.py +6 -0
  21. {readio-0.3.2 → readio-0.3.3}/readio/cli.py +190 -53
  22. readio-0.3.3/readio/cli_help.py +28 -0
  23. {readio-0.3.2 → readio-0.3.3}/readio/spotify_cli.py +6 -2
  24. {readio-0.3.2 → readio-0.3.3/readio.egg-info}/PKG-INFO +14 -1
  25. {readio-0.3.2 → readio-0.3.3}/readio.egg-info/SOURCES.txt +13 -0
  26. {readio-0.3.2 → readio-0.3.3}/readio.egg-info/requires.txt +1 -0
  27. {readio-0.3.2 → readio-0.3.3}/readio.egg-info/scm_file_list.json +13 -0
  28. {readio-0.3.2 → readio-0.3.3}/readio.egg-info/scm_version.json +2 -2
  29. readio-0.3.3/tests/test_cli_help.py +257 -0
  30. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_projects.py +43 -0
  31. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_types.py +58 -0
  32. {readio-0.3.2 → readio-0.3.3}/tests/test_voice_catalog.py +6 -3
  33. {readio-0.3.2 → readio-0.3.3}/.codecrate.toml +0 -0
  34. {readio-0.3.2 → readio-0.3.3}/.github/workflows/codecov.yml +0 -0
  35. {readio-0.3.2 → readio-0.3.3}/.github/workflows/pre-commit.yml +0 -0
  36. {readio-0.3.2 → readio-0.3.3}/.github/workflows/python-publish.yml +0 -0
  37. {readio-0.3.2 → readio-0.3.3}/.github/workflows/tests.yml +0 -0
  38. {readio-0.3.2 → readio-0.3.3}/.gitignore +0 -0
  39. {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/.ledger-project.toml +0 -0
  40. {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/config.toml +0 -0
  41. {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/.ledger-project.toml +0 -0
  42. {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/docs/docs-changelog-md-77f023b9.yaml +0 -0
  43. {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/docs/docs-index-md-b4d68dc8.yaml +0 -0
  44. {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/docs/readme-md-b3356305.yaml +0 -0
  45. {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/scan.yaml +0 -0
  46. {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/source-index.json +0 -0
  47. {readio-0.3.2 → readio-0.3.3}/.ledger/documentledger/data/storage.yaml +0 -0
  48. {readio-0.3.2 → readio-0.3.3}/.ledger/ledger.toml +0 -0
  49. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/.ledger-project.toml +0 -0
  50. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/config.toml +0 -0
  51. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
  52. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/audit/commit-audit.yaml +0 -0
  53. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0001.md +0 -0
  54. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0002.md +0 -0
  55. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0003.md +0 -0
  56. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0004.md +0 -0
  57. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0005.md +0 -0
  58. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/release.md +0 -0
  59. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.1/audit/commit-audit.yaml +0 -0
  60. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.1/entries/entry-0001.md +0 -0
  61. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.1/release.md +0 -0
  62. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/audit/commit-audit.yaml +0 -0
  63. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0001.md +0 -0
  64. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0002.md +0 -0
  65. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0003.md +0 -0
  66. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/entries/entry-0004.md +0 -0
  67. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.2/release.md +0 -0
  68. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/audit/commit-audit.yaml +0 -0
  69. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/entries/entry-0001.md +0 -0
  70. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/entries/entry-0002.md +0 -0
  71. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.3/release.md +0 -0
  72. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/audit/commit-audit.yaml +0 -0
  73. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0001.md +0 -0
  74. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0002.md +0 -0
  75. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0003.md +0 -0
  76. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0004.md +0 -0
  77. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0005.md +0 -0
  78. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/entries/entry-0006.md +0 -0
  79. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.0/release.md +0 -0
  80. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.1/audit/commit-audit.yaml +0 -0
  81. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.1/entries/entry-0001.md +0 -0
  82. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.1/release.md +0 -0
  83. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/audit/commit-audit.yaml +0 -0
  84. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0001.md +0 -0
  85. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0002.md +0 -0
  86. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0003.md +0 -0
  87. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0004.md +0 -0
  88. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0005.md +0 -0
  89. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0006.md +0 -0
  90. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/entries/entry-0007.md +0 -0
  91. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.2/release.md +0 -0
  92. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0001.md +0 -0
  93. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0002.md +0 -0
  94. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0003.md +0 -0
  95. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0004.md +0 -0
  96. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0005.md +0 -0
  97. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/entries/entry-0006.md +0 -0
  98. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.3/release.md +0 -0
  99. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/audit/commit-audit.yaml +0 -0
  100. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/entries/entry-0001.md +0 -0
  101. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/entries/entry-0002.md +0 -0
  102. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/entries/entry-0003.md +0 -0
  103. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/entries/entry-0004.md +0 -0
  104. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.2.4/release.md +0 -0
  105. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.0/entries/entry-0001.md +0 -0
  106. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.0/entries/entry-0002.md +0 -0
  107. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.0/entries/entry-0003.md +0 -0
  108. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.0/entries/entry-0004.md +0 -0
  109. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.0/release.md +0 -0
  110. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.1/audit/commit-audit.yaml +0 -0
  111. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.1/entries/entry-0001.md +0 -0
  112. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.1/release.md +0 -0
  113. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.2/audit/commit-audit.yaml +0 -0
  114. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.2/entries/entry-0001.md +0 -0
  115. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.2/entries/entry-0002.md +0 -0
  116. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.2/entries/entry-0003.md +0 -0
  117. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/data/ledgers/main/releases/v0.3.2/release.md +0 -0
  118. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/audit-decisions.yaml +0 -0
  119. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/audit.yaml +0 -0
  120. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/entries.yaml +0 -0
  121. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/evidence/4ecf165.patch +0 -0
  122. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/evidence/manifest.json +0 -0
  123. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.0/range.json +0 -0
  124. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/audit-decisions.yaml +0 -0
  125. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/audit.yaml +0 -0
  126. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/entries.yaml +0 -0
  127. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/evidence/18d1765.patch +0 -0
  128. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/evidence/2c5e221.patch +0 -0
  129. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/evidence/4791e70.patch +0 -0
  130. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/evidence/5840ad5.patch +0 -0
  131. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/evidence/manifest.json +0 -0
  132. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.2.4/range.json +0 -0
  133. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/audit-decisions.yaml +0 -0
  134. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/audit.yaml +0 -0
  135. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/entries.yaml +0 -0
  136. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/evidence/86a3aec.patch +0 -0
  137. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/evidence/manifest.json +0 -0
  138. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.1/range.json +0 -0
  139. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/audit-decisions.yaml +0 -0
  140. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/audit.yaml +0 -0
  141. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/entries.yaml +0 -0
  142. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/evidence/0251443.patch +0 -0
  143. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/evidence/20c4037.patch +0 -0
  144. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/evidence/manifest.json +0 -0
  145. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/work/v0.3.2/range.json +0 -0
  146. {readio-0.3.2 → readio-0.3.3}/.ledger/releaseledger/write.lock +0 -0
  147. {readio-0.3.2 → readio-0.3.3}/.ledger/taskledger/.ledger-project.toml +0 -0
  148. {readio-0.3.2 → readio-0.3.3}/.ledger/taskledger/config.toml +0 -0
  149. {readio-0.3.2 → readio-0.3.3}/.pre-commit-config.yaml +0 -0
  150. {readio-0.3.2 → readio-0.3.3}/LICENSE +0 -0
  151. {readio-0.3.2 → readio-0.3.3}/docs/architecture.md +0 -0
  152. {readio-0.3.2 → readio-0.3.3}/docs/conf.py +0 -0
  153. {readio-0.3.2 → readio-0.3.3}/docs/incremental-rendering.md +0 -0
  154. {readio-0.3.2 → readio-0.3.3}/docs/index.md +0 -0
  155. {readio-0.3.2 → readio-0.3.3}/docs/make.py +0 -0
  156. {readio-0.3.2 → readio-0.3.3}/docs/projects.md +0 -0
  157. {readio-0.3.2 → readio-0.3.3}/docs/requirements.txt +0 -0
  158. {readio-0.3.2 → readio-0.3.3}/examples/README.md +0 -0
  159. {readio-0.3.2 → readio-0.3.3}/examples/python_api.py +0 -0
  160. {readio-0.3.2 → readio-0.3.3}/examples/readio-podcast.ssmd +0 -0
  161. {readio-0.3.2 → readio-0.3.3}/examples/readio-prosody.ssmd +0 -0
  162. {readio-0.3.2 → readio-0.3.3}/llm-guides/README.md +0 -0
  163. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/audio-drama.md +0 -0
  164. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/debate-pro-con.md +0 -0
  165. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/document-summary.md +0 -0
  166. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/dramatic-story.md +0 -0
  167. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/educational-explainer.md +0 -0
  168. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/funny-story.md +0 -0
  169. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/general-narration.md +0 -0
  170. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/guided-meditation.md +0 -0
  171. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/kids-story.md +0 -0
  172. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/language-learning.md +0 -0
  173. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/news-briefing.md +0 -0
  174. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/podcast-interview.md +0 -0
  175. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/podcast-roundtable.md +0 -0
  176. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/podcast-solo.md +0 -0
  177. {readio-0.3.2 → readio-0.3.3}/llm-guides/ssmd/quiz-trivia.md +0 -0
  178. {readio-0.3.2 → readio-0.3.3}/readio/__init__.py +0 -0
  179. {readio-0.3.2 → readio-0.3.3}/readio/__main__.py +0 -0
  180. {readio-0.3.2 → readio-0.3.3}/readio/api/__init__.py +0 -0
  181. {readio-0.3.2 → readio-0.3.3}/readio/api/app.py +0 -0
  182. {readio-0.3.2 → readio-0.3.3}/readio/api/audiobooks.py +0 -0
  183. {readio-0.3.2 → readio-0.3.3}/readio/api/catalog.py +0 -0
  184. {readio-0.3.2 → readio-0.3.3}/readio/api/configuration.py +0 -0
  185. {readio-0.3.2 → readio-0.3.3}/readio/api/diagnostics.py +0 -0
  186. {readio-0.3.2 → readio-0.3.3}/readio/api/errors.py +0 -0
  187. {readio-0.3.2 → readio-0.3.3}/readio/api/events.py +0 -0
  188. {readio-0.3.2 → readio-0.3.3}/readio/api/extensions.py +0 -0
  189. {readio-0.3.2 → readio-0.3.3}/readio/api/ingest.py +0 -0
  190. {readio-0.3.2 → readio-0.3.3}/readio/api/integrations/__init__.py +0 -0
  191. {readio-0.3.2 → readio-0.3.3}/readio/api/integrations/spotify.py +0 -0
  192. {readio-0.3.2 → readio-0.3.3}/readio/api/roles.py +0 -0
  193. {readio-0.3.2 → readio-0.3.3}/readio/api/speech.py +0 -0
  194. {readio-0.3.2 → readio-0.3.3}/readio/api/ssmd.py +0 -0
  195. {readio-0.3.2 → readio-0.3.3}/readio/api/templates.py +0 -0
  196. {readio-0.3.2 → readio-0.3.3}/readio/audio.py +0 -0
  197. {readio-0.3.2 → readio-0.3.3}/readio/audiobook.py +0 -0
  198. {readio-0.3.2 → readio-0.3.3}/readio/chapter_selection.py +0 -0
  199. {readio-0.3.2 → readio-0.3.3}/readio/cli_adapter.py +0 -0
  200. {readio-0.3.2 → readio-0.3.3}/readio/cli_present.py +0 -0
  201. {readio-0.3.2 → readio-0.3.3}/readio/config.py +0 -0
  202. {readio-0.3.2 → readio-0.3.3}/readio/doctor.py +0 -0
  203. {readio-0.3.2 → readio-0.3.3}/readio/document.py +0 -0
  204. {readio-0.3.2 → readio-0.3.3}/readio/engines/__init__.py +0 -0
  205. {readio-0.3.2 → readio-0.3.3}/readio/engines/base.py +0 -0
  206. {readio-0.3.2 → readio-0.3.3}/readio/engines/catalog.py +0 -0
  207. {readio-0.3.2 → readio-0.3.3}/readio/engines/discovery.py +0 -0
  208. {readio-0.3.2 → readio-0.3.3}/readio/engines/pipersynth.py +0 -0
  209. {readio-0.3.2 → readio-0.3.3}/readio/engines/pocketsynth.py +0 -0
  210. {readio-0.3.2 → readio-0.3.3}/readio/engines/pykokoro.py +0 -0
  211. {readio-0.3.2 → readio-0.3.3}/readio/engines/registry.py +0 -0
  212. {readio-0.3.2 → readio-0.3.3}/readio/engines/selection.py +0 -0
  213. {readio-0.3.2 → readio-0.3.3}/readio/errors.py +0 -0
  214. {readio-0.3.2 → readio-0.3.3}/readio/execution.py +0 -0
  215. {readio-0.3.2 → readio-0.3.3}/readio/formats.py +0 -0
  216. {readio-0.3.2 → readio-0.3.3}/readio/ingest.py +0 -0
  217. {readio-0.3.2 → readio-0.3.3}/readio/jsonutil.py +0 -0
  218. {readio-0.3.2 → readio-0.3.3}/readio/lexicons.py +0 -0
  219. {readio-0.3.2 → readio-0.3.3}/readio/logging_config.py +0 -0
  220. {readio-0.3.2 → readio-0.3.3}/readio/manifest.py +0 -0
  221. {readio-0.3.2 → readio-0.3.3}/readio/markdown.py +0 -0
  222. {readio-0.3.2 → readio-0.3.3}/readio/models.py +0 -0
  223. {readio-0.3.2 → readio-0.3.3}/readio/paths.py +0 -0
  224. {readio-0.3.2 → readio-0.3.3}/readio/plan.py +0 -0
  225. {readio-0.3.2 → readio-0.3.3}/readio/planning/__init__.py +0 -0
  226. {readio-0.3.2 → readio-0.3.3}/readio/planning/compiler.py +0 -0
  227. {readio-0.3.2 → readio-0.3.3}/readio/planning/policy.py +0 -0
  228. {readio-0.3.2 → readio-0.3.3}/readio/planning/semantic.py +0 -0
  229. {readio-0.3.2 → readio-0.3.3}/readio/progress.py +0 -0
  230. {readio-0.3.2 → readio-0.3.3}/readio/project.py +0 -0
  231. {readio-0.3.2 → readio-0.3.3}/readio/project_model.py +0 -0
  232. {readio-0.3.2 → readio-0.3.3}/readio/project_roles.py +0 -0
  233. {readio-0.3.2 → readio-0.3.3}/readio/project_settings.py +0 -0
  234. {readio-0.3.2 → readio-0.3.3}/readio/py.typed +0 -0
  235. {readio-0.3.2 → readio-0.3.3}/readio/reader.py +0 -0
  236. {readio-0.3.2 → readio-0.3.3}/readio/rendering/__init__.py +0 -0
  237. {readio-0.3.2 → readio-0.3.3}/readio/rendering/capacity.py +0 -0
  238. {readio-0.3.2 → readio-0.3.3}/readio/rendering/lowering.py +0 -0
  239. {readio-0.3.2 → readio-0.3.3}/readio/resources/__init__.py +0 -0
  240. {readio-0.3.2 → readio-0.3.3}/readio/resources/templates/__init__.py +0 -0
  241. {readio-0.3.2 → readio-0.3.3}/readio/resources/templates/briefing.ssmd +0 -0
  242. {readio-0.3.2 → readio-0.3.3}/readio/resources/templates/dialogue.ssmd +0 -0
  243. {readio-0.3.2 → readio-0.3.3}/readio/resources/templates/podcast.ssmd +0 -0
  244. {readio-0.3.2 → readio-0.3.3}/readio/selection.py +0 -0
  245. {readio-0.3.2 → readio-0.3.3}/readio/spotify.py +0 -0
  246. {readio-0.3.2 → readio-0.3.3}/readio/ssmd.py +0 -0
  247. {readio-0.3.2 → readio-0.3.3}/readio/ssmd_authoring.py +0 -0
  248. {readio-0.3.2 → readio-0.3.3}/readio/stages/__init__.py +0 -0
  249. {readio-0.3.2 → readio-0.3.3}/readio/stages/audiobook_export.py +0 -0
  250. {readio-0.3.2 → readio-0.3.3}/readio/stages/composition.py +0 -0
  251. {readio-0.3.2 → readio-0.3.3}/readio/stages/export.py +0 -0
  252. {readio-0.3.2 → readio-0.3.3}/readio/stages/pipeline.py +0 -0
  253. {readio-0.3.2 → readio-0.3.3}/readio/stages/planning.py +0 -0
  254. {readio-0.3.2 → readio-0.3.3}/readio/stages/speech_identity.py +0 -0
  255. {readio-0.3.2 → readio-0.3.3}/readio/stages/synthesis.py +0 -0
  256. {readio-0.3.2 → readio-0.3.3}/readio/synthesis.py +0 -0
  257. {readio-0.3.2 → readio-0.3.3}/readio/templates.py +0 -0
  258. {readio-0.3.2 → readio-0.3.3}/readio/text.py +0 -0
  259. {readio-0.3.2 → readio-0.3.3}/readio/voices.py +0 -0
  260. {readio-0.3.2 → readio-0.3.3}/readio/wave.py +0 -0
  261. {readio-0.3.2 → readio-0.3.3}/readio.egg-info/dependency_links.txt +0 -0
  262. {readio-0.3.2 → readio-0.3.3}/readio.egg-info/entry_points.txt +0 -0
  263. {readio-0.3.2 → readio-0.3.3}/readio.egg-info/top_level.txt +0 -0
  264. {readio-0.3.2 → readio-0.3.3}/setup.cfg +0 -0
  265. {readio-0.3.2 → readio-0.3.3}/skill/readio/SKILL.md +0 -0
  266. {readio-0.3.2 → readio-0.3.3}/skill/readio/references/cli.md +0 -0
  267. {readio-0.3.2 → readio-0.3.3}/skill/readio/references/input-formats.md +0 -0
  268. {readio-0.3.2 → readio-0.3.3}/skill/readio/references/spotify.md +0 -0
  269. {readio-0.3.2 → readio-0.3.3}/skill/readio/references/ssmd.md +0 -0
  270. {readio-0.3.2 → readio-0.3.3}/skill/readio/references/troubleshooting.md +0 -0
  271. {readio-0.3.2 → readio-0.3.3}/tests/audiobook_support.py +0 -0
  272. {readio-0.3.2 → readio-0.3.3}/tests/conftest.py +0 -0
  273. {readio-0.3.2 → readio-0.3.3}/tests/fixtures/architecture-review.ssmd +0 -0
  274. {readio-0.3.2 → readio-0.3.3}/tests/fixtures/markdown/all-elements.md +0 -0
  275. {readio-0.3.2 → readio-0.3.3}/tests/fixtures/markdown/all-elements.txt +0 -0
  276. {readio-0.3.2 → readio-0.3.3}/tests/multiscope_support.py +0 -0
  277. {readio-0.3.2 → readio-0.3.3}/tests/project_support.py +0 -0
  278. {readio-0.3.2 → readio-0.3.3}/tests/test_audio.py +0 -0
  279. {readio-0.3.2 → readio-0.3.3}/tests/test_audio_formats.py +0 -0
  280. {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_cli.py +0 -0
  281. {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_export.py +0 -0
  282. {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_export_api.py +0 -0
  283. {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_pipeline.py +0 -0
  284. {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_project.py +0 -0
  285. {readio-0.3.2 → readio-0.3.3}/tests/test_audiobook_status.py +0 -0
  286. {readio-0.3.2 → readio-0.3.3}/tests/test_backend_config.py +0 -0
  287. {readio-0.3.2 → readio-0.3.3}/tests/test_chapter_selection.py +0 -0
  288. {readio-0.3.2 → readio-0.3.3}/tests/test_chapters.py +0 -0
  289. {readio-0.3.2 → readio-0.3.3}/tests/test_cli.py +0 -0
  290. {readio-0.3.2 → readio-0.3.3}/tests/test_cli_adapter.py +0 -0
  291. {readio-0.3.2 → readio-0.3.3}/tests/test_cli_public_api_boundary.py +0 -0
  292. {readio-0.3.2 → readio-0.3.3}/tests/test_composition_ssmd09_prosody.py +0 -0
  293. {readio-0.3.2 → readio-0.3.3}/tests/test_config.py +0 -0
  294. {readio-0.3.2 → readio-0.3.3}/tests/test_defaults_cli.py +0 -0
  295. {readio-0.3.2 → readio-0.3.3}/tests/test_doctor.py +0 -0
  296. {readio-0.3.2 → readio-0.3.3}/tests/test_document.py +0 -0
  297. {readio-0.3.2 → readio-0.3.3}/tests/test_engine_adapters_requests.py +0 -0
  298. {readio-0.3.2 → readio-0.3.3}/tests/test_engine_contract.py +0 -0
  299. {readio-0.3.2 → readio-0.3.3}/tests/test_engine_execution.py +0 -0
  300. {readio-0.3.2 → readio-0.3.3}/tests/test_engine_registry.py +0 -0
  301. {readio-0.3.2 → readio-0.3.3}/tests/test_engine_spine.py +0 -0
  302. {readio-0.3.2 → readio-0.3.3}/tests/test_examples.py +0 -0
  303. {readio-0.3.2 → readio-0.3.3}/tests/test_execution_request_path.py +0 -0
  304. {readio-0.3.2 → readio-0.3.3}/tests/test_ffmpeg_sink.py +0 -0
  305. {readio-0.3.2 → readio-0.3.3}/tests/test_incremental_project_render.py +0 -0
  306. {readio-0.3.2 → readio-0.3.3}/tests/test_ingest.py +0 -0
  307. {readio-0.3.2 → readio-0.3.3}/tests/test_language_defaults_config.py +0 -0
  308. {readio-0.3.2 → readio-0.3.3}/tests/test_lexicon_catalog.py +0 -0
  309. {readio-0.3.2 → readio-0.3.3}/tests/test_lexicons_cli.py +0 -0
  310. {readio-0.3.2 → readio-0.3.3}/tests/test_llm_guides.py +0 -0
  311. {readio-0.3.2 → readio-0.3.3}/tests/test_logging_cli.py +0 -0
  312. {readio-0.3.2 → readio-0.3.3}/tests/test_manifest.py +0 -0
  313. {readio-0.3.2 → readio-0.3.3}/tests/test_markdown.py +0 -0
  314. {readio-0.3.2 → readio-0.3.3}/tests/test_model_source_preference.py +0 -0
  315. {readio-0.3.2 → readio-0.3.3}/tests/test_models_cli.py +0 -0
  316. {readio-0.3.2 → readio-0.3.3}/tests/test_package_resources.py +0 -0
  317. {readio-0.3.2 → readio-0.3.3}/tests/test_packaging_metadata.py +0 -0
  318. {readio-0.3.2 → readio-0.3.3}/tests/test_paths.py +0 -0
  319. {readio-0.3.2 → readio-0.3.3}/tests/test_piper_engine.py +0 -0
  320. {readio-0.3.2 → readio-0.3.3}/tests/test_plan.py +0 -0
  321. {readio-0.3.2 → readio-0.3.3}/tests/test_plan_cli.py +0 -0
  322. {readio-0.3.2 → readio-0.3.3}/tests/test_plan_no_tts_load.py +0 -0
  323. {readio-0.3.2 → readio-0.3.3}/tests/test_plan_v2.py +0 -0
  324. {readio-0.3.2 → readio-0.3.3}/tests/test_plan_validation.py +0 -0
  325. {readio-0.3.2 → readio-0.3.3}/tests/test_pocketsynth_engine.py +0 -0
  326. {readio-0.3.2 → readio-0.3.3}/tests/test_progress.py +0 -0
  327. {readio-0.3.2 → readio-0.3.3}/tests/test_project_atomic_manifest.py +0 -0
  328. {readio-0.3.2 → readio-0.3.3}/tests/test_project_composition.py +0 -0
  329. {readio-0.3.2 → readio-0.3.3}/tests/test_project_export.py +0 -0
  330. {readio-0.3.2 → readio-0.3.3}/tests/test_project_layout.py +0 -0
  331. {readio-0.3.2 → readio-0.3.3}/tests/test_project_model.py +0 -0
  332. {readio-0.3.2 → readio-0.3.3}/tests/test_project_planning.py +0 -0
  333. {readio-0.3.2 → readio-0.3.3}/tests/test_project_roles.py +0 -0
  334. {readio-0.3.2 → readio-0.3.3}/tests/test_project_target_routing.py +0 -0
  335. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_catalog_listings.py +0 -0
  336. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_catalog_roles_ssmd_extensions.py +0 -0
  337. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_configuration_templates_ingest_diagnostics.py +0 -0
  338. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_errors.py +0 -0
  339. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_events.py +0 -0
  340. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_examples.py +0 -0
  341. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_imports.py +0 -0
  342. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_speech.py +0 -0
  343. {readio-0.3.2 → readio-0.3.3}/tests/test_public_api_spotify.py +0 -0
  344. {readio-0.3.2 → readio-0.3.3}/tests/test_pykokoro_10_contract.py +0 -0
  345. {readio-0.3.2 → readio-0.3.3}/tests/test_pykokoro_10_regressions.py +0 -0
  346. {readio-0.3.2 → readio-0.3.3}/tests/test_pykokoro_10_support.py +0 -0
  347. {readio-0.3.2 → readio-0.3.3}/tests/test_reader_markdown.py +0 -0
  348. {readio-0.3.2 → readio-0.3.3}/tests/test_reader_selection.py +0 -0
  349. {readio-0.3.2 → readio-0.3.3}/tests/test_released_engine_apis.py +0 -0
  350. {readio-0.3.2 → readio-0.3.3}/tests/test_render_from_plan.py +0 -0
  351. {readio-0.3.2 → readio-0.3.3}/tests/test_render_manifest_cli.py +0 -0
  352. {readio-0.3.2 → readio-0.3.3}/tests/test_rendering_capacity.py +0 -0
  353. {readio-0.3.2 → readio-0.3.3}/tests/test_rendering_lowering.py +0 -0
  354. {readio-0.3.2 → readio-0.3.3}/tests/test_segment_architecture.py +0 -0
  355. {readio-0.3.2 → readio-0.3.3}/tests/test_selection.py +0 -0
  356. {readio-0.3.2 → readio-0.3.3}/tests/test_semantic_plan.py +0 -0
  357. {readio-0.3.2 → readio-0.3.3}/tests/test_skill_integrity.py +0 -0
  358. {readio-0.3.2 → readio-0.3.3}/tests/test_spotify.py +0 -0
  359. {readio-0.3.2 → readio-0.3.3}/tests/test_spotify_cli.py +0 -0
  360. {readio-0.3.2 → readio-0.3.3}/tests/test_spotify_lifecycle.py +0 -0
  361. {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_authoring_09.py +0 -0
  362. {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_cli.py +0 -0
  363. {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_integration.py +0 -0
  364. {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_model_roster.py +0 -0
  365. {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_preflight.py +0 -0
  366. {readio-0.3.2 → readio-0.3.3}/tests/test_ssmd_single_source.py +0 -0
  367. {readio-0.3.2 → readio-0.3.3}/tests/test_synthesis.py +0 -0
  368. {readio-0.3.2 → readio-0.3.3}/tests/test_template_validate.py +0 -0
  369. {readio-0.3.2 → readio-0.3.3}/tests/test_templates.py +0 -0
  370. {readio-0.3.2 → readio-0.3.3}/tests/test_text.py +0 -0
  371. {readio-0.3.2 → readio-0.3.3}/tests/test_utterplan_v3_linguistics.py +0 -0
  372. {readio-0.3.2 → readio-0.3.3}/tests/test_voice_resolution_workflow.py +0 -0
  373. {readio-0.3.2 → readio-0.3.3}/tests/test_voices_cli.py +0 -0
  374. {readio-0.3.2 → readio-0.3.3}/tests/test_wave.py +0 -0
  375. {readio-0.3.2 → readio-0.3.3}/tests/typecheck/public_api_consumer.py +0 -0
@@ -101,3 +101,9 @@
101
101
  {"data":{"updated_rows":2},"event":"audit.updated","event_id":"event-0101","record_revisions":{"commit_audit_sheet":4},"release_version":"v0.3.2","schema_version":2}
102
102
  {"data":{"entry_ids":["entry-0003"],"synced_audit_rows":2},"event":"entry.batch_added","event_id":"event-0102","record_revisions":{"commit_audit_sheet":5,"entry:v0.3.2/entry-0003":1,"release:v0.3.2":4},"release_version":"v0.3.2","schema_version":2}
103
103
  {"data":{"released_at":"2026-09-28"},"event":"release.finalized","event_id":"event-0103","record_revisions":{"release:v0.3.2":5},"release_version":"v0.3.2","schema_version":2}
104
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0104","record_revisions":{"release:v0.3.3":1},"release_version":"v0.3.3","schema_version":2}
105
+ {"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-0105","record_revisions":{"release:v0.3.3":2},"release_version":"v0.3.3","schema_version":2}
106
+ {"data":{"row_count":2},"event":"audit.created","event_id":"event-0106","record_revisions":{"commit_audit_sheet":1},"release_version":"v0.3.3","schema_version":2}
107
+ {"data":{"updated_rows":2},"event":"audit.updated","event_id":"event-0107","record_revisions":{"commit_audit_sheet":2},"release_version":"v0.3.3","schema_version":2}
108
+ {"data":{"entry_ids":["entry-0001","entry-0002"],"synced_audit_rows":2},"event":"entry.batch_added","event_id":"event-0108","record_revisions":{"commit_audit_sheet":3,"entry:v0.3.3/entry-0001":1,"entry:v0.3.3/entry-0002":1,"release:v0.3.3":3},"release_version":"v0.3.3","schema_version":2}
109
+ {"data":{"released_at":"2026-09-28"},"event":"release.finalized","event_id":"event-0109","record_revisions":{"release:v0.3.3":4},"release_version":"v0.3.3","schema_version":2}
@@ -0,0 +1,80 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 3
6
+ release_version: v0.3.3
7
+ git_base_ref: v0.3.2
8
+ git_base_sha: fcf02b93783d26ec02252791a1642ea7bb3cc26a
9
+ git_head_ref: HEAD
10
+ git_head_sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
11
+ git_range: fcf02b93783d26ec02252791a1642ea7bb3cc26a..05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
12
+ commit_count: 2
13
+ rows:
14
+ - sha: 3dbc57bc393a396c67606b36fbde0960b5347187
15
+ source_ref: git:3dbc57bc393a396c67606b36fbde0960b5347187
16
+ short_sha: 3dbc57b
17
+ changed_paths:
18
+ - README.md
19
+ - docs/cli.md
20
+ - pyproject.toml
21
+ - readio/cli.py
22
+ - readio/cli_help.py
23
+ - readio/spotify_cli.py
24
+ - tests/test_cli_help.py
25
+ - tests/test_voice_catalog.py
26
+ stats:
27
+ files_changed: 8
28
+ insertions: 515
29
+ deletions: 58
30
+ inspected: true
31
+ inspected_paths:
32
+ - README.md
33
+ - docs/cli.md
34
+ - pyproject.toml
35
+ - readio/cli.py
36
+ - readio/cli_help.py
37
+ - readio/spotify_cli.py
38
+ - tests/test_cli_help.py
39
+ - tests/test_voice_catalog.py
40
+ observed_behavior:
41
+ Added formatted root and command-group help, plus engine and
42
+ output-format discovery commands with JSON output; documented the CLI behavior
43
+ and covered it with tests.
44
+ public_impact: public
45
+ decision: accepted
46
+ stale: false
47
+ evidence_subject: "feat: better cli help"
48
+ target_entry_id: entry-0001
49
+ notes: ""
50
+ - sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
51
+ source_ref: git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
52
+ short_sha: 05f8940
53
+ changed_paths:
54
+ - docs/api.md
55
+ - readio/api/projects.py
56
+ - readio/api/types.py
57
+ - tests/test_public_api_projects.py
58
+ - tests/test_public_api_types.py
59
+ stats:
60
+ files_changed: 5
61
+ insertions: 125
62
+ deletions: 2
63
+ inspected: true
64
+ inspected_paths:
65
+ - docs/api.md
66
+ - readio/api/projects.py
67
+ - readio/api/types.py
68
+ - tests/test_public_api_projects.py
69
+ - tests/test_public_api_types.py
70
+ observed_behavior:
71
+ Exposed resolved pronunciation, lexicon, and language-detection
72
+ settings through the read-only synthesis preflight result, preserving automatic
73
+ versus explicitly empty lexicon selections; documented the behavior and added
74
+ tests.
75
+ public_impact: public
76
+ decision: accepted
77
+ stale: false
78
+ evidence_subject: "feat: add missing parameter to api"
79
+ target_entry_id: entry-0002
80
+ notes: ""
@@ -0,0 +1,36 @@
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.3.3
9
+ kind: added
10
+ summary:
11
+ Added formatted command help and engine and output-format discovery to the
12
+ CLI
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:3dbc57bc393a396c67606b36fbde0960b5347187
18
+ paths:
19
+ - README.md
20
+ - docs/cli.md
21
+ - pyproject.toml
22
+ - readio/cli.py
23
+ - readio/cli_help.py
24
+ - readio/spotify_cli.py
25
+ - tests/test_cli_help.py
26
+ - tests/test_voice_catalog.py
27
+ issues: []
28
+ prs: []
29
+ sources:
30
+ - git:3dbc57bc393a396c67606b36fbde0960b5347187
31
+ contributors:
32
+ - "@holgern"
33
+ breaking: false
34
+ internal: false
35
+ order: 1
36
+ ---
@@ -0,0 +1,33 @@
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.3.3
9
+ kind: added
10
+ summary:
11
+ Added lexicon, pronunciation, and language-detection policies to the read-only
12
+ synthesis preflight API
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
18
+ paths:
19
+ - docs/api.md
20
+ - readio/api/projects.py
21
+ - readio/api/types.py
22
+ - tests/test_public_api_projects.py
23
+ - tests/test_public_api_types.py
24
+ issues: []
25
+ prs: []
26
+ sources:
27
+ - git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
28
+ contributors:
29
+ - "@holgern"
30
+ breaking: false
31
+ internal: false
32
+ order: 2
33
+ ---
@@ -0,0 +1,27 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 4
7
+ version: v0.3.3
8
+ status: released
9
+ history_state: curated
10
+ title: null
11
+ released_at: "2026-09-28"
12
+ previous_version: v0.3.2
13
+ cancel_reason: null
14
+ superseded_by: null
15
+ changelog_file: docs/changelog.md
16
+ boundary_ref: null
17
+ source_refs: []
18
+ source_count: null
19
+ entry_count: 2
20
+ artifact_count: 0
21
+ git_base_ref: v0.3.2
22
+ git_base_sha: fcf02b93783d26ec02252791a1642ea7bb3cc26a
23
+ git_head_ref: HEAD
24
+ git_head_sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
25
+ git_range: fcf02b93783d26ec02252791a1642ea7bb3cc26a..05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
26
+ git_commit_count: 2
27
+ ---
@@ -0,0 +1,34 @@
1
+ rows:
2
+ - sha: 3dbc57bc393a396c67606b36fbde0960b5347187
3
+ inspected: true
4
+ inspected_paths:
5
+ - README.md
6
+ - docs/cli.md
7
+ - pyproject.toml
8
+ - readio/cli.py
9
+ - readio/cli_help.py
10
+ - readio/spotify_cli.py
11
+ - tests/test_cli_help.py
12
+ - tests/test_voice_catalog.py
13
+ observed_behavior: Added formatted root and command-group help, plus engine and output-format discovery commands with JSON output; documented the CLI behavior and covered it with tests.
14
+ public_impact: public
15
+ decision: accepted
16
+ target_entry_key: null
17
+ target_entry_id: null
18
+ notes: ""
19
+ stale: false
20
+ - sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
21
+ inspected: true
22
+ inspected_paths:
23
+ - docs/api.md
24
+ - readio/api/projects.py
25
+ - readio/api/types.py
26
+ - tests/test_public_api_projects.py
27
+ - tests/test_public_api_types.py
28
+ observed_behavior: Exposed resolved pronunciation, lexicon, and language-detection settings through the read-only synthesis preflight result, preserving automatic versus explicitly empty lexicon selections; documented the behavior and added tests.
29
+ public_impact: public
30
+ decision: accepted
31
+ target_entry_key: null
32
+ target_entry_id: null
33
+ notes: ""
34
+ stale: false
@@ -0,0 +1,56 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 1
6
+ release_version: v0.3.3
7
+ git_base_ref: v0.3.2
8
+ git_base_sha: fcf02b93783d26ec02252791a1642ea7bb3cc26a
9
+ git_head_ref: HEAD
10
+ git_head_sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
11
+ git_range: fcf02b93783d26ec02252791a1642ea7bb3cc26a..05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
12
+ commit_count: 2
13
+ rows:
14
+ - sha: 3dbc57bc393a396c67606b36fbde0960b5347187
15
+ source_ref: git:3dbc57bc393a396c67606b36fbde0960b5347187
16
+ short_sha: 3dbc57b
17
+ changed_paths:
18
+ - README.md
19
+ - docs/cli.md
20
+ - pyproject.toml
21
+ - readio/cli.py
22
+ - readio/cli_help.py
23
+ - readio/spotify_cli.py
24
+ - tests/test_cli_help.py
25
+ - tests/test_voice_catalog.py
26
+ stats:
27
+ files_changed: 8
28
+ insertions: 515
29
+ deletions: 58
30
+ inspected: false
31
+ inspected_paths: []
32
+ observed_behavior: ""
33
+ public_impact: unknown
34
+ decision: needs_review
35
+ stale: false
36
+ evidence_subject: "feat: better cli help"
37
+ - sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
38
+ source_ref: git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
39
+ short_sha: 05f8940
40
+ changed_paths:
41
+ - docs/api.md
42
+ - readio/api/projects.py
43
+ - readio/api/types.py
44
+ - tests/test_public_api_projects.py
45
+ - tests/test_public_api_types.py
46
+ stats:
47
+ files_changed: 5
48
+ insertions: 125
49
+ deletions: 2
50
+ inspected: false
51
+ inspected_paths: []
52
+ observed_behavior: ""
53
+ public_impact: unknown
54
+ decision: needs_review
55
+ stale: false
56
+ evidence_subject: "feat: add missing parameter to api"
@@ -0,0 +1,48 @@
1
+ schema: releaseledger.entry-batch.v1
2
+ operation: create
3
+ schema_version: 1
4
+ object_type: release_entry_batch
5
+ release_version: v0.3.3
6
+ git_base_ref: fcf02b93783d26ec02252791a1642ea7bb3cc26a
7
+ git_base_sha: fcf02b93783d26ec02252791a1642ea7bb3cc26a
8
+ git_head_ref: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
9
+ git_head_sha: 05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
10
+ include_merges: nontrivial
11
+ entries:
12
+ - kind: added
13
+ summary: Added formatted command help and engine and output-format discovery to the CLI
14
+ status: accepted
15
+ source_refs:
16
+ - git:3dbc57bc393a396c67606b36fbde0960b5347187
17
+ paths:
18
+ - README.md
19
+ - docs/cli.md
20
+ - pyproject.toml
21
+ - readio/cli.py
22
+ - readio/cli_help.py
23
+ - readio/spotify_cli.py
24
+ - tests/test_cli_help.py
25
+ - tests/test_voice_catalog.py
26
+ sources:
27
+ - git:3dbc57bc393a396c67606b36fbde0960b5347187
28
+ prs: []
29
+ issues: []
30
+ contributors:
31
+ - "@holgern"
32
+ - kind: added
33
+ summary: Added lexicon, pronunciation, and language-detection policies to the read-only synthesis preflight API
34
+ status: accepted
35
+ source_refs:
36
+ - git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
37
+ paths:
38
+ - docs/api.md
39
+ - readio/api/projects.py
40
+ - readio/api/types.py
41
+ - tests/test_public_api_projects.py
42
+ - tests/test_public_api_types.py
43
+ sources:
44
+ - git:05f8940cb8d3e1aa3eab6c26eacc3912ba89e36d
45
+ prs: []
46
+ issues: []
47
+ contributors:
48
+ - "@holgern"
@@ -0,0 +1,211 @@
1
+ docs/api.md | 6 ++--
2
+ readio/api/projects.py | 14 ++++++++++
3
+ readio/api/types.py | 6 ++++
4
+ tests/test_public_api_projects.py | 43 +++++++++++++++++++++++++++++
5
+ tests/test_public_api_types.py | 58 +++++++++++++++++++++++++++++++++++++++
6
+ 5 files changed, 125 insertions(+), 2 deletions(-)
7
+
8
+ diff --git a/docs/api.md b/docs/api.md
9
+ index 36229ca..31a4453 100644
10
+ --- a/docs/api.md
11
+ +++ b/docs/api.md
12
+ @@ -132,9 +132,11 @@ build = app.projects.build(project, ProjectBuildRequest(target="export"))
13
+ `app.audiobooks.inspect(epub_path)` returns typed EPUB metadata and chapters. `create_project()` creates an ordinary Readio project; `create_project_result()` additionally returns the selected chapter numbers and scope IDs. `app.audiobooks.export(project, AudiobookExportOptions(...))` writes M4B with chapters using the audiobook-specific API. `SUPPORTED_AUDIOBOOK_FORMATS` contains `m4b`; it is intentionally not in generic `SUPPORTED_AUDIO_FORMATS`.
14
+ `describe_project(project)` describes an existing audiobook after reopening it. The immutable `AudiobookProjectDescription` contains its `ProjectRef`, persisted source path, and persisted `AudiobookProjectChapter` values (chapter number, scope ID, title, and level). Readio loads the project and validates its kind; consumers do not need to inspect project files.
15
+
16
+ -`app.projects.resolve_synthesis(project, request=None, *, voice_bindings=None)` returns a typed `SynthesisResolution` with effective engine, language, voice, model, model source, quality, speed, unit, pause mode, voice level, and supported planning/provider settings. It uses the same project synthesis resolver as `synthesize()`: fatal choices raise public API errors, and non-fatal resolver diagnostics are returned on the result.
17
+ +`app.projects.resolve_synthesis(project, request=None, *, voice_bindings=None)` returns a typed `SynthesisResolution` with effective engine, language, voice, model, model source, quality, speed, unit, pause mode, voice level, planning/provider settings, and pronunciation/resource policies: lexicons, G2P fallback, lexicon data policy, language-detection mode and languages, and experimental-option permission. It uses the same project synthesis resolver as `synthesize()`: fatal choices raise public API errors, and non-fatal resolver diagnostics are returned on the result.
18
+
19
+ -Resolution is for preflight, validation, and UI display. It does not render audio, open an engine session, activate a profile, or mutate persistent synthesis/build state. It reports the same effective selection semantics used by actual project synthesis.
20
+ +`lexicons` preserves three states: `None` means automatic or inherited behavior, an empty tuple means static lexicon layers were explicitly disabled, and a non-empty tuple lists selected layers. These fields expose resolved request/profile values; preflight does not materialize backend runtime defaults that were not resolved.
21
+ +
22
+ +Resolution is read-only and intended for preflight, validation, and UI display. It does not render audio, open an engine session, activate a profile, or mutate project configuration, profile files, manifests, caches, audio, role bindings, or persistent synthesis/build state. It reports the same effective selection semantics used by actual project synthesis.
23
+
24
+ ```python
25
+ from pathlib import Path
26
+ diff --git a/readio/api/projects.py b/readio/api/projects.py
27
+ index e72cb82..4cab874 100644
28
+ --- a/readio/api/projects.py
29
+ +++ b/readio/api/projects.py
30
+ @@ -91,6 +91,14 @@ _OPERATION_DETAIL_KEYS = frozenset(
31
+ )
32
+
33
+
34
+ +def _optional_string_tuple(value: object) -> tuple[str, ...] | None:
35
+ + if value is None:
36
+ + return None
37
+ + if isinstance(value, (tuple, list)):
38
+ + return tuple(str(item) for item in value)
39
+ + raise TypeError(f"expected a list or tuple, got {type(value).__name__}")
40
+ +
41
+ +
42
+ class ProjectService:
43
+ """Create, inspect, plan, and incrementally build persistent projects."""
44
+
45
+ @@ -215,6 +223,12 @@ class ProjectService:
46
+ spacy=resolved.plan.planning.spacy,
47
+ short_sentence=cast(str | None, options.get("short_sentence")),
48
+ provider=adapter.capabilities().voice_binding_namespace,
49
+ + lexicons=_optional_string_tuple(options.get("lexicons")),
50
+ + g2p_fallback=cast(str | None, options.get("g2p_fallback")),
51
+ + lexicon_data_policy=cast(str | None, options.get("lexicon_data_policy")),
52
+ + language_detection=cast(str | None, options.get("language_detection")),
53
+ + detect_languages=_optional_string_tuple(options.get("detect_languages")),
54
+ + allow_experimental=bool(options.get("allow_experimental", False)),
55
+ diagnostics=diagnostics,
56
+ )
57
+
58
+ diff --git a/readio/api/types.py b/readio/api/types.py
59
+ index bbf859e..37b0dcd 100644
60
+ --- a/readio/api/types.py
61
+ +++ b/readio/api/types.py
62
+ @@ -379,6 +379,12 @@ class SynthesisResolution:
63
+ short_sentence: str | None = None
64
+ provider: str | None = None
65
+ diagnostics: tuple[Diagnostic, ...] = ()
66
+ + lexicons: tuple[str, ...] | None = None
67
+ + g2p_fallback: str | None = None
68
+ + lexicon_data_policy: str | None = None
69
+ + language_detection: str | None = None
70
+ + detect_languages: tuple[str, ...] | None = None
71
+ + allow_experimental: bool = False
72
+
73
+ def to_dict(self) -> dict[str, JsonValue]:
74
+ return cast(dict[str, JsonValue], json_value(self))
75
+ diff --git a/tests/test_public_api_projects.py b/tests/test_public_api_projects.py
76
+ index ad24290..178f187 100644
77
+ --- a/tests/test_public_api_projects.py
78
+ +++ b/tests/test_public_api_projects.py
79
+ @@ -248,11 +248,54 @@ def test_resolve_synthesis_uses_profile_and_reader_settings_without_mutation(
80
+ assert resolution.pause_mode == "manual"
81
+ assert resolution.voice_level == "calibrated"
82
+ assert resolution.provider == "fake"
83
+ + assert resolution.lexicons is None
84
+ assert adapter.open_calls == 0
85
+ assert _project_snapshot(project.root) == before
86
+ assert json.loads(json.dumps(resolution.to_dict()))["model"] == "profile-model"
87
+
88
+
89
+ +def test_resolve_synthesis_exposes_pronunciation_options_and_empty_lexicons(
90
+ + tmp_path: Path, monkeypatch
91
+ +) -> None:
92
+ + adapter = Adapter()
93
+ + monkeypatch.setitem(_registry._adapters, "fake", adapter)
94
+ + app = Readio(ReadioConfig(reader=ReaderSettings(engine="fake", voice="fake-voice")))
95
+ + source = tmp_path / "pronunciation.txt"
96
+ + source.write_text("Preflight pronunciation settings.", encoding="utf-8")
97
+ + project = app.projects.create(source, output=tmp_path / "pronunciation.readio")
98
+ + before = _project_snapshot(project.root)
99
+ +
100
+ + request = SynthesisRequest(
101
+ + engine="fake",
102
+ + voice="fake-voice",
103
+ + lexicons=("lex-a", "lex-b"),
104
+ + g2p_fallback="espeak",
105
+ + lexicon_data_policy="installed-only",
106
+ + allow_experimental=True,
107
+ + language_detection="auto",
108
+ + detect_languages=("en-us", "de"),
109
+ + )
110
+ + resolution = app.projects.resolve_synthesis(project, request)
111
+ +
112
+ + assert resolution.lexicons == ("lex-a", "lex-b")
113
+ + assert resolution.g2p_fallback == "espeak"
114
+ + assert resolution.lexicon_data_policy == "installed-only"
115
+ + assert resolution.allow_experimental is True
116
+ + assert resolution.language_detection == "auto"
117
+ + assert resolution.detect_languages == ("en-us", "de")
118
+ + assert isinstance(resolution.lexicons, tuple)
119
+ + assert isinstance(resolution.detect_languages, tuple)
120
+ + assert adapter.open_calls == 0
121
+ + assert _project_snapshot(project.root) == before
122
+ +
123
+ + no_lexicons = app.projects.resolve_synthesis(
124
+ + project, SynthesisRequest(engine="fake", voice="fake-voice", lexicons=())
125
+ + )
126
+ + assert no_lexicons.lexicons == ()
127
+ + assert adapter.open_calls == 0
128
+ + assert _project_snapshot(project.root) == before
129
+ +
130
+ +
131
+ def test_resolve_synthesis_respects_request_overrides_and_voice_bindings(
132
+ tmp_path: Path, monkeypatch
133
+ ) -> None:
134
+ diff --git a/tests/test_public_api_types.py b/tests/test_public_api_types.py
135
+ index 8d4cae2..d2f6c46 100644
136
+ --- a/tests/test_public_api_types.py
137
+ +++ b/tests/test_public_api_types.py
138
+ @@ -87,15 +87,73 @@ def test_audiobook_and_synthesis_preflight_types_are_immutable_and_json_serializ
139
+ pause_mode="auto",
140
+ voice_level="off",
141
+ provider="kokoro",
142
+ + lexicons=("lex-a", "lex-b"),
143
+ + g2p_fallback="espeak",
144
+ + lexicon_data_policy="installed-only",
145
+ + language_detection="auto",
146
+ + detect_languages=("en-us", "de"),
147
+ + allow_experimental=True,
148
+ )
149
+
150
+ description_payload = json.loads(json.dumps(description.to_dict()))
151
+ resolution_payload = json.loads(json.dumps(resolution.to_dict()))
152
+ assert description_payload["chapters"][0]["scope_id"] == "chapter-0003"
153
+ assert resolution_payload["model_source"] == "github"
154
+ + assert resolution_payload["lexicons"] == ["lex-a", "lex-b"]
155
+ + assert resolution_payload["g2p_fallback"] == "espeak"
156
+ + assert resolution_payload["lexicon_data_policy"] == "installed-only"
157
+ + assert resolution_payload["language_detection"] == "auto"
158
+ + assert resolution_payload["detect_languages"] == ["en-us", "de"]
159
+ + assert resolution_payload["allow_experimental"] is True
160
+ with pytest.raises(FrozenInstanceError):
161
+ resolution.engine = "piper" # type: ignore[misc]
162
+
163
+ + legacy_resolution = SynthesisResolution(
164
+ + engine="pykokoro",
165
+ + language="en-us",
166
+ + voice="af_heart",
167
+ + model="kokoro-v1",
168
+ + model_source="github",
169
+ + quality="fp32",
170
+ + speed=1.0,
171
+ + unit="paragraph",
172
+ + pause_mode="auto",
173
+ + voice_level="off",
174
+ + )
175
+ + assert legacy_resolution.lexicons is None
176
+ + assert legacy_resolution.g2p_fallback is None
177
+ + assert legacy_resolution.lexicon_data_policy is None
178
+ + assert legacy_resolution.language_detection is None
179
+ + assert legacy_resolution.detect_languages is None
180
+ + assert legacy_resolution.allow_experimental is False
181
+ + assert set(legacy_resolution.to_dict()) >= {
182
+ + "lexicons",
183
+ + "g2p_fallback",
184
+ + "lexicon_data_policy",
185
+ + "language_detection",
186
+ + "detect_languages",
187
+ + "allow_experimental",
188
+ + }
189
+ +
190
+ + legacy_positional = SynthesisResolution(
191
+ + "pykokoro",
192
+ + "en-us",
193
+ + "af_heart",
194
+ + "kokoro-v1",
195
+ + "github",
196
+ + "fp32",
197
+ + 1.0,
198
+ + "paragraph",
199
+ + "auto",
200
+ + "off",
201
+ + None,
202
+ + None,
203
+ + None,
204
+ + (),
205
+ + )
206
+ + assert legacy_positional.diagnostics == ()
207
+ + assert legacy_positional.lexicons is None
208
+ +
209
+
210
+ def test_synthesis_engine_options_are_json_compatible_and_frozen() -> None:
211
+ request = SynthesisRequest(