LOCATION: one Location setting and its uses — location reminders via Apple Reminders geofencing (grill) #391
Closed
opened 2026-09-29 04:16:15 +00:00 by kayg
·
62 comments
No Branch/Tag specified
dev
job/restyle-files
wip/previewcard-1098
wip/perf-1124
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
job/onboard-1141
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/delete-1119
wip/collabloss-1197
wip/cards2-1179
wip/cards2-1083
wip/cards-1179
wip/cards-1083
wip/canvas-visual
wip/canvasvis2-976
wip/calhdr-1112
wip/calcards-1115
wip/browserfix
wip/blocks-1125
wip/allday-1107
wip/agenda-decks
wip/agenda-1086
wip/adv7c-1105
job/wizchoices-1140
wip/trayicons2-1095
wip/trayicons-1095
job/perf-1124
wip/tagdnd-1187
wip/sidebar3-1094
job/tocrail-1191
wip/rev2-webperf
wip/rev2-money-ident
job/hide-1153
job/notifloop-1194
job/tagdnd-1187
job/collabloss-1197
wip/wizchoices-1140
wip/restyle-1190
job/moneyfmt-1180
job/txentry-1198
job/cards-1179
wip/moneyfmt2-1180
wip/moneyfmt-1180-r
wip/moneyfmt-1180
job/tagperf-1186
job/pillglass-1189
wip/tocrail-1191
job/flags-1181
wip/flags-1181
job/restyle-1190
job/restyle-mailmoney
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/tagperf-1186
wip/settingsreg-1195
job/merge29
job/fu-1171
wip/merge29j
wip/fu-1171
job/fu-1166
job/adv-1202
job/directory-1199
job/segmented-1200
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#391
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?
Request (owner, 2026-09-29)
"why is the location permission here? what is it being used for? the sunset thing? for auto theme switching? I feel like we could use the location toggle for much more like location reminders."
Today
Settings → Appearance → Theme & UI → "Use my precise location" feeds only the Auto colour scheme (#324): sunrise/sunset from coordinates rounded to 0.1° (~10 km), otherwise the time-zone reference city.
Constraint
A web app cannot watch location in the background (iOS has no background geolocation for web apps). Arrive/leave reminders on iPhone work through Apple Reminders' native geofencing: a VTODO VALARM with
X-APPLE-STRUCTURED-LOCATIONandX-APPLE-PROXIMITY:ARRIVE|DEPARTover CalDAV (#358 now preserves these properties). A future native app could geofence itself.Grill (open; do not build until answered and recorded in DESIGN.md)
Decided (owner, 2026-09-29), recorded in DESIGN §47: L1 yes; L2 yes (meant for the iOS app anyway; Apple Reminders geofencing over CalDAV until then); L3 plaintext; L4 yes (on by default with the Location permission, user can turn it off); L5 agreed (travel time-zone detection now); L6 exact precision everywhere: 'what are we hiding from? it's the user's personal cloud'.
Starting #391 on branch
job/location, based atd5dfcb93d4a5eae67be0311c68554bf94e1ba825(the current merge-base withdev). I confirmed the owner decision comment and DESIGN §47. Scope: L1, L3–L6; L2 remains with #393. I will inspect the existing location, preferences, log, deep-link, and filesystem patterns before implementing.Finding — L6:
apps/web/src/lib/appearance/autoScheme.svelte.tsrounded browser coordinates to 0.1°, andcrates/calternal-server/src/appearance.rsrounded again on both GET and PUT. The server test expected 28.6139/77.209 to become 28.6/77.2. I removed the client and server rounding and changed the test to require exact values; existing legacy rounded values remain as stored until the User refreshes Location with a precise browser fix.Implementation decisions where DESIGN §47 is silent:
Places.jsonfile in the User's Home. Each place has a stable UUID, a name, exact coordinates and an editable radius. The default radius is 100 m; valid values are 10 m through 100,000 m.utz0.4.1+2026c (MIT; verified withcargo info), so travel detection makes no third-party request.Finding — old
appearance.auto_scheme.locationvalues were rounded to 0.1°, so their discarded precision cannot be recovered. The migration moves that value into Location, marks it approximate, preserves the prior opt-in and Auto scheme, and replaces it with a full browser fix when Location is enabled and geolocation is available.Owner (2026-09-29): remove the 'Next switch' row ("Using New Delhi as the reference…" / "Dark at 18:09 your time") from Appearance entirely — there is no reason to show it. Instead, hovering or focusing the Auto segment shows a tooltip: 'Next flip at
Decision — each Log line will carry its Saved place UUID and name snapshot in a trailing HTML comment. It keeps the place label with the Log entry through moves and Saved place renames or removal, and it stores no coordinates in the Daily note. The Calendar Index will project that reference for entry rows and previews. Typed pins accept decimal coordinates; I will not use an outside address geocoder because Location data must stay in this Instance.
Finding — confirmed timezone reload:
LocationStore.load()restored the API client’s day-key zone but left Calendar’s local date/time helpers on the browser zone. This made the same confirmed zone behave differently after a reload. The store now restores both overrides; a regression test checks both setters.Finding — focused web tests: the Calendar suite calls
formatStampthrough@calternal/ui; the timezone work used that helper inlocalNowbut the package index did not export it. I added the public export. Verification now passes:Test Files 2 passed (2)andTests 23 passed (23)forlocation.test.tsandzones.test.ts.After merging
dev, the Location server build failed because its settings error match did not cover the newUserSettingsError::InsufficientStoragevariant (E0004 atcrates/calternal-server/src/location.rs:253). I added HTTP 507 mapping for Location preferences and Saved places writes, documented the response in the Location OpenAPI operations, and added regressions for the Home quota path and server mapping.cargo test -p calternal-locationpassed (8 tests); the focused server mapping test passed (1 test).The one adversarial run passed the 70 KB request-body check (HTTP 413), malformed and invalid-coordinate checks, concurrent place writes, and cross-User isolation. It then reached the oversized
Places.jsoncheck, which returned 413, but the harness failed while restoring its temp fixture (EACCESon acalternal-fsread-only file). I removed direct writes to the server's private Home from the harness. The API body limit remains in the probe, andcrates/calternal-location/tests/places.rsexercises the on-disk size limit throughRoot. I did not rerun the adversarial round.Implemented Forgejo #391 on
job/location.Built
Places.jsonin the User Home, with exact coordinates, current-fix or typed-coordinate entry, CRUD, radius matching, stable place-ID links, and per-User isolation.Files
crates/calternal-location/,crates/calternal-server/src/location.rs,crates/calternal-server/src/appearance.rs,crates/calternal-plugin/src/user_settings.rs.crates/calternal-notes-core/,crates/plugins/notes/,crates/plugins/calendar/.apps/web/src/lib/location/,apps/web/src/lib/appearance/autoScheme.svelte.ts, Settings and Calendar routes,apps/web/e2e/appearance-review.mjs,packages/api-client/src/generated.ts,contracts/openapi.json.tests/adversarial/appearance_auto_scheme.mjsand Location tests undercrates/calternal-location/tests/places.rs.Head:
007289ab7972c89a1ca5212b03ec72ddb527663e(worktree clean). The localdevbranch was merged once into this branch. No merge intodevwas made.Gate output
The four-hour job limit stopped Clippy while it was still checking dependencies. Full
cargo test,bun run check, andbun run testwere not run within that limit. Focused tests passed:cargo test -p calternal-location(8 passed), andcargo test -p calternal-server location::tests::user_settings_quota_errors_return_insufficient_storage(1 passed). The focused web tests passed earlier. Production web build passed.Visual review: 12 production screenshots passed at 390/820/1440 px in light/dark for Location and Auto. They are in
artifacts/appearance-review/.scripts/fjhas no attachment command, so the screenshots remain in the worktree for the visual reviewer.Adversarial round: The probe reached and passed malformed/bogus input, 70 KB request-body rejection (413), Unicode, 12 concurrent writes, and cross-User checks. The oversized on-disk file returned 413, then the harness failed restoring its read-only temp file with
EACCES. I removed direct Home-file mutation from the probe and kept the on-disk size regression in thecalternal-locationtests. The adversarial round was not rerun.Known review gap: The existing full Appearance review assertion expects 16
menuitemradioelements in dark mode. Three variant families render as submenu parents, so the observed count is 13 radios plus 3 submenu parents. I kept that expectation unchanged; the focused Location/Auto screenshot review passed.Decisions: Use
Places.json; capture place UUID/name in a trailing Log comment; use exact coordinates; allow typed coordinates without an external geocoder; use local timezone data and require User confirmation; preserve Location item query/hash during Settings canonicalization. L2 remains owned by #393;crates/calternal-davwas not edited by this job.Review of job/location head
007289ab: sent back. (1) Saved places move from Places.json to a hand-editable Places.md (one heading per place, list lines, unknown content preserved). (2) Clippy, full tests and the web check did not run before the time limit, so run them now. (3) Fix the probe fixture restore and rerun it. (4) Correct the stale Appearance radio count.Resuming #391 on branch at . The current merge-base with is ; this branch already contains the earlier one-time merge of (). I am completing the Markdown Saved places store, design/test updates, probe fixture restore and rerun, and the Appearance menu count assertion.
Resuming #391 on branch
job/locationat007289ab7972c89a1ca5212b03ec72ddb527663e. The current merge-base withdevisc46515046871936ad681c4d00e8b76de69dde3b7; this branch already contains the earlier one-time merge ofdev(56340ec1). I am completing the Markdown Saved places store, design and test updates, probe fixture restore and rerun, and the Appearance menu count assertion.Finding during the required
devmerge:devuses Notes migration IDs 16 and 17 for Daily note navigation, while this branch used ID 16 for the Log Saved place projection. I keptdev's migrations at 16/17 and moved the not-yet-deployed Location projection migration to ID 18 (0018_log_place.sql), so the merged migration set has unique, increasing IDs. The shared-theme E2E conflicts now use thedevtheme helper; the Location branch'sLogPlaceexports anddev'sset_daily_note_navigationexport are both retained.Finding after the
devmerge:cargo clippy --all-targets -- -D warningsstops incrates/calternal-notes-core/src/dayfile.rswithmanual_is_multiple_ofat line 1419 andchunks_exact_to_as_chunksat line 1424. I will apply Clippy's equivalent suggestions; this affects no Location format behavior.Finding in the second
cargo clippy --all-targets -- -D warningsrun:crates/calternal-location/src/lib.rs:143triggersneedless_option_as_deref;expectedis already anOption<&str>. I will pass it directly towrite_checked.Finding in the latest
cargo clippy --all-targets -- -D warningsrun: server compilation stops incrates/calternal-server/src/main.rs:67because theRustEmbedderive cannot find generatedapps/web/build/. This is the production web build prerequisite; I will build the web app before the final Clippy rerun and adversarial probe.Post-merge
bun run checkfinding:apps/web/src/lib/location/location.svelte.tstreatedLocationView.positionandLocationView.timezoneas required nullable fields, but the merged OpenAPI contract marks both optional. Svelte diagnostics also found an untyped click event inLocationGroup.svelte. I will normalize omitted optional fields tonullat the API boundary and type the event asMouseEvent, then rerun the web check and requested test gate.Requested
apps/web bun run testresult: 125 test files passed and 1 failed (805 tests passed, 1 failed). The failure issrc/lib/components/analytics/RangeBar.svelte.test.ts > turning pages constructs no new Intl.DateTimeFormat: expected 0 constructions, received 302. This is outside the Location files and the expectation remains unchanged as required. I am recording it as a known gap while completing the Location/API checks.Location adversarial probe evidence: the Location API segment passed, including malformed/oversized input, atomic fixture restore, 12 concurrent place writes (all 201), and User isolation. In the subsequent Account → Location UI flow, the server saved
enabled=truewith the exact browser position, but the switch'saria-checkedstayedfalse(the probe failed atappearance_auto_scheme.mjs:356). The likely race is an in-flight initialLocationStore.load()overwriting the newer preference save. I am fixing this state race and adding a regression test; I will not alter the unrelated RangeBar test expectation.Finished Forgejo #391 on
job/location.Head:
449e422368998749638218ee9d670a95d06a2d21Built: Saved places now use
Home/Places.mdwith one## <Name>section andid,lat,lon, andradius: 150 mfields. Edits preserve unknown lines, prose, and original line endings; deletion removes only known place fields. DESIGN §47 and Location tests describe this format. The Location client also normalizes omitted optional API fields and ignores older in-flight preference responses after a newer save.Main files:
docs/DESIGN.md,crates/calternal-location/src/lib.rs,crates/calternal-location/tests/places.rs,crates/calternal-server/src/location.rs,crates/calternal-notes-core/src/dayfile.rs,crates/plugins/notes/migrations/0018_log_place.sql,tests/adversarial/appearance_auto_scheme.mjs,apps/web/e2e/appearance-review.mjs, and the Location store, its tests, andLocationGroup.svelteunderapps/web.Gates
cargo fmt --check— exit 0, no output.cargo clippy --all-targets -- -D warnings— exit 0:cargo test -p calternal-location -p calternal-server -p calternal-notes-core— exit 0. Verbatim suite summaries:apps/web bun run check— exit 0 after the Location fixes:apps/web bun run test— 125 test files passed; one unrelated Analytics test failed:Failure:
src/lib/components/analytics/RangeBar.svelte.test.ts > turning pages constructs no new Intl.DateTimeFormat. Its existing expectation was not changed. After the final Location race fix, the focused Location suite passed:Test Files 1 passed (1)andTests 4 passed (4).packages/api-client/check-generated.sh— exit 0 when invoked with Bash (the script is not executable in the worktree):Adversarial probe: The Location API segment passed malformed and oversized payloads, Unicode places, exact coordinates, 12 concurrent writes, cross-User isolation, and oversized-file fixture restoration. The full probe then found a client race: the server saved Location as enabled, but an earlier load left the Settings switch off. I fixed it with a preference revision guard and regression test. The focused Location suite passes after that fix; I did not repeat the one time-boxed probe. The generated screenshot remains under ignored
artifacts/and is not committed.Decisions:
calternal-notes-coreMarkdown serializers normalize some source formatting, so the Saved place file uses a small byte-span parser to retain unknown text and line endings. NoPlaces.jsonmigration is needed because nothing is deployed. The mergeddevbranch already uses migration numbers 16 and 17, so the Saved place projection migration uses 18. Optional Location API fields becomenullin the client store to keep its existing complete local type.devwas merged into this branch once as required. This job was not merged intodevand was not pushed.cargo cleanremoved 14,566 files (7.5 GiB), and the web build output was deleted. The worktree is clean.Starting resumed round 3 on
job/location, based at449e422368998749638218ee9d670a95d06a2d21; currentdevis02be0946d2a4908cdf323f1e9a6ed643b455795e. Worktree was clean. I am mergingdevonce as requested, then will resolve the Notes migration number and the listed conflicts while preserving both sides' behavior.Rust gate finding during this merge:
cargo clippy -p calternal-location --all-targets -- -D warningsreportedbyte_char_slicesatcrates/calternal-fs/src/root.rs:379in the per-User Index readiness marker added ondev(#400,a89649008). I changed[b'1']to Clippy's equivalent*b"1"form; this does not change behavior and lets the requested per-crate gates continue.Round 3 status — stopped at the owner’s four-hour timebox
Head:
7bd2defd8e0376cb72ef334162de528b142d47bcBuilt and committed
4b1375a59(dev merge and resolved Location changes),7bd2defd8(calendar accessible-name fix).Gate output recorded
cargo fmt --check: exit 0, no output.cargo clippy -p calternal-location --all-targets -- -D warnings: passed;Finished dev profile [unoptimized + debuginfo] target(s) in 1m 48s.cargo test -p calternal-location:cargo clippy -p calternal-plugin-notes --all-targets -- -D warnings: passed;Finished dev profile [unoptimized + debuginfo] target(s) in 42m 23s.cargo test -p calternal-plugin-notes:cargo clippy -p calternal-server --all-targets -- -D warnings: passed;Finished dev profile [unoptimized + debuginfo] target(s) in 45.65s.cargo test -p calternal-server:bun run checkpassed:The full
bun run testrun before the tag-name fix reported:The TimeGrid tag-name failure was fixed; its focused rerun passed:
The Analytics RangeBar assertion still fails in isolation on this job branch:
On the current
devworktree, the same focused assertion passed:The RangeBar source and test are identical to current dev. I did not alter the expectation. The full web suite was not rerun after fixing the TimeGrid issue.
Remaining work / evidence gaps
artifacts/location/does not have the requested 390/820/1440 light/dark matrix.devref is369ab6a2f; this branch’s one merge commit has02be0946das its dev parent. I did not merge again.bun run checkpassed before the final one-line accessible-name adjustment; the current full web suite and production screenshots remain unverified.Decisions
No push, deploy, or issue closure was performed.
Report supplement: files edited during this round:
crates/plugins/notes/migrations/0020_log_place.sql(renamed from 0018)crates/plugins/notes/src/store.rscrates/plugins/notes/src/lib.rscrates/calternal-server/src/wire.rscrates/calternal-fs/src/root.rspackages/ui/src/components/calendar/GridColumn.svelteapps/web/src/routes/settings/account/LocationGroup.svelteapps/web/e2e/appearance-review.mjsCleanup output:
Removed 15626 files, 7.0GiB totalfromcargo clean;apps/web/buildwas removed.Starting resumed round 4 on branch job/location. Rebuilding from origin/dev at
369ab6a2f9(old branch head7bd2defd8e). The old branch includes merge02be0946(#400); I will replay only the #391 first-parent commits and retain the accepted Places.md, plain wording, migration 20, and Location sheet title.Finding during the branch rebuild: origin/dev added App Surfaces wiring and Daily note navigation migrations 16–19. The Location API/Log replay conflicted in wire.rs, notes-core exports, and the Notes migration list. I kept both API routes and exports, retained migrations 16–19, and assigned the Saved-place projection migration 20 as required.
Finding after the branch rebuild: bun run check reports two missing LocationGroup imports because origin/dev moved AccountRow and SettingsGroup out of settings/parts. I am locating and reusing the current Settings components before rerunning the check.
Resolved: LocationGroup now uses the current SettingsCard/AccountList/SettingsRow components. The shared-components guard showed the stale wrappers before the edit, then passed after it (2 tests); bun run check now reports 0 errors and 0 warnings. The Location copy and phone sheet title assertion match the accepted text.
Finding: cargo fmt --check reported one formatting difference in the merged Notes core exports. I am applying rustfmt's line wrap; no behavior change is involved.
Finding: the existing generic adversarial checks still expected Appearance to store and return coordinates. #391 moved coordinates to /api/v1/location, so I updated those checks to expect mode-only Appearance data and reject the retired field; the dedicated Location probe covers coordinate bounds.
The adversarial suite still treated Location coordinates as Appearance fields. I updated its valid, hostile, and concurrency checks to assert that Appearance stores only the mode; Python AST parsing passed, commit
93ca20a2.Resume round 4 started from job/location at
d0a15308af(origin/dev:369ab6a2f9). I verified02be0946is not reachable from this branch or origin/dev; I will rebuild on current origin/dev and replay only the #391 commits before running the remaining gates.Finding on reconstructed origin/dev: the full web suite reports 302 Intl.DateTimeFormat constructions while paging RangePicker. The #391 change made formatDateRange resolve systemTimeZone() for each visible week cell; systemTimeZone constructs a formatter directly. I changed the no-override path to compare Installation-local years directly and kept explicit User-zone comparisons cached. I am verifying the existing RangeBar regression assertion now; no test expectation changed.
Starting resume round 4 on branch job/location. The worktree was clean at head
3d10a0203d. I fetched origin/dev at55a2f90feb; I am rebuilding from that base and will replay only the #391 commits before running the requested gates and probes.Resumed #391 on
job/location. Fresh base:origin/devatdfb5964a2fcf13dc8b9a50a319eee09bc386f322. The original branch had 27 ahead commits; all were #391 changes, and fetched refs showed02be0946was not an ancestor of the checkout. Replaying onto currentorigin/devhit a conflict where the Location Log fields overlap the newer #468 batch Log API. I am keeping both behaviors and will verify the combined API before final gates.Location #391 — round 4 final report
Built
Places.md, with exact coordinates, stable place IDs, bounded parsing, and filesystem writes through the server-owned root.Location.0020_log_place.sql. Integrated Location capture with the currentlog/batchAPI.Main files:
crates/calternal-server/src/location.rs,crates/calternal-location/src/lib.rs,crates/calternal-location/tests/places.rs,crates/plugins/notes/migrations/0020_log_place.sql,crates/plugins/notes/src/lib.rs,crates/calternal-notes-core/src/dayfile.rs,apps/web/src/lib/location/location.svelte.ts,apps/web/src/routes/settings/account/LocationGroup.svelte,apps/web/e2e/appearance-review.mjs, andtests/adversarial/appearance_auto_scheme.mjs.Branch
Head:
30294e17bff42d35a96945be1e124842d1ad203f(test(location): wait for settings state before review).git log origin/dev..HEADlists only the 27 #391 commits; it has no #400 merge commit. The clean rebuild started atdfb5964. The final fetch foundorigin/devhad advanced to6c87f5ff9442cd658572139bc536d018fd5222a4during this long run. Notes migrations on that fetchedorigin/devstill end at 0019, so 0020 remains the next free number. Rebase onto the newerorigin/devand rerun gates before merge; I did not add a merge commit because the branch must contain only #391 commits.Gate output
cargo fmt --checkexited 0 with no output.Clippy passed for
calternal-location,calternal-plugin-notes,calternal-notes-core,calternal-plugin-calendar, andcalternal-server:Crate tests passed:
cargo build -p calternal-serverpassed:bun run checkpassed:Full
bun run testresult:The only failure was the slow timezone test
keeps dates and Log instants in the selected zone when the browser zone differs; its focused run passed (1 passed | 20 skipped). The Analytics RangeBar test passed.The Location adversarial probe passed its malformed/oversized payload, exact coordinate, Unicode place, concurrency, fixture restore, and cross-User checks. Its UI consent assertion now waits for API/UI agreement across two rendered frames; the final run passed and captured the Auto review screenshots.
The six files are
location-light-{1440,820,390}.pngandlocation-dark-{1440,820,390}.pngunderartifacts/location/. They remain untracked and were not committed.scripts/fj issuehas no attachment command, so the images are available in the worktree rather than attached to this comment.Cleanup output:
Known gaps
origin/dev6c87f5ffand rerun required gates. The current branch is still based ondfb5964becauseorigin/devadvanced during the long gate run and the four-hour job limit was reached.Decisions not specified by DESIGN
log/batchrequest, then apply that sample to the batch. This keeps the batched request consistent and avoids repeated lookups or prompts.Places.mdlossless for unknown prose and line endings, and do not add migration from the earlier unshippedPlaces.jsonformat.origin/devuses 18 and 19 and has no 20.Started merge-round-2 on branch
job/merge-round-2, base6c87f5ff9442cd658572139bc536d018fd5222a4(origin/dev). Integrating the five requested branches in order, regenerating contracts, then checking migrations and running per-crate and web gates. No push or deployment.All five branches are committed on
job/merge-round-2. Finalgit fetch originandgit merge origin/devreturnedAlready up to date.Migration numbers are unique in every migrations folder: Notes adds 0020 above dev 0019; Calendar adds 0004 above dev 0003.Conflict resolution preserves Maintenance query redirects and saved-place UUID/fragment links; authenticated Location routing and public calendar feed routing; current Mail reader regression cases and the full-history performance fixture; canonical Daily note lookup plus filename search restricted to the selected User Home. Contracts are being regenerated, not hand-merged.
First web check exposed shared-token violations in LocationGroup: three literal line heights and one literal radius. Replaced these with existing leading and radius tokens; check rerun pending.
Safemode prevents execution of hostile-input, race-exploitation, and request-storm probes. These will be listed as unrun gates; normal integration and offline classification checks remain in scope.
Offline classification initially failed with
RuntimeError: OpenAPI operation has no authorization policy: GET /api/v1/location (location_get). Added explicit policies for the eight Location operations and caller-Home saved-place IDs; no prefix-wide allowance. Added one offline policy regression; existing assertions were not changed. Commita4c5cbd82.Fresh output:
Location token fix is committed as
8cd11376f. Shared-token guard passes; Settings registry: 8 passed. Productionbun run buildreturned exit 0.bun run testfirst run: 897 passed, 2 failed; both failures wereTest timed out in 5000ms.The isolated one-worker reruns passed: Calendar zones 21 passed; KeyboardShortcutsCard 1 passed. Both first and rerun output will be in the final report.Svelte check currently reports the expected stale pre-regeneration Calendar fields/routes. Contract generation is compiling the final merged server before regenerating the client.
calternal-cliclippy has passed. Offline benchmark helpers (12), DAV probe contract helpers (7), and Appearance probe contract helpers (4) pass. These offline helper tests are not the live adversarial round.Merged server generation completed:
The OpenAPI contract and TypeScript client were regenerated from this binary; all 328 operation IDs are unique. Offline cross-User classification now covers 328 operations and all four guard tests pass.
Reviewed and regenerated the parity inventory. Newly visible static adapter gaps: eight Location operations (CLI/MCP/WebMCP), eleven calendar feed/subscription operations (MCP), and the existing batch Log route (MCP/WebMCP). The Location, feeds and subscriptions Settings groups are added to the form inventory. Decision: retain the imported branch adapter scope and record these gaps in the source-backed inventory. This merge does not add adapter features.
Normal production browser checks are now running sequentially. Rust per-crate gates continue.
Normal production browser proof passed: Calendar feeds and Location at 390, 820 and 1440 px in light and dark. Full matrices are attached, with representative phone and desktop PNGs. No review artifacts are committed.
merge-round-2-location-review.zip
merge-round-2-calendar-feeds-review.zip
Local one-item Photos/Home smoke: allIndexedMs 4060; serverUpMs 1101; mean RSS 350938740 bytes; peak RSS 432443392 bytes; mean CPU 25.24%; peak CPU 132.98%. The one-item run is not comparable with the larger baseline datasets.
Generated-contract check passed with no diff. Current head:
19186f8e2. Per-crate Rust gates remain in progress.Correction to the earlier generated-check status: its tool wrapper returned 143 after generation, so that wrapper is not a confirmed pass. I reran the same generation, unique-operation-ID and Git diff checks with the freshly built merged server binary. All commands returned exit 0 and no generated diff remains.
Review archives and representative PNGs are attached to #391 and #431. Current head is
19186f8e2b3f5f8d315c0819c93f30ff277ca054. CLI clippy and both test binaries passed; remaining per-crate Rust gates continue.Rust gates remain serial on the shared host. Completed so far: CLI, DAV, Location, and Notes core clippy/test, all exit 0. Location: 11 tests passed; DAV: 41 unit and 33 integration tests passed; Notes core: 12 tests passed. Plugin clippy is compiling dependencies. No Rust failure so far. Browser checks and the explicit generated-contract, parity and offline cross-User classification checks are complete. The live adversarial round remains unrun under this session's safety limits.
The additional full Appearance review found an imported test regression: job/location changed origin/dev's existing 16-family menu assertion to 13 families plus 3 submenu parents, although the production menu still has 16 families. Restoring origin/dev's exact expectation and retaining Location-specific checks. No production behavior change and no weakened existing dev assertion. The initial full review also observed stored Light with server System; the instrumented normal-request rerun showed ordered System migration then Light save and passed that check, then stopped at the stale menu assertion. Both logs are preserved; the final full review is pending.
Additional production Appearance evidence exposed stale review selectors, not a change to the 16-family contract. The menu has 16 radio families in Light, and 13 radio families plus 3 variant submenu parents in Dark. Dev's expected total remains exactly 16; the selector now counts both family representations. Existing ThemePicker component tests require Catppuccin variants in a keyboard submenu, so the review now uses that interaction and retains its Frappé assertion. Capture guard regressions: 8 passed, 0 failed (committed
f57954466). The review seeds System through the real Appearance API before the first SPA navigation, so fixture setup does not leave a null-value migration unfinished. The full capture rerun is in progress. Earlier unseeded runs showed browser Light with server System; those failures remain preserved and are not a certified cold-start migration result. Calendar clippy is green; tests are compiling.Head
84d4258f130ebebe748a9b3a08f03c8741d01c45. Appearance review:PASS appearance review captures: 71 screenshots in /home/kayg/Developer/calternal-wt/merge-web/artifacts/location. Notes/Photos/Log review:PASS Notes and Photos review: 18 production screenshots, 390/820/1440 px, light/dark. Combined archive (89 PNGs): https://git.kayg.org/attachments/2a0c2168-6199-4d45-9ff2-ad676518e88e . The original Calendar archive remains attached to #431. Visual quality review stays with the orchestrator. The Appearance fixes retain dev's 16-family and Frappé expectations; count submenu parents as families, use the existing keyboard submenu behavior, distinguish saved Auto/System preferences from rendered Light/Dark phases, and await API persistence outside Playwright's synchronous predicate. Guard regression tests: 8 pass, 0 fail. Notes clippy/tests and Photos clippy now pass. Remaining main Rust gates: Photos tests and server clippy/tests. Live adversarial probes remain unrun under this session's safety limits.All five branches are committed on
job/merge-round-2. Validation remains incomplete at the four-hour limit.Head:
84d4258f130ebebe748a9b3a08f03c8741d01c45. Base:6c87f5ff9442cd658572139bc536d018fd5222a4.No push, deploy, or change to dev. No branch was dropped: no included branch produced a Rust code/test failure; unfinished validation is listed below.
Included:
job/location(#391),job/webcal-431(#431),job/small-bugs-4(#459/#463/#464),job/photos-470(#470),job/perf-367(#367). All five heads are ancestors. The required final fetch and origin/dev merge returnedAlready up to date.Integration fixes and files:
apps/web/src/routes/settings/[...path]/+page.svelte, registry tests).crates/calternal-server/src/wire.rs).crates/plugins/mail/src/sync.rs). Calendar benchmarks use the canonical Daily note first, then search only that User's Home (apps/web/e2e/calendar-perf.mjs).apps/web/src/routes/settings/account/LocationGroup.svelte).tests/adversarial/authz_matrix.py,xuser_matrix.py,test_xuser_classification.py).apps/web/e2e/harness.mjs,harness.test.mjs,appearance-review.mjs). Earlier failing capture output is preserved; no existing numeric assertion was weakened.contracts/openapi.json,packages/api-client/src/generated.ts, anddocs/parity-*. No generated files were hand-merged.artifacts/merge-round-2/files.txt.Migrations: no duplicate numeric prefixes in any migrations folder. Notes adds 0020 after origin/dev's 0019; Calendar adds 0004 after origin/dev's 0003. Notes bridge is excluded.
Decisions:
Known gaps:
calternal-servertests were stopped during compilation at the approximately four-hour limit (exit -15). Server clippy passed. No server test assertion result was produced. Runcargo test -p calternal-serverbefore merge.async-imapclippy/test were initially cancelled while waiting for the build lock and were not completed before the limit. Mail clippy and tests checked/exercised its Tokio dependency path.unknown.Browser evidence: Calendar feeds passed with 36 screenshots. Location passed with six screenshots, including stable Saved place link restoration and cap-height assertions. The full Appearance review passed with 71 screenshots. Notes, Photos and the Log with its Saved place passed with 18 more screenshots. All required surface matrices cover 390/820/1440 px and light/dark. The additional Unsplash previews use third-party test fixtures; ordinary Notes/Photos/Location/Calendar data comes from the real local API. The production app supplied the screenshots; visual quality review remains with the orchestrator.
Appearance, Notes, Photos and Log matrix. Location full matrix. Calendar full matrix.
Local performance smoke (
photos-perf.mjs --items 1 --home-only): server start 1101 ms; all indexed 4060 ms; rebuild requested 2582 ms; mean/peak RSS 350938740/432443392 bytes; mean/peak CPU 25.24/132.98%; CPU 23.74 s. Load after: 33.2/38.3/40.6. Baselinedocs/perf/baseline.json, commit369ab6a2f9fc673e3564b94857fbecfeb04df404, 5000 photos: server start 290 ms; indexed 63230 ms; rebuild 719 ms; mean/peak RSS 360533602/495759360 bytes; mean/peak CPU 63.05/235.82%; CPU 113.24 s. Different dataset and environment: these numbers show the smoke completed, not a regression comparison.Gate outputs follow. Full logs are under
artifacts/merge-round-2/in the worktree; screenshots and logs are not committed.Required environment:
CARGO_PROFILE_DEV_DEBUG=line-tables-only CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=4 TMPDIR=$PWD/target/tmp; the preset CARGO_TARGET_DIR was retained. Rust gates ran per crate.cargo fmt --check: exit 0, no output.git diff --check: exit 0, no output.Per-crate exit statuses, verbatim:
calternal-cli clippy:
calternal-cli test:
calternal-dav clippy:
calternal-dav test:
calternal-location clippy:
calternal-location test:
calternal-notes-core clippy:
calternal-notes-core test:
calternal-plugin clippy:
calternal-plugin test:
calternal-plugin-calendar clippy:
calternal-plugin-calendar test:
calternal-plugin-files clippy:
calternal-plugin-files test:
calternal-plugin-mail clippy:
calternal-plugin-mail test:
calternal-plugin-notes clippy:
calternal-plugin-notes test:
calternal-plugin-photos clippy:
calternal-plugin-photos test:
calternal-server clippy:
Server test run: cancelled during compilation; no test result. Last compiler output, verbatim:
Web, contract, classification, parity, offline helper and browser output excerpts follow verbatim. Full output, including earlier failures and isolated reruns, is in the attached log archive.
bun-install.log
web-check-final.log
web-test.log
web-zones-alone.log
web-shortcuts-alone.log
settings-alone.log
api-client-tests.log
bench-tests.log
dav-probe-contract-tests.log
appearance-probe-contract-tests.log
classification-final-tests.log
classify-final.log
parity-final.log
generated-check-confirmed.log
calendar-feeds.log
location-review.log
photos-home-local.log
harness-test-final.log:
appearance-review-awaited.log:
reconcile-review-normal-note.log:
cargo-clean.log:
migrations.log:
bun run build: exit 0. Output, verbatim:Official generated-check wrapper exit: 143. Confirmed equivalent generation/uniqueness/diff steps: all exit 0, quoted above.
Standalone vendor attempt statuses, verbatim:
Cleanup: cargo clean exit 0; web build and Svelte build output deleted. Screenshots and logs remain uncommitted. Final git status is clean.
Full gate output, earlier failures, isolated reruns, performance smoke and changed-file manifest.
Resuming merge round 2 on
job/merge-round-2, base/head84d4258f130ebebe748a9b3a08f03c8741d01c45. I will merge the currentorigin/devonce, thenjob/bg-422, and run the missing final-tree gates and ordinary local functional/performance checks. Hostile-input, race and cross-User exploitation probes remain unrun under this session’s safety limits. No push or deployment. Fresh output will be reported on #391 #431 #459 #470 #367 #422.Fetched
originonce.origin/devmerged ase3bb4b1f5; its only conflict was the GridColumn module comment, resolved with both #431 subscription Event and #410 pile invariants. The #422 merge conflicts are an import list and a Photos index module comment: retain both Location and BACKGROUND_FOLDER imports, targeted/startup refresh (#470), and Backgrounds exclusion (#422). Final-tree server clippy/test and web check/test are running. Freshorigin/devalso contains CRLF CSV lines and Markdown hard breaks underdocs/perf/runs/2026-09-30-asr-ab*, which make the staged diff whitespace check report trailing whitespace; I preserved these imported research files.Both requested merges are committed:
e3bb4b1f5(origin/dev5d6d22e6047e902213980f88df8c77bba463fe10) and272139628(#422 head59a232b4d43aa77c274dd180454d5bd8e6ab617c). Final-tree web check:svelte-check found 0 errors and 0 warnings. Web tests:Test Files 139 passed (139)/Tests 905 passed (905). Offline classification and harness regressions passed. Parity regeneration removes one stalePhotosView.svelte:uploadmenu inventory entry; no new adapter gaps. Rust gates and production build continue.Final-tree
cargo fmt --checkexit 0 (no output). Server clippy exit 0:Server tests now compile. The production web build passed. Unique migration-prefix checks passed in all 14 folders. Browser plugin not available; the existing Playwright harness will run ordinary local checks against the final-tree server and production SPA.
Final-tree server clippy and tests passed (both exit 0). The #422 explicit 2 MiB stack regression passed. Output, verbatim:
The runnable server build and sequential IMAP/Files/Photos/filesystem gates are next.
Standalone
async-imapclippy passed; tests failed one existing expectation. The unchangedclient::tests::test_parsing_errorexpects the SMTP fixture greeting inDisplay; the existingParseError::Invaliddisplay atsrc/error.rssays onlyunable to parse status response. Both came fromc54be68ad(2026-09-28). No merge altered either. I keep the old expectation and current display unchanged under the owner rule; the orchestrator must decide the intended diagnostic contract.Location review passed six screenshots and Calendar feeds passed 36 screenshots on the final production build. Settings effects initially failed to load Sharp because the Nix Bun runtime could not find libstdc++; resolving the runtime path is in progress.
Starting resumed validation on job/merge-round-2 at
42c63668fd(merge base:5d6d22e604). I am reconciling origin/dev and job/bg-422, then running the remaining gates and live probes.Merge finding: origin/dev conflicted in AppearanceSection.svelte and the #367 benchmark recorder/runner. The incoming Appearance version put the precise-location toggle back in Appearance, while DESIGN §47 L1 assigns location consent to Account → Location; I kept that ownership and merged the #506 schemePreference/variant behavior. The incoming benchmark files lacked #367's locking and workload coverage; I retained those paths and added the #506 Theme menu profile to the locked probe and shared report schema.
The first Location probe run exposed a flaky test harness wait, not a server defect: the async
page.waitForFunctionpredicate could resolve early under Playwright 1.63, while checking the DOM and API in one predicate. I updated the probe to await the Location write response, read authoritative API state on the host, then wait with synchronous DOM predicates. The existing consent expectation remains unchanged. The corrected real-server probe passed, including hostile payloads, exact coordinates, concurrent writes, and cross-User isolation.Merge round 2 final report
Head:
192ea5457f1fc17735d876e70b41cb506b2a8274onjob/merge-round-2.origin/devwas fetched and merged at1389119e33831275e6b56b9181ef42838003a4b3;job/bg-422was already an ancestor (git merge --no-edit job/bg-422→Already up to date.). No push, deploy, or merge to dev.Built
Integrated the #391 Location/Appearance, #431 calendar feeds, #459 bug fixes, #470 Photos and #367 performance changes. Follow-up
76d1e71e1makes Location probes await settled server state. Follow-up192ea5457fixes the Photos/Backgrounds SSE ordering race: preserve one event invalidation while the stable folder ID resolves, then refetch once. Updated the production Settings sweep to cover Account → Location and real Photos folder actions.Files changed by the follow-up:
apps/web/src/lib/photos/BackgroundsFolderView.svelteapps/web/e2e/settings-effects.mjstests/adversarial/appearance_auto_scheme.mjsFull integration manifest:
artifacts/merge-round-2/files.txt.Gates (output verbatim)
cargo fmt --check: exit 0, no output.Live probes
Location API probe: malformed and oversized payloads and file, exact coordinates, Unicode place, concurrent writes, fixture restore, and cross-User isolation passed;Appearance Auto/Fonts/Background burst: 48 concurrent writes, all 200.Calendar feeds proof passed; screenshots: /home/kayg/Developer/calternal-wt/merge-web/artifacts/webcal-431.WebDAV scripted probes passed.PASS settings effects: Appearance, Photos/Backgrounds, Calendar time preview; screenshots in /home/kayg/Developer/calternal-wt/merge-web/artifacts/bg-422.328 operations classified; 157 operations replayed; 565 A-ID vs missing-ID comparisons across B, C, D and anonymous; median absolute timing delta 6.1 ms; ownership:77 comparisons; 0 denial failures.photos-perf.mjs --items 1 --home-only: at load average 38.2/42.8/43, server start 2850 ms, indexed 4790 ms, mean/peak RSS 335424222/425738240 bytes, mean/peak CPU 23.37/95.95%, CPU 22.16 s. This one-photo local smoke is not comparable to the 5,000-photo perf VM baseline.Known gaps and decisions
client::tests::test_parsing_error; clippy passes. No test expectation was changed.libstdc++.so.6missing). No app code changed for the host workaround.Production screenshots
The new Settings/Photos/Backgrounds matrix covers 390/820/1440 px in light and dark: download review ZIP. Existing full matrices: Location, Appearance/Notes/Photos/Log, Calendar feeds. Screenshots and logs are not committed.
Merged into dev and deployed to calternal.cloud at
aa372eef6via merge round 2 (server tests 93 passed, web 914/914, live location/webcal/WebDAV/Settings-Photos/two-User probes passed).