Notes: 5,000-block Note opens in about 7 s, typing p95 171 ms, heap doubles in 5 minutes #1349
Closed
opened 2026-10-07 10:31:00 +00:00 by kayg
·
50 comments
No Branch/Tag specified
dev
wip/cards2-1083
wip/cards-1083
wip/canvas-visual
wip/canvasvis2-976
wip/calhdr-1112
wip/blocks-1125
wip/allday-1107
wip/agenda-1086
wip/trayicons2-1095
wip/trayicons-1095
wip/sidebar3-1094
wip/previewcard-1098
wip/palette2-1123
wip/palette-1093
wip/nlpchip-1127
wip/mchrome-1084
wip/mailghost2-1094
wip/mailghost-1094
wip/kbpreview2-1118
wip/kbpreview-1118
wip/kanban-1092
wip/editreg-1132
wip/editorrail3-1113
wip/editorrail2-1113
wip/editorrail-1113
wip/draw4-1101
wip/draw3-1101
wip/draw2-1101
wip/draw-1101
wip/delete-1119
job/txentry-1198
job/rev1586
job/rev2-money-ident
job/rev2-webperf
job/morph-1104
job/previewcard-1098
job/importhang-1121
job/kanban-1092
job/merge-round-7b
job/merge-round-7c
job/calcards-1115
job/collabrev3-1197
job/e2e-b-1071
job/agenda-1086
job/agenda-decks
job/allday-1107
job/browserfix
job/calact9
job/adv7c-1105
wip/collabrev3-1197
wip/calcards-1115
wip/calact9
wip/calact10
wip/browserfix
wip/agenda-decks
wip/adv7c-1105
wip/txentry-1198
wip/rev2-webperf
wip/rev2-money-ident
wip/rev1586
wip/morph-1104
wip/merge-round-7c5
wip/merge-round-7c4
wip/merge-round-7c3
wip/merge-round-7c2
wip/merge-round-7c
wip/importhang-1121
wip/fix1586
wip/e2e-b2-1071
wip/e2e-b-1071
job/noncanon-1618
wip/noncanon-1618
job/edrevert-1616
job/partial-1605
wip/partial-1605
job/calact6
job/cold-1586
job/perfvm-1587
wip/cold-1586
job/cal404-1581
wip/calact6
wip/cal404-1581
job/dname-1584
wip/dname-1584
job/merge41
wip/merge41b
wip/merge41
job/rev1573c
job/hscroll-1579
wip/rev1573c
job/rev1573b
job/rev1573
wip/fix1573
wip/hscroll2
wip/hscroll-1579
job/rev1574
wip/fix1574
wip/rev1574
job/startup-1573c
job/merge40
wip/startup-1573d
wip/startup-1573c
job/calact5
wip/remtext2
wip/merge40c
wip/merge40b
wip/merge40
job/calact4
job/startup-1573
job/calprof
wip/calprof
wip/startup-1573
job/fs1575
job/fix1570
job/calact3
job/rec1540c
wip/fix1570
job/rev1570-review
wip/calact3
job/calact2
wip/calact2
job/calcold-1560
wip/calcold-1560
wip/rec1540c
job/fix1569
wip/fix1569
job/calact-1557
wip/calact-1557
job/remtext-1568
wip/remtext-1568
job/fix1566
wip/fix1566
job/rec1540b
job/reconcile-1540
job/money2rev
wip/money2rev
job/merge39
wip/merge39
wip/reconcile-1540
job/tabswitch2
job/merge38
wip/merge38
job/autherr-1553
wip/autherr-1553
job/money-688
wip/money688rev3
wip/money688rev2
wip/money688rev
wip/money688l
wip/money688k
wip/money688j
wip/money688i
wip/money688h
wip/money688g
wip/money688f
wip/money688e
wip/money688d
wip/money688c
wip/money688b
wip/money-688
wip/tabswitch2
wip/merge37
job/merge37
job/jobnames-1538
wip/jobnames-1538
job/tabcomp-perf
job/calscript-1492
wip/tabcomp-perf
wip/calscript-1492
job/mailbody-1533
wip/mailbody-1533
job/intlfmt-1461
job/merge36
wip/intlfmt2
wip/intlfmt-1461
wip/merge36
job/merge35c
job/tagperf-1186
wip/tagrev2
wip/tagrev
wip/tagperf4
wip/tagperf2-1186
wip/tagperf-1186
wip/tagfix5
wip/tagfix3
wip/tagfast2
wip/tagfast
wip/merge35c
job/notesel-1493
wip/notesel2
wip/notesel-1493
job/merge35b
wip/merge35b
wip/m35btriage
wip/m35bratchet
wip/calsel-1491
job/calsel-1491
job/notifread-1387
job/bulkwrite-1393
wip/notifread2
wip/notifread-1387
job/slowsel-1392
wip/bulkwrite-1393
wip/bulkrev4
wip/bulkrev3
wip/bulkrev2
wip/bulkrev
wip/bulkfix4
wip/bulkfix3
wip/bulkfix2
wip/bulkfix
job/mail7-1340
job/bigscroll-1481
job/searchperf-1425
wip/mailrev4
wip/mailrev3
wip/mailrev2
wip/mailrev
wip/mail7f
wip/mail7e
wip/mail7d
wip/searchperf2
wip/searchperf-1425
wip/mail7c
wip/mail7b
wip/mail7-1340
job/photoopen-1367
job/mailsel-1449
wip/bigscroll-1481
wip/slowsel3
wip/slowsel2
wip/slowsel-1392
wip/selroot
job/journaldup
wip/journaldup8
wip/journaldup7
wip/journaldup6
wip/journaldup5
wip/journaldup4
wip/journaldup3
wip/journaldup2
wip/journaldup
wip/jdrev5
wip/jdrev4
wip/jdrev3
wip/jdrev2
wip/jdrev
wip/jdfix9
job/bignote-1349
wip/mailsel-1449
wip/bignote3
wip/bignote2
wip/bignote-1349
job/statusmark-1457
wip/statusmark-1457
wip/photoopen4
wip/photoopen3
wip/photoopen2
wip/photoopen-1367
job/authflash-1473
job/merge35
wip/authflash-1473
job/phototags-1370
wip/phototags-1370
wip/merge35
wip/m35triage
job/tick-1446
wip/tick-1446
job/restartidx-1450
job/exmove-1333
job/coldnote-1451
wip/restartidx-1450
wip/exmove-1333
wip/coldnote-1451
job/undo412-1430
wip/undo412-1430
job/calwrite-1441
job/xcancel-1443
job/calscroll-1362
wip/xcancel-1443
wip/calwrite-1441
job/xsub-1445
wip/calscroll3
wip/calscroll2
wip/calscroll-1362
wip/xsub-1445
job/linkdup-1440
wip/linkdup2
wip/linkdup-1440
wip/tabswitch4
wip/tabswitch3
wip/tabswitch-1233
wip/navrev
job/tabswitch-1233
job/mdpaste-1431
job/taskundo-1433
job/directory-1199
wip/taskundo-1433
job/remind-1432
job/nfd-1411
wip/remind-1432
wip/dirfix4
wip/dirfix3
wip/dirfix2
wip/dirfix-1199
wip/directory-1199-r
wip/directory-1199
job/readerx-1427
wip/readerx-1427
job/scrollfade-1416
job/tipphone-1439
wip/nfd-1411
job/purge-1420
job/notifrow-1414
wip/purge-1420
wip/notifrow-1414
job/slop-1385
wip/slop2
wip/slop-1385
job/tbover-1409
job/qltitle-1408
job/grantlive-1405
job/taskclick-1434
wip/tbover-1409
wip/taskclick-1434
wip/qltitle-1408
job/scrub-1422
job/hotfix35
job/ticks-1361
wip/scrub-1422
job/taskprev-1401
wip/grantlive-1405
job/ghost-1323
wip/ticks3
wip/ticks2
wip/ticks-1361
wip/taskprev-1401
job/bash3-settings
wip/ghost-1323
job/mailmorph-1368
wip/bash3-settings
job/apiaudit-1374
wip/bash3-filesphotos
job/bash3-filesphotos
job/xuser39-1402
job/bash3-money
job/mailhtml-1372
wip/mailhtml2
wip/mailhtml-1372
job/bash3-interop
job/bash3-calendar
wip/bash3-money
wip/bash3-interop
wip/bash3-calendar
wip/mailmorph2
wip/mailmorph-1368
wip/bash3-tasks
job/outro-1391
job/linkpick-1379
job/linkdel-1384
wip/linkpick2
wip/linkpick-1379
wip/linkdel3
wip/linkdel2
wip/linkdel-1384
job/mailrows-1390
wip/mailrows-1390
wip/apiaudit2
wip/apiaudit-1374
job/bash-core
wip/outro-1391
wip/bash-core2
wip/bash-core
job/bash3-notes
job/bash3-tasks
job/merge34
job/notifdel-1363
wip/merge34
wip/notifdel2
wip/notifdel-1363
job/wklink-1371
wip/wklink-1371
job/searchbar-1360
wip/searchbar2
wip/searchbar-1360
job/merge33-1122
wip/merge33c
wip/merge33b
wip/merge33-1122
job/bash-security
job/mailglass-1373
wip/bash-security2
wip/bash-security
wip/mailglass-1373
job/instaudit-1369
wip/instaudit-1369
job/tabstorm-1338
wip/tabstorm2
wip/tabstorm-1338
wip/bash-files2
wip/bash-files
job/bash-files
job/bash-money
job/editfuzz-1335
wip/bash-money
wip/moneyrev
job/tasksperf-1286
wip/tasksperf3
wip/tasksperf2
wip/tasksperf-1286
wip/editfuzz2
wip/editfuzz-1335
review/dirrev-1199
job/merge32
wip/merge32b
wip/merge32
job/bash-chrome
job/tagdnd-1187
job/bash-notes
wip/bash-notes2
wip/bash-notes
wip/bash-chrome
wip/reconcile-c1
wip/adv-c1
wip/tagdnd2-1187
wip/tagdnd-1187
job/bash-calendar
job/deploy-c1
job/editbreak-1334
job/bash-perf
wip/bash-calendar2
wip/bash-calendar
wip/bash-perf
job/hunt-20261006
job/bash-interop
job/collabloss-1197
wip/collabrev-1197
wip/collabloss5-1197
wip/collabloss4-1197
wip/collabloss3-1197
wip/collabloss2-1197
wip/collabloss-1197
wip/bash-interop
job/bash-mail
wip/bash-mail
job/vis-1293
wip/vis-1293
wip/restyle-search-r
wip/restyle-search-fix2
wip/restyle-search-fix
wip/restyle-search
job/restyle-settings
job/restyle-search
wip/restyle-settings-fix
wip/restyle-settings
job/adv31
wip/advfix-a
wip/adv31
job/bash-tasks
wip/bash-tasks
job/restyle-files
wip/restyle-files-fix
wip/restyle-files
job/fmtbar-1210
wip/fmtbar2-1210
wip/fmtbar-1210
job/perf2-1124
wip/perf2-1124
job/proflog-1204
job/merge31
wip/restyle-notes
wip/merge31
wip/proflog-1204
job/restyle-notes
job/fix-1213
wip/fix-1213
job/hide-1153
job/restyle-mailmoney
job/notestatus-1209
wip/hide-1153
wip/hiderev2-1153
wip/hiderev-1153
wip/hide5-1153
wip/hide4-1153
wip/hide3-1153
wip/hide2-1153
job/sidebarblur-1208
wip/notestatus-1209
wip/sidebarblur-1208
wip/restyle-mailmoney
job/onboard-1141
wip/onboard2-1141
wip/onboard-1141.aborted-early
wip/onboard-1141
job/adv-1202
job/segmented-1200
wip/segmented-1200
job/merge30
job/notifloop-1194
job/toastmorph-1201
wip/notifloop-1194
job/perf-1124
job/tocrail-1191
job/cards-1179
wip/cards2-1179
wip/cards-1179
wip/tocrail-1191
wip/perf-1124
wip/merge30j
job/wizchoices-1140
wip/wizchoices-1140
wip/restyle-1190
job/moneyfmt-1180
wip/moneyfmt2-1180
wip/moneyfmt-1180-r
wip/moneyfmt-1180
job/pillglass-1189
job/flags-1181
wip/flags-1181
job/restyle-1190
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/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
fixbatch-25
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
fixbatch-23
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/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
hotfix-sidebar2
job/cards-1083
job/palette-1093
job/mchrome-1084
job/e2e-a-1071
job/canvas-visual
wip/e2e-a2-1071
wip/e2e-a-1071
backup/canvas-visual-before-reconcile
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
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/staging-imap
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-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/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/theme-detail
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
job/merge-round-3-pre-rebuild
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
backup/doc-stack-r3-reset-source
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
job/dedup-375-clean
job/dedup-375-before-rebase
wip/modes-424
job/recog-417
wip/recog-417
wip/bounce-425
wip/ab-384-luna
backup/doc-stack-round3-before-rebuild
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
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-v0#1349
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?
From bash-notes round 2 (#1216), local DEBUG server, host load 27-38 (provisional; confirm on the perf VM with a release build):
5,000-block Note (499,898 bytes): open 6,910 ms; scroll frame p95 16.8 ms; keydown-to-paint p50 76.9 ms / p95 171.5 ms; heap 27.7 MB before and 56.9 MB after five minutes of typing; 60/60 typing bursts saved, the last after 34.3 s.
Budgets (DESIGN §59): open from cache <= 100 ms, first usable view with 10,000 items <= 1.5 s, action input to visible state <= 150 ms, and the editor should keep typing at frame rate. Heap doubling during 5 minutes of typing needs a leak check (undo history bound, collab update log, decorations).
Steps: measure on the perf VM (release build, bench/hdd-emu.sh), profile open and typing, fix the top causes (likely: full-document parse/render on open instead of incremental or virtualised rendering; per-keystroke work proportional to document size; unbounded history), regression budget test.
Starting #1349 on branch
job/bignote-1349, based on0419170fe456b58614befcb12d9c9d255118f1c0(origin/dev).Corrected local diagnostic before any production changes: on the release server binary for baseline
0419170fe, a 5,000-block Note took 6.36 s to become editable and 7.86 s to render all paragraphs. Four keydown-to-next-frame samples per position measured p95 328 ms at the start, 566 ms in the middle, and 883 ms at the end; the separate 23-sample middle typing trace measured p95 344 ms. This fails the 1.5 s open and 50 ms input budgets. The host load average was 28.11 / 39.60 / 38.72. This is diagnostic evidence only, not the requested full baseline: the run was local, the perf VM was occupied, and the HDD emulator is unmounted ( is unavailable). I am validating persistence and will post the full 5k/20k table and traces before changing production code.Perf VM smoke profile with the production build and release server, backed by the mounted HDD emulator: load average 1.91 / 1.99 / 1.51 before and 5.55 / 3.17 / 1.98 after. The 5,000-block Note reached editable view in 2.85 s and fully rendered in 2.97 s. With two diagnostic samples per position, keydown-to-paint p95 was 132 ms at start, 54 ms middle, and 70 ms end; the 24-sample middle typing trace p95 was 143 ms; scroll frame p95 was 167 ms. The 5-second typing smoke inserted 30 keys after 30 positioning/trace keys; all 60 were present in the Note API. The final save marker reached the API in 56.8 s. This is not the full baseline: the five-minute typing run and 20,000-block Note remain to be measured. No production files have changed.
Trace and source finding before production changes: the 5,000-block perf-VM typing trace sampled ProseMirror nodesBetween and forChild work. The shared editor has three matching full-document paths: BlockAnchorOwners walks every descendant after each document-changing transaction; BlockIdAnchorDecoration rebuilds hidden block-ID ranges from every descendant during decoration, keydown, copy, and cut handling; EmptyBlockHints checks every top-level child whenever ProseMirror asks for decorations. These paths do linear work per edit or key even when a Note has no block IDs. The full 5k/20k baseline is still running under the perf-run lock. I will post the complete measurements before editing production code.
Full perf-VM 5,000-block baseline at
0419170fe: usable view 2.706 s; fully rendered 2.789 s; keydown-to-paint p95 82 ms / 109 ms / 129 ms (start / middle / end); scroll frame p95 166.6 ms. After five minutes, renderer heap was 47.9 MB at start and 35.7 MB at end (-25.4%); browser-tree RSS stayed around 850-865 MB, while server RSS rose from 997 MB at 30 s to 1,278 MB at 300 s. The 5-minute run entered 1,842 sustained keys, for 1,962 total expected z characters including the 120 positioning/trace keys. At the 60-second save deadline, the live editor had all 1,962 and the final marker, but the Note API returned 1,716 z characters and no marker. This proves the save was not visible within 60 seconds; it does not yet prove permanent keystroke loss. I am extending the save probe to distinguish a slow save from missing updates. The 20,000-block profile and full baseline table are pending; no production code has changed.The initial 5,000-block run was a single-open pilot, so I did not treat it as the §59 baseline. I updated
bench/bignote-1349.mjsto report five first-open samples for distinct Notes and five same-Note warm reopen samples, with first-usable paint and full-render p50/p95/max. A local production-build smoke passed this flow and persisted all 147 expectedzkeys plus the save marker after 43.9 s. The local host load was 11.43/19.63/25.92, so these timings are harness evidence only, not the perf baseline. No editor implementation changes have started; the corrected perf VM baseline is still pending.The corrected perf VM run has completed the five cold and five warm 5,000-block opens and the start/middle/end typing samples. Cold first-usable paint is 1,652 ms p50 / 2,984.9 ms p95; warm reopen is 1,094.7 / 1,409.3 ms. Keydown-to-paint p95 is 97.5 ms at the start, 108.6 ms in the middle, and 98.7 ms at the end. The typing CPU profile samples
forChild,nodesBetweenand ProseMirror child lookup repeatedly;extensions.tshas full-document scans in BlockAnchorOwners, BlockIdAnchorDecoration, and EmptyBlockHints. The five-minute run and 20,000-block profile are still running, so this is interim evidence; no editor code has changed.The perf VM baseline completed the 5,000-block profile: after five minutes and 1,934 sustained key presses, the live Note and Note API both contained all 2,054 expected
zkeys, and the marker reached the API in 81.8 s. Renderer heap growth was 2.8%. The 20,000-block profile failed before typing: after clicking the first 20,000-block Note,.editor-surface[data-editor-ready="true"]did not become visible within 120 s. The profile recorded the timeout and released the perf lock. I have not changed editor code; I am isolating the 20,000-block open to determine whether this is a slow open or a surfaced error.The isolated 20,000-block profile has completed its open, typing and scroll samples. First-usable paint is 4,577.8 ms p50 / 4,779.6 ms p95 for cold content opens and 2,782.8 / 4,180.9 ms for warm reopens. Keydown-to-paint p95 is 191.6 ms at the start, 227.2 ms in the middle, and 270.0 ms at the end; scroll-frame p95 is 316.6 ms. Renderer heap is 26.3% lower at the five-minute endpoint than at start. The trace samples
forChildfor 866.8 ms across the typing capture, with repeated ProseMirror traversal calls. The final API save check is still pending; no editor code has changed.Baseline before editor changes
Measured with the release server, production web build, Chromium at 1440×900, and
bench/hdd-emu.sh(8 ms read/write delay, 200 IOPS). Each size ran in its own fresh server/browser session underperf-runto avoid cross-size cache and memory contamination. Five first opens of distinct Notes and five same-Note warm reopens were recorded. Typing samples use 32 keys at each document position. Load average at lock-held command start was 1.06/3.99/4.14 for 5,000 blocks and 1.82/3.60/4.46 for 20,000 blocks.Open and interaction latency (ms; p50 / p95 / max)
Scroll-frame p50/p95/max was 66.7/150/183.4 ms at 5,000 blocks (101 frames) and 116.7/316.6/366.6 ms at 20,000 blocks (98 frames).
Five-minute typing memory and save
The browser heap column is renderer JS heap; RSS columns are process-tree totals, all in MiB at 30-second intervals.
The browser process-tree peak was 905.2 MiB at 5,000 blocks and 1,718.7 MiB at 20,000 blocks. Server RSS at the final sample was 1,247.4 MiB and 2,399.2 MiB respectively.
Trace finding
The typing traces repeatedly sample ProseMirror
forChild,nodesBetween, child lookup andfindIndex. Source review found full-document work on edits/redraws inBlockAnchorOwners,BlockIdAnchorDecoration, andEmptyBlockHintsinpackages/editor/src/extensions.ts. These are the first targets for the fix. No production editor code has changed yet.Artifacts on the perf VM:
/root/calternal-bignote-1349/artifacts/bignote-1349/before-sampled.json/root/calternal-bignote-1349/artifacts/bignote-1349/before-sampled-open-5000.chrome-trace.json/root/calternal-bignote-1349/artifacts/bignote-1349/before-sampled-typing-2500-24.chrome-trace.json/root/calternal-bignote-1349/artifacts/bignote-1349/before-20000.json/root/calternal-bignote-1349/artifacts/bignote-1349/before-20000-open-20000.chrome-trace.json/root/calternal-bignote-1349/artifacts/bignote-1349/before-20000-typing-10000-24.chrome-trace.jsonFull web test gate update after merging origin/dev: Vitest has reported failures in three unrelated UI suites:
src/lib/calendar/TimeGrid.svelte.test.ts(1/16, “opens the shared anchored surface with every all-day event and task in a 1-day view”),src/routes/settings/connected-accounts/ConnectedAccountsSection.svelte.test.ts(4/11), andsrc/routes/settings/apps/CalendarFeedsGroup.svelte.test.ts(1/4, “freezes edits and retries the complete submitted body after assertion”). The fullbun run testprocess is still running; I will report its final exit and summary when it finishes. These files are outside #1349’s editor ownership, so I have not changed their assertions or implementation.Further failures in the same still-running
bun run test:src/routes/settings/account/PasskeysGroup.svelte.test.ts(2/2, both OIDC-only first-passkey flows) andsrc/routes/settings/account/AppPasswordsGroup.svelte.test.ts(1/3, “grants Calendar, Notes and Mail through the ordinary device choice”). Together with the three suites reported above, all five failing files are outside #1349’s editor ownership. I am preserving their existing code and assertions; the final Vitest aggregate is pending.Full
bun run testgate completed after the origin/dev merge. Exact Vitest aggregate:The failing files are
src/lib/calendar/TimeGrid.svelte.test.ts,src/routes/settings/account/ConnectedAccountsSection.svelte.test.ts,src/routes/settings/apps/CalendarFeedsGroup.svelte.test.ts,src/routes/settings/account/PasskeysGroup.svelte.test.ts, andsrc/routes/settings/account/AppPasswordsGroup.svelte.test.ts. Eight reported failures are Vitest's 5000ms timeout; one Passkeys case asserts the missing “Single sign-on” label. I did not alter these unrelated tests or their expectations. The command exited witherror: script "test" exited with code 1.After-profile interim finding from the first 5,000-block Note (
after.json, while 20,000-block run is pending): cold open p95 is 3,103.1 ms; keydown-to-paint p95 is 46.2 ms at start, 91.6 ms in the middle, and 112.5 ms at the end; scroll frame p95 is 150 ms. The open trace has Layout events of 170.9 ms (10,101 dirty of 10,379 objects) and 126.1 ms (10,112 dirty of 10,485 objects). The rendered Note has 5,001 paragraphs and about 12,900 DOM nodes. This shows full-document layout remains a measured cost after the transaction-local decoration fix. At 300 seconds, sustained typing had entered 1,990 keys, heap growth was 7.9%, and the 5k save completed in 87.45 seconds with all input keys persisted. I will include the complete 5k/20k after table after the locked run finishes.The first after-profile attempt completed the 5,000-block phase: 1,990 sustained keys; 7.9% heap growth; save 87,454.4 ms;
no_lost_keystrokes=true. The 20,000-block Note opened, but the benchmark then failed while resolving the last paragraph: Playwrightlocator('.cal-prose > p').nth(19999).scrollIntoViewIfNeeded()timed out after 30 seconds while waiting for the 20,000th sibling. This is a profile-harness limitation, not a Note/editor error. I changedbench/bignote-1349.mjsto resolve the paragraph in page context and use the same real pointer double-click, committed as9cf38a4cd; I will rerun the after-profile underperf-runto capture 20k typing and save metrics.The 5k typing p95 still missed budget, and source review found another per-transaction full-document path:
NoteCardsLayer.sectionBlocks()walked everyprose.childrenelement after each document edit before measuring each Card. I replaced that walk with start/end positions from the Note Card decoration set. The layer now resolves only Card endpoints fromEditorView.nodeDOM; the plugin maps the boundary metadata through text edits. Added a unit test for the mapped positions. Commit:23d464f42.Focused verification:
The final
bun run checkreached the source guard and found thatNoteCardsLayer.svelte's exact existing performance exception pins no longer match after the section-boundary edit (layout.observer-purpose, plus repeated-read and loop-site fingerprints). The live scan confirms the same bounded ResizeObserver and measured Card-boundary reads; the#663ledger entries are scoped to those exact sites. I am refreshing only their live symbol/hash identities, keeping the existing rules, limits, owner, reason, expiry, and ratchet counts unchanged, then rerunning the check.Final
bun run checkpasses after refreshing the exact live pins for #663. The output isperf-lint: PASS; 0 violations; 22543 scoped exceptionsandsvelte-check found 0 errors and 4 warnings in 2 files; the warnings are unused CSS selectors in the merged-branch Mail and budget screens, outside this issue. I am now running the requested fullbun run testgate.The 5,000-block sustained-typing phase completed its five-minute sampling window. Across the first and last 30-second samples, browser heap was 56,383,892 → 58,874,112 bytes (+4.4%); browser process-tree RSS was 1,007,898,624 → 1,003,036,672 bytes (-0.5%); server RSS was 861,462,528 → 1,108,418,560 bytes (+28.7%). The input probe recorded 2,106
zkeys. The benchmark is still checking persisted save contents and running the 20,000-block profile. Perf VM load was 0.85 / 1.64 / 1.64 at lock acquisition and 7.17 / 5.80 / 3.63 near the end of the typing window.Correction to my previous interim heap note: the benchmark's five-minute budget measurement starts immediately before typing, after its warm-up actions. It recorded 42,188,500 → 58,874,112 bytes (+39.6%), so the 20% heap budget is not met. The full 5,000-block result also misses the budgets: cold/warm first-usable p95 3,083.1 / 1,774.3 ms (1,500 ms limit); keydown-to-paint p95 start/middle/end 77.2 / 81.0 / 88.8 ms (50 ms limit). Scroll-frame p95 was 200 ms. Save completed in 10,516.1 ms and all 2,226 typed keys persisted.
The 20,000-block open p95 was 4,717.5 ms cold and 2,628.9 ms warm. Its 32-key position samples were 150.7 / 184.1 / 205.4 ms p95. The typed trace's top application work is ProseMirror traversal (
map,forChild,descAt,nodesBetween); the open trace also shows 161.6 ms ingetBoundingClientRectat 20k. The perf VM load rose to about 7 during this run. I am finishing the 20k save check, then will target the measured ProseMirror and Card-layout work.The first after profile was diagnostic and failed the requested 5k budgets. It ran the production build from
deb719bc6on perf-test-69-63; load rose to about 7 during the 20k phase.Measured evidence:
Chrome typing profiles showed repeated ProseMirror
DecorationSet.forChildscans and decoration mapping. The 20k open trace also showed 20,001 paragraphs mounted in the DOM and repeated Card endpoint layout reads. The Note API returned 525,516 bytes in about 222 ms in the 5k open trace, so the profile points to editor/render work after the request rather than request latency alone.The editor fix now binary-searches sparse top-level decoration children and measures Card geometry only after a structural change or a real prose resize. Focused tests pass (12/12). The enforced profile still needs to be rerun on this fix; no budget pass is claimed.
Final report
Branch:
job/bignote-1349Head:
26fdacdb3bf106407ad4fd1afefa1af62d27bc2dBuilt
content-visibility: auto.Before and measured checkpoint
The final profile was not rerun after the last commit (
26fdacdb3). The “checkpoint” column is the prior measured profile atcf711ec56; it must not be read as a measurement of HEAD.cf711ec56The checkpoint still missed the 5k open and typing budgets. Its trace showed ProseMirror scanning root-local Node decorations in
forChildfor each child. The final commit fixes that sparse lookup path, but there is no post-fix timing evidence yet. The previous enforced profile exited with the 5k open-budget assertion; the final profile command is listed below.Gates
cd apps/web && bun run build— PASS:cd apps/web && bun run check— PASS:cd apps/web && bun run test— FAIL at the design-rule check because the movingorigin/devref advanced after this worktree's one required merge:The full suite passed when run against this worktree's merge baseline with
CALTERNAL_DESIGN_RULE_BASE=ef0aa12b12e0047cf9a779827cc0ed32261b934e:Focused editor test: 1 file and 2 tests passed. No Rust files changed, so Rust crate gates were not run.
cargo cleancompleted:Removed 1 file, 356B total. The web build output was removed. The worktree is clean.UX gaps left
The requested final profile for HEAD and the 390/820/1440 Mac-platform light/dark screenshots were not completed or attached. At closeout the perf VM lock was held by another job and the local browser slot was occupied; the job had passed the four-hour cap. Visual review therefore remains outstanding. No UI control or interaction behavior changed.
Decisions not covered by DESIGN
localandchildrenarrays. It uses a runtime type sentinel to distinguish inline decorations and falls back to the source set when inline-local decorations are present.2lh.Files
packages/editor/src/extensions.tspackages/editor/src/{blockAnchorOwners,documentDecorationPlugins,indexedDecorationSet,noteCardsDecoration,transactionRanges}.tsand their testspackages/editor/src/components/NoteCardsLayer.svelteapps/web/src/lib/notes/noteProse.cssbench/bignote-1349.mjscontracts/perf/exceptions.jsonRemaining work
After the perf VM is available, run the staged final profile and attach the result and traces:
On the merge-round branch, rerun
cd apps/web && bun run testagainst the integratedorigin/devtip to verify the default design-rule baseline and full web suite.Starting continuation on job/bignote-1349 at
26fdacdb3b; branch merge base isef0aa12b12. I will measure this HEAD on the perf VM before code changes, then continue the listed risk checks and screenshots.Measurement setup finding: HEAD run 1 exited before sampling because the copied release server could not load libsherpa-onnx-c-api.so. perf-run released the lock. I am copying the complete matching shared-server runtime directory, then will restart the interleaved perf run. No timing data was produced by this attempt.
HEAD run 1 finding: after five minutes of typing in the 5k Note, the benchmark had not observed the SAVE13495000 marker in the Notes API after about 60 seconds. The profile is still within its 180-second save deadline; I will report whether the marker becomes durable or times out.
Correction to the interim save note: the completed 5k profile now records save_complete=true, save_latency_ms=2904.1, and no_lost_keystrokes=true. The quiet console did not mean the save was still pending; the earlier note was premature. I will use the saved profile data as the record.
HEAD run 1, 5k Note result: fully painted p95 2408.6 ms (the profile target is 1500 ms); typing p95 is 115.8 ms at start, 131.4 ms in the middle, and 158.6 ms at the end (profile threshold 50 ms); scroll-frame p95 is 366.6 ms. Chrome traces are saved. Load average was 0.52/2.36/2.93 before and 5.88/4.76/3.84 after, so this is one provisional sample; the interleaved origin/dev matrix will provide comparison.
HEAD run 1 completed on perf-test-69-63. For 20k: cold fully painted p95 5525.1 ms, warm fully painted p95 5254.4 ms; typing p95 294.1/285.2/266.3 ms (start/middle/end); scroll-frame p95 866.6 ms; heap change -11.9%; mean browser-tree RSS 1397 MiB and server RSS 1277 MiB; save latency 3666.2 ms with no lost keys. At 5k, heap change was +11.5%, mean browser-tree RSS 917 MiB and server RSS 1022 MiB, save latency 2904.1 ms with no lost keys. Load average was 0.52/2.36/2.93 before and 3.98/3.85/3.69 after. HEAD run 1 records five cold and five warm opens per size; the bench exited 1 after recording because 5k open p95 exceeded its 1500 ms threshold. I am starting the
d395b6e25baseline as B1.Baseline run 1 on
d395b6e25completed. 5k: cold fully painted p95 2800.1 ms, warm p95 1876.2 ms, typing p95 154.4/155.9/121.7 ms, scroll-frame p95 233.3 ms, heap change -2.1%, mean browser-tree/server RSS 925/1046 MiB, save 3551.6 ms with no lost keys. 20k: cold fully painted p95 7862.8 ms, warm p95 5811.7 ms, typing p95 342.2/468.1/759.6 ms, scroll-frame p95 516.6 ms, heap change -18.7%, mean browser-tree/server RSS 1347/1345 MiB, save 2636.4 ms with no lost keys. Load average was 2.62/3.54/3.59 before and 3.89/4.10/4.10 after. Compared with HEAD run 1, the 20k opens and typing samples improve, while the 5k budget still misses and scroll-frame p95 was higher on HEAD; repeated interleaved runs will confirm.#1349 measurement update — paired run 3 (A3 HEAD
26fdacdb3, B3 baselined395b6e25)B3 completed on perf-test-69-63. Typing windows were 60 seconds. A3 host load was 2.40/3.24/3.66 before and 3.66/3.66/3.76 after (peak sampled 5.12/3.86/3.83); B3 was 3.38/3.60/3.72 before and 4.06/3.80/3.77 after.
The 5k HEAD open and typing p95 values exceed their 1500 ms and 50 ms budgets. The 1-minute heap samples are noisy and are not directly comparable with the 5-minute first pair. The VM load differed between A3 and B3, so this pair is directional; paired runs 4 and 5 remain.
#1349 finding: the TagPill design-rule failure is branch-only.
Evidence:
node apps/web/scripts/design-rules.test.mjsonjob/bignote-1349fails atpackages/ui/src/components/TagPill.svelte:78with a new hand-rolled button. The same command in a detached worktree atorigin/dev(d395b6e25) passes:design rules: no new shared primitive overrides or hand-rolled buttons (origin/dev baseline). This branch has a stale TagPill implementation compared with origin/dev. I will resolve it with the required origin/dev merge and will runbun run teston origin/dev and on the merged branch before reporting.#1349 measurement update — A4 HEAD
26fdacdb3on perf-test-69-63A4 typing windows were 60 seconds. Load average was 1.49/3.11/3.53 before and 3.72/3.76/3.75 after.
The 5k cold and warm open p95 values exceed 1500 ms. All three 5k typing p95 values exceed 50 ms. The one-minute heap result is not directly comparable to the first five-minute sample.
#1349 measurement update — paired run 4 (A4 HEAD
26fdacdb3, B4 baselined395b6e25)B4 typing windows were 60 seconds. A4 load average was 1.49/3.11/3.53 before and 3.72/3.76/3.75 after; B4 was 2.66/3.52/3.67 before and 3.90/4.02/3.87 after.
Both builds miss the 5k cold-open and typing p95 budgets. The 20k baseline cold-open is faster than HEAD in this pair; 5k opens are close. Heap changes are from 60-second windows and remain noisy.
#1349 TagPill check follow-up
The full origin/dev web suite passed in the detached
d395b6e25worktree, with Vitest capped at two workers:bun run test -- --maxWorkers=2; output reportedTest Files 297 passed (297)andTests 2116 passed (2116). Its design-rule stage passed. The branch-onlyTagPill.svelte:78failure is therefore due to the stale component on this job branch, not origin/dev. I will run the full web suite again after the required merge.#1349 measurement update — A5 HEAD
26fdacdb3on perf-test-69-63Typing windows were 60 seconds. Load average was 0.49/0.68/1.35 before and 3.96/2.87/2.17 after.
The 5k open p95 and all three 5k typing p95 values exceed their 1500 ms and 50 ms budgets. This completed HEAD run 5; baseline run 5 remains.
#1349 measurement update — B5 baseline
d395b6e25on perf-test-69-63B5 typing windows were 60 seconds. Load average was 2.67/2.66/2.11 before and 3.38/3.39/2.66 after.
This completes the fifth paired HEAD/baseline run. The 5k HEAD cold-open and typing budgets remain unmet; all five runs preserved input.
Implemented and committed
6f0ba220a(Guard indexed decoration storage assumptions). The runtime guard accepts only the pinned array/triple shape and returns unsupported sets unchanged for ProseMirror's native lookup. The test asserts the private shape resolved by@tiptap/pm3.31.4 (prosemirror-view1.42.5), then renders both the indexed set and an unsupported array-like storage fallback withEditorViewand compares the resulting HTML. Focused test output:Test Files 1 passed (1);Tests 3 passed (3).Sourcemapped HEAD profile (
26fdacdb3, original pre-fix) completed on perf-test-69-63. For the 5,000-block Note, cold fully-rendered open was p50/p95 1690/3272.5 ms; warm was 1367/1543 ms. Keydown-to-paint p95 was 81.2/199.4/151.8 ms at start/middle/end; scroll-frame p95 was 333.2 ms. For 20,000 blocks, cold/warm open p95 was 4480.9/3847.3 ms, typing p95 200.3/206.9/196.1 ms, scroll-frame p95 799.9 ms. One-minute memory samples grew 3.6% and 27.7%; all input keys saved. Load average was 0.29/1.75/2.14 before and 3.72/3.25/2.73 after.Chrome traces mapped repeated 14–178 ms AppToaster dock updates while 5k/20k prose children mounted. I excluded
.cal-prosesubtree mutations from that dock observer and added an AppToaster regression test. The editor test now also pins the ProseMirror storage arrays/triples and asserts native fallback HTML matches indexed HTML. These changes are committed in772920b6band6f0ba220aplus follow-up type/perf-pin commits. Re-measurement on perf-test-69-63 is pending the active infraternal perf lock; no result is inferred from the old profile.Final report — #1349
Head:
bad252232(job/bignote-1349).Built
data-focus-ring="none"token; the caret remains the text focus indicator.Files:
packages/editor/src/indexedDecorationSet.ts,packages/editor/src/indexedDecorationSet.test.ts,apps/web/src/lib/components/AppToaster.svelte,apps/web/src/lib/components/AppToaster.svelte.test.ts,contracts/perf/exceptions.json,contracts/perf/adoption-1058.json,apps/web/src/lib/notes/NoteEditorSurface.svelte,apps/web/src/lib/notes/noteProse.css,apps/web/e2e/bignote-1349-risk.mjs.Performance
One post-fix perf VM run used one cold and one warm open per size, 24 key-paint samples per position, and 60 seconds of sustained typing per size. This sample count is smaller than the interleaved baseline run, so treat it as directional.
The 5k open and typing budgets remain missed. Both sizes saved all typed keys; save latency was 1,672.7 ms at 5k and 1,699.1 ms at 20k. The source-mapped profile and the initial five-pair HEAD/baseline table are in the earlier comments.
Verification
apps/web:bun run checkexited 0. Output:perf-lint: PASS; 0 violations; 22544 scoped exceptions;svelte-check found 0 errors and 4 warnings in 2 files.packages/editor:bun run check—svelte-check found 0 errors and 0 warnings.packages/editor:bun run test—Test Files 26 passed (26);Tests 460 passed (460).3 passed; AppToaster prose mutation4 passed.apps/webtest suite was deferred under the shared verification policy. For the merge round:cd apps/web && bun run test --maxWorkers=2must prove the complete web test suite passes.origin/dev(d395b6e25); the post-merge branch check passes.UX gaps
Closed: Note focus uses the caret without an outline after pointer typing; all requested width/theme/state captures are clean and show loaded Note content.
Left: no separate immediate-after-click capture was produced; the typed captures show the editor after pointer activation and typing. Print generation and measured scroll drift remain open as described above.
Decisions
content-visibilityand intrinsic sizing so every block uses its measured height.window.findwith wraparound because⌘Fis the browser's native find action, not the app Search palette.Captures
390 light: top · middle · typed
390 dark: top · middle · typed
820 light: top · middle · typed
820 dark: top · middle · typed
1440 light: top · middle · typed
1440 dark: top · middle · typed
Shortcut find: 1440 light
bignote3 started on job/bignote-1349, base/head
bad252232f. No code changes before the controlled interleaved d395b6e25/bad252232 A/B (five pairs, 5k and 20k). Perf VM currently held by slowsel2-ab-retry; preparing isolated builds while waiting for perf-run. Then trace-led typing/scroll fixes and print/drift checks.Controlled A/B is in progress under perf-run calternal bignote3-initial (five alternating-order pairs, 5k/20k, two distinct cold fixture Notes and a true warm switch-away/reopen per size). No tracked code has changed. A source-mapped headed Mac trace and the first locked VM 5k typing trace both identify two full-Note walks in inlineLinks (decoration rebuild and standalone preview collection), repeated anchor parsing, and posAtIndex prefix summation in Note Card dirty-range calculation. The 5k VM scroll trace has 2,491.5 ms of style recalculation and 1,242.7 ms of layout during the 50-wheel profile; Floating UI dimension reads have 2,945.8 ms sampled self time including forced rendering. The local existing risk probe reached its 600 s timeout without a PDF. Full paired table follows after all five pairs; production edits remain deferred until then.
New risk evidence, before any tracked edits: the original production risk probe timed out after 600 s without a PDF. A narrow print diagnostic that installs print block flow before changing media and hides fixed/decorative shell chrome completed a 1,542,883-byte PDF in 7.4 s. PDF.js reads 251 pages and confirms Block 5000 on the last page. These are temporary browser overrides, not a shipped fix; the production Card/shell fix and full risk rerun follow the initial five-pair A/B. A later caret probe ended at Block 2502 after 40 ArrowDown presses; its click coordinate is computed immediately after entering a deferred block, so the starting caret must be verified after layout settles without weakening the existing assertion.
bignote3 controlled A/B completed before tracked changes. Branch remains clean at
bad252232.Compared exact production web builds
d395b6e25(dev) andbad252232(head), same release server SHA256 9187026d117f4da1c62ba2e00581683cca9516c4804b58e9bab5885969d4f5bf, same browser/data/harness. Five interleaved pairs: dev/head, head/dev, dev/head, head/dev, dev/head. Each trial has fresh server/browser and both 5k/20k Notes. perf VM lock: perf-run calternal bignote3-initial 30; actual run 16:42:01–17:26:35 UTC. Load averages at trial start were 4.13–5.98 (1 min); no quiet-host filtering. Milliseconds except heap. Scroll frame samples include the same Chrome tracing overhead on both revisions.The branch improves typing percentiles at both sizes and cold-open p95, but it does NOT consistently improve opening: warm-open p95 is worse at both sizes, and 5k cold-open p50 is worse. Scroll p95 is worse at both sizes. The 5k typing budget of 50 ms is missed at all positions.
20 middle keys at 5k, VM trace: sampled link decoration/preview work 171.6 ms (8.6/key); Card range work 99.1 ms (5.0/key); Yjs update/encode 80.6 ms (4.0/key); other decoration work 52.8 ms (2.6/key). Timeline Layout 159.5 ms (8.0/key), UpdateLayoutTree 26.9 ms (1.3/key). NoteView/save debounce sampled 2.0 ms total (0.1/key). NoteCardsLayer and toast dock have no sampled stack; Svelte effects are below reliable sample resolution. Sampled CPU and timeline categories overlap and must not be summed.
Scroll trace: UpdateLayoutTree 2,491.5 ms and Layout 1,242.7 ms; Floating UI getCssDimensions has 2,945.8 ms sampled self time including forced rendering. The synthetic stationary-pointer mousemove dispatch on each scroll frame repeatedly positions the drag handle.
Next fixes: remove prefix rescans in transaction-local ranges; rebuild links only in changed blocks; settle passive hover once scrolling stops; production print normal flow. Keep the guarded ProseMirror index and fallback test. No tracked code has changed yet.
bignote3 findings and commits:
e05f0588bremoves repeated sibling-prefix scans from Card/local range lookup. Editor check:svelte-check found 0 errors and 0 warnings; focused range/Card/index tests:Test Files 3 passed (3),Tests 13 passed (13). Guarded private-field index and fallback remain intact.8e63bbb41updates link decorations in changed blocks and derives preview requests from sparse widgets.70b7367b7synchronizes routed link DOM locally with WeakMap ownership. Focused link tests:Test Files 1 passed (1),Tests 17 passed (17), including 5k no-root-walk, duplicate ordinals and stable-link restoration.9a283c5edsettles stationary-pointer hover after scroll. Focused drag-handle tests:Test Files 1 passed (1),Tests 11 passed (11). Twenty scrolling events cause zero synthetic mouse moves during travel, then one settled refresh. Real pointer input stays immediate; keyboard focus/grab state stays visible.84d0c9890maps Canvas widgets for plain-prose edits. Focused Canvas tests:Test Files 1 passed (1),Tests 5 passed (5). Actual embed edits retain the full sixteen-preview admission rule.3c6a330a7adds shared Card printFlow and Note/shell normal flow. Shared Card/Canvas tests:Test Files 2 passed (2),Tests 15 passed (15). Production risk probe retained the original caret assertion and passed it after waiting for deferred pointer layout. The tightened fresh-before-print drift assertion also passed.The PDF completeness assertion caught a real remaining print defect: a 122-page, 16 MB PDF repeated Blocks 1–17 and omitted Block 5000. Evidence: PDF text extraction from pages 120–122. The shell has fixed html/body positioning in calternal-app.css; the diagnostic override reset position too. The production fix now resets shell positioning for print and is rebuilding. I will rerun the same completeness assertion; a nonempty PDF is not sufficient.
8a358d08dretains raw CPU profiles and scroll traces in the existing benchmark, using twenty middle trace keys. Initial A/B table remains unchanged.bignote3 progress: the guarded ProseMirror decoration index and fallback test are retained. The first five-pair post-fix comparison is nearing completion; its production snapshot is frozen at
eead8044a.The new 20-key middle-of-5k trace attributes 2.202 ms total (0.110 ms/key) to link decorations/previews, compared with 171.636 ms total (8.582 ms/key) before the changes. Other sampled costs remain: Card decorations 85.633 ms (4.282 ms/key), other decorations 52.754 ms (2.638 ms/key), Yjs update/encode 94.896 ms (4.745 ms/key), Svelte effects 7.912 ms (0.396 ms/key), and NoteView/save 0.888 ms (0.044 ms/key). No NoteCardsLayer or toast-dock stack was sampled; this does not establish zero cost. Native Layout totals 150.661 ms (7.533 ms/key), style-tree update 31.671 ms (1.584 ms/key), and native intersection computation 305.300 ms (15.265 ms/key). These native totals overlap JS/event work and must not be added as independent latency. The native
(program)samples are not source-attributed.The fling trace still samples 2573.78 ms in Floating UI getCssDimensions, plus native intersection computation 3529.929 ms, Layout 1372.298 ms and style-tree update 2187.596 ms. The debounce alone did not remove the largest geometry cost. A follow-up slice suppresses same-coordinate passive mouse events during settling and uses Floating UI's existing fixed-position strategy for the viewport virtual reference. Physical pointer motion, dragging, and focused/grabbed keyboard handles remain immediate. Unit tests cover these contracts. No dependency was added.
Print now completes: 251 pages, final page contains Block 5000. The prior broken capture repeated the first 17 blocks over 122 pages; the fixed-position shell prevented pagination. Fresh deferred-block scrolling records 0 px scrollTop drift, and the stable Block 4000 link scrolls to its actual viewport position (204471 px). The current final screenshot set covers 390/820/1440 px in light and dark with macOS platform emulation. Native macOS measurements are queued behind the other tenant's lock.
Typing is still above 50 ms p95 in the first post-fix samples. This is not yet a budget-complete result. I will finish the controlled comparison and repeat it for the final scroll-positioning slice within this job's time limit.
Five-pair post-fix comparison completed,
d395b6e25versuseead8044a(before the final handle positioning slice). This branch is not consistently better than dev on typing and open. It misses the 5k typing budget.The 5k middle typing p95 is 149.6 ms versus dev 146.5 ms. Open p95 is worse in all four cold/warm × size cases. Scroll p95 is worse at both sizes. Top/end typing improves, and 20k typing improves, but these changes do not establish an acceptable overall result.
Measurement qualification: both the initial table and this table used the same pointer-targeting setup, but did not assert the caret block after deferred layout. Treat their top/middle/end labels as intended positions, not verified caret positions. Open measurements remain content-confirmed. The final comparison now waits for deferred geometry and asserts the actual Block number before every typing phase. Its source-attributed 20-key middle trace will have the same assertion.
The final handle slice is
443864508. A separate native-layout diagnostic is running under perf-run before the verified five-pair final comparison. All raw trials, including slow trials, are retained.Corrected measurement finding (bignote3, source
923307029): the two completed pairs below assert the actual caret Block and actual wheel travel. This branch is not consistently better than dev on typing and open. The 5k middle typing p95 is 235.7 ms versus dev 158.7 ms; the 50 ms target is not met. These are TWO pairs, not the requested five. All trials, including the slow second head trial, are retained.Correction to earlier evidence: the earlier five-pair scroll probes reset window.scrollTo while the fixed shell uses #route-content. They did not establish a real fling and must not be used as scroll improvement evidence. Earlier typing labels also did not verify the post-layout caret.
Risk finding: the review probe could serve the shared server embedded dev assets unless CALTERNAL_E2E_ASSET_OVERRIDE was set. The probe now requires its own frozen production assets. Earlier risk failures from runs without that flag are not evidence about this branch. The verified production probe found a real 26 px bottom drift: the terminal empty paragraph has one line but its deferred estimate was two. A CSS exception lays out that one empty paragraph, preserving deferral of other blocks. The final production drift probe now reports maxInputDrift=0, maxClampPx=0 and end=finalMaximum=255696. PDF completion is still being checked.
The final production rerun is queued behind the perf-run lock holder searchperf2 (started 19:51 UTC, expected 40 minutes). The real macOS GPU run is also queued under the required locks. The job ends at its four-hour deadline, 20:29 UTC; unfinished requested measurements will be reported explicitly. No runtime feature changes are planned after the terminal paragraph correction.
bignote3 final report, #1349. Head
0743d5a9ad. TASK INCOMPLETE: the 5k typing target is not met. No push, deploy or merge into dev was done. The explicitly requested origin/dev integration was performed once (af202e151).Built: transaction-local link decorations and stable link DOM updates; Canvas preview mapping for plain block edits; guarded sparse node-decoration mapping; stationary pointer suppression during scrolling; viewport-based shared drag-handle positioning; complete Note print layout; a one-block empty-tail exception that removes bottom scroll drift. The guarded ProseMirror private-field index and native fallback test remain. Benchmarks retain raw CPU profiles and Chrome traces, verify actual caret Blocks and real feed scroll travel, and keep all slow trials.
Files authored in this round:
packages/editor/src/transactionRanges.tspackages/editor/src/transactionRanges.test.tspackages/editor/src/indexedDecorationSet.tspackages/editor/src/indexedDecorationSet.test.tspackages/editor/src/extensions.tspackages/editor/src/extensions.dragHandle.test.tspackages/editor/src/components/NoteCardsLayer.sveltepackages/editor/package.jsonapps/web/src/lib/notes/inlineLinks.tsapps/web/src/lib/notes/inlineLinks.test.tsapps/web/src/lib/notes/editor-types/indexedDecorationSet.d.tsapps/web/src/lib/notes/editor-types/transactionRanges.d.tsapps/web/src/lib/canvas/embeds.tsapps/web/src/lib/canvas/embeds.test.tsapps/web/src/lib/notes/NoteView.svelteapps/web/src/lib/notes/noteProse.cssapps/web/src/routes/layout.cssapps/web/e2e/bignote-1349-risk.mjsbench/bignote-1349.mjscontracts/perf/exceptions.jsoncontracts/perf/adoption-1058.jsonThe continued branch also contains the previous rounds' block-anchor/document-decoration ownership, NoteCardsLayer and toast-dock optimizations. Shared Card and token changes made during this round were reverted to origin/dev; no new visible control or local shared-primitive styling ships. Shared controls remain Card, Button/IconButton, the existing drag handle and global search.
Performance: final production source
0743d5a9aversus pinned devd395b6e25, two interleaved pairs (dev/head, head/dev), under perf-run. The final source was copied; no build ran on the VM. The same release server binary and guarded caret/wheel protocol were used. The lock became available at 20:02:48 UTC and the campaign stopped at its time-box boundary after the second pair at 20:19:23 UTC. This is TWO final pairs, not the requested five.Typing improves at both sizes in this limited final comparison. The 5k middle typing p95 is 119.3 ms versus dev 171.2 ms, so the <=50 ms target still fails. The head trials are 134.2 and 104.5 ms. At 20k, cold/warm opens and typing improve. This branch is not consistently better on typing and open: 5k cold-open p95 is worse (4245.1 versus 4056.5 ms). Scroll p95 is worse at both sizes (250.1 versus 241.7 ms; 725.0 versus 533.3 ms). All eight sustained typing/save checks confirm that every inserted key reached both the live Note and durable storage.
The initial five-pair d395b6e25/bad252232 and intermediate five-pair d395b6e25/eead8044a tables are posted above. Their opens are content-confirmed, but their intended typing positions and real wheel travel were not verified; do not use their typing position or scroll claims as controlled evidence. The corrected exploratory
923307029comparison and raw evidence remain posted, including its slow head trial. No slow trials were removed.Verified 20-key middle typing trace (5k, source
923307029): sampled attribution is Yjs update/encode 5.99 ms/key; ProseMirror tree traversal 4.21; ProseMirror view 4.35; Card decoration ranges 0.66; other decorations 0.95; links 0.06; save debounce/NoteView 0.44; Svelte effects below the sampling resolution. NoteCardsLayer and toast dock had no attributed samples, which does not establish zero cost. Chrome Timeline reports layout 7.78 ms/key, style-tree update 1.63, and native intersection computation 14.05. These overlapping layers must not be summed as wall-clock latency. Unattributed native program time remains large. Card mapping was 4.28 ms/key in the earlier trace; the guarded single-step map avoids validating unchanged sparse spans.Verified 5k real-fling trace: native intersection computation totals 3617.39 ms; style-tree update 1267.54; layout 1026.22; sampled Floating UI getCssDimensions 1455.66 ms; caretPositionFromPoint in BlockHoverActions 555.43 ms plus drag-handle caret lookup 151.61 ms. The stationary-pointer and viewport-reference fixes do not remove all hover/position work. The largest remaining scroll costs are not solved. Remaining full-document JavaScript work includes TipTap code-block-lowlight findChildren/nodesBetween and Yjs binding traversal. Fixing these without breaking collaboration needs another tested slice; no unsafe third-party shortcut was added.
Expected cost: changed-block traversal is changed Blocks plus a fixed neighbor margin; plain Canvas edits map existing sparse previews; the guarded node-decoration map is proportional to sparse decorations and validates only touched spans. Compound maps and unsupported private shapes use native behavior. This does not establish edited-block-only cost for every keystroke: ProseMirror/Yjs/native layout still consume Note-size-dependent work. The new empty-tail rule adds one laid-out empty paragraph. docs/perf/baseline.json has no directly comparable controlled bignote profile; pinned
d395b6e25is the comparison baseline.Risk proof: the final frozen production assets passed the focused risk probe. Print generated a 2,764,161-byte PDF containing the first and last of 5,000 Blocks. Fresh deferred scrolling reached the exact bottom with maxInputDrift=0 px, maxClampPx=0 px, end=finalMaximum=255696. Stable Block 4000 links, browser Find, middle caret movement and Select All also passed. risk-tail-production.log bignote-1349-print.pdf
UX gaps closed: full-document print pagination; bottom scroll drift; pointer-triggered typing focus proof; real deep-link viewport confirmation. Screenshot typing now restores the whole paragraph after Undo, instead of merely waiting for a two-character marker to disappear. The risk probe explicitly serves this job's production assets.
Gates (verbatim summaries; linked files contain the complete unmodified output):
cd packages/editor && bun run test --maxWorkers=2gate-editor-map.log
cd apps/web && bun run checkgate-web-check-tail.log
cd apps/web && bun run test --maxWorkers=2gate-web-test-fixed.log
The last CSS-only correction was checked by bun run check and the real production regression probe. No Rust source was authored or server built in this job. No dependencies were added.
Decisions: use the existing Photos-derived 140 ms passive hover settle delay; retain immediate real pointer, button and keyboard actions; use the shared drag handle's existing viewport positioning configuration rather than runtime whole-editor geometry reads. Keep content-visibility enabled: the diagnostic that disabled it did not improve all typing positions. Lay out only a terminal empty paragraph to fix its intrinsic-height mismatch. Keep shared Card material and hide editing-only controls in print. No product behavior decision marked OPEN was built.
Known gaps / UX gaps left: 5k typing <=50 ms; open/scroll budgets; five correctly targeted final interleaved pairs; five-minute memory retention; complete real macOS before/after control. Native timing and capture status are given below. Corrected raw evidence: verified-evidence.tar.gz.
verified-typing-attributed.json
verified-scroll-attributed.json
review-tail-clean.log
Native macOS confirmation (one final-head trial, 5k, release server, actual Chrome/Metal GPU; not an A/B): cold open p50/p95 4760.2/8846.6 ms; warm 3782.3 ms; typing top 36.2/64.4, middle 38.4/130.6, end 59.2/108.6 ms (p50/p95, 20 verified keys per position); real fling scroll-frame p95 383.1 ms, scrollTop 0 -> 30000. Renderer heap 28,599,480 bytes, 12,846 DOM nodes. Metal GPU compositing is enabled; Mac load average inside the lock was {5.19 5.19 4.48}. The process host/load fields in the profile describe the local server/controller, not the Mac; GPU fields and renderer metrics come from the remote browser. The <=50 ms target fails on the Mac too.
An initial native run with the debug server reached the real "This note could not be opened" state and timed out with no editor. It is retained as a failure, not a latency sample. The focused release-server retry opened the same fixture shape and completed typing. The earlier failure's cause is not established; no claim is made that it is fixed or only host load.
Review: 19 production captures with macOS platform glyphs passed at 390/820/1440 px, light/dark; no loading placeholders or update toast. The real Mac produced all 24 large-Note captures (top, middle, pointer typing, opening Cmd+K) at the same six width/theme combinations. Pointer and shortcut outline assertions passed. Four of six nearest existing Small Note comparison captures completed; the twenty-minute browser lease ended before dark tablet/desktop comparisons. Claude must review visual quality; the captures are evidence, not an aesthetic approval.
The native measurement JSON retains a failure from the later comparison helper (it attempted a hidden phone sidebar row). Its preceding 5k open/typing/fling phases completed; a direct stable-link helper obtained four comparison captures before browser shutdown. Native 20k timing and a native before/after control remain undone.
tail-two-table.md
tail-results.tar.gz
tail-traces.tar.gz
bignote3-mac-tail.json
Native screenshot evidence (actual-size PNGs, Metal macOS rendering):
Cleanup: cargo clean completed (
Removed 1 file, 356B total); web build and Svelte output were deleted. Temporary local test data was deleted. All owned measured runs and queued browser attempts are stopped; the perf lock and the original Mac browser lease were released. The remaining two comparison screenshots are not presented as complete. No screenshots or review artifacts were committed. Worktree status is clean.Mac download cleanup: not verified; the local Mac lock was occupied. Own files may remain under ~/calternal-bench/bignote3 and must be deleted when the lock is available.
Cleanup follow-up for head
0743d5a9ad: Mac download cleanup completed under the required local lock; ~/calternal-bench/bignote3 was removed. The final report was generated before that check returned, so its unverified-cleanup note is superseded. All own measured/queued runs are stopped, local build output and temporary fixture data are removed, and the worktree is clean. The performance and measurement gaps listed in the report remain.Deployed to calternal.cloud in merge round 35c (build
5a2c02c13, live 2026-10-09 ~16:35 IST). Closing.