0.2.58 (2026-06-02) ------------------- - Changed Wagtail-admin Voxhelm transcript generation to report missing ``CAST_VOXHELM_API_BASE`` / ``CAST_VOXHELM_API_KEY`` plus invalid boolean or numeric configuration as admin error messages instead of server errors. - Made transcript artifact replacement write-safe: Voxhelm regeneration, speaker-label rewrites, known-speaker application, and private suggestion sidecar updates now write fresh replacement objects first, persist the transcript row, and delete superseded objects only after the database points at the replacements. - Clarified Voxhelm token handling in the Wagtail settings UI and deployment docs: an existing token keeps the password field blank by design, and sites can keep tokens in deployment-managed environment variables. - Moved episode transcript generation status out of the Wagtail page action menu and into the episode edit form so status text and edit links no longer overlap the save dropdown. - Added transcript samples and timestamp seek controls to the Wagtail transcript speaker-mapping form so editors can identify diarized speakers before assigning them to episode contributors. - Transcript speaker mapping is now durable and non-destructive: the Wagtail editor stores approved raw-label mappings to episode contributors or one-off display names, keeps Podlove, DOTe, and WebVTT transcript files unchanged, marks old approvals as needing review when artifacts are replaced, keeps disappeared labels as inactive history, and applies approved mappings at read time before the public speaker-label sanitizer. One-off display names must not duplicate raw transcript speaker labels, so unmapped anonymous labels cannot become public through a value collision. - Stabilized transcript speaker-mapping fingerprints on S3-style storage so approved public mappings remain current even after the same transcript instance has already opened Podlove, DOTe, or WebVTT artifacts. - Fixed episode publishing from the Wagtail editor by no longer rendering a hidden ``action-publish`` field that could shadow Wagtail's publish button. - Fixed episode contributor editing so links for a contributor created after the episode edit form was opened become selectable without first saving and reloading the episode draft. - Added contributor defaults for episode assignments: contributors now carry a default role, and the first ordered contributor link is preselected when a contributor is added to an episode. - Voxhelm transcript generation now sends the episode contributor count as a diarization speaker-count hint and includes it in the task reference, so regenerating multi-speaker episodes can force the expected number of speakers. Episode-level generation uses that episode's contributors; audio-level generation only sends this hint when the audio belongs to exactly one episode. - Audio objects now have a transcript diarization mode with ``inherit``, ``enabled``, and ``disabled`` states. Disabled mode submits future Voxhelm jobs without diarization or speaker-count hints and hides stored speaker labels from public transcript output without rewriting the stored transcript files. - Public transcript and Podlove player output now sanitize speaker metadata against live episode contributors. Regenerated transcript text can still appear immediately for shared audio, but draft-only contributor names and unmapped diarization labels are hidden from player JSON, transcript JSON, HTML transcripts, feed-linked PodcastIndex output, and applicable WebVTT output. Public transcript endpoints expose no speaker labels when the transcript is not connected to a live episode yet. - PodcastIndex transcript JSON now returns ``404`` when a transcript points to a missing DOTe file instead of returning an empty ``200`` response. Wagtail episode previews also omit live-only public transcript links, so draft previews do not expose transcript URLs that would 404. - Added private contributor voice references: contributors can store reviewed clean-solo clips or source ranges into existing audio as private, admin-only known-speaker reference material. References require confirmed consent before approval, support a protected ``"cast_voice_references"`` ``STORAGES`` alias for uploaded clips, and are excluded from public contributor APIs, feeds, theme context, repository serialization, and public transcript output. This entry covers the private storage foundation; sending references to Voxhelm and reviewing the returned suggestions are described in the known-speaker entries below. - Added a known-speaker recognition opt-in (``CAST_VOXHELM_KNOWN_SPEAKER_ENABLED`` or the site-level Wagtail Voxhelm setting). When enabled, diarized Voxhelm jobs for an episode also send the approved voice references of that episode's expected contributors as known-speaker reference material (source ranges into existing audio or uploaded clips), never public profile URLs. Hidden contributors are excluded unless a reference explicitly opts in. - Voxhelm-returned known-speaker suggestions are stored as a private ``Transcript.speakers`` sidecar (per-segment candidates, confidence, margin, uncertainty, and raw diarization labels) in protected storage. They are reviewable editorial state and are excluded from public transcript output. Known-speaker results stay suggestions: public speaker identities are not shown until reviewed and approved. - Added a known-speaker review panel to the Wagtail transcript edit view. It shows the confident/uncertain suggestion counts and the confident speaker distribution so editors can see uncertainty before approving. An "Approve and apply confident suggestions" action writes only confident (non-uncertain) speaker names into the public Podlove, DOTe, and WebVTT transcript output, matched to segments or cues by start time. By default, uncertain segments between known speakers are smoothed by carrying the surrounding confident speaker forward, so the public transcript reads continuously instead of showing speaker-less paragraphs; pass ``smooth=False`` to label only confident segments. The private suggestion sidecar (including the uncertainty flags) is preserved for audit and re-application. - Known-speaker review now supports per-segment approve, reject-to-blank, and correction decisions from the Wagtail transcript edit view. Segment decisions are stored additively as private ``editor_decision`` metadata in the ``Transcript.speakers`` sidecar, override the confident/smoothed bulk result, and are applied to matching Podlove, DOTe, and WebVTT entries by start time while preserving the raw Voxhelm metadata for audit. - Added a Wagtail transcript voice-reference candidate picker. Diarized Podlove transcripts now derive clean solo source-range candidates grouped by resolved speaker/contributor context, audition them with bounded playback in the existing transcript audio player, and create pending or explicitly consent-gated approved ``ContributorVoiceReference`` rows without editors typing raw ``start_seconds`` / ``end_seconds`` for the normal workflow. Candidate ranges split across large untranscribed gaps so a same-speaker label cannot produce one proposed reference that silently spans unrelated audio. - Added ``CAST_POST_BODY_BLOCKS`` so projects can append custom Wagtail blocks independently to the ``overview`` and ``detail`` sections of ``Post.body`` without editing django-cast's ``ContentBlock`` class or leaking consumer block paths into cast migrations.