Releases: AmirMotefaker/KetabCast
Release list
v0.2.0-beta.5.1.14 - Checkpoint Recovery Seeding
Checkpoint Recovery Seeding
- PR: #81
- PR head: bbc3b49
- exact merge SHA: a10d744
- PR CI: 31677868134
- post-merge CI: 31677926800
- Pages: 31677926831
- trigger production run: 31675910818
- next resume checkpoint artifact: 9171645600
- artifact digest: sha256:06089a026ea4ba6f2dde77ec39ab1740e70d0122c73b6b8f85ed46511dbd5ff5
A provenance-verified checkpoint reuse now reconstructs the successful transcript hash state used by the existing bounded content_blocked recovery path. Unverified resume cannot seed this state and invalid hashes fail closed.
Existing content_blocked recovery caps, classifier-block limits, free-tier handling and hard network request caps are unchanged.
No production dispatch or media/player promotion is performed by this release.
v0.2.0-beta.5.1.13 - Stale Pending Interaction Budget
Stale Pending Interaction Budget
Exact lifecycle
- PR: #79
- PR head: fc13890
- Merge SHA: d002d3c
- PR CI: 31675017445
- Post-merge CI: 31675079962
- Pages: 31675080011
- Same-ID timeout source run: 31672388904
- Next resume checkpoint artifact: 9170553292
- Artifact digest: sha256:13e30e039e6da33d3c989db59627cadd41b8941eae498bac3ea952ba0d0c3a3a
Released contract
A pending provider Interaction ID is bounded to two polling/materialization windows. When that budget is exhausted, the stale ID is retired before further GET polling; the normal renderer path may then make one fresh generation attempt for the same chunk under the existing request cap, quota handling, transient retry and content-safety rules.
No production dispatch or media/player promotion is performed by this release.
v0.2.0-beta.5.1.12 — Pending Interaction Checkpoint
Pending Interaction checkpoint hotfix
Exact lifecycle evidence
- PR: #77
- PR head: 3b01d53
- PR CI: 31668781391
- Merge SHA: 81b120b
- Post-merge CI: 31669113741
- Post-merge Pages: 31669113732
- Trigger failed production resume: 31623180788
- Trigger failed checkpoint artifact: 9152558220
Released fix
- accepted Gemini Interaction ID is persisted before long polling;
- pending Interaction provenance is bound to book/role/voice/transcript/chunk/source run/source SHA;
- verified pending Interaction metadata can be seeded from failed artifacts;
- a verified same ID is resumed before any new generation POST;
- pending sidecar is cleared only after a finalized WAV checkpoint exists;
- existing request hard-cap, 429 handling, and content-safety behavior remain fail-closed.
Production
No production dispatch or media/player promotion is performed by this release lifecycle.
v0.2.0-beta.5.1.9 - Gemini TTS Long Materialization Window
Gemini completed-audio materialization window
Trigger:
- controlled Batch A run 31597210578
- source v0.2.0-beta.5.1.8 / 87da695
- Atomic Habits Sulafat chunks succeeded
- Atomic Habits Schedar chunk 1 returned an accepted completed Interaction but exposed no audio through six same-ID GET polls
Fix:
- same-ID polling interval remains 5 seconds
- existing Interaction timeout remains 15 minutes
- completed/no-audio bound derives to 180 same-ID GET polls
- success-path deterministic proof returns audio on GET 12
- persistent no-audio remains fail-closed
- no duplicate generation POST after accepted Interaction ID
- generation POST hard cap remains 10
- content_blocked recovery POST hard budget remains 2
- response_format remains type=audio
- transcript and safety settings unchanged
Lifecycle:
- Issue #70
- PR #71
- final PR head: 4863683
- merge/release SHA: e52eea2
- PR CI: 31599995316
- main CI: 31601039576
- Pages deploy: 31601039609
Safety:
- no Batch A dispatch in this release step
- no media-dual-v0.2.0-beta.6 creation
- no episodes.json/player/Piper promotion
v0.2.0-beta.5.1.8 - Gemini TTS Content-Blocked Recovery
Gemini TTS content_blocked classifier recovery
Trigger:
- controlled Batch A run 31587048578
- source v0.2.0-beta.5.1.7 / 30c75a0
- Atomic Habits Sulafat chunks succeeded; Schedar chunk 1 then returned HTTP 400 content_blocked
Fix:
- explicit speech-synthesis preamble
- spoken transcript START/END boundaries
- transcript preserved exactly
- no safety setting changes
- recovery only for exact transcript SHA already synthesized successfully in the same process
- every actual recovery-prompt POST consumes the global recovery budget
- generic retryable recovery responses also consume recovery budget
- max recovery POSTs = 2 globally
- third recovery POST refused before network fetch
- overall generation POST hard cap remains 10
Deterministic proof:
- primary content_blocked -> recovery POST #1 -> retryable 500
- recovery POST #2 -> retryable 500
- later eligible recovery POST #3 is refused before network fetch
- unseen transcript fails closed
- completed/no-audio materialization tests remain PASS
Lifecycle:
- Issue #68
- PR #69
- final PR head: f3f9d42
- merge/release SHA: 87da695
- PR CI: 31594232501
- main CI: 31594649547
- Pages deploy: 31594649570
Safety:
- no Batch A dispatch in this release step
- no media-dual-v0.2.0-beta.6 creation
- no episodes.json/player/Piper promotion
v0.2.0-beta.5.1.7 - Gemini TTS Audio Materialization
Gemini TTS completed-Interaction audio materialization
Fixes the Batch A failure where an accepted Gemini Interaction returned status=completed before audio was visible in the initial snapshot.
Runtime behavior
- completed/no-audio preserves the accepted Interaction ID;
- up to 6 bounded same-ID GET materialization polls;
- GET polling remains separate from the generation POST hard cap;
- generation POST hard cap remains 10;
- no duplicate generation POST after an Interaction ID is accepted;
- response_format remains type=audio with no delivery property;
- fail closed with TTS_INTERACTION_COMPLETED_WITHOUT_AUDIO after the bound.
Deterministic runtime proof
- success: completed/no-audio -> same-ID GET #1 no audio -> GET #2 audio -> PASS;
- failure: persistent completed/no-audio -> exactly 6 same-ID GETs -> fail closed;
- same ID, poll numbering, API-key forwarding and poll interval are asserted.
GitHub lifecycle
- Issue #66
- PR #67
- PR final head: 1a3ba20
- merge/release SHA: 30c75a0
- PR CI run: 31585178328
- main CI run: 31585940997
- Pages deploy run: 31585940957
Trigger evidence
- failed controlled Batch A run: 31572749438
- failed source tag: v0.2.0-beta.5.1.5
- failed source SHA: 686f5ff
Safety boundary
This release does not dispatch Batch A, does not modify production episode metadata/player/Piper audio, and does not publish media-dual-v0.2.0-beta.6. Batch A remains separately controlled under #53.
v0.2.0-beta.5.1.6 - Approved Voice Preview
Approved voice preview
Published the two human-approved narration previews on GitHub Pages:
- Sulafat / Warm — female product voice
- Schedar / Even — male product voice
GitHub lifecycle
- Issue #64
- PR #65
- feature SHA: 22cb9e0
- merge/release SHA: 09e220f
- main CI run: 31582037891
- Pages deploy run: 31582037942
Provenance
- Voice Lab run: 31462344234
- artifact id: 9090398542
- source SHA: fa45671
Preview SHA-256
- Sulafat: 46b523fe8aad6472de6e1fdf34a601b7892822e9fb2e1d22d120a43f5f65cc7b
- Schedar: ca763d44ac0062dea18985b4c15fdfebb2fe658be817df88cc8612a7feda6ff1
Safety boundary
Production episode metadata and existing Piper audio remain unchanged. Full dual-voice episode generation remains tracked separately in #53.
Zobdino v0.2.0-beta.5.1.5 — Gemini TTS Audio Response Format Contract
Zobdino v0.2.0-beta.5.1.5 — Gemini TTS Audio Response Format Contract
Trigger: Batch A run 31570098554 failed with HTTP 400
Audio delivery mode is not supported.
Fix:
- remove explicit response_format.delivery
- preserve response_format.type=audio
- preserve Interaction completion polling
- preserve audio data/URI extraction
- preserve no duplicate generation POST
- preserve Retry Policy v2 and hard cap 10
Evidence:
- Issue #62
- Batch A #53
- PR #63
- PR CI https://github.com/AmirMotefaker/KetabCast/actions/runs/31571948969
- post-merge CI https://github.com/AmirMotefaker/KetabCast/actions/runs/31572009128
- Pages https://github.com/AmirMotefaker/KetabCast/actions/runs/31572009033
- exact SHA 686f5ff
- live https://amirmotefaker.github.io/KetabCast/
No TTS generated.
No workflow/episodes/Piper/player mutation.
Dual Voice remains 0/10.
media-dual-v0.2.0-beta.6 remains absent.
Zobdino v0.2.0-beta.5.1.4 — Gemini TTS Interaction Completion Polling
Zobdino v0.2.0-beta.5.1.4 — Gemini TTS Interaction Completion Polling
Trigger
Controlled Batch A run 31565336801 exposed a successful-Interaction handling
gap: two fast HTTP-success responses did not contain extracted inline audio,
the renderer submitted duplicate generation POSTs, and the third POST hit a
transient 429.
Fix
- explicit audio delivery=inline
- accepted Interaction IDs are polled using GET /interactions/{id}
- no duplicate generation POST while an accepted Interaction is pending
- inline audio data + audio URI extraction
- 5-second polling / 15-minute timeout
- transient GET Retry-After/backoff
- safe metadata-only diagnostics
- generation POST hard cap remains 10
- GET poll requests recorded separately
- deterministic Interaction contract self-tests
Safety
No TTS generated by this hotfix.
No workflow/media/Piper/episodes/player state changed.
Dual Voice remains 0/10.
media-dual-v0.2.0-beta.6 remains absent.
Evidence
Issue: #60
Batch A: #53
PR: #61
PR CI: https://github.com/AmirMotefaker/KetabCast/actions/runs/31568215087
Post-merge CI: https://github.com/AmirMotefaker/KetabCast/actions/runs/31568262304
Pages: https://github.com/AmirMotefaker/KetabCast/actions/runs/31568262300
Exact SHA: 2bd4fac
Live: https://amirmotefaker.github.io/KetabCast/
Source failure: https://github.com/AmirMotefaker/KetabCast/actions/runs/31565336801
Zobdino v0.2.0-beta.5.1.3 — Dual-Voice Media Publication Hardening
Zobdino v0.2.0-beta.5.1.3 — Dual-Voice Media Publication Hardening
- recovery artifact before media publication
- canonical asset filename copy/upload
- canonical copy SHA/bytes verification
- legacy file#label removed
- legacy --clobber=false removed
- overwrite refusal retained
- GitHub digest/bytes/public download-back verification retained
No audio generated.
Production episodes/Piper/player unchanged.
Dual Voice remains 0/10.
media-dual-v0.2.0-beta.6 remains absent until controlled Batch A.
Issue: #58
Batch A: #53
PR: #59
PR CI: https://github.com/AmirMotefaker/KetabCast/actions/runs/31564675168
Post-merge CI: https://github.com/AmirMotefaker/KetabCast/actions/runs/31564728223
Pages: https://github.com/AmirMotefaker/KetabCast/actions/runs/31564728152
Exact SHA: 3b10a6f
Live: https://amirmotefaker.github.io/KetabCast/