VOICE: revive and merge local Parakeet transcription (job/voice, #373) + backfill-transcribe existing voice memos #619
Open
opened 2026-10-01 10:13:05 +00:00 by kayg
·
56 comments
No Branch/Tag specified
dev
wip/restyle-notes
wip/restyle-mailmoney
wip/previewcard-1098
wip/palette2-1123
wip/palette-1093
wip/onboard2-1141
wip/onboard-1141.aborted-early
wip/onboard-1141
wip/notifloop-1194
wip/nlpchip-1127
wip/morph-1104
wip/merge-round-7c5
wip/merge-round-7c4
wip/merge-round-7c3
wip/merge-round-7c2
wip/merge-round-7c
wip/mchrome-1084
wip/mailghost2-1094
wip/mailghost-1094
wip/kbpreview2-1118
wip/kbpreview-1118
wip/kanban-1092
wip/importhang-1121
wip/hiderev-1153
job/restyle-mailmoney
wip/hide4-1153
wip/hide3-1153
wip/hide2-1153
wip/hide-1153
wip/editreg-1132
wip/editorrail3-1113
wip/editorrail2-1113
wip/editorrail-1113
wip/e2e-b2-1071
wip/e2e-b-1071
wip/draw4-1101
wip/draw3-1101
wip/draw2-1101
wip/draw-1101
wip/directory-1199-r
wip/directory-1199
wip/delete-1119
wip/collabrev-1197
wip/collabloss-1197
wip/cards2-1083
wip/cards-1083
wip/canvas-visual
wip/canvasvis2-976
wip/calhdr-1112
wip/calcards-1115
wip/browserfix
wip/blocks-1125
job/onboard-1141
wip/allday-1107
wip/agenda-decks
wip/agenda-1086
wip/adv7c-1105
wip/txentry-1198
job/restyle-notes
wip/trayicons2-1095
wip/trayicons-1095
wip/tagperf-1186
wip/sidebar3-1094
wip/rev2-webperf
wip/rev2-money-ident
job/adv-1202
job/merge30
job/notifloop-1194
job/collabloss-1197
job/hide-1153
job/perf-1124
job/perf2-1124
job/tocrail-1191
job/restyle-settings
wip/restyle-settings
job/segmented-1200
job/tagperf-1186
wip/segmented-1200
job/restyle-files
job/tagdnd-1187
job/cards-1179
wip/cards2-1179
wip/cards-1179
wip/tocrail-1191
wip/tagdnd-1187
wip/restyle-files
wip/perf-1124
wip/merge30j
job/wizchoices-1140
wip/wizchoices-1140
wip/restyle-1190
job/moneyfmt-1180
job/txentry-1198
wip/moneyfmt2-1180
wip/moneyfmt-1180-r
wip/moneyfmt-1180
job/pillglass-1189
job/flags-1181
wip/flags-1181
job/restyle-1190
job/restyle-search
job/settingsreg-1195
job/wizard-1140
site/website
wip/wizardrev2-1140
wip/wizardrev-1140
wip/wizard5-1140
wip/wizard4-1140
wip/wizard3-1140
wip/wizard2-1140
wip/wizard-1140
wip/pillglass-1189
wip/settingsreg-1195
job/merge29
job/fu-1171
wip/merge29j
wip/fu-1171
job/fu-1166
job/directory-1199
job/proflog-1204
job/txresearch-1188
wip/fu-1166
job/merge28
job/search-1066
wip/search-1066
wip/merge28j
job/gateslot-1182
job/bulkimport-1157
job/mailnet-1160
wip/mailnetrev-1160
wip/mailnet-1160
wip/bulkrev-1157
wip/bulkimport-1157
job/startup-1161
wip/startup-1161
job/merge27
job/linkcards-1151
wip/linkcards3-1151
wip/linkcards2-1151
wip/linkcards-1151
job/traydate-1144
wip/traydate3-1144
wip/traydate2-1144
wip/traydate-1144
job/draw-1101
wip/merge27j
job/blockpill-1152
wip/blockpill3-1152
wip/blockpill2-1152
wip/blockpill-1152
job/minihover-1149
wip/minihover2-1149
wip/minihover-1149
job/merge25
wip/merge25-r
wip/merge25b
wip/merge25
job/inspector-1129
job/tags-1110
wip/inspector3-1129
wip/inspector2-1129
wip/inspector-1129
wip/tagsrev-1110
wip/tags2-1110
wip/tags-1110
job/dates-1148
wip/datesrev-1148
wip/dates2-1148
wip/dates-1148
job/licence-1145
wip/licence2-1145
wip/licence-1145
job/selfhost-1156
job/merge23
wip/merge23
job/tagfilter-1109
wip/tagfilter2-1109
wip/tagfilter-1109
job/kbd-1134
wip/kbd2-1134
wip/kbd-1134
job/palfoot-1137
wip/selfhost-1156
wip/palfoot2-1137
wip/palfoot-1137
job/toggle-1158
wip/toggle-1158
job/kbpreview-1118
job/docratchet-1155
job/perflint-1133
job/devtests-1159
wip/docratchet-1155
wip/devtests-1159
job/segv-1136
wip/toast-1142
wip/segv-1136
job/toast-1142
job/blockreload-1147
wip/blockreload-1147
job/font-1150
wip/font-1150
job/importui-1120
job/minimonth-1149
wip/importui-1120
wip/minimonth-1149
job/depcheck-1146
wip/perflint-1133
wip/depcheck-1146
job/calcards-1115
job/blocks-1125
job/plus-1128
job/shift-1138
wip/plus2-1128
wip/plus-1128
wip/shift-1138
job/moneyfid-1130
job/editorrail-1113
wip/moneyrev-1130
wip/moneyfid-1130
job/noext-851
wip/noext-851
wip/noext3-851
wip/noext2-851
job/week-1135
wip/week-1135
job/editreg-1132
job/smoke-1122
wip/smoke-1122
job/docs-1143
job/palette2-1123
job/calhdr-1112
job/nlpchip-1127
job/mailghost-1094
job/reconnect-1131
wip/reconnect-1131
job/trayicons-1095
job/delete-1119
job/importhang-1121
job/cards-1083
job/palette-1093
job/mchrome-1084
job/e2e-a-1071
job/canvas-visual
job/previewcard-1098
job/allday-1107
wip/e2e-a2-1071
wip/e2e-a-1071
job/e2e-b-1071
job/adv7c-1105
job/kanban-1092
job/agenda-1086
job/merge-round-7c
job/morph-1104
wip/surfaces-p2
job/merge-round-9
wip/merge-round-9
job/7cfix-small
wip/7cfix-small
job/mailui-1078
job/merge-round-8
wip/merge-round-8
wip/mailui-1078
job/mailround-1038
job/applemail-accept
wip/settitle-1068
wip/mailround2-1038
wip/mailround-1038
wip/e2e-7b
job/crash-1069
wip/crash-1069
job/searchlost-1066
wip/searchlost-1066
job/7b-reconcile
job/flake-1065
wip/flake-1065
wip/merge-round-7b7
wip/merge-round-7b6
wip/merge-round-7b5
wip/merge-round-7b4
wip/7b-reconcile
job/appupdate-1059
job/nfd-1044
wip/appupdate-1059
job/e2e-7b
job/loop-1062
wip/loop-1062
job/pdfprev-1045
job/invtoggle-1053
wip/pdfprev-1045
wip/nfd-1044
wip/invtoggle-1053
job/7bfix-e2e
job/mailstress-b
wip/7bfix-e2e
wip/mailstress-b
job/7bfix-adv
wip/7bfix-adv
job/mailstress-a
job/stack-1054
wip/stack-1054
wip/mailstress-a
job/mailstress-1038
wip/mailstress-1038
job/upload500-1051
wip/upload500-1051
job/share-1034
wip/share-1034
job/syncerr-1037
job/7bfix-photos
wip/7bfix-photos
job/paste-1036
job/setside-1039
wip/setside-1039
wip/paste-1036
job/lease-1042
wip/syncerr-1037
wip/lease-1042
job/7bfix-data
job/passkeybind-1043
wip/apprevoke-1041
job/invite-1035
wip/invite-1035
job/merge-round-7b2
wip/merge-round-7b2
job/mailproxy-486
job/apprevoke-1041
job/rebuild-1033
job/pillborder-1029
wip/pillborder-1029
wip/mailproxy-486
wip/applemail-486
job/headless-998
wip/headless-998
job/groups-1028
wip/groups-1028
job/rebuildwarn-1016
wip/rebuildwarn-1016
job/startup-1011
wip/startup-1011
job/monthpill-1009
job/bgthumb-1025
job/sharetitle-1012
wip/monthpill-1009
wip/bgthumb-1025
wip/sharetitle-1012
job/canvas-cards-977
wip/canvas-cards-977
job/canvas-pencil-978
job/canvas-sketch-990
wip/canvas-sketch-990
wip/canvas-pencil-978
job/canvas-files-989
wip/canvas-files-989
job/canvas-collab-991
wip/canvas-collab-991
job/weekscroll-1018
wip/weekscroll-1018
wip/canvas-core-976
job/canvas-core-976
job/round-drag
wip/round-drag
job/round-settings
job/browserfix
wip/oapi-974
job/oapi-974
job/hist2-integrate
job/mailhtml-726
wip/mailhtml-726
wip/hist2-integrate
job/moneyfu-984
job/drag-1015
wip/drag-1015
job/rename-1017
wip/rename-1017
job/hist2-api
wip/hist2-api
job/oneacct-1014
wip/oneacct-1014
wip/moneyfu-984
job/hist2-bench
job/hist2-restore
wip/hist2-bench
job/hist2-write
job/hotfix-724
wip/hotfix-724
wip/hist2-write
wip/hist2-restore
job/hist2-store
job/hist2-ui
wip/hist2-ui
wip/hist2-store
job/searchstarve-965
job/shutdown-963
wip/shutdown-963
wip/pubedit-981
job/pubedit-981
job/analytics-973
wip/searchstarve-965
job/authflash-850
job/weeklane-969
job/pvtitle-1004
job/hist-975
wip/authflash-850
job/voicepill-617
wip/pvtitle-1004
job/headring-1003
wip/weeklane-969
wip/voicepill-617
wip/headring-1003
wip/analytics-973
job/agentscope-980
wip/thumbsandbox-988
job/thumbsandbox-988
wip/hist-975
job/links-856
wip/links-856
job/davetag-966
wip/davetag-966
job/filesstorm-1000
job/hoverpad-725
wip/filesstorm-1000
job/ffmpegblas-993
job/merge-round-7a
wip/hoverpad-725
wip/ffmpegblas-993
job/nowdot-1002
wip/verify-7a
job/noteid-857
wip/nowdot-1002
wip/noteid-857
wip/merge-round-7a
wip/agentscope-980
job/imapedge
job/a11yfix2
wip/imapedge-941
wip/imapedge
wip/a11yfix2
job/notetask-986
job/logheading
wip/logheading-998
job/textthumb-652
job/photolive-987
wip/photolive-987
job/davactive-983
job/savefix-985
job/tabicons-607
wip/davactive-983
wip/tabicons-607
wip/notetask-986
wip/savefix-985
job/dirid-627
job/buildspeed-1007
wip/dirid-627
job/agenda-decks
job/perfguards-impl
job/undo-a11y
wip/undo-a11y
job/mailperf
job/wal-824
wip/settings-50
job/settings-50
job/notesfilter-606
wip/notesfilter-606
job/surfaces-p2
wip/wal-824
job/maillayouts
wip/mailperf
wip/maillayouts
job/taskmeta-659
job/money-ident
wip/money-ident
wip/taskmeta-659
job/errstates
wip/perfguards-impl
job/headings-881
wip/headings-881
wip/errstates
job/voice-619
job/gaps-827
job/notesperf
wip/notesperf
wip/voice-619
job/hddsql-549
job/perf-stream-668
wip/perf-stream-668
wip/deeplinks-fix
job/deeplinks-fix
job/authfix
job/docsfix-rust
wip/docsfix-rust
job/webperf
job/docsfix-web
job/datafix2
job/webdav-lock-476
job/copyfix
wip/copyfix
wip/webperf
job/focus-658
wip/protofix
job/mediafix
job/protofix
wip/mediafix
job/agentfix
job/hhmm-724
wip/agentfix
job/undo-722
job/reuse
wip/webdav-lock-476
wip/reuse
job/scopefix
job/datafix
wip/hhmm-724
wip/undo-722
job/surfaces-p1
wip/hddsql-549
job/voicememos-618
wip/datafix2
wip/surfaces-p1
job/fix-940
wip/fix-940
job/blaze-surfaces
wip/datafix
wip/blaze-surfaces
job/taskday-655
job/linknav-639
wip/linknav-639
wip/gaps-827
job/isolation-707
job/audiophotos-720
wip/audiophotos-720
job/advfind-664
wip/voicememos-618
wip/taskday-655
wip/isolation-707
wip/advfind-664
wip/scopefix
wip/focus-658
job/testgaps
wip/testgaps
job/overscroll-718
wip/authfix
job/deps
wip/overscroll-718
job/rev2-agentfix
job/rev2-money-ident
job/rev2-mailperf
wip/deps
job/hardening-728
wip/hardening-728
job/searchgen-832
wip/searchgen-832
job/photopw-849
job/mailsql-825
wip/photopw-849
job/sharefix
wip/sharefix
job/rev2-mailhtml-726
job/rev2-perfguards
job/copyval-723
job/lightglass-r2
wip/lightglass-r2
wip/docsfix-web
job/copy-audit
job/macinterop-staging-r2
job/design-sync
job/rev2-taskmeta-659
job/rev2-webperf
job/docs-audit
job/rev2-advfind-664
job/rev2-mailproxy-486
job/states-audit
job/rev2-datafix
job/design-drift
job/test-gaps
job/rev2-voicememos-618
job/rev2-mediafix
job/rev2-deps
job/rev2-datafix2
job/licence-audit
job/issue-hygiene
job/rev2-protofix
job/rev2-voice-619
job/rev2-isolation-707
job/rev2-surfaces-p1
job/deeplink-audit2
job/rev2-audiophotos-720
wip/test-gaps
job/rev2-overscroll-718
job/rev2-undo-722
wip/states-audit
job/rev2-dropmd-719
job/rev2-linknav-639
job/merge-7b-plan
wip/merge-7b-plan
job/rev2-taskday-655
wip/mailsql-825
job/rev2-webdav-lock-476
job/rev2-browserfix
wip/design-drift
job/rev2-hddsql-549
wip/deeplink-audit2
job/rev2-scopefix
job/rev2-authfix
job/rev2-hardening-728
job/rev2-wal-824
job/rev2-sharefix
job/calsidebar-638
job/chrome-audit
job/ioperf
wip/ioperf
wip/chrome-audit
wip/calsidebar-638
job/dropmd-719
wip/dropmd-719
job/ocr-build
wip/ocr-build
job/blaze-settings
wip/copyval-723
job/toastring-721
wip/toastring-721
job/deployfix-732
wip/deployfix-732
wip/blaze-settings
job/money-import-recheck
job/rev-a11y
job/perf-arch-db
job/rev-7b-data
wip/textthumb-652
wip/perf-arch-db
job/sec-protocols
job/sidehdr-660
job/rev-7b-security
job/research-surfaces
job/rev-design-gaps
job/rev-mcp-api
wip/sidehdr-660
job/perf-arch-memory
wip/sec-protocols
job/perf-arch-bundle
job/snapedge-714
wip/rev-mcp-api
job/sec-supplychain
wip/research-surfaces
job/perf-arch-sync
job/rev-consistency
job/perf-arch-server
wip/perf-arch-server
wip/perf-arch-memory
job/perf-arch-io
job/perf-arch-client
job/sec-fs
job/sec-mcp-scopes
job/sec-sharing
job/perf-guards
job/sec-browser
job/sec-admin-deploy
job/sec-auth
wip/snapedge-714
job/bgpicker-717
wip/perf-arch-bundle
wip/money-import-recheck
job/advsetup-654
wip/bgpicker-717
wip/advsetup-654
job/burst-709
job/kbdcaps-710
job/app-pw-chooser
wip/burst-709
wip/app-pw-chooser
job/imaptest-625
wip/kbdcaps-710
job/fix-499
wip/fix-499
job/perf-mut-667
job/calimg-589
job/perf-snap-666
wip/calimg-589
wip/perf-snap-666
wip/perf-mut-667
job/perf-cache-665
wip/perf-cache-665
job/voicefiles-620
wip/voicefiles-620
job/admin-burst-705
wip/admin-burst-705
job/voicememos-review
wip/voicememos-review
wip/ryw-653
job/ryw-653
job/writeonopen-661
job/instant-663
wip/writeonopen-661
job/money-import-review
wip/money-import-review
wip/importjs-610
review/integrations-407-round6
wip/integrations-review
job/dragghost-612
wip/dragghost-612
job/integrations
wip/integrations
job/decider-656
job/merge-round-6
job/perf-rerun
wip/merge-round-6
job/integrations-review-round5
job/selalign-576
wip/selalign-576
job/mcp-events-491
job/files-631
job/cal-e2e-569
wip/cal-e2e-569
job/reload-423
wip/reload-423
wip/mcp-events-491
wip/files-631
job/notesbridge-644
wip/notesbridge-644
job/editor-series
job/calcard-series
wip/calcard-series
job/mcp-events-review-491
wip/mcp-events-review
wip/editor-series
job/quirks-546
job/integrations-recheck
job/tocrail-636
wip/tocrail-636
wip/quirks-546
wip/reminders-643
job/reminders-643
wip/davscale-573
job/davscale-573
job/integrations-review
wip/ocr-eval-584
job/ocr-eval-584
job/esc-537
wip/esc-537
job/toastname-586
wip/toastname-586
job/submenu-579
wip/submenu-579
job/tasks-mode
wip/tasks-mode
job/agentdocs-630
job/dupwrite-634
wip/agentdocs-630
wip/dupwrite-634
job/lightglass-588
wip/lightglass-588
job/tabswitch-549
job/ghosttask-623
wip/ghosttask-623
job/toaststack-616
job/weekstate-609
job/mailsync-613
wip/mailsync-613
wip/weekstate-609
job/maildup-626
wip/tabswitch-549
wip/maildup-626
wip/toaststack-616
job/motion-611
wip/motion-611
job/tlstest-601
wip/tlstest-601
job/perf-495
job/floating-sheet
wip/floating-sheet
job/remdup-585
wip/remdup-585
job/fix-502
wip/fix-502
job/attachplay-622
job/perf-batch
wip/perf-batch-563
wip/perf-495
hotfix/mail-sync-diag
job/mail-m3
wip/mail-m3
job/attach-poof-603
job/calhover-608
job/editorbar-604
job/mentions-605
job/merge-round-4
job/allday-514
wip/merge-round-4
wip/allday-514
job/merge-round-4a
wip/merge-round-4a
job/sharestack-580
job/fix-501
wip/sharestack-580
wip/fix-501
job/perf-batch-563
job/apw-cache-review
wip/apw-cache-review
job/probe-520
wip/probe-520
job/mac-393
wip/mac-393
job/header-571
job/flake-513
wip/flake-513
job/docs-thumb-547
wip/header-571
job/webcal-572
wip/webcal-572
wip/shortcuts-542
job/shortcuts-542
wip/docs-thumb-547
job/caldav-stress
wip/caldav-stress
wip/sweep-478
job/apw-cache-512
wip/apw-cache-512
job/money-empty-540
wip/restart-505
wip/money-empty-540
wip/fix-510
job/restart-505
job/fix-503
job/perf-496
wip/perf-496
job/fix-498
wip/fix-498
job/info-inspector-465
wip/info-inspector-465
job/fix-510
job/fix-507
wip/fix-507
wip/fix-503
job/fix-493
job/money-kinds
wip/money-kinds
job/hygiene-548
job/merge-round-3
wip/fix-493
job/drag-snap-536
wip/merge-round-3
wip/merge-round-0930
wip/drag-snap-536
job/align-538
wip/align-538
job/bg-flash
wip/bg-flash
job/money-import
job/search-count-544
wip/search-count-544
wip/money-import
job/settings-key-541
wip/settings-key-541
job/toast-539
job/preview-421
wip/preview-421
wip/toast-539
job/tasks-500-531
job/title-plain-526
wip/title-plain-526
wip/tasks-500-531
job/notes-bridge
wip/parity-484
job/parity-484
job/files-slow
job/crash-525
wip/notes-bridge
wip/files-slow
wip/crash-525
job/kbd-motion-527
wip/bg-422
job/analytics-504
wip/analytics-504
wip/kbd-motion-527
job/upload-pill-523
wip/upload-pill-523
wip/tray-order
job/tray-order
wip/overflow-mid
wip/merge-round-2
job/perf-494
wip/perf-494
wip/mcp-fast-492
wip/motion-477
wip/asr-ab-489
wip/theme-variants-506
wip/overflow-511
wip/week-header-508
wip/attach-427
job/dav-delete-471
job/iso-435
wip/iso-435
wip/files-sel-keys
wip/dav-delete-471
job/align-253
job/siwc-490
wip/siwc-490
job/money-kinds-review
wip/align-253
wip/money-kinds-review
job/small-bugs-3
wip/overlay-title-487
wip/multiget-500
wip/hidden-420
wip/webcal-ui
wip/webcal-431
job/perf-367
job/location
wip/small-bugs-3
wip/location
wip/perf-367
wip/admin-deny-483
job/tag-unicode-473
wip/tag-unicode-473
job/blur-436
wip/photos-470
wip/blur-436
wip/small-bugs-4
wip/hunt-20260930
wip/settings-hdr-482
wip/chips-416
job/dedup-375
wip/dedup-375
job/doc-stack
wip/doc-stack
job/tokens-literals
wip/tokens-literals
job/jobs-leftovers
wip/send-fast
wip/paste-467
wip/money-numbers
job/money-plugin
wip/money-plugin
job/break-dav
wip/merge-batch
wip/crossday-469
wip/mac-verify
wip/mail-m2
wip/break-dav
wip/money-review2
job/money-md
job/modes-424
wip/money-md
wip/jobs-leftovers
job/agenda-413
wip/agenda-413
wip/modes-424
job/recog-417
wip/recog-417
wip/bounce-425
wip/ab-384-luna
job/webdav-perf
wip/webdav-perf
job/toast-ring
wip/toast-ring
job/money-review
wip/money-review
wip/micro-motion
wip/settings-card
wip/minical
job/notes-imap-428
job/least-priv
wip/ui-small-2
wip/flaky-426
wip/drag-end-418
job/jank
wip/jank
wip/least-priv
wip/docs-site
job/agenda
job/sec-batch
wip/sec-batch
wip/per-user-index
job/area-calendars
wip/area-calendars
job/parity
wip/parity
job/documents-research
wip/documents-research
job/test-infra
job/reminders-sync
wip/small-bugs-2
wip/reminders-sync
wip/gestures
job/google-oauth
wip/tags-merge
wip/tags
job/e2e-theme
wip/e2e-theme
job/icon-align
wip/test-infra
wip/select-align
wip/editor-385
job/voice
wip/webdav
job/webdav
job/app-pw-ui
job/editor-integrity
wip/editor-integrity
wip/voice
wip/quota
wip/cal-followups
wip/icon-align
job/composer-scale
wip/composer-scale
job/jobs-page
wip/jobs-page
job/hig-type
wip/hig-type
wip/app-pw-ui
job/motion-spring
job/mcp
wip/motion-spring
wip/mcp
job/small-bugs
wip/push-hosts
job/profile-sign
wip/touch-369
wip/profile-sign
job/mobile-focus
wip/mobile-focus
wip/ui-polish-354
wip/small-bugs
wip/dup-task
job/toast-polish
job/app-pw-scopes
wip/toast-polish
wip/app-pw-scopes
wip/cli-agent
wip/selection-pills
job/preview-attach
wip/preview-attach
job/dav-proppatch
wip/dav-proppatch
wip/cal-switcher
job/atomic-race
wip/atomic-race
job/photos-shared
wip/photos-shared
wip/cal-grid
wip/note-rewrite
wip/search-rebuild
job/mail-m1
job/paperless-import
wip/paperless-import
wip/mail-m1
wip/hidden-activity
wip/search-d
wip/pricing-research
wip/cursors
wip/auto-scheme
job/single-pills
wip/single-pills
wip/xuser-matrix
wip/money-format
wip/app-pw-setup
wip/purge-dos
wip/vault-health
wip/caldav-apple
wip/xuser-audit
wip/e2e-green
wip/tabbar
wip/adv-harness
wip/maple-mono
job/search-fix
wip/search-fix
wip/search-perf-c
job/adv-harness
wip/sidebar-headers
job/glass
wip/temp-index
job/polish
wip/polish
wip/file-protocols
wip/money-research
wip/glass
wip/voice-models
wip/collab-redo
job/voice-research
wip/hunt-20260928
wip/notes-actions-research
wip/search-pad
wip/search-perf
wip/search-sticky
wip/editor-undo
wip/chrome-rules
wip/motion
wip/appearance-research
wip/appearance
wip/audit-bugs
wip/cal-glass
wip/block-actions
wip/authz-order
wip/event-stripes
wip/chrome-sidebar
wip/auth-flaky
wip/robust-2
wip/gate-fix
wip/menu-blur
wip/import-calternaljs
wip/tray-fix
job/import-calternaljs
wip/index-order
wip/audit-fixes
wip/search-chevrons
research/mail
wip/phone-chrome
wip/dedup-break
wip/csp
wip/ui-audit
wip/select-toast
wip/perf
wip/flat-layout
wip/fonts
wip/event-tint
wip/sync-converge
wip/data-split
wip/glass-audit
wip/robustness
wip/sync-chaos
wip/search-thumbs
wip/fuzz
wip/menu-icons
wip/search-pill
wip/sync-changing
wip/heading-links
wip/date-formats
wip/a11y
wip/break-editor
wip/e2e-fix
wip/settings-sections
wip/sync-root-guard
wip/search-palette
wip/share-edit
job/toasts
wip/toasts
wip/cont-analytics
wip/authz-review
wip/popovers
wip/overlay-glass
wip/change-feed
wip/editor-modes
wip/composer-align
wip/cont-agenda
wip/agenda-merge
job/agent-conventions
wip/agent-conventions
wip/backend-misc
job/route-audit
wip/route-audit
wip/ui-batch
wip/heif-hardening
wip/grid-resize
wip/ask-page
wip/webmcp
job/deeplink-audit
wip/deeplinks
wip/shortcuts
wip/cont-tz-days
main
No results found.
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/calternal#619
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Owner question (2026-10-01): "When is Parakeet coming? And auto-transcribing existing voice notes?"
State: local transcription (#373, Parakeet v2 → S1-mini, background model download, inline mic morph) was built on
job/voicebut never merged (40 commits ahead, last touched ~37 h ago). It also implements the owner's #304 decision: a recording made on a Log entry becomes a linked note (a child bullet whose title is the link text) that holds the title + recording + transcription; on a task → the task note; on a note → that note.Job:
job/voiceand resolve conflicts (the composer has changed a lot since: #617 Voice Pill and #618 Voice Memos are queued; coordinate: keep the recorder hooks generic so the Voice Pill can wrap them).Documents/Voice MemosandDocuments/Voice memosplus audio attachments referenced by entries), newest first, resumable, low priority, with progress in Settings → Maintenance (Jobs). It never re-transcribes a file whose transcript exists (hash-keyed).Gates per crate + web. Screenshots of the record → transcript flow. Time limit 5 h.
Started voice-619 on branch
job/voice-619at base SHA9a6c38c3b7c8bbbdad9919cd2419f773d9c34b6e(origin/dev was687ff703136e71e89f8dfba139e93cd0788b25c1, seven commits ahead). I am reviewing the binding voice and Jobs decisions, then merging the existingjob/voicework into this branch and adapting it to the current Composer. I will keep recorder hooks generic for Voice Pill integration and add resumable, hash-keyed backfill for existing voice memos and Journal/task audio attachments.Finding:
bun run checkstopped before Svelte checking becauseapps/web/node_modulesdoes not containtypescript(ERR_MODULE_NOT_FOUND). I am installing from the committed lockfile, then I will rerun the check.Findings during integration:
typescriptwas absent fromapps/web/node_modules;bun install --frozen-lockfilerestored the lockfile dependencies.check-type-tokensandcheck-motion-tokensidentified them; I replaced them with the shared tokens.devhad duplicateappendEntryAttachmentsimplementations and incompatibleItemPreviewedit callbacks. The app type check exposed these, so I am retaining the current Journal API and routing Search edits through the shared Composer.Finding: the first Rust build stopped in
llama-cpp-sys-2's bindgen step because this build host has no discoverablelibclang.so(Unable to find libclang ... set LIBCLANG_PATH). I am checking the installed toolchain and will continue as soon as the available library path is identified.The libclang finding is resolved on this build host:
libclang-19-devwas absent; the distro package is installed and I am restarting the same build with its library path. This changed no repository files.The next compiler attempt reached native model builds and found the same image is also missing
cmake; this is an environment dependency, not a Rust diagnostic. I am installing the distro build tool and checking the native build's worker count before retrying so it stays within the shared-host limit.Decisions for points not set in DESIGN: files found only in
Documents/Voice MemosorDocuments/Voice memosbecome one standalone Note inDocuments/Notes, titled from the audio filename and linked to the original audio. A Journal attachment creates or reuses the entry's linked child Note; a Note or Task attachment writes the transcript to that existing destination. The transcript cache is private per User and keyed by the audio BLAKE3 hash. The performance sample will be deterministic English speech synthesized locally so both 1-minute and 30-minute timings can be repeated without shipping fixture audio or sending speech to a service.The Notes crate compile surfaced two integration issues from the merge: both controlled and ordinary backfill handlers returned
Stringerrors where the shared job queue requiresJobError; they now map that error explicitly. The newer User Settings API also addsInsufficientStorage; the Voice settings writer now returns HTTP 507 for quota failures. I am rerunning the crate check before continuing.Finding: both historical folders can contain byte-identical files. A Note ID derived from the audio hash would collapse those two paths into one Note and leave the second source file without its own link. Standalone backfill Notes now use a stable identity per Home-relative source path; the transcript cache stays keyed by User and audio hash, so the duplicate bytes share recognition while both files keep a Note link. The E2E fixture seeds the same speech file in both folder spellings to cover this case.
Integration finding:
bun run checkfound the Voice routes were absent fromcontracts/openapi.json, and the Search preview was passing an attachment callback shape that no longer matchedItemPreview. I am generating the contract from the server and restoring the Search preview's file picker through its current callback while keeping the recorder pill as a generic snippet hook.Finding and fix: the first server OpenAPI build reported that
crates/plugins/files/src/media.rsstill contained an unusedMediaProcessGroup; the shared process-group ownership now lives incalternal-plugin::media_sandbox. I removed the obsolete duplicate guard without changing the timeout regression test. OpenAPI generation also requiresapps/web/buildbecause the server embeds the production SPA, so I am building that first.Correction to the earlier design note: standalone backfill Note IDs use the Home-relative source path, not the audio hash. This keeps two byte-identical memos in the two historical folder spellings individually reachable. The transcription cache and destination marker remain keyed by User, BLAKE3 audio hash, and destination.
Finding and fix: the web suite reported that the merged shortcut registry changed
calendar.attachfrom the contract'sAkey to Cmd+Shift+A, while the issue branch's existing test expectsA. I restored the registeredAbinding and wired it to the focused Journal attachment action in ItemPreview. I left both existing expectations unchanged; I will rerun the focused and full web tests.Benchmark fixture check: FFprobe measured the original 30-minute WebM at 1800.008 seconds, 8 ms above the API's hard 30-minute decode cap. I truncated only the ignored test input to 1799.021 seconds; the benchmark accepts its duration within 1 second and the server cap remains unchanged.
Rust finding:
cargo clippy -p calternal-plugin-files --all-targets -- -D warningsreached the Notes dependency and rejectedensure_journal_voice_notefor eight arguments. I am grouping the audio path/hash and Journal block identity/title into one documented value type; no lint suppression or behavior change.Owner override applied: inherited #527 code still set all motion tokens to 0 ms for
data-input="keyboard", and Settings added aninstantOpenpath. The job instructions withdraw that behavior. I am removing the keyboard-motion suppression, including the Settings/sidebar special case, while preserving reduced-motion handling and the keyboard flag used by focus rings.Found that origin/dev already uses Notes migration 0024 for Journal day read snapshots in crates/plugins/notes/migrations/0024_journal_day_snapshots.sql. Renumbered the Voice transcript migration and registration to 0025 before final gates, preserving both migrations.
During the benchmark audit,
measure()calledrequest_audio()with four arguments while the helper required five; the extrapathparameter was unused. Removed that parameter so the requested timing run can reach transcription.The production E2E found two backfill candidates but produced no Notes or transcript cache entries. I reproduced the decoder call directly: local voice-mode media sandbox exits 127 (
prlimit: failed to execute ffmpeg: No such file or directory). This host resolves FFmpeg inside the Nix store, outside the sandbox mounts. I am correcting the local runtime setup and will rerun the real-server flow.Fixed the local media runtime staging and the production runtime image to link FFmpeg’s real BLAS and LAPACK libraries into the read-only decoder tool tree;
/etc/alternativesremains outside the sandbox. The direct voice-mode sandbox decode now exits 0 and emits 512,000 PCM bytes from the spoken fixture.After fixing the sandbox, backfill created both Notes and stored one transcript for the identical audio hash. The next E2E assertion failed because
/api/v1/searchreturns the indexed Note file by its Home-relative path (plugin_id: files,id: Notes/...md), while the probe expected the Note API UUID. I am changing the probe to search a transcript-only word and assert that indexed path.The revised Search probe passed both backfill cases and the flow reached the Journal Log preview. It then timed out because the merged Calendar now names that accessible dialog
Journal; the E2E still looked forLog entry. I am aligning the locator with the current Calendar label.Correction after checking the merged Calendar keyboard contract: the Log row’s Enter action opens its Composer for editing; Space selects the Log and opens its preview. The
Journallabel was correct. I am updating the E2E activation to Space so it records the intended preview action.The cached-model E2E reached the recorder and captured
calendar-recorder-390-light.png. Its next action failed because the broadDiscardlocator also matched a hidden ComposerDiscard draftbutton. I am making that action exact so the screenshot loop can continue.The recorder viewport checks now complete, and the live recording reaches Keep and Save changes. After the Composer closes, the Calendar preview does not expose its expected
Open notelink within 30 seconds. I will preserve the throwaway server data on the next run to inspect whether the linked Note or the preview refresh is missing.Preserved E2E data shows the product did create the linked child Note: the Journal attachment projection contains both the WebM and
Notes/20261002-voice-linked-memo-proof-ce78bd1f.md, and the Note file exists with the recording link and pending transcript marker. The probe held a locator for the pre-edit preview, so I will reopen the saved Log and assert the fresh preview link.The re-opened Journal preview now exposes the linked Note. Its transcription Job completed, and the transcript-only Search query returned the indexed Note path. The Note shows both cleaned and raw transcript text, so the screen-capture wait matched two elements; I am selecting the first visible transcript block.
Production E2E finding (2026-10-02): the 9-second recording is present in the Calendar Log attachments and in its linked Note, but the local
notes.voice.transcribejob is absent from.system/index.sqliteafter the edit save. The transcript wait therefore cannot pass. The route-level model download and old-file backfill jobs completed successfully. I am adding a production-browser assertion on the transcription POST response so the next run reports the queue failure at the save boundary.Performance finding (2026-10-02): the production UI matrix passes, and the live Journal transcript job completes. The local benchmark accepted its 60-second audio, but that queued job remained leased for more than 20 minutes without an error. The build host load average was 25.43/26.28/24.00 on an 8-core host. This is a slow-path result under heavy shared load; the 30-minute local run has not started yet.
#619 implementation report
Head:
4011a4fadonjob/voice-619.Built
Documents/Voice Memosspellings and audio attachments; the newest items run first in a low-priority resumable job shown in Maintenance.Gate output
cargo fmt --check: no output; exit 0.cargo clippy -p calternal-fs --all-targets -- -D warnings:Finisheddevprofile [unoptimized + debuginfo] target(s) in 29.48s.cargo test -p calternal-fs:test result: ok. 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; storage:42 passed; 0 failed.cargo clippy -p calternal-plugin --all-targets -- -D warnings:Finisheddevprofile [unoptimized + debuginfo] target(s) in 1m 17s.cargo test -p calternal-plugin:25 passed; 0 failed; doc tests:0 passed; 0 failed.cargo clippy -p calternal-plugin-notes --all-targets -- -D warnings:Finisheddevprofile [unoptimized + debuginfo] target(s) in 55.74s.179 passed; 0 failed; 1 ignored; Files clippy passed; Files tests146 passed; 0 failed; 1 ignored.cargo clippy -p calternal-server --all-targets -- -D warnings:Finisheddevprofile [unoptimized + debuginfo] target(s) in 5m 07s.cargo test -p calternal-serverwas still compiling at the five-hour job limit.bun run check:svelte-check found 0 errors and 0 warnings.bun run test:Test Files 153 passed (153);Tests 1056 passed (1056).bun run buildpassed earlier:✓ built in 37.06s;Wrote site to "build";✔ done.Performance and gaps
The build host load average was
25.43, 26.28, 24.00on the shared 8-core host. The benchmark accepted a 60-second recording, but its job remained leased for over 20 minutes without an error; I stopped the run at the time limit. I do not have a completed local RTF, the 30-minute local result, or perf VM RTF/RSS numbers. The existing release server on the perf VM did not contain the Voice route. The adversarial round andcargo test -p calternal-serverremain incomplete. I did not runcargo cleanbefore the time limit.Decisions
Production screenshots
Report correction: cleanup completed immediately after the report was posted.
cargo cleanoutput wasRemoved 22920 files, 18.0GiB total;apps/web/buildandapps/web/.svelte-kitwere removed, andgit status --shortis clean at4011a4fad.Round 2 started on branch
job/voice-619, based onorigin/devatc4a61e8cf090170f35b1bed3350d9de20c83ecd5. Current head:4011a4fadd83d82123d2e7f1de37f5168e2917a7. I am tracing the >20-minute benchmark lease, backfill throttling and cancellation, and model/runtime licences before running the perf and adversarial checks.Finding: the durable worker renews a Voice Job lease every
lease_for / 3while its handler future is alive. Voice inference runs onspawn_blocking, so native model calls have no bounded execution time or progress updates; even a wedged model thread keeps the Job leased. The previous 60-second probe was on a host at load average 25.43/26.28/24.00, while the locked perf VM is at 0.04/0.31/0.74. I am reproducing on the VM before selecting the watchdog threshold.Round 2 finding: the perf VM was idle inside
/root/perf.lock(load average 0.04 / 0.31 / 0.74; 7.0 GiB available), but its installed server binary is from Sep 29 and does not expose the Voice routes. I am building the branch's release server locally before reproducing the 60-second and 30-minute jobs. The earlier >20-minute lease cannot yet be attributed to inference cost until this current build runs on the VM.Round 2 finding (2026-10-02):
bun run testcompleted with 1,039 passed and 19 failed across 16 files. The failure report lists each asTest timed out in 5000ms; most are unrelated existing UI/unit tests, consistent with this host's load. I will keep the Voice-specific web checks separate and include the exact gate summary in the final report.License check: pinned Parakeet TDT v2 INT8 weights are CC BY 4.0; commercial use is allowed with attribution and the INT8 conversion must be identified. S1-mini by Superwhisper uses Apache-2.0 plus its exact-name term; commercial use is allowed while keeping that name condition. Runtime sherpa-onnx 1.13.8 is Apache-2.0 and llama-cpp-2 0.1.157 is MIT OR Apache-2.0. I added these attribution and runtime terms to
NOTICE; no separate About/licences page exists in the current app.Benchmark finding (2026-10-02): the concurrent-backfill branch originally reused the baseline 60-second byte stream. Voice transcript caching keys on audio bytes, so the interactive request could have returned from cache and understated latency. Commit
980802151now requires unique audio bytes for baseline, interactive, and backfill inputs; it requires the backfill stress input to be a bounded 30-minute WebM and reports sample count, mean, p50, and p95. Each case has one sample in this run, so p50/p95 will equal that sample and will be labelled as such.Implementation finding (2026-10-02): a direct transcription could hold a lease while waiting on the shared model downloader, but its User Job progress stayed at the prior decode stage. Commit
f89b262a9now reports downloaded/total model bytes on that transcription Job every five seconds and fails visibly if the direct wait exceeds 30 minutes. The shared Voice settings meter remains the source of byte counts.Round 2 progress (2026-10-02): merged
origin/devat8e7d20f1322337ed7d700c2cc725d1c3199ff99e(merge commit onjob/voice-619). I started the release build and notes clippy before final gates. They have not reached the application crate after about 1h55 and 48m;/proc/loadavgwas138.54 133.60 129.77, with over 6,700 runnable/total tasks and many concurrent Cargo jobs. The perf VM's existing server binary lacks the Voice route, so no Voice latency sample is valid yet. I will continue using the current build and report measured values only if the Voice server is available.Round 2 follow-up:
ffprobeconfirms separate benchmark inputs are exactly 60.008s and 1800.008s; the interactive and backfill inputs use distinct bytes to avoid transcript-cache hits. The saved production screenshots cover 30 cases (five touched surfaces × 390/820/1440 × light/dark), but they predate the updated paused-Job screenshot capture, so I will regenerate that set if a server binary becomes available. The local release build is still at generic dependencies and has no executable yet; sccache reported its server had shut down and Cargo fell back to local compilation under the same high host load.Round 2 build constraint: after 2h27,
cargo build --release -p calternal-serverhad compiled generic dependencies only and/mnt/hdd/targets/jobs/voice-619/release/calternal-serverdid not exist. The shared host load average was139.01 149.78 149.32; the server test was waiting on the debug build-directory lock. I stopped only my release-build process (exit 130) to let the required test and adversarial probe proceed. The perf VM still has no Voice-capable binary from this branch, so no perf measurement has been claimed.The requested
cargo test -p calternal-serveris still blocked after 22 minutes. Its captured output contains only threeBlocking waiting for file lock on package cachelines and oneBlocking waiting for file lock on build directory; the Cargo process is in uninterruptible filesystem I/O on the shared build volume, and no test has started or failed. The build directory lock became available when I stopped notes clippy, but shared Cargo/cache I/O remains saturated.Forgejo #619 — round 2 report
Branch:
job/voice-619Head:
5465d06eb6d9d478a244bd09e540d4c85e28e6bBuilt
ADVERSARIAL_VOICE_ONLY=1runner path and the hostile Voice probes. Extended the Voice benchmark to reject duplicate recording bytes and measure interactive latency while a real backfill runs.NOTICEandlicenses/voice/.Key files:
crates/plugins/notes/src/voice.rs,voice_engine.rs,voice_models.rs,crates/plugins/notes/migrations/0025_voice_transcripts.sql,apps/web/src/routes/settings/jobs/MyJobsGroup.svelte,JobDetails.svelte,bench/voice-transcription.py,tests/adversarial/voice_transcription.py,tests/adversarial/run.sh,contracts/openapi.json,packages/api-client/src/generated.ts, andNOTICE/licenses/voice/. The branch diff againstorigin/devis 70 files.Gate output
cargo fmt --check:bun run check:bun run test:The 19 failures were 5-second test timeouts while the shared build host was heavily loaded.
cargo test -p calternal-serverwas stopped at 16:20 UTC (exit 130) before compilation reached the server or any test. Captured output ended while compiling dependencies; no test result is available. Notes clippy was also stopped before reaching the Notes crate. Server clippy and the Notes crate test were not run.bash -n tests/adversarial/run.sh, the benchmark fixture/dedup checks, Python syntax checks, andnode --check apps/web/e2e/voice-transcription-619.mjscompleted successfully.Performance and adversarial status
No RTF, peak RSS, CPU, or interactive latency measurement is claimed. The perf VM binary checked for this job lacked the Voice route. The local release build ran for 2h27 without producing a server executable under a host load average of
139.01 149.78 149.32; I stopped it to prioritize the requested test. I did not measure on the perf VM or hold its measurement lock, and I did not run the adversarial probe against a server without the Voice route.Licenses
The pinned NVIDIA Parakeet INT8 export is CC BY 4.0: commercial use is allowed with attribution and change marking (pinned model, CC BY 4.0 terms). S1-mini permits commercial use under Apache-2.0 plus the model-name condition (model card). Runtime versions checked: sherpa-onnx 1.13.8 (Apache-2.0), llama-cpp-2 0.1.157 (MIT OR Apache-2.0), and linked llama-cpp-sys-2 0.1.158 (MIT) (sherpa-onnx, llama-cpp-2). Attribution and full notices are in
NOTICEandlicenses/voice/.UX gaps closed / left
Closed: pause/resume and other standard Job actions are available from the Jobs menu and details view; progress and terminal states are visible; Composer and Search link to durable Job details. Existing screenshot files cover 30 desktop/tablet/phone and light/dark cases.
Left: the saved screenshots predate the macOS user-agent and paused-Job screenshot changes, so there is no fresh macOS production screenshot set. The screenshots were not attached to this issue: the Git credential helper had no non-interactive Forgejo credential. The production E2E script was not rerun because no Voice-capable server executable was available.
Decisions not covered by DESIGN
NOTICEbecause the app has no About/licences page.No push, deploy, merge, or issue close was performed.
cargo cleanexited 0 (Removed 4914 files, 1.4GiB total);apps/web/build,apps/web/.svelte-kit, and the generated benchmark audio were removed.Correction to my final report: the exact current head is
5465d06eb6d9d478160a4c2449db95046607b09e. Cleanup completed:cargo cleanexited 0 and removed 4,914 files;apps/web/build,apps/web/.svelte-kit, and the generated benchmark audio were removed. The final report file now contains the corrected full SHA.Starting independent read-only review on branch
job/rev2-voice-619, reviewingjob/voice-619at5465d06eb6d9d478160a4c2449db95046607b09eagainstorigin/devat440e19dce23040ac8ebaae88f0469b6535b1afcb. I will inspect the Voice transcription worker and backfill paths, existing helper reuse, route isolation, tests, and commit the review report in this worktree. No build or tests will run.Independent read-only review committed as
ff5167cdc2fde7e45523d87d499b7902167ac48c(review-voice-619.md). Findings are ranked by severity:crates/plugins/notes/src/voice.rs:418-427, 477-499, 667-674. Request concurrency is capped only while reading each body; queued Jobs and staged audio have no per-User count or byte bound, and crash orphans have no sweeper. The Composer progress link also points to owner-filtered Jobs, but the Voice Job has no owner (apps/web/src/lib/composer/Composer.svelte:941-949,crates/calternal-server/src/wire.rs:3642-3645, 3671-3678). Reserve per-User Job/byte capacity before staging, setowner_user_id, release capacity on terminal paths, and sweep unreferenced staged files.crates/plugins/notes/migrations/0025_voice_transcripts.sql:3-9,crates/plugins/notes/src/voice.rs:2058-2064. Move the cache into each User's private derived store and purge it during User deletion; add a deletion test.crates/plugins/notes/src/voice.rs:1855-1894, 1923-1932. The native thread can retain memory and its semaphore slot after Tokio times out. Use a killable, reaped process with resource limits or a cancellable native API; test worker termination and slot recovery.crates/plugins/notes/src/voice.rs:626-645, 1053-1060, 1195-1232. Persist partial failures as retryable and mark complete only after all destinations update; a disabled run should be skipped/cancelled, not completed. Test a write failure and off-then-on setting change.crates/plugins/notes/src/voice.rs:649-661, 1252-1281,crates/plugins/notes/src/voice_models.rs:141-145. Bound the shared download Job and the backfill wait; test a downloader that never resolves.crates/plugins/notes/src/voice.rs:782-900, 913-953, 1039-1067, 1111-1153, 1284-1305, 1994-2006. Move bounded scan/hash pages to a low-priority blocking worker and checkpoint progress/cancellation after each page and file.crates/plugins/notes/src/voice.rs:1413-1430. Match the Note to the audio identity or add every source audio link when reusing a per-Log Note; test two recordings on one Log.No weakened existing test expectations were found. This review did not build or test, start a server, use a browser, or run performance measurements, as required for the read-only review.
docs/DESIGN.mdends at §57; §58 was not present.Round 3 started on branch job/voice-619 at HEAD
5465d06eb6; merge base with origin/dev is440e19dce2(origin/dev currentlyc4faf184df). I have read the independent review and will address all P1/P2 findings with regressions before verification. The host is currently busy (load average 21.67 / 26.22 / 27.58); I will avoid starting resource-heavy gates while I work through the review.The first Notes crate test run after the review fixes completed with 191 passed, 7 failed and 1 ignored (885.47 s). The failures were:
imap::tests::captured_append_store_expunge_executes_on_real_home(timeout),tests::daily_and_composer_preserve_unrelated_bytes(404 vs 200),tests::fs_change_batch_does_not_reindex_unchanged_notes(projection not updated),tests::journal_patch_storm_finishes_with_one_winner_and_stale_preconditions(timeout),tests::journal_read_does_not_wait_for_reconciliation(100 ms timeout),tests::apple_replay_area_delete_reparents_two_task_links_and_syncs(NotFound), and the new Voice page-cancellation regression (observedLeasedbefore the worker persisted its terminal state). Host load was 60.80 / 62.57 / 67.45 when checked. The six non-Voice failures appear unrelated to this issue; I have not changed their expectations. I fixed the Voice regression's completion synchronization and am rerunning that test alone.The first Voice adversarial runner invocation stopped at its offline cross-User classification gate before starting a server. The new transcription operation exposed unclassified
target_id; after adding that rule, the same gate exposed the new detail route'sjob_id. I added explicit classifications for both, mappedtarget_idto an owned Note fixture, and extended the Voice probe to post a valid WAV from the second User against the first User's Note and verify that no Voice Job is created. The classification gates now pass: 340 OpenAPI operations / 945 generated entry points, and 39 admin operations. I am rerunning the Voice-only server probe.The production E2E run captured the real paused/running/completed backfill states, timeout-failed Job, and Composer Job details, then timed out waiting for the Search preview's
Record voice noteaction. The probe selected the first result matching the Log title without requiringdata-kind="log"or activating that row; Search can return both a Journal Log and its linked Note with the same title, while only the Log preview owns the recorder. I updated the probe to hover the matching Log result, assert it is selected, and wait for the action inside that preview. I also reduced only the screenshot backfill fixture to five minutes; the separate local benchmark still uses its byte-distinct 30-minute backfill.The first completed UI run reached the real benchmark and failed with HTTP 403 at the Files TUS backfill fixture. The benchmark sent Origin on its JSON and direct Voice requests, but its TUS create and patch requests omitted it. I added the same-origin Origin header to both TUS requests and am rerunning the browser capture and benchmark against this branch's server binary.
The UI run completed its backfill before the contention benchmark. The benchmark then waited for a second scan, but
enqueue_voice_backfillcorrectly skips scheduling while an owner has a completed scan. I confirmed the guard from the Voice code and observed that no pending or leased backfill existed. The E2E fixture now marks only its completed test Job as cancelled, then lets the benchmark call the normal backfill endpoint; the live run enteredleased / Transcribing voice memoand started the interactive burst.Voice #619 verification report
Head:
5005b5ac652a2dc2b1b596d1dfe0334acc13896f(Document Voice E2E review flow). The branch is committed and clean.origin/devwas merged once before final gates (bd2db6301); no push or deploy was performed.Built
0026_voice_user_store.sqland removed the old shared transcript table.voice_transcription_619todocs/perf/baseline.json, a Voice adversarial probe, and a Voice E2E flow.UX gaps closed
UX gaps left: none found in the Voice flow covered here. The full web suite and broad E2E suite remain for the merge round under the verification policy.
Decisions where DESIGN.md is silent
DESIGN.md has no Voice-specific worker protocol, limits, or storage layout. I used its §48 derived-data isolation direction and chose a private per-User store, a killable child process with a bounded framed protocol, a 30-minute / 32 MiB recording cap, and at most four active or pending Voice jobs per User. These are implementation choices for owner confirmation.
Verification
Passed:
The full Notes test gate had a shared-host failure. One cancellation race introduced by this work was fixed and its focused regression gate above passed. The remaining failures were unrelated timeout/state failures under heavy host load; no existing expectations were changed.
Other checks passed:
cargo test -p calternal-fs(53 unit tests and 42 storage tests),cargo test -p calternal-server(107 passed),node --check apps/web/e2e/voice-transcription-619.mjs,python3 -m py_compile bench/voice-transcription.py, JSON validation,git diff --check, and the cross-User classification gates (340 operations; 945 generated entry points; 39 admin operations).Performance
Local only; the perf VM was not used.
docs/perf/baseline.jsonrecords no prior Voice baseline (baseline: null). The local host was loaded (load average 10.68 before and 17.75 after). The final benchmark reported:Screenshots
74 PNGs are under
artifacts/voice-619(ignored by Git). Required groups includemaintenance-jobs-{running,paused,done,failed-timeout}-{390,820,1440}-{light,dark}.png, failed-job detail captures, and Composer/Search Job detail captures at all three widths and both themes. Screenshots were not committed.For the merge round
cd apps/web && bun run test --maxWorkers=2— run the full web suite on the combined branch.cargo test -p calternal-plugin-notes— rerun the Notes suite on the combined branch and determine whether the remaining seven host-load failures reproduce.tests/adversarial/run.sh— run the full adversarial matrices required by the merge round.cd apps/web && bun run test:e2e:voice-619.Cargo build output was cleaned with
cargo cleanafter verification. No known Voice-specific functional gaps remain; the Notes full-suite failures and local-only performance measurement are the outstanding verification limits.Per-crate gate addendum
The final crate audit found
calternal-pluginandcalternal-plugin-fileswere also touched. Their missing per-crate gates are now complete:The Files test run printed two tests as running for over 60 seconds; both completed successfully. No code changes were needed. The working tree remains clean at
5005b5ac652a2dc2b1b596d1dfe0334acc13896f.Correction to the Notes gate summary: the captured full
cargo test -p calternal-plugin-notesresult (191 passed; 7 failed; 1 ignored) is from before the backfill cancellation-race fix. Those seven failures comprised six shared-host timeout/state failures and the cancellation race. The race was fixed, and the focused cancellation regression test passed afterward. I did not rerun the full Notes suite after that fix, so the six other failures have not been rechecked. The prior wording that called them “remaining failures” was imprecise; please use this correction.Re-verification on a quiet host (load avg about 1), head
b5d9c59941c1d2771c336085c189d58627f99578.First run (before fix),
cargo test -p calternal-plugin-notes -- --test-threads=4:The other six failures from the last job run (busy host) did not occur again. They were host-load timeouts.
Classification: the remaining failure is the #954 fixture collision. Run alone, it passes 3 out of 3 times (
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 198 filtered out). In parallel, another test holds the process-globalUSER_LOCKSentry for the shared fixture User ID, so the Journal ID repair skips and the read returns a false 404. The branch did not have the fix. Fix: cherry-pickedff8e857c2fromjob/datafix2(each fixture Home gets its own User ID). No assertion changed. The voice.rs, bookmarks.rs and tasks_dav.rs tests that use the same literal ID only take the blockinglock_user, which serializes them and cannot cause the skip, so they did not need a change.After the fix, two full runs with
--no-fail-fast -- --test-threads=4:cargo fmt --check -p calternal-plugin-notes: exit 0, no output.cargo clippy -p calternal-plugin-notes --all-targets -- -D warnings: exit 0,Finished \dev` profile [unoptimized + debuginfo] target(s) in 1m 20s`.Ready for merge from the Notes test side: yes. Not pushed.
Round 7b source review for #867:
artifacts/from-7b2/round3-adversarial.log:177records a short invalid WebM transcription still inprocessingafter the probe's 30-second deadline. No server stage or lifecycle log was supplied.crates/plugins/notes/src/voice.rssets a 5-minute engine-slot wait (line 65), a 15-minute media decode deadline (line 2211), and a 30-minute model-download wait (line 66). The decoder runs before model verification, but it first acquires the model semaphore. Thus the existing bounds do not establish the probe's 30-second requirement. Production6074f71d1has no Voice route.Unresolved: identify whether the supplied fixture waited on capacity, decoding, or model work. Add a defensive regression that invalid recordings reach a terminal failure before model work, while valid large recordings keep their documented duration and resource limits. Do not clear this finding based on the source deadline alone. No live hostile-input reproduction ran in 7bfix-data.