Chrome: sidebar and H1 never repeat each other; Files breadcrumb; Pinned first with drag-to-pin; calm H1 transitions #156
Closed
opened 2026-09-26 09:35:02 +00:00 by kayg
·
110 comments
No Branch/Tag specified
dev
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
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
wip/previewcard-1098
wip/palette2-1123
wip/palette-1093
wip/onboard2-1141
wip/onboard-1141.aborted-early
wip/onboard-1141
wip/nlpchip-1127
wip/morph-1104
wip/merge-round-7c5
wip/merge-round-7c4
job/notifloop-1194
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
job/collabloss-1197
job/onboard-1141
job/hide-1153
job/perf-1124
job/perf2-1124
job/tocrail-1191
job/restyle-settings
wip/restyle-settings
job/segmented-1200
wip/notifloop-1194
job/tagperf-1186
wip/segmented-1200
job/restyle-files
job/tagdnd-1187
job/merge30
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#156
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 grill 2026-09-26 (round 1, all answered). Applies to EVERY mode through the shared header/sidebar code (one rule, no per-mode copies). Read DESIGN §34 first.
Deliver: e2e + layout-sweep coverage (collapsed and open sidebar, 1440/1024/390, light and dark), screenshots attached in the report for Claude to review. Gates as CLAUDE.md.
Starting #156. Branch: job/chrome-sidebar. Base SHA:
c2a81aeab9(dev). Scope: shared mode header/sidebar rules, Files breadcrumb/sidebar pin behavior, Calendar title-switch regression coverage.Finding for #156: apps/web/src/lib/FilesSidebar.svelte (actually apps/web/src/lib/files/FilesSidebar.svelte) still mounts the Folders tree; Smart folders renders before Pinned; the Pinned section is hidden when empty. Pinned file metadata is stored under localStorage key calternal.files.pins in apps/web/src/lib/files/prefs.svelte.ts, so it is not shared across Installations for one User. packages/ui/src/components/ModeHeader.svelte renders a title switcher based on menu presence without checking sidebarVisible or sidebarOpen. I will use the Files plugin API and calternal-fs for per-User storage and retain the existing stable item IDs.
Decision for the design gap: no server API currently stores Files pins; the existing values are browser-local. I am adding GET/PUT /api/v1/files/pins. The User settings file stores only the
files.pinslist and monotonicfiles.pins_revision; PUT uses compare-and-swap so a stale Installation cannot overwrite a newer list. Pin IDs stay stable item IDs. Existing browser pins will be imported on first load where the server revision is zero.Finding:
cargo test -p calternal-plugin-files files_pins -- --nocapturepassed (2 tests). The followingcargo run -p calternal-server -- openapifailed before compilation completed becausesccachetried to create temp directories under the sibling/home/kayg/Developer/calternal-wt/tz-days/target/tmp. I am retrying with the cache temp directory inside this worktree; no endpoint failure was observed.Finding: the Files plugin had no server-backed pin endpoint, so sidebar pins were stored in browser localStorage and did not follow the User across Installations. I added authenticated GET/PUT
/api/v1/files/pinsbacked by<home>/.calternal/settings.json, with stable item IDs, a per-User boundary, validation, and revision compare-and-swap.cargo test -p calternal-plugin-files files_pins -- --nocapturepassed: 2 passed, 0 failed. The adversarial probe now covers malformed and oversized payloads, hostile paths/IDs, User isolation, and concurrent stale writes.Finding from the production Files e2e: the pin and drag/move flows passed, but the Trash check timed out because the revised breadcrumb/move sequence left the test on Home while
alpha.txtremained in Inbox. I updated the test to reopen Inbox before the Trash action. No product failure was observed in this run; rerunning the full flow now.Follow-up e2e finding: the section-order assertion also raced the Files sidebar's first render. A focused production-server check showed the headings in the required order (
Pinned,Smart folders) after the sidebar settled. I added waits for both headings before asserting their order, then will rerun the Files flow.Finding for #156: the Files pin store retained the loaded User's pin list after sign-out. The regression test reproduced it: after loading
alice-private, dispatching the session-ended signal left that pin inpins.items. I am clearing the in-memory state on sign-out and reloading the server list after an auth change; generation checks will ignore replies from requests started for the prior User.Finding for #156: I also reproduced a migration leak before the Files sidebar loaded. The regression test put
alice-privatein the legacy browser cache, dispatched sign-out, then loaded Pins with an empty revision-0 server list. The store exposed the legacy pin and attempted to save it for the next signed-in User. I am installing the session listeners when the client store is created; initial sign-in remains eligible for the one-time migration, and sign-out clears the legacy cache even if Files was not opened first.Finding for #156: the per-User pins GET reused another User's cached response. A focused production-store regression loaded Alice's pins, dispatched sign-out, changed the mocked server list to Bob's pins, then dispatched
calternal:auth-changed. The second fetch never reached the mock (call count remained 1), and the client reused the same 750 ms GET snapshot. I am bypassing GET coalescing for this endpoint and retaining the regression check for a fresh request after the User changes.Finding for #156: the shared API GET coalescer also crossed User sessions outside Files Pins. A focused test completed an authenticated
/api/v1/searchGET, dispatchedcalternal:session-ended, and requested the same URL again. The fetch mock stayed at one call and returned the prior snapshot because the cache key cannot distinguish HttpOnly session cookies and the cache was not cleared by the auth event. I am invalidating and aborting pending coalesced requests on bothcalternal:session-endedandcalternal:auth-changed.Finding: the folded breadcrumb drag test times out because a top-level Menu's FloatingSurface renders a fixed full-viewport
.fs-scrimat z-index 200 withpointer-events: auto. The file list is behind that scrim, so dragging a file while the breadcrumb menu is open cannot reach its drop rows. I am tracing the internal drag lifecycle to allow only that drop menu to receive an active Files drag while keeping normal outside-click dismissal intact.Finding:
bun run checkfound two type errors in the session-cache regression atapps/web/src/lib/files/prefs.svelte.test.ts: its mock search envelope used agenerationproperty that is not part of the API response type. I changed the mock to return typed search results with session-specific IDs and kept the assertions on the typedresultsfield. The check is running again.Production-build Files E2E passed against a real local server. Output:
Decision for the folded breadcrumb menu: when a menu has drop rows, do not place a full-screen scrim over the draggable source. Handle outside presses in capture phase instead. A normal outside press closes the menu and does not activate the row. A native drag that starts on a draggable row keeps the menu open so the drop rows can receive it. The header E2E will verify both paths.
Resumed after the planned VM restart. Current head:
1bee359433bb5c41de8cb065a660cfb40b4fb175; merged the currentdevtipe976bff6(documentation only).node --checkfor both layout sweep scripts andgit diff --checkpass. The production web build is current with the UI fixes.The final header sweep and adversarial round are waiting because other worktrees currently have Playwright browsers active. I am keeping to one browser run at a time on the shared host. No API or UI change came from the latest
devmerge.Production screenshots for Claude's visual review are committed at
4b803033. The 20-image subset is inartifacts/chrome-sidebar-review/and covers Calendar, Files, Notes and Photos at 1440, 1024 and 390 widths, in Paper and Tokyo Night themes, with open/collapsed/phone sidebar states. These are real app screenshots, not mockups. The final interaction matrix remains pending after the folded-breadcrumb drag fix.Finding from the production header sweep: the run captured 148 screenshots. Four
header screens calendar-weekscrolled captures timed out waiting 5 seconds for the header to collapse: widths 1440 and 1024, in Paper and Tokyo Night. The other captured states completed. I am checking the existing header scroll-collapse assertions to determine whether this is a Calendar Week interaction failure or a screenshot-path timeout under shared-host load before changing code.Root cause found: the production
ModeHeaderintentionally leaves the Calendar Week header expanded when the grid auto-scrolls to the current time. The dedicatedcollapseProblemscheck resets large inner scrollers to the top before a synthetic wheel; the screenshot path did not. The focusedHEADER_SECTIONS=collapserun then completed with exactly:This identifies a screenshot-test setup issue, not a Calendar Week collapse failure. I will share the existing scroller reset helper with the screenshot path so it starts from a known scroll position.
The Calendar Week screenshot issue is resolved. I extracted the existing large-scroller reset into one helper and call it before both collapse assertions and scrolled screenshots. The production header sweep then completed with the exact output:
It saved 150 screenshots. The refreshed 27-image review subset is committed at
8beb8f08underartifacts/chrome-sidebar-review/.Finding before the API probes:
tests/adversarial/run.shrebuilt the web app, then Cargo stopped while compilingcalternal-db. The compiler tried to writedeps.dunder another worktree'sanalytics/target/tmp/sccacheBWHlOC, which was no longer present. No adversarial endpoint ran. I am retrying withSCCACHE_DISABLE=1; the runner sets this worktree'sTMPDIRtotarget/tmp.Follow-up on the build blocker:
SCCACHE_DISABLE=1did not bypass the configuredRUSTC_WRAPPER=/home/kayg/.nix-profile/bin/sccache; rustc still failed to create temp directories under the Analytics worktree. No endpoint probes ran. The next retry will unsetRUSTC_WRAPPERso the build uses rustc directly and the worktree-localTMPDIR.Adversarial triage update for #156
The local round has surfaced three non-SLOW findings. I am tracing these before deciding whether they are product defects or effects of the shared host load.
Shared/<owner>/Photos, the Photos timeline returned200 {"days":[]}for the full 12-second poll. The adversarial database later showed the uploaded photo in User B'sphotos_media,photos_groups, andphotos_daysrows. The Share was revoked by the time I inspected the database, so I am still tracing the active-read path.The hostile-file round reported 0 findings. The server remained alive. The other reported latency notices are SLOW-only and count as host load under the owner rule. No fix is being attempted until the active round finishes and these results are isolated.
Resuming #156 after the planned VM restart. Branch:
job/chrome-sidebar. Current head:db2180cebf338d824d5fe1cb760cd4ab87f2c0da. Current merge base withdev:116cd780b2b5c175e4728ed229965d3f790fb8df. The worktree is clean. The production UI work and screenshots are committed; I am continuing from the pending adversarial triage and final verification.Finding during the required
devmerge:cargo test -p calternal-plugin-filesinitially failed onlymedia::tests::timeout_kills_the_whole_media_process_group(100 passed, 1 failed). The isolated test failed in 1.02 seconds with stale stateSome("R"); the 10-second polling loop had exited when/proc/<pid>/statdisappeared after the lastRread. I cleared the saved state onNotFoundand kept unexpected/procerrors fatal. The focused test then passed, and the full crate rerun passed: 101 passed, 0 failed; doc-tests: 0 passed, 0 failed. The process-group implementation did not change.Post-merge Pins probe finding: an unknown field returns Axum's 422 plain-text rejection, but
/api/v1/files/pinsdocuments 400 withErrorEnvelope;tests/adversarial/attack2.pyflagged the mismatch. I will map request JSON rejections to the endpoint's standard 400 response and keep a regression check. The separate-User isolation subcheck also reused token B after the earlier share-options section removed that User; its 401 is a probe lifecycle defect, which I will correct by refreshing the probe actor.Fixed and committed the post-merge Pins findings at
ba330d11.PUT /api/v1/files/pinsnow maps Axum JSON extraction failures to the documented 400ErrorEnvelope, and keeps oversized requests at 413 with the same envelope. The adversarial per-User check now runs before deletion probes remove its member fixture.Verification:
Post-merge adversarial finding and fix:
attack2.pyran user-deletion probes before the Files share-options section. The transfer probe removed the only member account, so the dot-file share check printeddot files: member probe skipped (no member left). I moved deletion after the share-options section. A focused real-server run now printsdot files: member probe runsand reports no dot-file member leak. The fix is committed as8b9394b0.The same run again found no photo thumbnail after 30 seconds; thumbnail endpoints returned 404 because the local media worker is unavailable here. This remains tracked by #209. The feed, sync, isolation, Pins and restart probes reported no non-SLOW failure; latency notices were classified as shared-host load.
Finding from production Files E2E after the latest
devmerge: pin drag/reorder/persistence, keyboard selection, Quick Look, rename, move/undo, trash/restore, and UI upload passed. The next API upload returned 201, butfrom-elsewhere.txtdid not appear in the already-open Archive view within 10 seconds. I am checking the Files SSE event and refresh path with a focused real-server reproduction before changing code.Finding after the latest dev merge: the web suite reported 56/57 files and 433/433 tests passing, while
notes.test.tscould not resolve@calternal/ui/floatingfrompackages/editor/src/slash.ts. The editor already declared the workspace dependency and the lockfile was current; this worktree was missing thepackages/editor/node_modules/@calternal/uiworkspace link.bun install --frozen-lockfilereportedChecked 267 installs across 312 packages (no changes)and restored the link. The focused Notes suite then passed: 1 file, 9 tests. No source or lockfile change was needed.Finding in the merged production Files E2E: the
a Files load sends each GET onceassertion saw two GETs forentries?path=Inbox&limit=500&sort=name. This was the test's fullpage.gotoreopeningEventSource, not a duplicate inside one listing:/api/v1/files/eventsstarts at Last-Event-ID 0 and replays the last 10 minutes; the live-change listener then correctly schedules oneno-storereconciliation GET. I am changing the dedupe check to navigate folders within the same SPA session so the event stream does not replay fixture writes; the separate live-update E2E will keep checking catch-up behavior.Finding from the second production Files E2E run: moving between folders in the same SPA session still observed two GETs for the root listing. The root path intentionally matches any recent file event, so the EventSource catch-up reconciliation can schedule one
no-storeroot reload. The coalescing check now opens Home first and waits for that durable replay to drain before measuring a later folder switch. This is E2E setup behavior; the live root reconciliation is expected. The revised E2E is committed at8976baa3; its clean rerun is pending while other worktrees are using Chromium.Files E2E retest after
8976baa3passed against the production web build and local server. Exact output:The root-listing SSE catch-up adjustment lets the same-session coalescing assertion pass; live reconciliation remains covered by the dedicated live-update checks.
Finding from the production layout sweep: all 336 main-matrix screenshots were captured before the final offline check failed.
layout-sweep.mjswaited for theYou are offlineheading, then read#route-contentasName / Modified / Size / Kind / Loading 0 items… / 0 itemsinstead of the expected “not loaded on your device yet” message. No layout assertion failed. I am isolating this offline state to determine whether the assertion races the route error render or the product leaves stale Files content visible.Resuming #156 after the VM restart. Branch:
job/chrome-sidebar. Original base SHA:c2a81aeab9fd6090cb4eba448af5835c4877e7de(dev). Current head:182817ee93c938cd0674689733b85783135c7efe. The prior run was stopped while isolating the production layout sweep offline-state assertion. I am reviewing that checkpoint, merging currentdevbefore final gates, then I will finish the remaining UI/E2E and adversarial verification.Finding after merging the current
devtipf6418fc7: the new Analytics mode has a Ranges sidebar and a period title menu, but the explicit #156 sidebar/title matrix only covered Files, Calendar, Photos, Notes, and Ask. Analytics was present in the general layout sweep, but this shared rule had no focused coverage for Analytics with the sidebar open, collapsed, or as a phone sheet. I am adding it to the same real-route matrix.Finding during final web check after the
devmerge:bun run checkstopped withsvelte-check found 497 errors and 0 warnings in 59 files. The first and representative errors are unresolved modules from the Analytics work merged fromdev(react,@visx/scale,@testing-library/svelte,torph/svelte); the source changes in this branch are not implicated. I am restoring the worktree dependency links with the frozen lockfile, then rerunning check.The offline-state check now passes against the rebuilt production app when run directly with
bun e2e/layout-sweep.mjs --only offline:\n\n\nchecked 0 screens\nLAYOUT SWEEP PASSED\n\n\nThe broad screenshot-enabled sweep captured all 336 main layout screens but exceeded a 30-minute time box in its later interaction section, so I stopped that run. I am running the pending title/sidebar matrix and review captures as focused header sections.Correction with the line breaks preserved: the offline-state check passes against the rebuilt production app when run directly with
bun e2e/layout-sweep.mjs --only offline:The broad screenshot-enabled sweep captured all 336 main layout screens but exceeded a 30-minute time box in its later interaction section, so I stopped that run. I am running the pending title/sidebar matrix and review captures as focused header sections.
The offline assertion passed. The focused title/sidebar matrix did not reach its checks: I found a live
menu-iconslayout sweep on the shared host, stopped this job's browser to honor the one-browser limit, and removed this run's server/browser process. ItsTarget page, context or browser has been closedoutput is from that intentional stop. I will retry the matrix when the other sweep exits; no product failure was observed.Current-branch Files regression run passed after merging
dev:This includes the Pins JSON rejection, size-limit, per-User isolation and settings-preservation tests.
devadvanced fromf6418fc7to8b8e5cc9while the shared-host checks were running. I am merging the latestdevtip before final gates, as requested; this tip includes the sync-root guard, toast and share-edit merges.Merged the latest
devtip21ee397dintojob/chrome-sidebarin1f36b255. Resolved thelayout-sweep.mjsconflict by preserving the breadcrumb upload fixture and incoming Agenda seed, and by retaining the exact offline fallback text with an explicit visible-state wait.node --check,git diff --check, and the merged web gates pass so far:bun run checkreports 0 errors and 0 warnings;bun run testreports 71 files and 547 tests passed. I am continuing with production-build screenshot review and the remaining workspace gates.The post-merge
--only offlinebrowser run passed the offline fallback assertion but the runner's unconditional Agenda stress tail reported:The same Agenda stress checks passed in the immediately prior post-merge
--only headersrun, which also captured the 16 Agenda screenshots. At least four other worktrees had activecargo testprocesses during the timeout run. I am treating this as an intermittent timing result pending one retry after the shared CPU load clears; no application code change has been made for it.The focused production browser sweep against the merged tree passed. The command ran Calendar title and shared sidebar matrix checks, Agenda adversarial checks, and screenshots. Exact stdout:
checked 0 screensis expected for--only headers; the mode-header checks still ran. It captured 170 header review screenshots and 16 Agenda review screenshots. The Agenda screenshots are committed inca9d6c26062add2a0aa208beaef83da8ca38f155underartifacts/chrome-sidebar-review/.Root cause confirmed:
agendaAdversarial()ran unconditionally after every--onlysection, so--only offlinealso exercised the 320px and 200% zoom Agenda checks. I gated it to the full sweep or--only agendainb2b01bbc.After the fix, the isolated merged-tree offline run passed with exact stdout:
The earlier full
--only headersrun passed the Agenda adversarial checks before the selector fix. No application behavior changed for this finding.devadvanced tocf142cb4during the shared-host wait, so I merged it before final gates in0374bd18. The merge was clean. It adds the media sandbox runtime probe and changes thumbnail reads to use the open descriptor; I am including those changes in the remaining E2E, adversarial, and workspace gate runs.devadvanced again toeb9acfcc; I merged it cleanly inb147a205before proceeding. This tip adds generated OpenAPI contract and API client entries. I am rerunning the final web checks and will include the merged contract in the workspace and adversarial validation.Merged current
devtipc82549b9inf507d9f5with a clean worktree and no conflict resolution needed. Post-merge web gates:bun run buildexited 0 and wroteapps/web/build. It still emits the existing vendored Analyticsuse clientmodule-level directive warnings. I am waiting for the active shared-host adversarial/browser runs to finish before starting this branch's required real-server adversarial round.devadvanced tof170d4e9during the shared-host checks; merged it ine3bcb076before final gates. This tip changes the o2 deployment names and single-instance wording indocs/DESIGN.md; it adds no API surface. The previous merged API work and Files pins remain in scope for the adversarial round. The worktree is clean anddevis an ancestor of this branch.The merged-tree production header sweep is still pending. Two attempts were stopped after other worktrees launched Chromium during our browser session. The latest title-only run was interrupted when
menu-iconsopened its browser and printed:This is the harness reporting the controlled browser stop; the run did not reach a product assertion. I will retry after the shared browser sessions clear.
devadvanced to32b115dc; merged the README-only deployment note in3110d9cdbefore gates. This tip adds no API surface. The worktree is clean,devis an ancestor, andgit diff --check dev..HEADexits 0.Starting the required full real-server adversarial round on
job/chrome-sidebarat3110d9cd, based on mergeddev32b115dc. It covers the Files Pins API and the current merged server/API changes. The browser slot is clear at launch. I will classify SLOW-only results as shared-host load and fix or file any other finding.Adversarial round progress on
3110d9cd:The authorization matrix printed no policy failures. The passkey fixture line
28/30is its setup budget counter. The Appearance latency result exceeds the 0.500s target and is classified as SLOW-only shared-host load per the owner rule. The runner is continuing through the media, hostile-file, round 2 and restart probes.The active round has two additional SLOW-only notices:
They are latency notices with successful 204/207 responses. Along with the Appearance PUT burst p95=3.456s, these are classified as shared-host load under the owner rule. No non-SLOW finding has appeared in the output so far; media and hostile-file probes are still running.
Additional DAV results from the active adversarial round:
All reported statuses are successful DAV responses; these are SLOW-only latency notices under the owner rule. The rest of the round is still running.
Cross-plugin adversarial progress:
The status codes match the probe's expected conflict, rejection, and upload results. The latency lines are SLOW-only shared-host load. The full round is still running; no non-SLOW finding has appeared in the output so far.
Round 1 completed on the real local server:
All 31 entries printed in
FINDINGSwere SLOW-only latency notices. The hostile-byte probe found no issue. The thumbnail check was skipped because this host's media worker is busy or unavailable; that remains the existing local-runtime gap tracked by #209. Pins isolation and subsequent sections are in progress.The deep-link and logrewrite probes have only produced SLOW latency notices on successful responses:
These are shared-host load notices. The deep-link and logrewrite sections continue.
Adversarial round complete on
3110d9cd5cb8c40581ff5ec25804ba03e6f26445againstdevbase32b115dc6338b262d7c5a313a24d25f24d3c2637.The runner exited 1 because its threshold treats latency outliers as findings: round 1 reported 31 findings and round 2 reported 5. Every reported item was marked
SLOW; there were no 5xx responses, crashes, accepted hostile input, or inconsistent outcomes. Both rounds ended with the server alive. Hostile-byte checks reported0findings, the 924-request authorization matrix printed no policy failures, and the restart probe reported0 findings. The thumbnail probe did not produce a thumbnail within 10 seconds, so its header check was skipped; this local media-worker gap is tracked by #209.Other concurrency evidence: search storm 0 failures (p50 546ms, p95 749ms); 200 mkdir operations and rename races completed without errors; calendar duplicate-account storm had 20 expected conflicts; one of 20 concurrent PATCH requests won; 64 SSE streams and 63 collaboration sockets were accepted.
Merged current
devtip65265f87ffcc9c44c05e577b4e2ea9c27de130b2in merge commita73bfe925caf3fc8d8ffa993452f1ca4858cda93. The merge contains accessibility, search, settings and Files keyboard movement work. It did not change server or API files, so the completed API adversarial round remains current.On the merged tree,
bun run checkpassed with 0 errors and 0 warnings;bun run testpassed (73 files, 554 tests);cargo fmt --checkandcargo clippy --all-targets -- -D warningspassed. The fullcargo testgate is running.Merged latest
devtipfbecfbc6f0662d36ac3fcbb870a8d04cb88a4e3e; merge commit is31192bc7afb673d50db1e20838599d46bac9c150. The merge adds date/time preference APIs and shared UI changes. Conflict resolution retained both FilesPinsViewandTimeFormatschemas/types; sign-out now resets preference cache and sends the existing session-ended event; the media timeout test keeps its NotFound handling and also checks process identity to avoid PID reuse.The full
cargo testattempt on the preceding merged tree exited 101. Three collaboration timing tests failed:continuous_typing_is_saved_within_the_maximum_waitdid not save within 5 seconds,primitive_value_in_fragment_cannot_truncate_the_notedid not observe the later edit within 4 seconds, andreconnect_storm_does_not_cancel_pending_savemissed its 4-second persistence deadline. Other worktrees had concurrent Cargo jobs during the run, and the affected crate was unchanged by this branch. I will rerun these tests serially to determine whether contention explains the failures.Follow-up to the full Cargo run: I reran the already-built
calternal-collabhostile-client integration binary with--test-threads=1. It passed all 11 tests in 14.01 seconds, including the three persistence deadline tests that failed during the parallel workspace run. Nocalternal-collabsource changed on this branch. This supports scheduling contention as the cause of the first run; I will use a serial test harness for the full workspace rerun.devadvanced to2a379b185677fd6d85980900c5e757af990d9527; I merged it in8394a547d7275d11bdd4d15f11e2f7fd30ea6ee8. The merge adds collaboration room-save behavior, WebSocket probe changes, and the upstream 60-second wait for a newly opted-in Photos shared-library index refresh. I am running a fresh adversarial round because the collaboration API behavior changed.The prior round on
31192bc7passed the 924-operation authorization matrix, kept the server alive, and reported no hostile-byte findings. It found one Photos shared-timeline probe result after only 12 seconds; the merged upstream probe now allows 60 seconds for the documented asynchronous refresh. All other findings were SLOW-only, and the restart probe reported 0 findings.Adversarial round after merge
8394a547d7(dev base2a379b1856): first API round and hostile-byte checks completed; server remained alive and hostile-byte findings were 0.Findings under investigation:
run.shwaits 60 seconds forrestart-ready-3; the marker appeared only after the editor's earlier multi-minute probes. The missingrestart-go-3marker confirms the runner had left the wait loop. This is a harness timing defect.Round 2 is still running. SLOW-only latency reports are load under the owner rule; I am checking every non-SLOW finding before final gates.
The full adversarial run for merge
8394a547completed with exit 1. The local server stayed alive at the ends of both API rounds, the hostile-byte probe reported 0 findings, and the room-restart probe reportedrestart probe: 0 findings. Most reports were latency-only under a host load average of 25–37.Remaining non-SLOW reports and evidence:
ADVERSARIAL_PORT, which is the Node editor test proxy, not the Rust server onADVERSARIAL_BACKEND_PORT. The proxy's HTTP parser closes the oversized request and has no request-header timeout. These checks need to target the backend directly./readyzstill returned 200. I will retry under lower load.I will correct the harness issues, then verify the remaining timeout and frame-limit reports before final gates.
Focused real-server verification after the harness changes:
PASS editor server restart with a live editorandPASS editor all areas.owner installation session assertion refreshed; rotation returned the expected key shape and the old key was rejected.16/16 created; 16 unique IDswith the longer bounded wait.The selected Analytics run still ended with three request timeouts and
analytics storm consistency: two reads after the storm disagree. The server remained alive. Host load averaged 39.41 during that round; neighboring Analytics responses took 20.8–30.0 seconds. I am rerunning Analytics under lower load to distinguish in-flight timed-out writes from a cache inconsistency.Continuing the VM-restart checkpoint on branch
job/chrome-sidebar. Checkpoint was6b73dc8d; latestdevwasf1c07669. I mergeddevin commit1650686e. The merge had generated OpenAPI conflicts: I kept FilesFilePin/PinsView, retainedFirstDayOfWeek, and deduplicated the identicalTimeFormatschema.openapi-typescript 7.13.0generation passed. Next I will rerun the real-server adversarial coverage after host load and Chromium sessions clear.Post-merge adversarial finding on
1650686e: Round 2 printedpublic collab frame rate limit: the 301st frame did not close the socket. At the observation, host load averages were38.48, 36.26, 32.11, and two other adversarial runners were active. The earlier focused replay passed this probe. The Rust limiter uses a fixed 300-frame-per-minute bucket keyed by public link and client IP; I am checking whether the 301-frame send crossed the minute boundary, then I will rerun this probe against a fresh local server.Post-merge adversarial run on
1650686ecompleted (runner exit 1): Round 1 reported 48 SLOW-only entries, hostile-byte checks reported 0 findings, and the server stayed alive. Round 2 reported 80 entries: 79 were SLOW-only; the remaining report was the public collaboration 301-frame socket not closing within 10 seconds. The Analytics storm completed with successful201writes and no timeout or report mismatch. Room restart reportedrestart probe: 0 findings. I committed diagnostic timing output for the public frame burst in583db399; the targeted repeat is waiting for other Chromium sessions to finish.Merged newly advanced
devtip6495aaf7in commitebc25d3d. The merge kept the Files pins API and all 85artifacts/chrome-sidebar-reviewscreenshots. I combined thelayout-sweep --onlybehavior so Agenda variants run the shared adversarial pass. The merge result has no changes undercrates/,contracts/,packages/api-client/ortests/adversarial/; it does not change the API behavior covered by the completed post-1650686eadversarial run. The public frame-limit targeted replay and final gates remain.Merged the latest
devtip74d6072643e59cf8668a0cbd9e02b3e36b79736ein merge commit97b1ccf4772c8baa1d71d3ebe3077c5c9c754499. The merge adds Notes parser/path handling and fuzz coverage, and updates Files Share/upload handlers. It preserves the Files pins API, the 85 production review screenshots, and the targeted replay modes. I resolved the adversarial helper conflicts so the slowloris and oversized-URL probes reach the Rust backend, the runner supports the upstream per-call editor wait, and the 301-frame diagnostic remains. Syntax and targeted whitespace checks pass. A fresh real-server adversarial round is next because this merge changes API behavior.devadvanced to235073a6318b9a0b96818ab7f0f1b595e9555744with synchronization engine/API changes and a revised sync-chaos probe. I merged it inb0548a79. The merge is clean and the worktree has no uncommitted changes. I am including this API change in the pending real-server adversarial round.Merged
devtip57d1752c990e1509dfdb7faed55815158dbb2c57in5ea882bc8d7865be25b6e9bbf90068728a445178. I retained this job's Files pins implementation and UI, OpenAPI operation, and client types alongside the upstream Files and SQLite retry hardening. The media timeout probe keeps the upstream process-group/start-time identity checks and its missing-process handling. The bookmark storm probe retains the longer bounded wait, accepts only201,429, or503withRetry-After: 1, and still flags 5xx responses and timeouts. The 85 review screenshots remain. Adversarial script syntax and conflict-file whitespace checks pass. A fresh real-server round is pending because the merge changes Files, Notes, Calendar, AI, Photos, and sync APIs.The post-merge Files crate unit suite passed serially after
5ea882bc:This includes all three Files pins tests, both SQLite busy/retry cases, and the media timeout process-identity test. The full workspace gates and real-server adversarial round remain pending.
Merged latest
devtip895d34792de9cb56e2b31f5272bc50925fdc05b7in957db8a7. The sweep updates are retained, including the agenda selection and the newer select-mode layout checks. Conflict resolution keeps the title-menu screenshot limited to collapsed or phone-sheet-closed states, as required by this issue, while the toast screenshot uses the updated active-capsule dock. The branch still has all 85artifacts/chrome-sidebar-reviewimages needed for Claude's review; the upstream cleanup of other review-artifact directories is retained.node --checkfor both sweep scripts and targeted whitespace checks pass. This merge changes UI and e2e behavior only; the API adversarial round after the previous API merge remains applicable.Merged the latest
devhistory before final verification.1073eff5aeb89e3c0ae3255b10e47b50ee2c6bc9(filesystem identity, server wire and API probe runner changes) is included in4cf7f920; its adversarial scripts passpy_compileandbash -n. Then merged5af2ff7830ebf36e13e768adeddea015f3c8b23binc2889f76cfcf2765a57d49cac863460df512d8a6; that change moves deployment files and updates deployment guidance, with no API behavior changes.devis an ancestor of HEAD, the worktree is clean, and all 85 Chrome-sidebar review screenshots and the Files pins API remain present. A real-server adversarial round is still pending for the API changes from1073eff5.The serial filesystem tests passed on
c2889f76after the latestcalternal-fsmerge:The unit and storage tests include split-root confinement and the existing recovery/path guarantees. The real-server adversarial round and full workspace gates remain pending.
Merged newly advanced
devtip357df78096917bc2f22dd81bad219a6863ab27dbin4f9251ba074834174fb15630d9ee10ac25373a14. This commit only pins the Node multi-architecture image and sets the cloud image build architecture; it does not change API behavior. The existing adversarial round for the previous filesystem/server API merge remains current.devis an ancestor of HEAD and the worktree is clean.Merged
devtip4b4df8d368bf6bf36bc5e38ebefd1eedfe831c65in43b47812115e16c681eebd0323c9b52776542296. It changes only the cloud deployment script's D-Bus session handling and does not alter API behavior.devis an ancestor of HEAD; the worktree is clean.Merged
devtipc10fd91e60ffc632cd6a8d04d9a358eff6dc7fb9inc7b9a5b5f7323ac9dd271acf3c97c2b026a2477f. The update only changes cloud deployment SSH identity handling, so it does not alter API behavior.devis an ancestor of HEAD and the worktree is clean.Merged
devtip0558cc4ecaeb7f51af1e06acd31870b5f87b9f00in338d77aa3146a1c4ffe30b2b52b4b754dbebcfb5. This only changes how the cloud deployment script writes its environment file, with no API behavior change.devis an ancestor of HEAD and the worktree is clean.Starting finalization on branch
job/chrome-sidebar. Current branch head:338d77aa3146a1c4ffe30b2b52b4b754dbebcfb5; basedev:0558cc4ecaeb7f51af1e06acd31870b5f87b9f00. Ran the required one-timegit merge dev; Git reportedAlready up to date.Finalization finding: 93 review PNGs are tracked by this branch (89 under
artifacts/chrome-sidebar-review/and 4 underapps/web/e2e/review/), contrary to the owner rule that review images stay outside Git. I will keep local copies for review, remove these binaries from the branch tip, and attach the fresh production screenshots to this issue.Correction to my previous artifact count: the total is 89 tracked PNGs, not 93 (85 under
artifacts/chrome-sidebar-review/and 4 underapps/web/e2e/review/). All 89 are now removed from the branch tip in commit90272900; local copies remain under ignoredartifacts/for review.#156 final report
Built: shared sidebar/H1 rules, Files breadcrumbs with folded parents, pinned and smart folder ordering, per-User pin persistence, and Calendar title transition coverage. The API client/OpenAPI contract and adversarial pins probes are included.
Files:
packages/ui/src/components/ModeHeader.svelte,packages/ui/src/components/calendar/CalendarTitle.svelte,packages/ui/src/components/pageChrome.ts;apps/web/src/lib/files/*,apps/web/e2e/{files,header-sweep,layout-sweep}.mjs;crates/plugins/files/src/{lib.rs,pins.rs};contracts/openapi.json;packages/api-client/src/*;tests/adversarial/{attack.py,attack2.py,run.sh}.Head:
90272900bc3367e72e820d6e1bb04768b9327928onjob/chrome-sidebar. Pushed;origin/job/chrome-sidebarmatches. The cleanup commit removes 89 tracked review PNGs from the branch tip and keeps local copies under ignoredartifacts/.Gates:
cargo fmt --check— exit 0, no output.cargo clippy --all-targets -- -D warnings— exit 0. Verbatim final line:Finished \dev` profile [unoptimized + debuginfo] target(s) in 1m 08s`cargo test --workspace --quiet— exit 0; aggregate from the 72 test-binary summaries: 1,278 passed, 0 failed, 12 ignored. Verbatim example:test result: ok. 480 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.89sbun run check—svelte-check found 0 errors and 0 warningsbun run test—Test Files 82 passed (82);Tests 593 passed (593); exit 0.bun run build—✓ built in 46.09s;Wrote site to "build";✔ done. The existing vendor"use client"directive notices remain.ROUND 2 FINDINGS 0;server alive at end: True.Production screenshots: 168 captures are in ignored
artifacts/chrome-sidebar-final/. Five representative captures are attached below. TheHEADER_SECTIONS=sidebar-matrix,title,shotsrun was stopped during its optional 720 px / 200% review captures at the job cutoff. The issue matrix and title sections ran before capture, but the command did not printLAYOUT SWEEP PASSED; its final output was:Known gap: the header screenshot sweep ended before the supplemental 720 px / 200% captures and has no final pass line. Its interruption produced the page-closed messages above. All requested 1440, 1024, and 390 screenshots needed for review were captured; five representative images are attached.
Decisions: no new product design decision was needed; the owner grill in #156 settled the requested behavior. I used the existing
HEADER_SECTIONSselector for the final task-specific matrix, title, and screenshot pass to stay inside the cutoff.Starting merge reconciliation on
job/chrome-sidebar. Branch head:90272900bc3367e72e820d6e1bb04768b9327928; localdevbase to merge:21d985bf7ac8d4e13f2eb93bdc600198412df038. The worktree is clean. I have readCLAUDE.md,CONTEXT.md, and DESIGN §§33–34.Merge finding:
MENU_ICONS.folderis an SVG inner-markup string (apps/web/src/lib/notes/icons.ts), but the devMenuItemrenderer treated every string icon as one path'sdattribute. Using the shared map in the Files title menu would therefore create an invalid SVG path. I kept the static shared map and rendered its trusted inner SVG markup; component icons remain supported. The sameMenuItemreconciliation preserves the branch's breadcrumb drop handlers and dev's aligned trailing glyph slot.Merge finding: the merged server source contains the Files Pins API used by
FilesBrowser, butdev's OpenAPI/client output does not includePinsViewor/api/v1/files/pins. Evidence: the initialbun run checkreported 5 type errors inapps/web/src/lib/files/prefs.svelte.tsfor the missing schema and path. I am regenerating both artifacts withpackages/api-client/check-generated.shfrom the merged source before validating the web types again.Web test finding: the reconciled title menu now names both views and folder destinations. The existing header test still expected the old
Files viewslabel, whileModeHeaderemittedFiles views and folders;bun run testhad 600 passing tests and this one stale expectation failure. I updated the fixture assertion to the merged accessible name and am rerunning the web suite once against that correction.The one-time real-server adversarial round found a non-load editor data inconsistency: with seed
25608414, the browser paste and 500-step undo/redo probe saved repeated^duplicate-idand^icjf8jblock anchors; the uniqueness check failed (4 !== 7). I filed the reproducible finding and kept its regression probe in #262. The chrome-sidebar merge does not modify the editor implementation.The editor restart probe also reported an unexpected socket closure during the live-editor restart check. The 10-minute outer timebox expired during this area, so load/timeout effects are possible and the remainder of the adversarial script did not run. I filed the qualified observation in #263; the duplicate-block-ID defect is tracked separately in #262.
Completed the one-time
devmerge onjob/chrome-sidebar.Head:
d9ebe5b5e076cee27520517f692be99443aa2b7c(parents:90272900bc3367e72e820d6e1bb04768b9327928,21d985bf7ac8d4e13f2eb93bdc600198412df038). The branch was pushed;origin/job/chrome-sidebarmatches this SHA. Worktree is clean.Built
dev.MENU_ICONSmap for folder destinations.dev’s Home, Calendar tag, data split, and shared menu changes. No screenshots were retaken.Files reconciled
apps/web/src/lib/files/FilesBrowser.svelteapps/web/src/lib/modeHeader.svelte.test.tspackages/ui/src/components/menu/MenuItem.sveltecontracts/openapi.jsonpackages/api-client/src/generated.tstests/adversarial/run.shCargo.lock(merged fromdev)Gates
cargo fmt --checkexited 0 with no stdout.cargo clippy --all-targets -- -D warningsexited 0. Verbatim output:cargo testexited 0. Verbatim output excerpt:bun run checkexited 0. Verbatim output:bun run testexited 0. Verbatim output:packages/api-client/check-generated.shexited 0 after staging the regenerated files. Verbatim output tail:The first clippy attempt needed the production web build for
RustEmbed; after building the web app, clippy passed. The first web check ran against stale generated API types; after regeneration, it passed. The first web test run found the old accessible-name expectation; I updated it toFiles views and folders, and the full suite then passed.Adversarial round
One 10-minute real-server round ran. The Event tag probe passed, and the authorization matrix completed all 932 requests. The editor probe found duplicate block IDs after hostile paste and undo/redo history; I filed #262. The live-editor restart probe reported an unexpected socket close as the timebox expired; I filed the qualified observation in #263. The round exited 124 at the time limit, so later probes did not run. No screenshot retakes were made.
Decisions
Files views and folders, because it includes both sub-views and folder destinations.MENU_ICONSare static inner SVG markup, not pathdvalues.MenuItemrenders that trusted map markup and still supports component icons.Cleanup
cargo cleanoutput:Removed
apps/web/buildandapps/web/.svelte-kit.Started #156 on branch job/chrome-sidebar. Worktree HEAD:
d9ebe5b5e0. Fetched origin/dev for the one required reconciliation merge:3ad937ec88.Finding during verification:
phone-chrome.mjsreused the phone session's local storage for its desktop Files check, so the sidebar remained open while the assertion expected the collapsed-only breadcrumb menu. The run timed out waiting for.mh-switch; the app readscalternal.sidebar-collapsedduring page initialization. I updated the desktop E2E context to set that preference before navigation and am rerunning the scenario.Finding in the focused Files E2E: the inline rename check saw
delta.mdin the list but an immediate stat returned 404.FilesBrowser.svelteupdates the row optimistically, then awaits the rename API; the row's Enter callback discards that promise. The E2E therefore queried persisted state before it knew the POST had completed. I am updating the E2E to await the rename response before checking stat.Finding in the header sweep: #219 replaced the header's
.mh-blurelement with the sharedProgressiveBlurcomponent (.progressive-blur.top), but the older header metrics and collapse probes still queried.mh-blur. The sweep therefore raisedgetComputedStyle(null)across routes and later timed out waiting for the old selector. I am updating those probes to use the current component selector and will rerun the issue-specific matrix, title transition, and screenshot sections.Adversarial finding triage: the standard-user
PUT /api/v1/admin/configcase sent the result ofGET /api/v1/admin/configas its body. The GET result isAdminConfigView(including a structured dedup schedule), while PUT requiresInstanceConfig(a cron string); Axum rejected the mismatched JSON as 422 before the handler's admin check. This is a matrix fixture error, not an authorization bypass. I am keeping the OpenAPIInstanceConfigbody for that operation so the probe checks the intended 403 path.Built
Reconciled the desktop and phone chrome rules. Desktop keeps Files breadcrumbs while the sidebar is open; the
Files ▾title menu appears only when the sidebar is collapsed. Files sidebar pins remain before Smart folders. On nested phone pages, the header shows Back + the active page H1 and suppresses desktop breadcrumbs. The phone sheet keeps ProgressiveBlur.Also fixed three test-fixture issues found during verification: the phone E2E now sets its desktop sidebar state explicitly, the Files E2E waits for the optimistic rename request to persist, and the header sweep uses the shared
.progressive-blur.topcomponent introduced by #219. The adversarial authz matrix now keeps the OpenAPIInstanceConfigbody instead of sending the differently shaped GETAdminConfigViewto PUT.Files
Key files:
packages/ui/src/components/ModeHeader.svelte,packages/ui/src/components/pageChrome.ts,apps/web/src/lib/files/FilesBrowser.svelte,apps/web/src/lib/modeHeader.svelte.test.ts,apps/web/e2e/{phone-chrome.mjs,files.mjs,layout-sweep.mjs,header-sweep.mjs},tests/adversarial/{authz_matrix.py,attack2.py,run.sh}, and regeneratedpackages/api-client/src/generated.ts. The merge commit also brings the other latestorigin/devchanges.Commits and push
Head:
b392a4fcf3406528b3b10e7b6d231fc322eb46b5Commits:
82097609merge reconciliation;b0c6f64cexplicit chrome test states;52947538rename persistence wait;4c11fd37shared blur probe;b392a4fcauthz request fixture.Pushed
job/chrome-sidebar;git pushreportedEverything up-to-date.Gates
cargo fmt --checkexited 0 with no output.cargo clippy --all-targets -- -D warningsoutput:cargo testexited 0. Final output:bun run --cwd apps/web checkoutput:bun run --cwd apps/web testoutput:packages/api-client/check-generated.shoutput:The updated ModeHeader unit test passed:
Test Files 1 passed (1)/Tests 12 passed (12).phone-chrome.mjs,files.mjs, and the focusedsidebar-matrix,titleheader sweep passed. The header sweep printedchecked 0 screensbecause--only headersskips the separate general screen pass; its header matrix/title sections ran and passed.Adversarial round and gaps
One adversarial round was capped at 45 minutes and stopped with exit 143 before the last attack2 sections completed. It reported no 5xx or crash in the collected output; the server remained alive after the attack.py section. Two 30-second timeouts occurred: DAV initial sync and Calendar Event-from-Log. I added this evidence to existing investigation #269. Most other reports were SLOW responses under concurrent host load.
The authz matrix reported 422 for non-admin config PUT before I corrected its mismatched GET-view request body. That was a probe-fixture false positive: JSON extraction rejected the
AdminConfigViewbefore the handler's admin check. I documented this on #268 and did not repeat the full matrix, honoring the single-round rule.The phone sheet blur measurement remains an XFAIL tracked by #246 (light ratio 1.013, dark ratio 0.969; expected <0.3). The full unfiltered header sweep first exposed its stale blur selector; after fixing it, the issue-specific matrix and title sections passed.
Decisions
Nested phone Files uses Back + H1 without the desktop breadcrumb row. Desktop keeps full breadcrumbs and exposes the Files title menu only with the sidebar collapsed. These choices preserve both #156 and #219 behavior.
Screenshots
Starting Forgejo #156 on branch
job/chrome-sidebar, based at088e17d4fe49d6a7b41f03fcc13f5f4959346be9(origin/dev). Working tree was clean.Merge review finding: the incoming Files first-page cache can return a still-fresh cached page even when
FilesBrowserrequestscache: 'no-store'after a live change. That can hide an external Home write for the 2-second cache window. I am merging the preload cache with an explicit fresh-read bypass and a regression test.Review finding: deep Files pages put ancestor folders in the last segment's view menu while also showing those ancestors as breadcrumb links. On phones, the same page hid the breadcrumb and menu and rendered Back plus a second content H1. This conflicts with #156's rule that the last breadcrumb carries the view menu when the sidebar is closed. I am applying that rule at phone widths too; it supersedes the earlier phone Back/content-H1 behavior in DESIGN §38 for Files.
Production E2E finding:
bun e2e/files.mjspassed drag-to-pin, keyboard pin reordering, persistence, unpin, breadcrumb link, and middle-segment drop checks. It then timed out after 30 seconds waiting for Quick Look to advance fromalpha.txttobeta.txtafterArrowRight. The run reported 0 CSP violations. I am tracing the viewer's ordered items and focused key target before rerunning this flow.Follow-up evidence: Quick Look's
.qlwas visible after opening, butdocument.activeElementwasBODY(insideQuickLook: false). ThusArrowRightnever reached its key handler. The overlay's focus trap runs as its surface mounts while the shared portal also relocates the overlay branch. I will defer the initial focus move by one animation frame forOverlaySurface, after that branch is connected at its final location.Finding and fix: the Files production E2E showed that Quick Look received the overlay portal after its initial synchronous focus attempt, leaving
document.activeElementon BODY and preventing ArrowRight navigation. OverlaySurface now defers initial focus by one animation frame; the regression flow waits for the close control to own focus. The same run exposed that the watcher E2E wrote underserver.data, while Home files are underserver.userData; corrected the fixture to use the Home data root.bun e2e/files.mjsnow passes all flows with zero CSP reports.Phone E2E reconciliation: the existing phone test expected every parent crumb to remain visible at 390 px, and later expected folder names inside the Files view switcher. The header correctly folds unavailable parent crumbs into “Show folders in this path” and keeps the view switcher limited to Files, Shared, Recent, and Trash. Updated assertions to check each control's own entries.
bun e2e/phone-chrome.mjs --screenshots artifacts/chrome-sidebar-review/phonepasses and captures light/dark Files, selection, drawer, and desktop screenshots.Finding and fix: the real production header matrix showed that phone Files breadcrumbs missed the 44×44 hit test: the “Files” link was 21×44, and the rounded crumb controls missed corner points. ModeHeader now gives short links a 44px minimum width, clips only the inner text span, and supplies square transparent hit surfaces.
phone-chrome.mjsnow checks the eight points of each breadcrumb control on nested and Home routes; it passes on the production build. The matrix also exposed unrelated Calendar, Notes, and Analytics layout failures; I will list their exact evidence in the final report.Quick Look regression coverage now waits for the portaled close control to own focus before sending Escape.
bun e2e/files.mjspasses all flows with zero CSP reports.Adversarial context: the Photos shared-timeline probe reported
200 {"days":[]}after 60 seconds. This local round usedADVERSARIAL_ROUND2_ONLY=1on a fresh server, soattack.pydid not seed its photo fixture; inattack2.py, the owner timeline'sa_itemis therefore absent before the share. I am treating this probe result as an invalid fixture setup, not a Photos regression. The same adversarial run continues through the remaining round-2 checks.Finished —
job/chrome-sidebarpushedMerged
origin/devonce at088e17d4fe49d6a7b41f03fcc13f5f4959346be9, preserving the intent from #243, #259, #261, and #246. Final head:96ed2474bbec26565560e0168f0fa50071e9ae4c.Built
no-store,reload, andno-cache. Fixed deferred focus for portaled overlays and the Files watcher E2E fixture.Key files:
apps/web/src/lib/files/FilesBrowser.svelte,FilesSidebar.svelte,api.ts,api.test.ts,prefs.svelte.ts,prefs.svelte.test.ts;packages/ui/src/components/ModeHeader.svelteand menu/chrome components;apps/web/src/lib/a11y/focusTrap.ts;apps/web/e2e/files.mjs,phone-chrome.mjs,header-sweep.mjs, andlayout-sweep.mjs;crates/plugins/files/src/{lib.rs,pins.rs};packages/api-client/src/{index.ts,index.test.ts,generated.ts};contracts/openapi.json;docs/DESIGN.md.Gates
All required commands completed successfully. Verbatim terminal output excerpts:
bun e2e/files.mjsandbun e2e/phone-chrome.mjs --screenshots artifacts/chrome-sidebar-review/phonepassed. The phone run verifies 44×44 crumb hit areas on Files Home and nested folders. Rust build output andapps/web/build/.svelte-kitwere removed after the gates.Known gaps
ADVERSARIAL_ROUND2_ONLY=1mode omitted the Photos fixture seeding and dedup restart coordinator, so Photos 404s and restart/dedup reports were harness artifacts. Pin isolation checks completed without findings; the only load finding wasSLOWzip streaming. No valid non-SLOW API regression was confirmed.Decisions
The issue’s “Files breadcrumb at every width” requirement takes precedence over the older phone Back/H1 behavior in DESIGN §38. At 390 px, middle path segments can fold into the path menu; they remain available there, with 44×44 px touch targets.
Screenshots
Latest production screenshots are attached here:
Merged in
71ff5e11(svelte-check 0/0, web 629/629, generated client OK). Merge freeze lifted.