Skip to content

Meeting recording (plan +meeting-recording) - #1715

Draft
JSdotNet wants to merge 15 commits into
mainfrom
plan/meeting-recording
Draft

JSdotNet wants to merge 15 commits into
mainfrom
plan/meeting-recording

Conversation

@JSdotNet

@JSdotNet JSdotNet commented Nov 10, 2026 •

Copy link
Copy Markdown
Owner

Summary

Closing pull request for the Backlog plan +meeting-recording: plan/meeting-recording → main. Merging it signs the plan off. It stays a draft until entries 7 and 8 are done.

Entry State
1 - Specify meeting recording in the devbook Landed (#1710)
2 - Record the transcription decision Landed (#1711)
3 - Record a meeting on the phone Landed (#1713)
4 - Send and play recordings Landed (#1796); the sync service deploy with the audio types was started by hand
5 - Handle recording interruptions Landed (#1743)
6 - Transcribe and summarize recordings on the desktop Landed (#1806)
7 - Record a meeting on your own phone Manual test, ready: every entry it waits on has landed
8 - Review the plan for anything missed Waiting on 7
9 - Sign off the plan This pull request

The plan branch also carries three merges of main, done so each wave of entries started from a green base.

What could not be proved

No entry ran on a real Android phone, and the phone → sync → desktop → transcript path never ran end to end: on the build machine Docker had run out of network address ranges, so the sync service's Cosmos emulator never started. Entry 7 is that check. Each entry's own pull request lists what it could not prove.

Still open

  • Each code entry's "Update Backlog's own devbook" sub-item: entries 3–6 left chapters that still say the feature is not built. The proposed wording is in each entry's notes.
  • Entries 4 and 6 were not moved or linked in Backlog: the Backlog MCP server was unreachable when they landed.

Merge Danger

One-way door for data: once a desktop with Foundry configured runs this, meeting audio is sent to Azure and removed from the note after transcription (ADR 0049). Don't merge before entry 7 passes.

Opened by an unattended execute-plan run.

🤖 Generated with Claude Code

JSdotNet and others added 10 commits November 10, 2026 02:07
Meeting recording sub-feature, the requirements for recordings on a note,
the Meeting Recording runtime sequence, ADR 0048 (AAC in an ADTS stream,
16 kHz mono, 32 kbps) and the Android MediaRecorder tech chapter.

Plan +meeting-recording, entry spec-recording (90bc0d51-e8f6-4272-a0e1-a856fa33a047).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The desktop transcribes a downloaded meeting recording through the
gpt-4o-transcribe Foundry deployment once per sha256, remuxing ADTS to
M4A in parts of at most 5 minutes, appends Transcript and Summary to the
note, then removes the audio. Adds the model to tech/cloud.md and the
amendment notes to ADRs 0023 and 0014.

Plan entry 78334a1c-f50b-429a-b21b-17781572cacf (spec-transcription).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…6-4272-a0e1-a856fa33a047

docs(devbook): specify meeting recording on a phone note
…a-b21b-17781572cacf

Resolve the ADR index conflict by listing 0048 (entry 1) before 0049, and
point 0049's Context and audio types at ADR 0048 now that it has landed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…b-429a-b21b-17781572cacf

docs(devbook): record the meeting transcription decision (ADR 0049)
* feat(mobile): record a meeting into a phone note

Record sits in the note editor beside Dictate and Photo. It records AAC in an
ADTS stream (16 kHz mono, 32 kbps, local ADR 0048) through an Android
microphone foreground service with an ongoing notification, shows a recording
bar (dot, timer, level meter, Pause, Stop), and on Stop attaches each part as
"Recording · <duration>". A recording rolls over to a new part at 24 MiB on a
frame boundary with no gap, and a file left by a killed app is attached as
"Recording (interrupted)" on the next start. The web harness records the same
screen through the browser's MediaRecorder for Playwright.

Plan +meeting-recording, entry record-on-phone (07b9cfd0-7289-428f-b952-d2e8ac9e4266).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(devbook): keep ADR 0046 clear of a .dsl path and an undeclared c4 embed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 10027f6)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ow space and a deleted note

- A phone call (AudioManager mode, no new permission) pauses the recording with
  "Paused: a phone call has the microphone." and only Resume starts it again.
- A capture another app silences shows a notice (AudioRecordingCallback, API 29+);
  below that, ten seconds at a flat level shows a hint.
- A start needs about twice a part free; the recording stops cleanly at 200 MB
  free and says why.
- A note deleted elsewhere while recording keeps recording; Stop saves to a new
  note "Recording · <date>".
- A refused microphone reads the same as dictation on each host.

Plan +meeting-recording, entry 5 (4e8927db-2e77-451f-8ba7-81fe87edca40).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…7-451f-8ba7-81fe87edca40

feat(mobile): a meeting recording survives calls, silenced capture, low space and a deleted note
…oth sides

The sync service took no audio, so every recording a phone note carried was
refused with a 415 and the note stayed "Waiting to sync". Recordings now
travel like photos and play where they land.

- SyncAttachmentLimits.DefaultContentTypes takes audio/aac, audio/mp4 and
  audio/x-m4a (ADR 0048 §5); the phone's own audio exception goes, so the
  phone and the service cannot disagree.
- A shared AudioPlayer component plays a file through a blob URL built from
  a stream, released on dispose; a missing or unreadable file is said in
  words. It has its own storybook page.
- The phone's attachment tile plays a recording while its bytes are still on
  the phone (drafts/ or outbox/).
- The desktop Inbox item detail plays a downloaded recording.

Backlog plan +meeting-recording, entry c2560f69-ed55-4f44-a273-a91f0bedfd8d.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
github-actions Bot and others added 4 commits November 11, 2026 22:14
…5-4f44-a273-a91f0bedfd8d

feat(sync): send meeting recordings to the desktop and play them on both sides
Implements local ADR 0049 (plan +meeting-recording, entry 6
transcribe-on-desktop, 7dbb8d53-02af-4cf5-b715-3dbd9cfd7c03).

- AdtsRemuxer lifts AAC frames out of an ADTS stream into M4A without
  re-encoding, cut on frame boundaries into parts of at most 5 minutes,
  each with its offset.
- AzureFoundryTranscriptionClient gains an api-key credential and a part
  prompt; on the desktop its options are read from AzureFoundrySettings
  on every call, with a new TranscriptionDeployment setting
  (default gpt-4o-transcribe) shown in Settings > AI.
- AzureFoundryInboxRecordingTranscriber answers the Inbox's new
  IInboxRecordingTranscriber port: parts out with the previous part's
  last words as prompt, no language, no speaker labels, timestamps per
  part, then a summary with action items over the chat deployment.
- TranscribeRecordingsCommand runs in a background worker once a note's
  recording has downloaded, once per sha256 (records kept in the inbox
  folder), re-reads the note, appends ## Transcript and ## Summary and
  removes the recording in the same save; failure leaves both in place.
  A phone edit that drops the sections or names the file again is
  repaired from the kept record.
- The sync service releases the blob of a file a note edit drops, read
  from the note the replica held, once the edit has landed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…f-4cf5-b715-3dbd9cfd7c03

feat(inbox): transcribe and summarize meeting recordings on the desktop (meeting-recording 6)

This branch has not been deployed

No deployments
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