TASKS: Tasks mode (TickTick ease, Obsidian plaintext): views, board/list/matrix (grill in progress) #430
Open
opened 2026-09-29 11:42:14 +00:00 by kayg
·
50 comments
No Branch/Tag specified
dev
wip/kbpreview-1118
wip/kanban-1092
wip/importhang-1121
wip/hiderev-1153
wip/hide4-1153
wip/hide3-1153
wip/hide2-1153
wip/hide-1153
wip/editreg-1132
wip/editorrail3-1113
wip/editorrail2-1113
wip/editorrail-1113
wip/e2e-b2-1071
wip/e2e-b-1071
wip/draw4-1101
wip/draw3-1101
wip/draw2-1101
wip/draw-1101
wip/directory-1199
wip/delete-1119
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/segmented-1200
wip/rev2-webperf
wip/rev2-money-ident
wip/previewcard-1098
job/collabloss-1197
wip/palette2-1123
wip/palette-1093
wip/onboard2-1141
job/restyle-settings
wip/onboard-1141.aborted-early
wip/onboard-1141
wip/notifloop-1194
wip/nlpchip-1127
wip/morph-1104
wip/merge-round-7c5
wip/merge-round-7c4
wip/merge-round-7c3
wip/merge-round-7c2
wip/merge-round-7c
wip/mchrome-1084
wip/mailghost2-1094
wip/mailghost-1094
wip/kbpreview2-1118
job/restyle-files
job/tagdnd-1187
job/merge30
job/perf-1124
job/tocrail-1191
job/cards-1179
wip/cards2-1179
wip/cards-1179
job/segmented-1200
wip/tocrail-1191
job/hide-1153
wip/tagdnd-1187
wip/restyle-files
wip/perf-1124
wip/merge30j
job/onboard-1141
job/restyle-notes
wip/restyle-notes
job/wizchoices-1140
job/adv-1202
job/notifloop-1194
wip/wizchoices-1140
wip/restyle-1190
job/moneyfmt-1180
job/txentry-1198
wip/moneyfmt2-1180
wip/moneyfmt-1180-r
wip/moneyfmt-1180
job/tagperf-1186
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/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#430
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?
Goal (owner, 2026-09-29)
A Tasks mode with "the ease of use and versatility of TickTick and the plaintextness of Obsidian (our tasks model basically)". Default modes in the tray: Calendar, Tasks, Notes, Files, Photos, Analytics. Other plugin modes (Mail, Money …) are hidden from the tray and added from Settings → Plugins (T9 = a).
The model (already decided, DESIGN §31, §43)
title,status(todo, doing, blocked, waiting, done, cancelled),priority(4 levels),start,scheduled,due(date plus optional time),recurrence,estimate,area,created,completed.#xinside a task becomes#task/x.Decisions so far (grill in progress)
Owner decisions, round 2 (2026-09-29):
- [ ]line anywhere) and Task (a note with task frontmatter); the UI says 'Make task'.Owner decisions, round 3 (2026-09-29):
.baseYAML files in a visibleViews/folder. Board and Matrix are additional view types; where Obsidian's native Kanban view type matches, use its format.- [ ] → [Title](Notes/…)and mirrors the status both ways; Undo reverts the conversion. The composer NLP runs on Checkbox lines. The Obsidian Tasks inline format (📅 ⏫ …) is read only, and converted to Task notes on demand ('Convert to tasks'), never written.startis needed next toscheduled(GTD view) and what alerts are.Owner decisions, round 4 (2026-09-29):
scheduled:(shown as When: the day the task appears in Today and on the Calendar, hidden from Today before then) anddue:(shown as Deadline).start:is read-only for Obsidian imports (treated as scheduled when no scheduled is set) and never written.#context/…) are a calternal-only filter and do not appear in Reminders at all.remind: true/falseapplies to the task's dates, with the lead time in Settings → Tasks).Owner decisions, reminders (2026-09-29):
remind:property exists, because blocks (Checkbox lines and other blocks) can carry a reminder without being converted to a Task. This is the block-reminder design, DESIGN §'reminders',calternal-reminderskeyed by block ^id. It is an exception to T14b: a reminder alone never converts a Checkbox to a Task; a date, priority, repeat or notes still does. On a Task,remind:is auto-filled from the When (scheduled) and Deadline (due) dates, and the User may change or add instants.remind: falseswitches reminders off for a Task; the default is on and is not written.remind:.Found by #424's benchmark: the live tray on dev shows only five modes; Notes and Tasks are absent. The owner's default tray (T9 and the default-modes decision) is Calendar, Tasks, Notes, Files, Photos, Analytics, with other plugin modes (Mail, Money …) hidden and added from Settings → Plugins. The Tasks mode job must set this default order and make Notes visible. Check why Notes is missing today: is it disabled by default, or missing from MODE list?
Starting #430 on
job/tasks-modeat base SHA369ab6a2f9fc673e3564b94857fbecfeb04df404. I read the full issue thread and the binding repo docs. Existing task model/parser and Notes API are incalternal-notes-coreandcalternal-plugin-notes; I’m tracing the current gaps before making the first test-backed slice.Finding: the web shell does not yet expose a Tasks mode or a
.baseViews implementation.apps/web/src/lib/navigation.tshas notasksnavigation item and maps/notesinto Calendar;apps/web/src/routeshas no Tasks route; no.basefiles or Bases reader/writer are present. The Notes plugin already provides real Task collection and mutation routes (GET /tasks,/tasks/day,/tasks/standalone,/tasks/by-id,PATCH /tasks/properties,POST /tasks/tick), so the UI can use the real Index data while I add the missing view model and screen.Finding: the Task writer used the imported
start_timewheneverscheduled_timewas absent, even when an explicitscheduled:date existed. The added regression test failed on that case. Commit1fd173d26now usesstart_timeonly whenstart:supplies the effective When date;cargo test -p calternal-notes-core --quietpasses (503 + 13 + 5 + 7 + 12 tests).Resuming #430 after the usage-limit interruption. Branch:
job/tasks-mode; current HEAD:261a8ff0ff2ba18403ee35408fc431bbfe33aa97; original branch base recorded on start:369ab6a2f9fc673e3564b94857fbecfeb04df404. The worktree has an uncommitted Notes saved-views API and mode-navigation slice; I am validating it before committing and continuing from there.Finding: the first Notes route-test build failed at compile time because the test passed an owned
StringtoRelPath::join, which accepts&str(error[E0308]atcrates/plugins/notes/src/lib.rs:5944). I changed the test to borrow the formatted path and am rerunning the focused route tests.Resuming #430 implementation on branch
job/tasks-mode.369ab6a2f9fc673e3564b94857fbecfeb04df404261a8ff0ff2ba18403ee35408fc431bbfe33aa97origin/devobserved at resume:dfb5964a2fcf13dc8b9a50a319eee09bc386f322I am preserving the existing committed task model/parser work and inspecting the interrupted saved-view/API and Tasks mode changes before continuing.
Finding from the full Notes crate gate:
cargo test -p calternal-plugin-notesran 123 tests and reported 121 passed, 2 failed.macos27_daily_repeat_persists_markdown_and_dav_fieldsstill expectsrecurrence: FREQ=DAILY, but #430's committed repeat writer now stores readablerepeat:text; I will update that assertion to the issue-approved representation while keeping its RRULE projection checks.vtodo_wire_upgrade_rotates_sync_epoch_onceremoves the last registered migration, which is now Notes migration 19; the wire epoch migration is version 18. I will make the test construct its pre-wire state by version so the existing epoch assertions still exercise migration 18.The full Notes test rerun now passes the VTODO epoch test, but
macos27_daily_repeat_persists_markdown_and_dav_fieldsstill fails because a supported incomingFREQ=DAILYvalue is stored in Markdown without being rendered as the required readablerepeat:phrase. I am adding a bounded RRULE-to-Task conversion and keeping the existing RRULE read-back assertions.Progress on
job/tasks-mode: committedc600e6e35(from the resumed branch head). The mode registry now keeps Tasks and Notes separate, applies the six owner-selected default modes, and exposes the built-in Task views from the sidebar. The Task view date rules treat importedstartasscheduled, and focused web tests passed: 3 files, 20 tests. The first Svelte check found no errors and three accessibility/CSS warnings in the new Board/Matrix files; I corrected those and will include the clean result with final gates.Progress on
job/tasks-mode:1bf0c4ebfadds the real-data Tasks workspace with Board (virtual status lanes, drag/drop and keyboard Status control), List and priority-by-Deadline Matrix layouts. The Board is the default and cancelled Tasks stay out of its workflow lanes. Verification so far:Saved
.baseview loading and route integration remain in progress.While wiring the Tasks saved-view client, I found that the API returned each per-view object but omitted the file-level
filters:value thatTaskBasealready parses. This would make a valid hand-edited.baseappear unfiltered in Tasks. The #430 API now includesbase_filterswith each saved view, and a regression test covers an externally written file. I also added a literal-only client evaluator so these filters do not execute file expressions.A second live-update gap showed up while setting up the disk-edit proof: the server's filesystem bridge emits Home changes under plugin
fs, but/api/v1/notes/eventspreviously forwarded only pluginnotesevents. A hand-editedViews/*.basetherefore did not reach Tasks. The Notes event stream now forwards onlyNotes/andViews/filesystem paths, with a regression test; the Tasks client also skips its short GET coalescing window for view-list reloads.Web gate finding:
bun run testcompleted in 427.42 seconds with 825 passing tests and 6 failures out of 831. The failures are 5-second timeouts in existing calendar agenda/TimeGrid, composer highlighting, analytics RangeBar/StatRow, and menu opening focus tests. The Tasks tests passed in this run. I did not change their expectations; the host was running several concurrent build and test jobs during this run.Rust gate finding:
cargo test -p calternal-plugin-notesran 125 tests; 124 passed and the existingtests::journal_patch_storm_finishes_with_one_winner_and_stale_preconditionstimed out. Its fixed 12-secondtokio::time::timeoutreturnedElapsed(()); the full suite took 403.32 seconds on the shared build host. I left the test expectation unchanged. The new Notes filesystem event test and saved-view hostile input, round-trip, and global-filter tests all passed.Production E2E findings and fixes for #430:
selectOption('todo'); it read the previousdoingvalue while the UI's async write was still in flight. The test now polls the authoritative API for the exact expected status. It does not relax the assertion..basefile in place failed withEACCESbecause Notes files use immutable content-addressed inodes. The E2E now models an editor save with a sibling temporary file and atomic rename, which also preserves the shared blob.#app-sidebar, which is only mounted by the phone drawer. It now targets.desktop-sidebarat 820/1440 px and moves the pointer off screenshot targets to avoid tooltip overlays.The final production E2E passed: composer creation, Add task row, Board drag and status persistence, a disk-edited Bases view, and all 24 Board/List/Matrix/sidebar screenshots at 390/820/1440 px in light/dark. Output:
tasks e2e: composer, Add task, Board drag, live Bases file edit, and screenshots passed in /home/kayg/Developer/calternal-wt/tasks-mode/artifacts/tasks-mode;CSP REPORTS tasks: 0 across 1 pages.Tasks mode report (#430)
Built
start:as When only whenscheduled:is absent, and reads/writes readablerepeat:values with RRULE conversion..baseparsing and writing, bounded literal filter evaluation, stable view IDs, file-wide and per-view filters, sort/group handling, and Notes API routes for saved views. External Notes and Bases file events refresh the Task projection.Files
crates/calternal-notes-core/src/tasks/andcrates/calternal-notes-core/src/nlp/{mod.rs,tasks_recurrence_md.rs}.crates/plugins/notes/src/{lib.rs,task_views.rs,tasks_dav.rs}; contract/client:contracts/openapi.json,packages/api-client/src/generated.ts.apps/web/src/lib/tasks/,apps/web/src/routes/tasks/,apps/web/src/lib/{navigation.ts,navigation.test.ts,notes/noteIndex.svelte.ts,stores/settings-store.ts,stores/settings-store.test.ts},apps/web/src/lib/components/{SidebarLinks.svelte,app-sidebar.svelte}, andapps/web/src/routes/settings/plugins/PluginsSection.svelte.apps/web/e2e/tasks.mjs,apps/web/package.json,tests/adversarial/{attack2.py,xuser_matrix.py}.docs/DESIGN.md,docs/deep-links.md.Head and commits
job/tasks-mode7ab6818b896ed14b06a6c295706a667b04c1d4f5devwas made. The required localorigin/devmerge is commit332498328.Gates (output verbatim)
cargo fmt --checkexited 0 with no stdout.cargo clippy -p calternal-server --all-targets -- -D warnings:cargo test -p calternal-server:cargo clippy -p calternal-plugin-notes --all-targets -- -D warnings:cargo test -p calternal-plugin-notes:bun run check:bun run test --maxWorkers=1:The same ThemePicker test timed out at 5919ms in its isolated rerun; its assertions were not changed.
bun run build:node --check apps/web/e2e/tasks.mjsexited 0 with no stdout. Production E2E:One time-boxed Tasks-view adversarial round:
Cleanup:
Known gaps
remind:auto-fill, lead-time Settings, and complete VALARM mapping are incomplete.Decisions not explicit in DESIGN
EACCESor risk mutating a shared blob.Integration note: the shared
origin/devtracking ref advanced while the long Rust gates were running. Finalgit statusreadsahead 18, behind 27forjob/tasks-mode; the requiredorigin/devmerge was already made at332498328. I did not fetch or merge again because the job rule requires one such merge before final gates.Started the UI round for #430 on branch
job/tasks-mode. Base SHA:5474493b170f5d12b3d0fc9ccf5c3880e3d24bae. Current HEAD:7ab6818b896ed14b06a6c295706a667b04c1d4f5. I am inspecting the existing Tasks components and shared UI primitives before changing the screen.#430 UI inspection finding: the current
TasksWorkspace.svelterenders Layout as a native<select>and Save as view as<details>;TaskBoard.svelterenders Group by as a native select and visible helper row;TaskCard.svelteandTaskList.svelteuse native status selects, direct checkboxes, and inline CopyLink controls;TasksSidebar.svelteexposes saved-view CopyLink icons. This matches the reported control and chrome defects. The shared primitives are present inpackages/ui; I am composing them into the existing Tasks views and will capture viewport-sized screenshots from the production build.Finding: the first Tasks profile invocation stopped before server startup because the E2E harness looked under
target/debug/calternal-server, while this job uses the presetCARGO_TARGET_DIRat/mnt/hdd/targets/jobs/tasks-mode. The profile runner now passes the configured debug binary. A local 10,000-Task seed advanced at about 60 Tasks/minute on the shared host, so I stopped it and started a 1,000-Task local profile. The profile still supports the 10,000-Task maximum for a faster perf host.Performance finding: the local 1,000-Task profile seed reached 516 Tasks after 17 minutes on the shared host. I stopped it before route measurements so it would not hold the host for the remaining seed. No
tasks-ui.jsonresult was produced, so there are no p50/p95 or CPU/RSS numbers to compare withdocs/perf/baseline.json. The profile supports the 10,000-Task stress size and 24-client burst; its full local run remains unmeasured.Finding: the post-merge E2E reached the real Notes API, then its screenshot fixture assertion expected
reviewwhile the Task index returned the canonicaltask/reviewnamespace for#review. The assertion now follows that existing tag vocabulary; no API or production UI code changed for this finding.Finding: the local E2E fixture created with
POST /api/v1/notes/tasksreturned the requested When date butdue: nullfor the📅 2026-10-04suffix. The UI fixture now sets due, scheduled, priority and tag through the existingPATCH /api/v1/notes/tasks/propertieswriter, so the screen evidence uses persisted API data. I left the Task text parser unchanged because this UI round owns presentation only.Finding: the E2E waited for a scheduled Task on Inbox, and timed out because the built-in Inbox view correctly excludes Tasks with When or Deadline values. I separated the plain Task used by the drag proof from the metadata Task used by screenshots, and capture the latter in Next 7 days. The screenshot flow now asserts the card chips and relative List dates before saving each viewport image.
Finding: after a successful Board drag, Playwright's click on the
Change status · Doingmenu item retried until that item detached during its entrance transition. The E2E now waits for the shared menu row animation to finish before synthetic clicks on top-level items and radio submenu choices.Finding: the real-browser drag proof reached the Board but the authoritative Tasks API still reported
todoafter the 5-second write window; no status assertion passed. I am tracing the native drag event path before changing the Board behavior.Production E2E finding: after a Task status PATCH, the Notes change subscription started a full
TaskIndex.refresh(). Theloadingstate replaced the rendered board, detaching its card action menu while the write was settling.refresh()now preserves the ready projection during the background read, so the open view stays mounted; the production Tasks E2E passed through drag, keyboard status change, saved view edit, and all 24 viewport captures afterward.Production E2E finding: after a direct edit to a saved Bases file, the Notes API and Tasks content showed the new view name but the browser document title stayed at the route fallback (“Task view”). The app shell now derives the document title from the active page-owned header title, so a saved-view rename updates without navigation. The production Tasks E2E now passes through composer creation, Add task, Board drag, status menu, stable Copy link, external file edit, and all 24 required viewport captures.
The full web test run reported one 5-second timeout in the unrelated MailSection provider-details test (138 files passed; 905/906 tests passed). The required isolated rerun passed: 1 file, 4 tests.
Finished — Forgejo #430 UI round
Branch:
job/tasks-modeHead SHA:
a6125829ed3ac0328e3dfac8fdb4a53990db5bbeBuilt
Files
apps/web/src/lib/components/ItemActionMenu.svelte,apps/web/src/lib/components/SidebarLinks.svelte,apps/web/src/lib/tasks/{TaskBoard,TaskCard,TaskColumn,TaskList,TasksSidebar,TasksWorkspace,task-status,index.svelte}.ts,apps/web/src/routes/+layout.svelte,apps/web/e2e/{tasks,tasks-perf}.mjs,bench/tasks-ui/{README.md,run.sh}.The final commit changes
apps/web/e2e/tasks.mjs,apps/web/src/lib/tasks/TaskList.svelte,apps/web/src/lib/tasks/index.svelte.ts, andapps/web/src/routes/+layout.svelte.Gates and verification
bun run checkoutput:bun run buildcompleted successfully:CALTERNAL_SERVER_BIN="$CARGO_TARGET_DIR/debug/calternal-server" bun run test:e2e:tasksoutput:The 24 generated PNGs are 390, 820 or 1440 × 900 and cover paper and tokyo-night themes, Board, List, Matrix and sidebar.
bun run testhad one unrelated MailSection timeout; its isolated rerun passed. Relevant output:git diff --checkpassed with no output. No Rust files changed, so no Rust gates were run. Cleanup output:Decisions and gaps
artifacts/tasks-mode/and are not committed. Thescripts/fj issueCLI exposes no attachment/upload command, so I could not attach the PNGs to this issue; they remain in the worktree for review.Cargo and web build output were cleaned after verification. The worktree is clean. No push, deploy, merge or issue close was performed.
Superseding final report — Forgejo #430 UI round
The final screenshot review found that the List still displayed future dates as localized calendar dates. The earlier report called those relative labels; this follow-up corrects that gap. Tasks cards and rows now show relative day labels within the next or past seven days, then use the shared short-date format. A focused component regression test failed first with
10/1/26and10/3/26, then passed after the change. The production E2E assertstomorrowandin 3 daysfor both Board and List.Branch:
job/tasks-modeHead SHA:
5f00df7ec61d8850fac41509610211d7ce9b0f28Commits:
a6125829e(refresh, narrow List, live title) and5f00df7ec(relative Task dates).Delivered
Files touched by this job include
apps/web/src/lib/components/ItemActionMenu.svelte,apps/web/src/lib/components/SidebarLinks.svelte,apps/web/src/lib/tasks/{TaskBoard,TaskCard,TaskColumn,TaskList,TaskList.svelte.test,TasksSidebar,TasksWorkspace,index.svelte,task-date,task-status}.svelte,apps/web/src/routes/+layout.svelte,apps/web/e2e/{tasks,tasks-perf}.mjs, andbench/tasks-ui/{README.md,run.sh}.Gates and verification
bun run check:bun run buildcompleted:CALTERNAL_SERVER_BIN="$CARGO_TARGET_DIR/debug/calternal-server" bun run test:e2e:tasks:The E2E produced 24 PNGs at 390×900, 820×900 and 1440×900 for paper and tokyo-night, covering Board, List, Matrix and sidebar. The full unit run had two 5-second timeouts in existing shared-menu and Mail settings tests; 138 files and 905 tests passed. The required isolated rerun passed both files:
cargo build -p calternal-serverwas run only to restore the E2E server after cleanup; no Rust source changed and no Rust gates were needed.git diff --checkpassed with no output. Final cleanup output:Decisions and known gaps
artifacts/tasks-mode/and are not committed.scripts/fj issuehas no attachment/upload command, so I could not attach the PNGs to this issue; they remain in the worktree for review.The worktree is clean. No push, deploy, merge or issue close was performed.
Correction to the file and integration lines in my previous report:
Exact Task UI files include
apps/web/src/lib/tasks/TaskBoard.svelte,TaskCard.svelte,TaskColumn.svelte,TaskList.svelte,TaskList.svelte.test.ts,TasksSidebar.svelte,TasksWorkspace.svelte,index.svelte.ts,task-date.ts, andtask-status.ts, plusapps/web/src/lib/components/ItemActionMenu.svelte,SidebarLinks.svelte,apps/web/src/routes/+layout.svelte,apps/web/e2e/tasks.mjs,tasks-perf.mjs, andbench/tasks-ui/README.md,run.sh.The required
origin/devmerge was already present before final gates. No merge intodev, push or deploy was performed.Starting finishing round on job/tasks-mode. Original base:
cd3cea7575. Fetch and merge of origin/dev started; it reported conflicts in navigation.ts, settings-store.ts, and tests/adversarial/attack2.py, which I am resolving with both sides preserved before the UI fixes.Confirmed both findings in the current render code. TasksSidebar uses SidebarLinks and ItemActionMenu; its row CSS keeps the action trigger visible, while ItemActionMenu already attaches context-menu and touch long-press actions to the row. TaskColumn renders TaskCard with the same status pill used in Matrix. I’m collapsing the hidden sidebar action width and making the pill optional for Board cards; List remains separate and keeps its Status column.
Performance profile finding:
bench/tasks-ui/run.shwas started onroot@10.69.69.63with the shared release server under/root/perf.lock. The load average at lock acquisition was0.02 0.02 0.00. The profile was still seeding its 10,000-task dataset after 14:02; at that point the temporary user-data tree had 1,488 files. I stopped the run at 15:56. It did not reach route sampling, so it produced no route p50/p95 or burst metrics.docs/perf/baseline.jsonhas no Tasks UI route baseline. This is a setup-throughput observation, not a route regression measurement. The temporary server and staging files were removed.Finished — Tasks mode (#430)
Built
Files
apps/web/src/lib/components/SidebarLinks.svelteapps/web/src/lib/tasks/TasksSidebar.svelteapps/web/src/lib/tasks/TaskCard.svelteapps/web/src/lib/tasks/TaskColumn.svelteapps/web/e2e/tasks.mjsCommits
3633fbef4— mergeorigin/devwhile preserving Tasks defaults and probes2b2a3ff4b— hide Tasks sidebar actions until interaction242d5aaa3— remove duplicate Status chips from Task Board820452a32— verify Tasks touch sidebar menu actionsHead:
820452a32a019e495bae37b28d12bbe26c97f434.Gates
bun run checkexited 0. Verbatim output:bun run testexited 0. Verbatim result lines:Vitest also printed its existing jsdom warnings:
Not implemented: Window's scrollTo() methodandCould not parse CSS stylesheet; the command still exited 0.The production web build succeeded. The real API-backed E2E run passed:
cargo cleancompleted:No Rust source changed, so Rust clippy and test gates were not run.
Screenshots attached
390px: Paper Board · Paper sidebar · Tokyo Night Board · Tokyo Night sidebar
820px: Paper Board · Paper sidebar · Tokyo Night Board · Tokyo Night sidebar
1440px: Paper Board · Paper sidebar · Tokyo Night Board · Tokyo Night sidebar
The captures cover Board and sidebar at 390px, 820px, and 1440px in Paper and Tokyo Night. They use the production build and real local API. The Browser plugin was unavailable, so Playwright in the repository E2E harness captured them.
Performance profile
The existing
bench/tasks-ui/run.shprofile was started onroot@10.69.69.63with the shared release server under/root/perf.lock; the load average at lock acquisition was0.02 0.02 0.00. It was still seeding 10,000 Tasks after 14:02 and had 1,488 files in its temporary user-data tree. I stopped it at 15:56. It did not reach route sampling, so it produced no route p50/p95 or burst metrics.docs/perf/baseline.jsonhas no Tasks UI route baseline. This is a setup-throughput observation, not a route regression measurement; I posted it as a separate finding comment.Known integration gap
After the required one-time merge,
origin/devadvanced by7324257e2and15e17aeaf. The current tracking ref is two commits ahead of this branch and its diff removes the Tasks UI files, including the files changed here. I did not repeat the merge after gates, in line with the one-merge instruction. The orchestrator should account for this before integrating the branch.Decisions
No new product decision was needed. The issue specifies hover/focus visibility and says Board columns own Status; the implementation reuses the existing
ItemActionMenufor touch and keeps status chips in Matrix and List.Starting the #430 polish round on branch
job/tasks-mode.HEAD:
820452a32a019e495bae37b28d12bbe26c97f434origin/dev:
cc25c441b7a974185622a1dee853cf38686d2b67Merge base:
aa372eef6c9312403f59a65d5b90cb3648ff52edFinding from
artifacts/tasks-mode-final/1440-paper-board.pngand390-paper-board.png: the Board scroller shows a full-width scrollbar track below the lanes and clips Blocked at the right edge. The card metadata starts at a different left edge from the title text, the#reviewpill starts farther left, and the ⋯ action is in a separate bottom row. At 390 px the header title is visibly ellipsized toNext 7…while the layout switcher and two action icons occupy the same row.Implementation finding: a column Add task must write its selected Status during the create action to follow DESIGN §41. The existing
POST /api/v1/notes/tasksrequest did not accept an initial Status. I am adding an optional TaskStatus field to that route and writing the Status, Done completion date and root Checkbox in the same Notes writer; requests without the field keep their existing default.Tasks E2E on merged head
f3e211f3efound that the card title row intercepted clicks on the ⋯ action. Playwright timed out after 30 seconds and reported.task-title-rowas the pointer-event target. I raised the action layer above the row; I will rerun the E2E against the production build.The next E2E run showed that z-index and sibling placement alone still let
.task-title-rowintercept the action click. The ⋯ control now occupies its own third grid column in the title row, which keeps its hit target beside the title without overlap. I am validating this layout before continuing the screenshot run.Final report — Tasks mode polish round (#430)
Built
statusto the existing Notes Task-create route. A Board lane create writes Status, completion date, and the root Checkbox together.Decisions
statusfield, preserving the one-action/one-route rule in DESIGN §41.Files changed in this round
apps/web/e2e/tasks.mjs,apps/web/src/lib/composer/Composer.svelte,apps/web/src/lib/composer/commit.ts,apps/web/src/lib/composer/controller.svelte.ts,apps/web/src/lib/tasks/TaskBoard.svelte,apps/web/src/lib/tasks/TaskCard.svelte,apps/web/src/lib/tasks/TaskColumn.svelte,apps/web/src/lib/tasks/TasksWorkspace.sveltecontracts/openapi.json,crates/plugins/notes/src/lib.rs,crates/plugins/notes/src/tasks_api.rs,packages/api-client/src/generated.ts,packages/ui/src/tokens.csstests/adversarial/attack.pyorigin/devmerge conflict resolution:apps/web/src/routes/+layout.svelte,tests/adversarial/xuser_matrix.pyGates
Screenshots attached
The 30 new captures are attached to this issue. Each width has Paper and Tokyo Night Board, List, Matrix, sidebar, and 3× card crop captures.
390 px
820 px
1440 px
Gaps at the four-hour cutoff
docs/perf/baseline.jsonhas no comparable Tasks UI entry.blockedstatus (201) when run.cargo fmt --checkpassed after that Rust comment. The final adversarial module change was documentation only.Commits
abb05d977— Board layout and lane creationf3e211f3e— local merge oforigin/devbefore final gates5b2855676— keep Task card actions clear of title clicks2ec2b31fb— document initial Task Status invariantfec3352b1— document Task Status adversarial probeHead SHA:
fec3352b173671cf225ca311b748b19f2eebf648. No push, deploy, or merge todevwas made.cargo cleanremoved the job target, and the web build output was deleted.Owner update (2026-09-30): the default Tab list in this issue (Calendar, Tasks, Notes, Files, Photos, Analytics) is superseded. Owner: "didn't we decide that it should be Calendar, Tasks, Notes, Files, Photos, Mail, Contacts, Money?" and "i simply forgot to add it. please add it."
DESIGN §34 now has: Calendar, Tasks, Notes, Files, Photos, Mail, Contacts, Money, Analytics, then Ask; only enabled Tabs show, and Money is off until onboarding (#475). The order and the Tab Bar width are tracked in #590 and #591 (branch
job/tray-order, not merged yet). The Tasks mode work keeps using that shared order and does not hard-code its own list.Starting Round 3 in
job/tasks-mode, based on merge-basecc25c441b7a974185622a1dee853cf38686d2b67; current branch HEAD isfec3352b173671cf225ca311b748b19f2eebf648. I am addressing the three remaining alignment items from review artifactstasks-mode-430-f3e211f3eand will attach fresh screenshots and gate output when finished.Round 3 report
Branch:
job/tasks-modeMerged base:
origin/devat3f258302a0f2d6418ff60c9ce22cbb33e008ca99Head:
f620390c724ee08540d38b0ba69c3d12225fc1e4(Align task board metadata and lanes)Merge commit:
cc0db120d409e2e5df0ecac2d5c0697040ac37b6Built
Files changed:
apps/web/src/lib/tasks/TaskCard.svelteapps/web/src/lib/tasks/TaskColumn.svelteapps/web/src/lib/tasks/TaskBoard.svelteapps/web/e2e/tasks.mjsReview images
The fresh local folder is
artifacts/tasks-mode-430-r3-review/. Ten images are attached to this issue withround3-names:Gates
cargo fmt --checkexited 0 with no output.Verbatim Rust gate summary lines:
bun run checkverbatim summary:bun run testverbatim summary lines (the runner also printed existing CSS parse and jsdomscrollTo()notices):Tasks E2E (run with Node directly after this host’s Bun/Sharp wrapper could not load
libstdc++.so.6):The first direct browser run reported one
state_unsafe_mutation; it did not recur on the successful run with stack diagnostics enabled.Adversarial and performance notes
The one-time
ADVERSARIAL_API_ONLY=1campaign finished withFINDINGS 29; SLOW-only results were load. The server was alive at the end, the search storm had zero failures, the mkdir storm created 200 items with zero errors, and the rename race had one success and zero errors. No Task storm request timed out. The non-SLOW tag/DAV findings are recorded in #568, and the MCP probe setup failure is recorded in #564. The existing expectations were not changed.The existing
bench/tasks-uiprofile was attempted locally against the production web build. Its 10,000-Task seed stopped making progress at Task 3,288 for nearly six minutes while the debug server continued heavy writes. I stopped the run before route measurements; no timing file was produced.docs/perf/baseline.jsonhas no matching Tasks UI workload, so there is no comparable baseline yet. This remains a performance follow-up, not a merge gate.Cleanup:
cargo cleanreportedRemoved 16483 files, 9.0GiB total;apps/web/buildandapps/web/.svelte-kitwere deleted. Screenshots remain uncommitted.Known gaps
sharpdependency on this host; direct Node execution passed.Decisions
No new decision outside the Round 3 instructions. Date/priority metadata uses the secondary text role; TagPills remain visible in their own aligned row; Board end space uses the shared
--scroll-fadetoken.Static audit evidence for DESIGN §35 default Tab order:
apps/web/src/lib/navigation.ts:49-52 reserves a Tasks slot in DEFAULT_MODE_ORDER, but PLUGIN_NAVIGATION has no Tasks item; modeItemsForCatalog at :166-174 emits only registered items. The route inventory also has no /tasks page (Tasks resolve through /t/[id] and Calendar).
Expected: implement the Tasks Tab and its sidebar entries before enabling its slot. Regression idea: with Tasks enabled, verify its default order, navigation entry and stable task deep link.