Composer recording: port the sveltebits Voice Pill (icons, waveform, timer); Stop attaches directly, no 'Keep' step #617
Open
opened 2026-10-01 10:09:47 +00:00 by kayg
·
32 comments
No Branch/Tag specified
dev
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
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
wip/trayicons2-1095
wip/trayicons-1095
wip/tagperf-1186
wip/sidebar3-1094
wip/rev2-webperf
wip/rev2-money-ident
job/adv-1202
wip/restyle-notes
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/restyle-notes
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-mailmoney
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#617
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 report (2026-10-01, composer voice recording)
"These two [Stop / Discard] could be icons. And once stopped, why does it appear as Keep? Aren't we using the sveltebits.xyz component? https://sveltebits.xyz/micro/voice-pill looks way better than what we have."
Today:
apps/web/src/lib/composer/Composer.svelte~1819: while recording, text buttons "Stop" and "Discard". After Stop, a review state shows "Keep" and "Discard" (Keep attaches the recording). These are plain outlined text pills, not the design system.Build (CLAUDE.md: never invent basic UI; port/cherry-pick sveltebits first):
/micro/voice-pill; get the real source from the sveltebits repo/package, check its licence is AGPL-compatible, and record the source commit in a header comment as with other ports) intopackages/uias the shared recording pill: live waveform, elapsed timer, icon buttons (stop ■, cancel ✕) with warm tooltips + shortcuts, and the springy morph from the record button into the pill and back.Test: an e2e records 2 s (fake media stream), stops, and the attachment chip appears on the entry; Undo removes it; ✕ discards it. Screenshots of the recording and attached states in both themes at 390/1440, plus a frame strip of the morph.
Starting #617 on branch
job/voicepill-617, based at9a6c38c3b7c8bbbdad9919cd2419f773d9c34b6e. I have read CLAUDE.md, CONTEXT.md and docs/DESIGN.md. I am checking the recording flow, shared UI primitives, and upstream source/licence before implementation.Finding: the upstream VoicePill source is
DavidHDev/svelte-bitsat component commit8fa93ce9a919dd93678f5ac03e752ee90ca5fead. The repository'sLICENSE.mdis MIT + Commons Clause; the Commons Clause restricts sale, sublicensing, or redistribution of components as a port. That does not meet this repo's AGPL-compatible dependency rule, so I will not copy or port the source. There is no matching Voice Pill in calternal.js. I will independently implement the requested shared pill behavior with calternal tokens and existing UI primitives, and record the upstream source commit and license finding in its module header.Finding for #617:
AttachmentTray.add()can refuse an attachment at the existing 32-item or 2 GiB limit. The new Stop path reset the recorder even after a refusal, which discarded the only in-memory copy instead of attaching it. I am changing the error path to retain the recording and expose retry/discard controls; I will add regression coverage.Finding for #617: the production e2e showed two Undo actions after saving a Note within the 8-second VoicePill window. Sending clears the Composer tray, but the VoicePill toast stayed visible and its callback then targeted a missing tray item. I am tying each toast to its attachment and dismissing it when that item is removed, moved, or committed.
Production Composer e2e after the required
origin/devmerge measured the shared footer at mode 30 px, tools 36 px, and Send 30 px. The new VoicePill shell used the larger--hittoken for its painted height while PillGroup segments use--control-h-compact, so the toolbar grew. I am aligning the shell to the compact control token and keeping the child buttons' touch hit areas separate.The full production Composer e2e now passes the footer height assertion after the VoicePill sizing fix. It then writes the Log entry successfully, clicks the saved row, and times out after 30 seconds waiting for the existing
Log entrydialog (apps/web/e2e/composer.mjs:1025). CSP reports remain zero. I have left the expectation unchanged and am running the focused VoicePill proof separately.One-time adversarial round evidence after the
origin/devmerge:search_chaos.pyreportedadmin staged rebuild: expected (200,), got HTTP 202with body{"job_id":"974a28f1-5780-4cb9-8d0d-c040c3a277fe","inserted":true}. I kept the existing probe expectation unchanged.calendar_event_tags.mjs,mail_api.mjs, andmoney_api.mjsstopped before sending requests because the runner providedADVERSARIAL_SERVER_BIN, whileapps/web/e2e/harness.mjschecksCALTERNAL_SERVER_BINortarget/debug/calternal-server. These are harness wiring failures, not endpoint responses.The remaining adversarial sections are still running in the single 15-minute round.
Additional output from the same adversarial round:
xuser_matrix.pycould not create a fixture Folder (HTTP -1, timed out) while the Search chaos probe was active. Treat this as SLOW until a quiet rerun is authorized.authz_matrix.pystopped while creating the Admin denial App Password fixture:api_readreturned 403. The probe did not print a response body, so this is a fixture/setup finding, not evidence of an authorization bypass.I have not changed the probe expectations or production code. The single round is still running.
Finished: VoicePill (#617)
Branch:
job/voicepill-617Head:
e5d42e3982e942944bdbb8acc2dd5134711f9d17(includes the required merge oforigin/devatc4a61e8cf090170f35b1bed3350d9de20c83ecd5)Built
packages/uiVoicePill with live waveform and timer, icon-only Stop and Discard controls, warm tooltips and Enter hints, shared-token morphs, reduced-motion behavior, and accessible states. Stop attaches immediately and shows an 8-second Undo. Discard confirms only after ten seconds.Screenshot evidence
Recording and attached states are attached for each viewport and theme. The extra tablet captures are included alongside the requested phone and desktop widths.
Morph frame strip
Gates and E2E
cargo fmt --checkexited 0 with no output. The merged server API gates passed:The first
cargo testattempt stopped before tests because the sharedsccachedaemon referenced a removed temp directory from another worktree. The command above passed after bypassing that daemon for this run.bun run buildexited 0 (✓ built in 39.62s). The focused voice E2E passed:composer voice pill e2e: record, attach, Undo, discard, Note save and retained-file retry passed; CSP reports were 0 across 7 pages. The keyboard-motion and Settings shortcut E2Es also passed.Known E2E gap: the full
bun run test:e2e:composerflow writes its Log entry, then times out after 30 seconds waiting for the existingLog entrypreview dialog atapps/web/e2e/composer.mjs:1025. Its existing expectation was kept. The focused VoicePill flow passes.Adversarial round
One 15-minute round ran against the real local server and stopped at its time limit (
exit 124), so the suite did not complete. The classification gates passed (335 cross-user operations, 945 generated-entry tools, 39 admin operations). Findings already recorded here: Search staged rebuild returned HTTP 202 where the existing probe expects 200; three route-specific probes did not start because the harness expectsCALTERNAL_SERVER_BINortarget/debug/calternal-server, while the runner providedADVERSARIAL_SERVER_BIN; one Folder fixture timed out during the Search storm (SLOW); the app-passwordapi_readfixture received the expected authorization denial (403); and the 3 MiB Appearance proxy probe reported that its local server was unavailable. No expectation was changed. The round found no crash or authorization bypass.Performance
The profile is in
docs/perf/runs/2026-10-02T032343Z-551d7b33-voicepill-617.json;docs/perf/baseline.jsonhas no earlier VoicePill profile. The perf VM was unreachable, so this is a local result under high host load (19.93 to 11.48 load average).Decisions
8fa93ce9a919dd93678f5ac03e752ee90ca5fead) has an MIT + Commons Clause licence, which is incompatible with this repository's AGPL-3.0-only rule. The shared pill is therefore an independent implementation using calternal UI primitives and tokens; the source and decision are documented in its header.Main files
packages/ui/src/components/VoicePill.svelte,packages/ui/src/index.ts,apps/web/src/lib/composer/Composer.svelte,apps/web/src/lib/composer/recorder.svelte.ts,apps/web/src/lib/composer/attachments.svelte.ts, recorder/component tests,apps/web/e2e/composer.mjs,docs/DESIGN.md,bench/voicepill-617.mjs,bench/run.sh, anddocs/perf/.Starting round 2 on
job/voicepill-617ate5d42e3982e942944bdbb8acc2dd5134711f9d17, based onorigin/devc4a61e8cf090170f35b1bed3350d9de20c83ecd5. I am tracing the #622 recording display-name helper and shared waveform/focus tokens before changing the VoicePill, then I will verify the real app at 390/820/1440 in both themes with a macOS platform profile.Finding: the Composer chip uses the stored recorder filename (
Voice memo YYYY-MM-DD HH.mm.webm), while #622's shared Calendar helper displays the same recording asVoice Memo, HH:MM. The helper is present onjob/calcard-seriesbut is not inorigin/dev. A regression test reproduced the mismatch for both the original name and a Files collision prefix. I reused the sharedaudioDisplayNamebehavior inpackages/uiand the Composer display, while keeping the stored filename unchanged for upload paths and Note links.Round 2 environment finding: production screenshot capture could not start on this host.
COMPOSER_VOICEPILL_ONLY=1 ... bun e2e/composer.mjsexited inmediaSandboxEnv()before launching the server or browser.tests/adversarial/prepare-media-runtime.shreportedtoo many local threads for the bounded media sandbox test: 6754; its configured limit is 4090. The per-jobcargo build -p calternal-serveralso remained active for nearly an hour without producing a binary amid concurrent builds, so I stopped it and tried the fresh server binary from a current sibling job. The same preflight failure prevented screenshot capture. The branch is unchanged by these failed attempts. I am running the web gates and will report the missing screenshot evidence as a gap.Round 2 screenshot attempt: after reusing the worktree's staged media runtime and a current server binary, the production SPA and VoicePill appeared. The first matrix case (390 px, Paper/light) clicked “Record voice memo”, but
[data-voice-pill][data-state="recording"]did not appear within 30 seconds. Playwright stopped atapps/web/e2e/composer.mjs:734withTimeoutError; it captured no updated screenshot. The test reported 0 CSP reports. The earlier preflight failure and this microphone-state timeout prevented the requested refreshed 390/820/1440 light/dark set and the local VoicePill performance profile.bun run checknow passes;bun run testis running.Round 2 implementation is committed on
job/voicepill-617.Head:
a0cc3dd8d162122abf5125f71b934aab87ad2321Commits:
31e9929c9Normalize voice memo display names (#617)a0cc3dd8dPolish VoicePill waveform and announcements (#617)Built:
audioDisplayNameacross Calendar and Composer. The chip now uses the Calendar formatVoice Memo, HH:MM; the indexed filename stays intact for paths and Note links.VoiceWaveformin the recording pill at 24 × 24 px. The action buttons use--toolbar-gap; VoicePill no longer defines local focus rings. Its height still uses the toolbar token.UX gaps closed: Calendar and Composer names now agree; the waveform uses the shared, larger meter; stop/discard controls have the standard gap and shared focus treatment; the timer has a polite announcement cadence.
UX gaps left: The refreshed 390/820/1440 light/dark screenshot set was not captured or attached. The real-server browser run timed out waiting for the first recording to enter
recordingstate after 30 seconds. The reduced-motion/live-region browser assertions and the #617 performance profile therefore did not run. No new screenshots are attached.Gates and verification:
bun run checkcompleted with exit 0. Output:Focused tests passed before commit:
Test Files 2 passed (2), Tests 7 passed (7).bun run testwas stopped with exit 130 after it continued running past the job timebox. It did not produce a final Vitest summary. These failure lines were emitted before interruption:git diff --checkcompleted with no output.cargo cleanoutput:Removed 1306 files, 590.7MiB total. No Rust source changed.The required
git fetch origin && git merge origin/devreturnedAlready up to date.atc4a61e8cf090170f35b1bed3350d9de20c83ecd5. During later checks, the sharedorigin/devtracking ref advanced to440e19dce23040ac8ebaae88f0469b6535b1afcb(fix(test): let local media sandbox start on a busy shared host); this branch is now one commit behind. I did not run a second merge.Decisions recorded for owner confirmation: use the shared Calendar short label format for Composer recordings; size the pill waveform at 24 × 24 px while preserving the toolbar height; announce the timer through a polite status at the displayed one-second cadence. DESIGN §38 now records the accessibility cadence and reduced-motion behavior.
Final report addendum (supersedes the earlier head SHA in my previous comment): final head is
b6177e846dccb03d6a3d0b92fbe57b9c8f87faef.Final review found that the existing VoicePill performance profile still waited for 24
.voice-pill-wave-barnodes from the previous implementation. The shared pill waveform now renders five bars and exposes its bounded analyser level. I updatedbench/voicepill-617.mjsto wait for a positive--voice-leveland describe the current hot path.node --check bench/voicepill-617.mjsandgit diff --checkpassed. I did not run the profile because its microphone flow hit the same recording-state timeout as the screenshot flow; no performance numbers are available.Round 3 started on voicepill-617 at
b6177e846. Merged origin/dev; retained the updated §57 keyboard motion rule. Investigating actual microphone capture and collecting macOS-emulated production screenshots at 390/820/1440 in Light and Dark. Full suites and performance measurements are reserved for the merge round by the 2026-10-02 verification policy.Round 3 evidence: microphone capture now starts on the production SPA with a compatible prebuilt server, CALTERNAL_E2E_ASSET_OVERRIDE=1, microphone permission and a known PCM input file. The phone recording passed changing-analyser, reduced-motion and polite one-second live-region checks. bun run check reports 0 errors and 0 warnings; focused VoicePill/recorder/attachments/Composer tests passed (4 files, 40 tests). The stronger movement assertion found that an over-loud fixture saturates the meter, so the shared fixture uses a lower changing amplitude. Committed fixture/profile wiring at
2ff6a4901. Capturing the saved Calendar attachment and the complete matrix next.Round 3 product finding: the actual saved Agenda card rendered
Voice memo 2026-10-02 20.22.webm, while the Composer chip renderedVoice Memo, 20:22. The shared attachment view model only normalizes audio-family files; generated WebM voice files can have a container MIME of video/webm. A new regression failed withexpected video to be audio. The narrow fix recognizes generated recorder WebM names as audio in the shared helper and retains video classification for ordinary WebM clips. The new focused regression now passes (1 file, 5 tests). Rebuilding and capturing the corrected saved state next.Round 3 second product finding: the 1440 px 3x crop clipped Discard. The focused Note recording then timed out because the adjacent
Open in the editorbutton intercepted Discard clicks. The recording width was only 4.5 × the hit token, less than its waveform + timer + two buttons + three gaps on desktop. I replaced that multiplier with those CSS token dimensions and reserve five timer characters. The phone action group also exceeded its viewport during recording, so below 600 px the active VoicePill temporarily replaces the other Add controls. Stop/Discard and Send remain in one row; the Add controls return at idle. Added focused browser bounds assertions; rerunning affected checks and the capture matrix after this CSS change.Round 3 finished on
job/voicepill-617at4b9232890630813364077a41b5de31b6e4ff87c6.Merged
origin/devonce, atc4faf184df726a9375ae0c13bdfb6018ac2cf57e, including the busy-host media preflight fix. No push, deploy or merge into dev.Built and fixed:
Voice memo 2026-10-02 20.22.webmafter save. Generated recorder WebM files now use the audio family even when container MIME is video/webm, so Calendar and Composer both showVoice Memo, HH:MM. A new regression failed before the change and passed afterward. Ordinary WebM clips remain video.Files changed in this round:
apps/web/e2e/voice-fixture.mjs,apps/web/e2e/composer.mjs,bench/voicepill-617.mjs,packages/ui/src/components/VoicePill.svelte,packages/ui/src/components/calendar/attachments.ts,apps/web/src/lib/composer/Composer.svelte,apps/web/src/lib/calendar/attachments.test.ts. The merge kept origin/dev's corrected DESIGN motion rule.Evidence: all six production capture cases passed. Reduced motion keeps waveform bars static. The atomic polite status updates at the one-second cadence; the visible timer has aria-live off. The 3x crops were checked for icon/timer alignment and complete controls. Claude remains the visual reviewer.
Morph frame strip.
Gate output, verbatim:
cargo fmt --checkproduced no output. No Rust source changed, so Rust clippy/test gates are not applicable in this job.bun run check:Final affected-file command:
cd apps/web && bunx vitest run src/lib/composer/VoicePill.svelte.test.ts src/lib/composer/Composer.svelte.test.ts src/lib/calendar/attachments.test.ts --maxWorkers=2. Full output:Earlier focused recorder/attachment/component checks also passed (4 files, 40 tests); the new container regression passed (1 file, 5 tests). Those complete logs are attached. The production build completed with exit 0. Node syntax checks and
git diff --checkpassed. Module comments in all touched files were re-read.Browser output for the complete screenshot matrix, verbatim:
The tail-only run then reported, verbatim:
Known gaps and UX gaps left:
UX gaps closed: real-browser capture proof; changing waveform; reduced-motion and live-region proof; consistent saved names; reachable desktop Discard; phone control containment; touch/keyboard opening and real playback of saved memos.
Decisions for owner confirmation:
For the merge round:
cd apps/web && bun run test— full web regression suite.cd apps/web && COMPOSER_VOICEPILL_ONLY=1 CALTERNAL_E2E_ASSET_OVERRIDE=1 COMPOSER_SHOTS=../../artifacts/voicepill-617-merge bun e2e/composer.mjswithCALTERNAL_SERVER_BINset to the combined build — complete retained-file capacity/retry coverage.cd apps/web && bun run test:e2e:composer— all Composer write, keyboard and error flows on the combined branch.tests/adversarial/run.sh— combined-server cross-plugin and robustness round.CALTERNAL_SERVER_BIN, then runflock /root/perf.lock bash -c 'uptime; PERF_VM_LOCK=1 PERF_COMMIT=$(git rev-parse HEAD) bun bench/voicepill-617.mjs --json artifacts/voicepill-617/profile.json'. Compare CPU, RSS, average and full-tray burst results withdocs/perf/baseline.json: metrics.scenarios.voicepill_617. The baseline average p50/p95 is 580.35/792.39 ms at 390 and 455.15/634.50 ms at 1440; burst p50/p95 is 467.05/582.77 and 461.02/697.31 ms.Cleanup output, verbatim:
Web build output and the private server copy were removed. Git status is clean. Review artifacts remain ignored in this worktree and are attached to this issue.
Send-back round started on
job/voicepill-617.4b9232890630813364077a41b5de31b6e4ff87c6c4faf184df726a9375ae0c13bdfb6018ac2cf57eI am tracing the pill geometry, requesting state, waveform layout, and the timed-out 32-attachment retained retry before editing. I will recapture the requested 390/820/1440 light/dark Mac-rendered production screenshots and run focused verification after the fixes.
Finding from the reviewed production screenshots and current CSS:
VoicePill.sveltesets the pill height to--control-h-compactbut sets eachPillicon size to--control-h.Pill.svelteuses that value for both button width and height. The shared tokens resolve to 30/24 px on a fine pointer and 44/36 px on a coarse pointer, which matches the circles extending beyond the pill in the attached 1440 and 390 3x crops.verifyVoiceControlBounds()currently checks only horizontal containment.3.3 * --hitfor an ellipsized text label plus Cancel; the existing morph strip shows the label clipped toWai.../Waiting....VoiceWaveformrenders five 2 px bars in a 24 px region, while the recording slot is0.9 * --hit; the screenshots show the unused gap before the timer.I will add production geometry assertions for both axes and waveform spread, then adjust the pill controls, request indicator and waveform against those checks. The 32-file retained retry already exists in the focused real-server e2e; I will run it separately after reproducing its timeout.
The 390/820/1440 light/dark production screenshot matrix and focused VoicePill controls passed. In the 32-file retry case, the test waited for the retried upload to report Attached before looking for Undo; the subsequent Undo lookup timed out after 30 seconds. I changed the fixture to cancel queued uploads before opening the slot and to wait for the specific “Voice memo attached” toast before checking the settled upload state. I am rerunning this sequence now.
Completed
UX gaps closed
UX gaps left
None found in the #617 scope. Screenshots use Playwright macOS platform emulation.
Decisions
DESIGN §38 does not set these exact details. The action size uses
--control-h-compact - 2pxto leave a 1 px inset while retaining the shared hit target. The requesting state shows only the microphone icon and announces “Waiting for microphone…” through a hidden polite status. The pill uses the first 24 bars from the shared waveform data and spans the full reserved lane.Files
packages/ui/src/components/VoicePill.sveltepackages/ui/src/components/composer/VoiceWaveform.svelteapps/web/src/lib/composer/VoicePill.svelte.test.tsapps/web/e2e/composer.mjsHead
844277e621d3648df00f01bf4871929038503812Verification
cargo fmt --check: exit 0; no stdout.Finisheddevprofile [unoptimized + debuginfo] target(s) in 35m 51s.bun run buildsucceeded. The final screenshots came from that production SPA.bun run checkoutput:bunx vitest run src/lib/composer/VoicePill.svelte.test.ts --maxWorkers=2output:node --check apps/web/e2e/composer.mjs: exit 0; no stdout.Production E2E output:
Evidence
The production screenshot set is attached to this issue. The six groups cover recording, stopped, attached, saved and 3× row-crop states at 390/820/1440 px in light and dark. The macOS-rendered morph strip is here.
Remaining checks
The full web suite, full E2E suite and adversarial matrices remain for the merge round under the shared verification policy. No performance measurement was run for this visual/accessibility issue; the existing
bench/voicepill-617.mjsprofile remains available.Starting SEND-BACK round 2 on branch
job/voicepill-617.Base SHA (
origin/devmerge base):4a871b383864dad0d6c87bcd22b7f0d589e3506e. Current HEAD:844277e621d3648df00f01bf4871929038503812.I am adjusting the visible Stop and Discard circles to have equal top, bottom and trailing insets, preserving their shared touch targets. I will strengthen the existing e2e geometry assertion, then capture the 390/820/1440 light/dark set and 3x row crops.
Finding: the previous bounds helper allowed Stop and Discard to touch the recording capsule because it only checked containment with a 1px tolerance; the component sized each icon control to
--control-h-compact - 2px, which filled the capsule's inner height. It did not assert a shared inset, an inner radius, or the visible gap. I am extending that check to cover those measurements and the retained shared hit area.Finding: after reducing the painted circles, the old capsule width left spare space. The production geometry run showed
space-betweendistributing that space into the waveform-to-timer gap, which violated the existing shared-gap assertion. I have refit the recording capsule width around the smaller circles and equal insets so the existing waveform gap behavior stays intact; the original assertion remains unchanged.Completed SEND-BACK round 2 for #617.
Head SHA:
e4f2a8f007d60d4f9600d0c146ba6083b2a43e66Branch:
job/voicepill-617Built
--island-padinsets at the top and bottom; Discard has the same inset at the trailing edge.--radius-pill - --island-pad. Stop and Discard keep a visible gap, and the sharedPillpseudo-element still provides the full--hittarget.--hittarget, and waveform gap.Files
packages/ui/src/components/VoicePill.svelteapps/web/e2e/composer.mjsScreenshots
All files are attached to this issue. Each screenshot uses macOS platform signals.
Morph strip: five-frame strip.
Gate output
Production build completed with exit 0. Its final output was:
The server build was needed because
/mnt/hdd/targets/shared-server/CURRENTwas absent:bun run check:Focused component test, verbatim:
Production VoicePill e2e output, verbatim:
Cleanup output:
No Rust source changed, so Rust format, clippy and test gates were not applicable.
node --check e2e/composer.mjsandgit diff --checkpassed.UX gaps closed
The circle outlines no longer meet the capsule outline. Stop and Discard stay separated, vertically concentric, and touchable at phone, tablet and desktop sizes. The responsive screenshot set covers light and dark themes.
Known gaps and UX gaps left
No VoicePill-specific gaps remain. Vite printed existing
use clientdirective notices from vendored analytics files; the production build completed.Decisions
DESIGN §38 does not set a precise control inset. I used
--island-padas the inset and reduced the inherited pill radius by the same value, as the review requested. I refit the shell width to preserve the existing shared waveform gap after the controls became smaller.For the merge round
Run the full web Vitest and combined e2e suites under the merge-round policy. This job ran the focused VoicePill component test and production e2e only.
Starting send-back round 3 on branch job/voicepill-617. Base is origin/dev merge base
f06679b11c; current HEAD ise4f2a8f007. I will correct the production pill geometry and extend its responsive E2E proof to all requested widths, themes and DPRs.Finding: the existing responsive loop calls verifyVoiceControlBounds for 390/820/1440 in both themes, but the proof only measures waveform bars relative to their own lane. It never measures the first bar from the capsule's leading edge, so the 1440 dark crop can visibly touch the border while passing. The width matrix also samples only 3x/2x/1x once each, not both requested DPRs.
Finding: the strengthened recording-capsule assertion passed the complete responsive matrix at 390/820/1440, light/dark, 1x/2x DPR (12 production cases). The subsequent focused interaction flow sampled the pill 300 ms after recording began and failed an old whole-control containment check while the shell was still moving. I am making that probe wait for the width/morph transitions to settle; this does not add a production loading wait.
Round 3 complete for #617.
Built
Files
packages/ui/src/components/VoicePill.svelteapps/web/e2e/composer.mjsScreenshots
The 12 fresh 3x row crops are in
artifacts/voicepill-617-round3/with namesvoicepill-{390|820|1440}-{1x|2x}-{light|dark}-row-3x.png. They are ignored artifacts and are not committed. The installedfj v0.6.0has no issue attachment command, so I could not upload them to Forgejo; the shared worktree path is available for review.UX gaps closed
UX gaps left
Decisions
Head SHA
1488cbedf31bb5aa111d02189bf3821c29ddb061Gates and evidence
cargo fmt --checkexited 0 with no stdout or stderr. No Rust crate changed, so Rust clippy and unit-test gates were not applicable.bun run checkoutput:bunx vitest run src/lib/composer/VoicePill.svelte.test.ts --maxWorkers=2output:The production VoicePill E2E matrix passed all 12 combinations. Each geometry line logged equal leading, vertical and trailing insets: 3 px at 390/820 and 2 px at 1440. The focused control flow also passed (morph, Stop, Undo, Discard, keyboard Note save and retained-file retry). CSP reports: 0 across 13 pages.
The full web suite remains for the merge round under the shared verification policy.