Skip to content

feat(overview): show which notes still have their original audio - #470

Open
Optic00 wants to merge 2 commits into
stenolabs:mainfrom
Optic00:feat/overview-audio-indicator
Open

feat(overview): show which notes still have their original audio#470
Optic00 wants to merge 2 commits into
stenolabs:mainfrom
Optic00:feat/overview-audio-indicator

Conversation

@Optic00

@Optic00 Optic00 commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

keep_recordings defaults off, so for most notes the source recording is gone. Everything that needs it is then quietly unavailable - re-transcribe, speaker listening samples, any future re-diarization - and nothing said so until you opened a note and found the action missing.

list-meetings now returns has_audio, and the overview row shows a small audio glyph beside the duration when it is true. Only when true: absence is the normal case, so a "missing" marker on most rows would be noise rather than information.

Two implementation notes

Derived from one directory listing of recordings/, not a per-meeting existence check. This command is on the cold-start path and its own docstring calls it optimized for fast loading, so the cost must not scale with library size. A regression test counts the listings to hold it there.

Matching is on the stem alone, never an extension whitelist: the capture pipeline saves whatever the source produced (.webm, .wav, .m4a, .mp3), so a whitelist would silently mark imported meetings audio-less.

Two commits: the feature, and a follow-up fixing two stem-matching edge cases a review turned up - a directory named like a recording, and a note whose own name contains _summary.

Verified

7 new backend tests, 1 new T1 spec, typecheck:renderer clean, ruff 29 - identical to main.

Optic00 added 2 commits August 2, 2026 21:52
keep_recordings defaults off, so for most notes the recording is gone -
and everything that needs it is then quietly unavailable: re-transcribe,
the speaker panel's listening samples, and any future re-diarization.
Until now nothing said so until you opened a note and found the action
missing.

list-meetings gains `has_audio`, derived from ONE directory listing of
recordings/ rather than a per-meeting existence check: this command is on
the cold-start path and its own docstring calls it "optimized for fast
loading", so the cost must not scale with library size. A regression test
counts listdir calls to hold it to that. Matching is on the stem alone,
never an extension whitelist - the capture pipeline saves whatever the
source produced (.webm, .wav, .m4a, .mp3), so a whitelist would silently
mark imported meetings audio-less.

The row shows a small audio glyph beside the duration, and only when the
audio is present: absence is the normal case, so a "missing" marker on
most rows would be noise rather than information.
From a cross-family review (Codex) of the previous commit.

A directory in recordings/ named like a recording ("note.wav/") made
os.listdir report the note as having audio it does not have. Now files
only, via scandir so it stays a single listing.

The stem came from `f.stem.replace('_summary', '')`, which strips EVERY
occurrence: a note actually named "client_summary.v1" came back as
"client.v1". That was harmless while the stem only fed the dedup set,
where a wrong-but-consistent key still dedups - matching it against real
filenames on disk is what makes it visible. Now strips only a trailing
marker, the same rule reprocess and app/main.js's delete path already use.

Two further copies of the replace() form live in
_enumerate_meeting_stems (used by the speaker backfill). Left alone
deliberately: different function, outside this change, and worth its own
look rather than being folded into an unrelated PR.
@Optic00
Optic00 requested a review from ruzin as a code owner August 2, 2026 20:09
@Optic00

Optic00 commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator Author

Heads-up so this doesn't arrive silently: I merged these two commits into #473 (the speaker-review stack). I needed the audio indicator while testing that branch against real recordings, and one build was easier to reason about than two.

Consequence: if #473 lands on feat/speaker-diarization first, this feature comes along with it without this PR ever being reviewed. Git handles the overlap either way — same commits, common ancestor.

Either way works for me. Leave this open for its own review and I'll drop the merge from #473, or review it here and I'll close this once #473 lands. Your call.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant