Skip to content

Hardening candidates: v2.30.0 #255

Description

@jeiel85

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

  • The outline drops nothing, but it flattens #### and deeper into level 3. CommonMarkPreviewAdapter.renderHeading maps node.level 1/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 new PreviewLineType values 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.
  • isLongEnoughToJump counts 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.
  • The editor's jump direction is inferred from the caret, not the scroll position. BasicTextField's classic API exposes no scroll state, so "which end are you further from" reads editorState.selection.start. Scroll without moving the caret and the arrow can point the way you already are. The preview path uses the real firstVisibleItemIndex. Impact: a confusing arrow on the editor surface only; the tap still works.

Data and storage

  • note_view_state rows 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.
  • The position write reads the row back before writing it, on every debounced save. One extra query per second of idle editing, to preserve the other surface's value. A cached last-known pair in composition state would avoid the read entirely. Impact: negligible today; worth revisiting if the write ever moves off the debounce.

Configuration consistency

  • The store changelogs for de-DE, es-ES and fr-FR were written over the 500-character Play cap and had to be trimmed by hand. verify-release-notes.ps1 catches 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.
  • The landing pages carry a "current release" strapline that no check covers. verify-landing-versions.ps1 asserts 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

Observability

  • Nothing reports that a position restore was clamped or dropped. A note that shrank outside the app silently lands somewhere other than where it was left, which from the outside is indistinguishable from the setting not working. A one-line note in the Sync Center, or a debug log, would make it explainable. Impact: unreproducible "it forgot where I was" reports.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions