Candidates surfaced by, or adjacent to, what shipped in v2.30.0 (#215 outline screen, #214 open-at + jump control). Filed at tag time as a tracker, not as blockers — v2.30.0 ships as it is.
Correctness and boundaries
Data and storage
Configuration consistency
Testing
Observability
Candidates surfaced by, or adjacent to, what shipped in v2.30.0 (#215 outline screen, #214 open-at + jump control). Filed at tag time as a tracker, not as blockers — v2.30.0 ships as it is.
Correctness and boundaries
####and deeper into level 3.CommonMarkPreviewAdapter.renderHeadingmapsnode.level1/2/else, so H4–H6 render and outline identically to H3. Now that indentation is the only level cue on the outline screen, a deeply nested note reads as flat. Un-flattening means newPreviewLineTypevalues and preview rendering to match — deliberately out of scope for Title tree view for quick note browsing #215, tracked here. Impact: outline readability on notes using more than three heading levels.isLongEnoughToJumpcounts source lines, so a note of forty short lines gets the jump control and a note of five paragraphs that wrap to sixty screen lines does not. Line count is a proxy for "does not fit on screen", and it is wrong in both directions. A measured proxy (text length, or the text field's own content height) would track the real thing. Impact: the control appears on some notes that do not need it and misses some that do.BasicTextField's classic API exposes no scroll state, so "which end are you further from" readseditorState.selection.start. Scroll without moving the caret and the arrow can point the way you already are. The preview path uses the realfirstVisibleItemIndex. Impact: a confusing arrow on the editor surface only; the tap still works.Data and storage
note_view_staterows are written for every note visited while "where I left off" is on, and never pruned except by the note's own deletion. Cascade covers deletes, but a user who turns the setting on, browses a thousand notes, and turns it off again leaves a thousand rows behind. A prune on switching the setting off — or on the next maintenance pass — would keep it honest. Impact: unbounded row growth in a database that is otherwise proportional to note count.Configuration consistency
verify-release-notes.ps1catches the overrun, and warns under 50 characters of headroom — three of six locales are in that band for v2.30.0. The warning has no teeth and the trimming is manual. Consider having the export refuse a locale that is over, and having authoring tooling show the count while writing. Impact: an avoidable round trip at every release cut; Hardening candidates: v2.26.1 #167 is the precedent where it reached CI.verify-landing-versions.ps1asserts the three version strings per page but not the neighbouring<span>, which still reads "Includes Quiet Formatting" — a feature from an earlier release. Impact: the trust ledger advertises a stale headline feature indefinitely.Testing
settings_centered_tablet.pngbecause the Notes & search section is below the visible area. Every settings row added since that snapshot was written is visually uncovered. Impact: visual regressions in most of the settings screen would pass CI unnoticed.settings_notes_search_tablet.png,settings_data_tablet.pngandsettings_privacy_tablet.pngnow snapshot the sections that sit below the fold, recorded on the Linux runner rather than locally.note_view_statelive inAppDatabaseMigrationTest, which is instrumented and therefore not run by CI (AppIntegrationTest crashes the app process on teardown, and CI never runs it #235). The v17→v18 migration, the cascade, and the "legacy note has no row" case are all asserted and all only run when someone runs them locally. Impact: a broken migration reaches a release unless the local gate is remembered.instrumented-testsjob inandroid-build.ymlruns:app:ciAtdApi30DebugAndroidTeston an AGP managed device, so these assertions now execute on every push.continue-on-error: trueuntil it has been green for a while, so a broken migration is reported but does not block a merge. It has failed 3 of its last 6 runs, so promoting it to a required check is not yet the right move — but the flake belongs to the job, not to the migration.Observability