About redesign (#148 step 7) #161

Merged
claude-bot merged 4 commits from feat/redesign-about into main 2026-11-03 19:18:31 +00:00
Collaborator

What

Settings' About row opens a dialog (board E10) with the icon, the version, the licence, a Source code row that hands the address to the system, and a Licences row.
Licences is a new page: each installed module as its conf states it, then what the app carries (Crimson Pro, Lucide, CLDR, ISO 639-3).
The row reads "Licences", shorter than the board's words, so it fits on one line. Close is an outlined button like the other dialogs, not the board's plain text.

Blast radius

Tier: trunk
Trunk paths touched: qt/build.rs, qt/src/lib.rs, qt/src/module_licences.rs, tools/e2e/cases/about.sh
Testing tier: standard
Gate / rollback: no flag. Revert this merge; no schema or stored data changes.
Budgets: no measurable change at start-up. CI peak PSS 175330 kB normal, 178636 kB slow, of 185000 kB (#160: 173019/178272 kB). The conf read and the icon load only when their page or dialog opens.

Proof

  • CI on 835d5a1 (run 334): changes, rust, audit, app, e2e and click all success. In e2e: PASS about (8s), PASS settings-pages (19s).
  • cargo make: Build Done, no failures (run at the first commit; later commits touch only QML, PNGs and an e2e case).
  • Local cargo make app-docker fails its PSS check on this machine, and not because of this PR: branch 188792–196128 kB, untouched main b9de36d 186163–190846 kB. The gap to CI is unexplained; CI is the measure relied on here.
  • Fails without the change: on the final tree each break made the about case FAIL, and the restored tree gave PASS: installed modules dropped, licence returned empty, wrong source address, wrong icon path.
  • Markup in a conf: a one-off run with Description=Bible <b>NT</b> &amp; <i>tag</i> and DistributionLicense=<u>GPL</u> shows them literally under Xvfb. Throwaway; no committed test feeds it markup.
  • GUI-thread conf read: IndexCache::installed over 100 copies of the KJV conf took 3.4–4.1 ms across five runs. Throwaway test, debug build on the desktop with a warm cache. Not measured on the phone or with a cold cache.
  • Phone (arm64, Suru, b81d21b), Ambiance and SuruDark: dialog without elision; Licences with all 10 modules, scrolled to the last row; back to Settings. Source code opened the repo in Morph on an earlier build with the same AboutDialog.qml, so confinement allows it.
  • Icon: the first PNGs had opaque black corners, seen on the phone. The regenerated ones have transparent corners by pixel read and in the e2e shot on the light dialog. The final icon has not been on the phone. The owner approved knowing this ("Works, go for it").

Review

Reviewer: fresh-context code-review at high (413): 3 low findings; 1 fixed (conf text as plain text), 2 refuted with evidence (browser opens on the phone; conf read measured). Re-review at medium of 7da073f..835d5a1 (415): no findings. 0 deferred, 0 left open.
Review-Confidence: 100/100, earlier gaps are covered by evidence; remaining risks are the unmeasured cold-cache read on the phone and no committed markup test, both stated above.

Confidence by part

  • module_licences.rs and the Licences page: high; e2e with mutation proof, and seen on the phone with real modules.
  • About dialog and BuildInfoText: high; e2e, and seen on the phone in both themes.
  • LicenceRow plain text: medium; seen once, no regression test.
  • Icons: medium; checked by pixels and the e2e shot, not on the phone.

The design canvas still needs First start and About added; this session has no Artifact tool.

🤖 Generated with Claude Code

## What Settings' About row opens a dialog (board E10) with the icon, the version, the licence, a Source code row that hands the address to the system, and a Licences row. Licences is a new page: each installed module as its conf states it, then what the app carries (Crimson Pro, Lucide, CLDR, ISO 639-3). The row reads "Licences", shorter than the board's words, so it fits on one line. Close is an outlined button like the other dialogs, not the board's plain text. ## Blast radius **Tier:** trunk **Trunk paths touched:** `qt/build.rs`, `qt/src/lib.rs`, `qt/src/module_licences.rs`, `tools/e2e/cases/about.sh` **Testing tier:** standard **Gate / rollback:** no flag. Revert this merge; no schema or stored data changes. **Budgets:** no measurable change at start-up. CI peak PSS 175330 kB normal, 178636 kB slow, of 185000 kB (#160: 173019/178272 kB). The conf read and the icon load only when their page or dialog opens. ## Proof - CI on 835d5a1 (run 334): changes, rust, audit, app, e2e and click all success. In e2e: `PASS about (8s)`, `PASS settings-pages (19s)`. - `cargo make`: Build Done, no failures (run at the first commit; later commits touch only QML, PNGs and an e2e case). - Local `cargo make app-docker` **fails its PSS check on this machine**, and not because of this PR: branch 188792–196128 kB, untouched main b9de36d 186163–190846 kB. The gap to CI is unexplained; CI is the measure relied on here. - Fails without the change: on the final tree each break made the `about` case FAIL, and the restored tree gave PASS: installed modules dropped, licence returned empty, wrong source address, wrong icon path. - Markup in a conf: a one-off run with `Description=Bible <b>NT</b> &amp; <i>tag</i>` and `DistributionLicense=<u>GPL</u>` shows them literally under Xvfb. Throwaway; no committed test feeds it markup. - GUI-thread conf read: `IndexCache::installed` over 100 copies of the KJV conf took 3.4–4.1 ms across five runs. Throwaway test, debug build on the desktop with a warm cache. **Not measured on the phone or with a cold cache.** - Phone (arm64, Suru, b81d21b), Ambiance and SuruDark: dialog without elision; Licences with all 10 modules, scrolled to the last row; back to Settings. Source code opened the repo in Morph on an earlier build with the same `AboutDialog.qml`, so confinement allows it. - Icon: the first PNGs had opaque black corners, seen on the phone. The regenerated ones have transparent corners by pixel read and in the e2e shot on the light dialog. **The final icon has not been on the phone.** The owner approved knowing this ("Works, go for it"). ## Review **Reviewer:** fresh-context `code-review` at high (413): 3 low findings; 1 fixed (conf text as plain text), 2 refuted with evidence (browser opens on the phone; conf read measured). Re-review at medium of 7da073f..835d5a1 (415): no findings. 0 deferred, 0 left open. **Review-Confidence:** 100/100, earlier gaps are covered by evidence; remaining risks are the unmeasured cold-cache read on the phone and no committed markup test, both stated above. ## Confidence by part - `module_licences.rs` and the Licences page: high; e2e with mutation proof, and seen on the phone with real modules. - About dialog and `BuildInfoText`: high; e2e, and seen on the phone in both themes. - `LicenceRow` plain text: medium; seen once, no regression test. - Icons: medium; checked by pixels and the e2e shot, not on the phone. The design canvas still needs First start and About added; this session has no Artifact tool. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
about: a dialog with the icon, build and source, and a licences page, E10 (#148)
Some checks failed
CI / changes (pull_request) Successful in 7s
CI / rust (pull_request) Has been cancelled
CI / audit (pull_request) Has been cancelled
CI / app (pull_request) Has been cancelled
CI / e2e (pull_request) Has been cancelled
CI / click (pull_request) Has been cancelled
7da073fefe
Settings' About row opens a dialog: the icon, the name, the version (with the
development lines in a dev build), the licence, a row that hands the source
address to the system, and a row to a new Licences page. The page lists each
installed module as its conf states it, and what the app carries: Crimson Pro,
Lucide, CLDR, ISO 639-3. The build text is shared with the reading pane's
footer popup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-review left a comment

Review level: high (blast radius: trunk, tier standard)
Commit: 7da073fefe
Range: origin/main...HEAD (1 commit)
Files: docs/10-design.md, po/de.po, po/lectern.aps.pot, qml/icons/lectern*.png, qml/pages/AboutDialog.qml, BuildInfoPopup.qml, BuildInfoText.qml, LicenceRow.qml, LicencesPage.qml, SettingsPage.qml, qml/qml.qrc, qt/build.rs, qt/src/lib.rs, qt/src/module_licences.rs, tools/e2e/cases/about.sh

No high or medium findings. Findings outside the diff lines:

  • low · qt/src/module_licences.rs:43 · the Default impl reads and parses every installed conf on the GUI thread when LicencesPage is created; with many modules on a slow phone the push stutters. Small and one-off, so acceptable; noted against the docs/07 start-up budget.
  • low · qml/pages/AboutDialog.qml:79 · Qt.openUrlExternally on a confined Ubuntu Touch app is untested here (e2e stubs xdg-open; the apparmor has no url_dispatcher group). Confirm on the phone that the source row opens the browser.

Inline: one low on LicenceRow.

Review level: high (blast radius: trunk, tier standard) Commit: 7da073fefee7af3c08b564d70abe94b2baeda58f Range: origin/main...HEAD (1 commit) Files: docs/10-design.md, po/de.po, po/lectern.aps.pot, qml/icons/lectern*.png, qml/pages/AboutDialog.qml, BuildInfoPopup.qml, BuildInfoText.qml, LicenceRow.qml, LicencesPage.qml, SettingsPage.qml, qml/qml.qrc, qt/build.rs, qt/src/lib.rs, qt/src/module_licences.rs, tools/e2e/cases/about.sh No high or medium findings. Findings outside the diff lines: - low · qt/src/module_licences.rs:43 · the Default impl reads and parses every installed conf on the GUI thread when LicencesPage is created; with many modules on a slow phone the push stutters. Small and one-off, so acceptable; noted against the docs/07 start-up budget. - low · qml/pages/AboutDialog.qml:79 · Qt.openUrlExternally on a confined Ubuntu Touch app is untested here (e2e stubs xdg-open; the apparmor has no url_dispatcher group). Confirm on the phone that the source row opens the browser. Inline: one low on LicenceRow.
@ -0,0 +30,4 @@
wrapMode: Text.Wrap
color: colours.secondary
font.pixelSize: 13
text: row.detail
Collaborator

low · title/detail come from module confs (Description, DistributionLicense) but both Labels keep the default textFormat (AutoText). A conf value that looks like markup (e.g. 'Bible ' or an entity) is rendered as rich text and the tag text vanishes; may fetch a URL. BuildInfoText and PageDialog use Text.PlainText; set textFormat: Text.PlainText on these two Labels (lines 26 and 33 area).

low · title/detail come from module confs (Description, DistributionLicense) but both Labels keep the default textFormat (AutoText). A conf value that looks like markup (e.g. 'Bible <NT>' or an entity) is rendered as rich text and the tag text vanishes; <img src=...> may fetch a URL. BuildInfoText and PageDialog use Text.PlainText; set textFormat: Text.PlainText on these two Labels (lines 26 and 33 area).
licences: a module's conf text is plain text, not markup (#161, review)
All checks were successful
CI / changes (pull_request) Successful in 5s
CI / rust (pull_request) Successful in 3m23s
CI / audit (pull_request) Successful in 9s
CI / app (pull_request) Successful in 2m30s
CI / e2e (pull_request) Successful in 14m31s
CI / click (pull_request) Successful in 1m22s
b81d21bb85
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-bot left a comment

Answers to review 413:

  1. LicenceRow.qml, conf text as rich text: fixed in b81d21b; both Labels are Text.PlainText. No automated test feeds it markup; the about case passes.
  2. AboutDialog.qml:79, Qt.openUrlExternally under confinement: checked on the phone at the same QML (arm64 build of this tree, Suru). Tapping Source code opened the repo page in Morph. So no url_dispatcher group is needed.
  3. module_licences.rs:43, confs read on the GUI thread: left as is. It happens once per push of a page the owner rarely opens, and with a handful of modules it is small. Not measured with many modules.
Answers to review 413: 1. `LicenceRow.qml`, conf text as rich text: fixed in b81d21b; both Labels are `Text.PlainText`. No automated test feeds it markup; the `about` case passes. 2. `AboutDialog.qml:79`, `Qt.openUrlExternally` under confinement: checked on the phone at the same QML (arm64 build of this tree, Suru). Tapping Source code opened the repo page in Morph. So no url_dispatcher group is needed. 3. `module_licences.rs:43`, confs read on the GUI thread: left as is. It happens once per push of a page the owner rarely opens, and with a handful of modules it is small. Not measured with many modules.
about: the icon's rounded corners are transparent, not black (#148)
Some checks failed
CI / changes (pull_request) Successful in 6s
CI / rust (pull_request) Successful in 3m36s
CI / audit (pull_request) Successful in 10s
CI / app (pull_request) Successful in 2m18s
CI / e2e (pull_request) Has been cancelled
CI / click (pull_request) Has been cancelled
8ee772c722
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
e2e: about wants the conf's licence, not any text after the module's name (#161)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / rust (pull_request) Successful in 3m35s
CI / audit (pull_request) Successful in 8s
CI / app (pull_request) Successful in 2m16s
CI / e2e (pull_request) Successful in 14m24s
CI / click (pull_request) Successful in 1m17s
835d5a1b6f
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-review left a comment

Review level: medium. Commit: 835d5a1. Range: 7da073f..835d5a1.
Files: qml/icons/lectern.png, qml/icons/lectern@2x.png, qml/icons/lectern@3x.png, qml/pages/LicenceRow.qml, tools/e2e/cases/about.sh.

No defects found. Checked: the icon PNGs are 72x72 and 216x216 RGBA with transparent corners; LicenceRow's PlainText applies to both labels; and the about.sh assertion "KJV · GPL" matches the KJV conf's DistributionLicense=GPL as rendered by LicencesPage.qml:69.

Review level: medium. Commit: 835d5a1. Range: 7da073f..835d5a1. Files: qml/icons/lectern.png, qml/icons/lectern@2x.png, qml/icons/lectern@3x.png, qml/pages/LicenceRow.qml, tools/e2e/cases/about.sh. No defects found. Checked: the icon PNGs are 72x72 and 216x216 RGBA with transparent corners; LicenceRow's PlainText applies to both labels; and the about.sh assertion "KJV · GPL" matches the KJV conf's DistributionLicense=GPL as rendered by LicencesPage.qml:69.
claude-bot left a comment

Evidence for two answers to review 413, from throwaway runs that are not committed. The tree is unchanged at 835d5a1.

  • Finding 3 (module_licences.rs:43, confs read on the GUI thread): refuted by measurement. IndexCache::installed over 100 copies of the KJV conf took 3.4–4.1 ms across five runs, in a debug build on the desktop. No phone measurement; the owner's phone has 10 modules, so about a tenth of that work on a slower CPU. That is well under a frame, not a stutter.
  • Finding 1 (LicenceRow.qml, markup in conf text): the fix was seen to work. With a module whose conf has Description=Bible <b>NT</b> &amp; <i>tag</i> and DistributionLicense=<u>GPL</u>, the page under Xvfb shows those strings literally, tags and entity included, with no formatting. It is a one-off run; no committed test feeds it markup.
Evidence for two answers to review 413, from throwaway runs that are not committed. The tree is unchanged at 835d5a1. - **Finding 3 (`module_licences.rs:43`, confs read on the GUI thread): refuted by measurement.** `IndexCache::installed` over 100 copies of the KJV conf took 3.4–4.1 ms across five runs, in a debug build on the desktop. No phone measurement; the owner's phone has 10 modules, so about a tenth of that work on a slower CPU. That is well under a frame, not a stutter. - **Finding 1 (`LicenceRow.qml`, markup in conf text): the fix was seen to work.** With a module whose conf has `Description=Bible <b>NT</b> &amp; <i>tag</i>` and `DistributionLicense=<u>GPL</u>`, the page under Xvfb shows those strings literally, tags and entity included, with no formatting. It is a one-off run; no committed test feeds it markup.
claude-bot changed title from WIP: About redesign (#148 step 7) to About redesign (#148 step 7) 2026-11-03 19:18:07 +00:00
claude-review left a comment

Merge gate on 835d5a1: approved. The PR has no high or medium findings; review 413's three low findings are closed (finding 1 fixed in b81d21b with PlainText labels, findings 2 and 3 refuted with phone and timing evidence in 414 and 416), and review 415 of 7da073f..835d5a1 found nothing. Head is 835d5a1 with no commits after the last review round, and all six CI jobs (changes, rust, audit, app, e2e, click) are success. The Proof lists no unrun elevated, maximum or AI-behavior gate for this standard-tier PR. The PR body states the remaining risks: an unmeasured cold-cache conf read on the phone, no committed markup test, and a final icon not yet seen on the phone (owner accepted).

Merge gate on 835d5a1: approved. The PR has no high or medium findings; review 413's three low findings are closed (finding 1 fixed in b81d21b with PlainText labels, findings 2 and 3 refuted with phone and timing evidence in 414 and 416), and review 415 of 7da073f..835d5a1 found nothing. Head is 835d5a1 with no commits after the last review round, and all six CI jobs (changes, rust, audit, app, e2e, click) are success. The Proof lists no unrun elevated, maximum or AI-behavior gate for this standard-tier PR. The PR body states the remaining risks: an unmeasured cold-cache conf read on the phone, no committed markup test, and a final icon not yet seen on the phone (owner accepted).
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 participants
Notifications
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
schaefera/utStudyBIble!161
No description provided.