Repository navigation
Conversation
Implementation PlanProblem analysis and scope authorityIssue #510 requires a materially broader licensed Dashboard font catalog, direct previews for each picker option, keyboard accessibility, preserved appearance persistence, and catalog/rendering tests with reasonable loading behavior. The current catalog has six explicit families plus Theme default. Its native The requester explicitly chose “Catalog and preview picker only; handle uploads separately.” No font-upload storage, file API, server/RPC protocol, theme-color editor, TUI theme mapping, or general-purpose component-library refactor is included. Base inspected: upstream master Deliverables1. Expand the curated catalog and package compliant assets
2. Build an accessible, per-font preview picker
3. Preserve appearance and loading contracts
4. Tests and documentation as part of the feature
Acceptance criteria
Files to create or modifyClient state and UI
Assets and redistribution
Tests and fixtures
Documentation
No server, RPC, service-worker policy, or host-upload change is expected. Vite's existing font fingerprinting and same-origin static caching remain sufficient. Testing approach
Risks and remaining implementation checks
Plan created by mach6 |
Revised Implementation Plan — expanded additive catalogThis plan supersedes the earlier twelve-font plan: #540 (comment). Scope authority and problemIssue #510 requires a materially broader licensed font catalog, per-option typeface previews, accessible keyboard selection, preserved appearance preferences, and automated coverage with reasonable loading/payload. The requester subsequently asked for 15 serif and 15 sans-serif Latin fonts and explicitly required that all existing choices remain available. The approved scope update is recorded at #510 (comment). We will add thirty families, not replace existing ones: 36 explicit fonts plus Theme default. Existing IDs/labels, localStorage keys, defaults, theme behavior, and multilingual system/browser fallback remain compatible. Manual uploads, dedicated multilingual font bundles, IBM Plex self-hosting, theme-color editing, TUI changes, server/RPC changes, and a general-purpose component library are out of scope. The existing native font selector renders plain names; per-option font styling is inconsistent in native OS menus. A focused accessible preview listbox will replace only that control. Deliverable 1 — additive catalog and compliant assetsKeep these six choices unchanged: IBM Plex Mono, JetBrains Mono, Fira Code, Iosevka, OpenDyslexic, Atkinson Hyperlegible. Also retain Theme default. Add fifteen sans-serif families:
Add fifteen serif families:
Selection evidence: Google's public catalog metadata at Available source fonts/licenses were verified at immutable
Deliverable 2 — accessible preview picker
Deliverable 3 — persistence and loading compatibility
Deliverable 4 — tests and documentation
Acceptance criteria
Files to create or modifyState/UI:
Assets/package:
Tests:
Docs: No server/RPC or service-worker policy change is expected; existing Vite fingerprinting/static caching applies. Testing approach
Risks and implementation checks
Plan created by mach6 |
Requirement amendment — real core styles and measured overheadThe requester revised the font requirements during implementation: if an added family lacks important native styles (regular, italic, bold), replace it with another popular family, and assess whether more than thirty options impose unacceptable latency/frontend overhead. This supersedes the prior plan's permission to retain upright-only/display families with synthetic styles; all other approved scope remains intact. Keep all six existing choices unchanged; add fifteen sans-serif and fifteen serif families (36 explicit choices plus Theme default). Require real upstream regular 400, italic 400, bold 700, and bold-italic 700 for each addition; variable axes may supply actual weights without separate downloads. Do not fabricate coverage through CSS declarations or synthesis. Reject Oswald and Roboto Slab (no real italic), Instrument Serif and DM Serif Display (no real bold). Replace them using the next eligible Latin families in the frozen popularity evidence: Rubik, Crimson Text, Arvo, Bodoni Moda. Final sans-serif roster: Roboto, Open Sans, Google Sans, Inter, Montserrat, Poppins, Lato, Roboto Condensed, Arimo, Noto Sans, DM Sans, Raleway, Nunito, Nunito Sans, Rubik. Final serif roster: Playfair Display, Merriweather, Lora, Noto Serif, Cormorant Garamond, Libre Baskerville, PT Serif, EB Garamond, Fraunces, Bitter, Source Serif 4, Newsreader, Crimson Text, Arvo, Bodoni Moda. Verify eligibility against pinned upstream metadata and actual bundled faces, and test those core styles in Chromium. Refresh provenance, naming, checksums, notices, bootstrap registry, docs, and catalog tests together. Selected replacements are expected to use OFL; verify the actual pinned sources rather than retaining obsolete Apache records. Measure bundled bytes, regular-preview bytes, closed-startup requests, first-open requests, cache reuse, DOM/menu responsiveness and mobile bounds. Mount options only while open and apply per-family preview typography as rows approach the visible scroll window using IntersectionObserver; older browsers fall back to the complete open-menu preview. This keeps the full catalog reachable while avoiding the all-family first-open download burst. Inactive styles remain lazy; selected typography remains unaffected. Document measured tradeoffs rather than assuming the option count itself is slow. Original approved additive plan: #540 (comment) |
Implementation complete — revised font catalog and accessible lazy previewsCommit: Implemented the additive plan and the requester’s native-style amendment: #540 (comment). The requester accepted the measured package-size tradeoff and authorized continuing with the full catalog. Delivered
Measured overhead
The count is inexpensive frontend work; complete font assets primarily increase distribution size. A Chromium check with 4× CPU slowdown, 150 ms latency and 1.6 Mbit/s throughput remained interactive without waiting for typefaces. Dashboard is separately installed, so the fonts do not enlarge a CLI-only installation. These are measurements, not universal speed guarantees. Verification
Worktree clean after commit. No server/RPC, upload, dedicated multilingual bundle, IBM self-hosting, theme-color editor, or TUI changes. Formal review has not been started; the implementation is now durably saved for explicit requester-authorized review. Progress tracked by mach6 |
Unverified Review Candidates — Pending AssessmentReview round: 1
The full PR was reviewed against the latest native-core-style/viewport-lazy amendment, not superseded rosters. All six existing choices and the approved fifteen-plus-fifteen additions remain authoritative. Uploads, dedicated multilingual bundles, IBM self-hosting, server/RPC/TUI changes and unrelated appearance work remain excluded. The requester accepted the measured package-size tradeoff; no arbitrary payload budget is introduced. CriticalNone reported. ImportantFinding 1 — Background scrolling can move the open popup outside the viewport.
Finding 2 — Pointer opening relies on browser-specific button focus.
Finding 3 — Reserved names remain the primary names shown for renamed derivatives.
SuggestionsFinding 4 — Automated native-style assertions can approve upright bytes as italic.
Finding 5 — The touch-scrolling test bypasses a native swipe.
Finding 6 — New bootstrap cases depend on an unstubbed Google stylesheet.
Finding 7 — Unused naming-policy constant.
Finding 8 — Static face selection can use a direct ordered allowlist.
Finding 9 — Repeated requested-font byte accounting.
Strengths and verification
Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier. Configured preferred models were unavailable; all specialist invocations used the harness's available parent-model fallback in independent contexts. No fixes were made. The following independent assessment will classify all nine candidates using factual, scope and practical gates. Reviewed by mach6 |
Review AssessmentReview round: 1 Outcome: 3 merge blockers, 3 deferred useful follow-ups, 3 nitpicks; 0 false positives or discarded observations. All nine candidates were independently checked against actual source, original requests, latest approved scope and concrete practical consequences. The parent accepts the independent assessment below. Tests and GitHub CI pass, but do not cover the two identified interaction failures or the separate primary-menu-name licensing condition. Classifications
Component/state paths in the table are under RFN scope clarificationThe actual restricted new-label inventory includes Lato, Raleway, Playfair Display, Merriweather, Lora, Libre Baskerville, PT Serif and Arvo. Bitter also needs the same check: its bundled declaration reserves “Bitter Pro,” and OFL FAQ 5.4 prohibits using individual complete RFN words. This is additional evidence for finding 3, not another finding. Do not remove original attribution, mutate immutable notices, silently replace approved families, rename existing choices, or assume every source label is an RFN. The current primary bare labels must be differentiated where the actual license requires it. Internal neutral-name verification is correct but does not test a custom font menu's primary display name. Official FAQ 5.3 permits clearly secondary descriptive source reference; legal permission is an alternative if obtained and recorded. Action Plan — merge blockers only
Findings 4–9 are not part of the required action plan. Follow-up issues can be created for findings 4–6 if the requester wants separate tracking; nitpicks remain optional. Verification and limitsThe independent assessor inspected the full PR (all 168 paths), actual code, nine candidates, all specialist reports, original quoted requests and latest amendments. It reproduced background-scroll failure, checked non-focusing activation, performed a native touch swipe, inspected actual RFN source/derivative inventories, verified all current binaries offline, and independently retrieved official OFL/MDN guidance. No live provider/font-catalog calls, code changes, fixes, commits or review-fix loop occurred. Git HEAD/worktree remain unchanged and clean. Independent full-suite evidence remains 6,435 passed, zero failed, with GitHub Coverage/Lint & Type Check/Test checks passing. The full approved catalog, actual four core styles, progressive previews, licensing records/internal neutral names, preserved old choices and accepted package overhead remain strengths. The remaining blockers are specifically the two newly introduced interaction failures and primary RFN menu naming—not font-count or asset-budget objections. Assessment by mach6 |
Round 1 blocker fixes committed and pushedCommit: Implemented the authorized action plan for findings 1, 2 and 3 from #540 (comment). All 37 choices, original six labels, preference IDs/storage keys, approved source families, and four real core styles remain intact. Changes and regression evidence
Verification
Refreshed measurements
The approved approximately 5.46 MB distribution tradeoff is preserved; the four-face naming correction reduces font bytes by 228 B. Throttled interaction remains responsive without waiting for font completion. Local timings are not universal device/network guarantees. HEAD matches the pushed PR commit and the worktree is clean. The fixes are now durably saved. Formal re-review has not been started; the requester decides whether to begin the next round. Progress tracked by mach6 |
Unverified Review Candidates — Pending AssessmentReview round: 2
The full PR was reviewed: all 168 changed paths, original issue/discussion, superseding native-style/viewport-lazy amendment and actual source/assets. The fix delta was supplementary only. The approved 37 choices and approximately 5.46 MB distribution tradeoff remain authoritative; excluded uploads, IBM self-hosting and unrelated appearance/server/RPC/TUI work are not reintroduced. Stable numbering retains round 1 findings 4–9; finding 10 is new. Previously assessed blockers 1–3 are independently verified fixed, rather than repeated as current candidates. CriticalNone reported. ImportantNo new product correctness, error-handling or incomplete-deliverable candidate reported at confidence ≥80. SuggestionsFinding 4 — automated style assertions can still accept upright bytes declared as italic.
Finding 5 — touch reachability test still bypasses finger panning.
Finding 6 — appearance restoration tests inherit uncontrolled external Google CSS.
Finding 7 — unused naming-policy constant remains.
Finding 8 — static-weight selection can use a direct ordered allowlist.
Finding 9 — requested-font byte accounting remains duplicated.
Finding 10 — scroll-dismissal regression installs an unused animation-frame mock.
Verified fixes and strengths
Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier. Configured preferred models were unavailable; each ran in an independent context using the available No code changes or fixes were made. Independent phase-two assessment follows. Reviewed by mach6 |
Review AssessmentReview round: 2 Outcome: 0 merge blockers, 3 deferred useful follow-ups, 4 nitpicks; 0 false positives or discarded observations. All seven current candidates were independently checked against actual source, original issue/quoted requests, latest approved amendments and concrete practical impact. Previous blockers 1–3 are verified fixed and are not counted as current candidates. The parent accepts the independent assessment below. Classifications
Paths/line references and confidence are in the linked candidates comment. Stable numbering carries findings 4–9 from round 1; finding 10 is new. Useful follow-ups remain outside the required action plan. Prior blocker verification
Action Plan — merge blockers onlyNo further fixes are required by this review before merge. Findings 4–6 may be tracked as separate optional follow-up issues; findings 7–10 are optional cleanup. Do not turn them into another blocker-fix batch without approval. The final 15+15 source roster, all 37 choices, real four core styles, progressive open-only previews/unsupported-browser fallback, existing labels/IDs/storage/bootstrap/theme behavior, immutable provenance/notices and npm redistribution remain delivered. The requester-approved approximately 5.46 MB tradeoff and explicit exclusions remain authoritative. Verification and limits
No source changes, fixes, write-mode lint, in-place asset rebuilds, commits or pushes occurred during review. HEAD/worktree remain unchanged and clean. The requester decides whether to publish or separately track optional follow-ups. Assessment by mach6 |
Release preparation saved — final CI blockedProposed version: The version bump is committed/pushed on the PR branch, before merge as required. All seven workspace versions, root package, lockfile workspace fields and semantic-search plugin manifest are synchronized. Only version fields changed across ten files; the lockfile dependency graph is unchanged. Pre-merge review had zero merge blockers and no conflicts. The documentation audit checked the affected root/product/Dashboard docs, appearance references, all existing/expanded provenance and links; no additional docs changes were needed and there is no maintained changelog. Local release-preparation checks pass:
Final CI gate failed — merge not attemptedCoverage job failed in:
Case: “bounds the popup and keeps the last option reachable at 768px”. Observed geometry result: popup Publishing stops at the failed gate. No code fix, CI retry, merge, tag or GitHub release was performed. Next authorized step: A subsequent merge also needs maintainer permissions: the authenticated upstream viewer permission is READ. The release bump is ready for the maintainer's merge once final CI is repaired; never tag this unmerged feature branch as the release. Worktree clean, HEAD matches the pushed version commit. Round-two reviewed implementation remains Progress tracked by mach6 |
CI visibility failure fixed and savedCommit: Pushed to Reproduced causeThe failed Coverage job exposed a real scroll-anchoring issue at 768px, not an assertion that simply needed more waiting. After viewport-lazy preview fonts loaded, Chromium adjusted popup Scoped fix and regression
Exactly two files changed: ValidationNode 22; live API calls disabled.
Browser evidence is Chromium; no Safari/WebKit or physical-device claim. Local coverage passing is not a claim that the newly pushed GitHub checks have passed. CI must pass before merge; upstream merge still requires maintainer permissions. No merge, tag, release or formal re-review performed in this batch. The CI fix is now durably saved for authorized re-review. Worktree clean. Progress tracked by mach6 |
Unverified Review Candidates — Pending AssessmentReview round: 3
Reviewed the full 177-path PR, original issue and all discussion, quoted requests and superseding amendments, actual source/assets/docs/package/version records. Comparison with prior reviewed Stable candidate IDs 4–10 remain; no new candidate. Previous blockers 1–3 and the subsequent CI visibility failure are independently verified fixed, not repeated as current candidates. CriticalNone reported. ImportantNo new product-correctness, error-handling or incomplete-deliverable candidate at confidence ≥80. SuggestionsFinding 4 — automated descriptors/hashes can accept upright bytes declared italic.
Finding 5 — touch test still bypasses actual finger panning.
Finding 6 — restoration tests retain inherited external stylesheet timing dependency.
Finding 7 — unused naming-policy constant.
Finding 8 — static-weight selection can use one ordered allowlist.
Finding 9 — duplicate requested-font byte sums.
Finding 10 — unused RAF mock in scroll-dismissal regression.
Paths abbreviated above are under Verified fixes and strengths
Evidence limitsThe historical pinned Python venv/source cache have been cleaned; pinned verifier attempts fail the toolchain gate and are not counted as successful. Specialists transparently inspected actual current WOFF2 tables and ran the unchanged read-only verification function with available alternate fontTools/Brotli tools. No version spoofing, acquisition/rebuild or fresh original-TTF outline/notices comparison is claimed. Current hashes/identity/intrinsic styles/axes/coverage/local immutable records pass; earlier successful pinned deterministic rebuild/source comparisons remain prior implementation evidence. No fresh parent full build/coverage/deterministic rebuild/built-binary smoke claimed for this review; successful fix-phase evidence applies to this source. No physical-device/screen-reader-product/WebKit/live-provider/live-font-acquisition execution claimed. Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier, each in an independent context using available No tracked edits, fixes, write-mode lint, in-place rebuilds, commits or pushes during review. A specialist removed its generated untracked Python bytecode cache; worktree clean. Round-three independent assessment with practical and acceptance counter-pressure follows. Reviewed by mach6 |
Review AssessmentRound-three unverified candidates Review round: 3 Outcome: 0 merge blockers, 3 deferred useful follow-ups, 4 nitpicks; 0 false positives or discarded observations. Previous blockers 1–3 and the subsequent CI visibility failure are resolved, not counted as current candidates. No new finding. The independent assessor, developer's advocate and devil's advocate received the same seven candidates, full PR/issue context, verbatim requests/acceptance criteria, approved amendments and actual source. All agree that no candidate establishes a current material failure or unmet approved requirement. The parent accepts this outcome. The practical critic calls mandatory cleanup for findings7–10 low-value review ceremony; the parent classifies the factual observations as nitpicks, not mandatory work. No disagreement required escalation or voting. Classifications
Paths and confidence scores are in the linked candidates comment. Stable IDs4–10 retain their previous meaning; recurrence does not create new scope authority. Prior blocker and CI-fix verification
Action Plan — merge blockers onlyNo further code fixes are required by this review before merge. Findings4–6 may be tracked as separate optional follow-up issues;7–10 remain optional cleanup. Do not silently convert these into another fix batch. Continue the authorized publication workflow when requested. Version2.70.0 is already synchronized and pushed; do not double-bump merely because publication resumes after CI repair. Current CI passes; upstream merge still requires maintainer permissions. No merge/tag/release is performed by this review. Full-scope acceptance and evidence limits
No tracked source changes, fixes, write-mode lint, in-place rebuilds, commits or pushes during review. Generated bytecode artifact was removed by its owner; reviewed HEAD/worktree remain unchanged and clean. The requester decides publication and separate optional-issue tracking. Assessment by mach6 |
Release-ready — maintainer squash merge requiredProposed release: Publication resumed after the authorized CI fix/re-review. All technical pre-merge checks are clear:
Merge attempted and blocked by account permissionsImmediately after passing final CI, attempted: gh pr merge 540 --repo aebrer/dreb --squash --delete-branch \
--match-head-commit 8cf707e3bba6993cc3664bedb9809f983c405a24GitHub rejected it:
The account has upstream READ permission. PR remains OPEN; no merge or branch deletion occurred. Local/fork HEAD match and worktree is clean. Maintainer handoff
No tag, GitHub release or npm publication was performed. Publishing pauses at maintainer merge permission, not a technical failure. Optional follow-up issues were not created without authorization. Progress tracked by mach6 |
|
almost ready, two questions though:
overall this is great though and I agree it's basically ready to merge |
|
To 1. No shouldn't be there, let me check. |
Clarification on category headings and custom fontsThanks for checking both points. One correction to my earlier reply: “Serif” was intentional—it is the category heading following Rubik, not a selectable font. Its presentation was too ambiguous, and its font-size rule also referenced an undefined token. I've prepared clearer headings: “Sans-serif fonts” / “Serif fonts”, uppercase, full-width and separated by a hairline. They remain non-selectable group labels, visually distinct from the smaller “Based on …” source attribution. Clicking a heading keeps keyboard focus and the menu open without changing the font. Mobile/desktop regressions check that there are still exactly37 selectable fonts, then keyboard selection continues normally. Actual mobile rendering has also been inspected. Uploads were deliberately kept separate from the approved scope, not simply omitted because they were difficult. The agreed request was “Catalog and preview picker only; handle uploads separately.” A GUI upload path would additionally need font validation, storage/registration, persistence and licensing handling. This PR does not introduce that mechanism. Drew's request for manual documentation is reasonable. There is currently no runtime custom-font directory or font-path setting; uploading through Files or installing an OS font does not register a picker choice. I've added a developer-only “Custom fonts in a source build” guide in I hate LLMs... Progress tracked by mach6 |
okay, lol, push em and I can proceed to merge :) |
Maintainer follow-ups committed and pushedCommit: Both points from Drew's comment are addressed. This supersedes the local/uncommitted status in the clarification reply. Clear category headings
Manual custom-font documentation, not a new upload feature
Validation
Eight explicitly staged files; no font binaries, managed catalog/helper/legal records, manifests or version changes. Proposed release remains 2.70.0. Worktree clean; local and fork HEAD match. No new GitHub CI success is claimed before the pushed commit's checks finish. No formal re-review, merge, tag or release performed; the source changes are now durably saved for authorized review and fresh CI. Maintainer merge permissions are still required. Progress tracked by mach6 |
Closes #510
Add 15 popular Latin serif and 15 popular Latin sans-serif fonts to Dashboard, preserving all six existing choices and Theme default (36 explicit fonts plus Theme default).
Render each font choice in its own typeface using an accessible preview picker. Preserve browser-local appearance preferences and reasonable font-loading behavior. Every added family must have real regular, italic, bold, and bold-italic styles; preview faces load progressively as options approach the visible scroll window.
Manual font uploads and dedicated multilingual font bundles are explicitly excluded; existing multilingual browser/system fallback remains intact.
Revised implementation plan: #540 (comment)
Approved scope update: #510 (comment)
Requirement amendment (native core styles, replacements, overhead measurements): #540 (comment)