Skip to content

Reader upkeep: browser audit drift, development guide and vendor pruning - #196

Open
callumalpass wants to merge 8 commits into
mainfrom
chore/reader-upkeep
Open

callumalpass wants to merge 8 commits into
mainfrom
chore/reader-upkeep

Conversation

@callumalpass

@callumalpass callumalpass commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Refresh Reader development/SDK-refresh documentation and browser-audit selectors without changing dependency pins or the lockfile.
  • Delete 165 superseded vendor files (397,165,184 bytes) and the unused historical intake helper. Keep the currently referenced production/LAB/staging SDK archives, metadata/signatures, protocol archive and still-consumed legacy SDK archive. SDK-repin automation remains supported.
  • Fix both previously reported P2 product defects: the tab close affordance now calls Reader's guarded dock.close, and shared disclosure menus now escape scrolling ancestors through the same portal/viewport-positioning mechanism as library row menus.
  • Preserve native details/summary controls, deferred content, outside-pointer/item dismissal, Escape focus restoration, Tab/Shift+Tab traversal, start/end alignment and existing radio/context-menu arrow navigation. Resize/scroll and asynchronously resized content use the shared positioning hook. Remove the absolute/edge-specific positioning rules rather than adding table-specific or CSS-anchor positioning.
  • Correct a stale docking audit: the lone navigator tab is intentionally hidden by existing CSS. Use visible pane actions to expose it before real mouse/native-touch drags; assert drag sources are visible. No forced clicks, weaker assertions, retries or increased timeouts.

Commits

  • de2b46b9 docs: explain current Reader development and SDK refreshes
  • 376c90be chore: retain only current Reader SDK originals and pins
  • 086ebee8 test: align Reader browser audits with current library and editor flows
  • baa666ab fix(reader): route the tab close button through the dock's close guard (preserved unchanged)
  • a03b73b4 fix(reader): share viewport-positioned portals for disclosure menus
  • aac1edf7 test(reader): expose navigator tabs before native docking gestures
  • 3fbcfd57 fix(reader): preserve focus reset when a row menu target changes

Validation

All commands below pass on final head 3fbcfd57789fc855b70bd5cdba4780ac0fb20908. Finite code/build gates use rpnpm; browser fixtures run locally in isolated Chromium. Browser runs set TMPDIR="$PWD/.scratch/menu-fix" and PLAYWRIGHT_BROWSERS_PATH="$PWD/.scratch/reader-upkeep/playwright-browsers".

  • rpnpm check — lint, Prettier format check, architecture checks/tests, typecheck, 175 publisher tests, workspace tests (Reader: 204 files / 1,125 tests) and pnpm i18n:check all pass.
  • rpnpm --pull apps/reader/dist build — full workspace build passes, including i18n and offline-shell verification.
  • rpnpm --pull apps/reader/dist --filter @mdbase-reader/app build:feedback-test — configured feedback build passes.
  • pnpm --filter @mdbase-reader/app test:browser — all 40 full-audit checks pass with an external 600-second upper bound. A diagnostic completing run also used DEBUG=pw:api; assertions/timings were not relaxed.
  • READER_AUDIT_ANNOTATIONS_ONLY=1 pnpm --filter @mdbase-reader/app test:browser — passes, including actual Hide column clicks, start/end alignment, a short scrolling table at the viewport's right/bottom edges, Tab/Shift+Tab, Escape focus restoration and outside-click dismissal.
  • READER_AUDIT_READING_ONLY=1 pnpm --filter @mdbase-reader/app test:browser — passes.
  • pnpm --filter @mdbase-reader/app test:html-svg — passes.
  • pnpm --filter @mdbase-reader/app test:pdf-touch — passes both native-handle and workspace/persistence checks.
  • READER_FEEDBACK_TEST_ORIGIN=http://127.0.0.1:8891 pnpm --filter @mdbase-reader/app test:feedback — desktop/mobile acceptance passes; every delivery is intercepted.
  • git diff --check origin/main..HEAD — passes; worktree is clean.

At 390px the existing responsive design intentionally hides table column headers. The browser regression checks the reachable shared annotation-view menu at that width, including real action activation and Escape focus restoration. Desktop regressions exercise both column alignments and the table at the actual right/bottom viewport edges. Screenshots were inspected in both cases.

Stall diagnosis and limits

The reported renderer-residency stall did not recur: the full audit visited twenty HTML documents, measured residency rising from one to four and remaining at four, and verified evicted-location recovery. A separate repeatable stall occurred later in mouse.move while the old docking audit dragged a navigator tab hidden by reader-shell.css; the test setup above fixes that unreachable gesture while retaining real mouse and native-touch docking assertions. The final full run passes both.

Early portal-scoped selector/fixture failures were corrected. One tool-runtime reset stopped the owned local server and interrupted remote clients; owned stale leases were cleaned up and interrupted checks rerun. These attempts are not counted as passes.

User-visible behavior: dirty-tab close confirmation works, and shared menus stay available outside scrolling containers and flip/clamp within the viewport instead of using separate hard-coded placements. No UI text, dependency pins, persisted formats, authorization policy or SDK surface changed. No SDK gap or remaining product defect was found in this lane. Existing nonblocking bundle-size/source-map, architecture-size and test-act warnings remain out of scope.

Qualification is Chromium with local disposable fixtures and emulated phone/touch input, not WebKit, native hardware, production or a real collection. No deployment, SDK refresh or real feedback delivery was performed. No merge or review request is included.

The pointer close handler called a bare close(), which resolved to
window.close() because the dock's closer only exists inside the keyboard
effect. Clicking a tab's close button therefore never reached Reader's
dirty-tab confirmation. Call dock.close like the Delete key does.
Keep this branch's pin-derived SDK test, and drop the beta.209
production archive and metadata the repin superseded.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant