Rebrand to Lectern: app id lectern.aps, name, icon (#95 part 5) #147

Merged
claude-bot merged 2 commits from feat/lectern-rebrand into main 2026-10-31 17:14:02 +00:00
Collaborator

Part 5 of #95.

What

Rebrands the app to Lectern: app id lectern.aps, display name (not translated), desktop file, AppArmor profile, binary, click packaging and translation domain (po/lectern.aps.pot). The new icon is the owner's pick "H2", a pedestal lectern. The "C" monogram is kept in assets/icon-monogram.svg and docs/10 but not shipped. Internal names stay as they are: utsb-* crates, the utsb: log tag, UTSB_*, e2e tooling, the QML URI and the repo name. There is no migration code: the owner's data was copied once by adb (owner decision, #95).

icon monogram, kept

Blast radius

Tier: trunk
Trunk paths touched: CMakeLists.txt, manifest.json, clickable.yaml, lectern.apparmor, .forgejo/workflows/ci.yml, tools/ci/, tools/e2e/, qml/Main.qml, qml/pages/ReadingPane.qml
Testing tier: maximum (CI config, packaging, app id moves the data paths); also standard (e2e cases)
Gate / rollback: to roll back, revert the merge and reinstall the previous .click. The owner's data was copied, not moved, so the copy is the record (the old app was removed after sign-off).

Proof

  • CI: green on a510cd4 (changes, rust, audit, app with mem-check, e2e, click).
  • Local: cargo make, cargo make i18n and app-docker passed. Locally, the slow-profile mem-check went over the baseline, which I read as host noise; CI's mem-check is green. These e2e cases passed: language-switch, install-queue-cancel, menu-page, display-settings.
  • Click: cargo make click built lectern.aps_0.0.1_arm64.click and click review passed. Its manifest name is lectern.aps, the title is Lectern and the hook is lectern. Its icon.svg is byte-identical to assets/icon.svg at a510cd4.
  • Fails without the change: the paths.rs tests (home_defaults_and_relative_xdg_ignored, xdg_variables_win_over_home) fail with the old APP_ID. language-switch fails with the old title code.
  • Phone (a510cd4):
    • Installed as lectern.aps, and the launcher shows the new icon.
    • The data was copied by adb: 45 + 104 files, and every md5 matches.
    • The log shows restored BSB 244 and the owner's text scale of 120. There are no new AppArmor denials.
    • The owner signed off (comment 2846). They skipped the German system-language check; the language-switch e2e case covers it.
  • Memory: no change expected. CI mem-check is green.

Review

Reviewer: claude-review: review 385 (high, ea5ef2c, no findings) and delta review 386 (medium, ea5ef2c..a510cd4, no findings)
Review-Confidence: 100

Confidence by part

  • Renames and packaging: high. Checked by the click build, the click review, CI and the phone install.
  • Data paths under the new id: high. The owner's data loads from lectern.aps on the phone.
  • Splash colour keys (X-Lomiri-Splash-*): owner-checked on the phone. UT documentation for these keys was not checked.

🤖 Generated with Claude Code

Part 5 of #95. ## What Rebrands the app to Lectern: app id `lectern.aps`, display name (not translated), desktop file, AppArmor profile, binary, click packaging and translation domain (`po/lectern.aps.pot`). The new icon is the owner's pick "H2", a pedestal lectern. The "C" monogram is kept in `assets/icon-monogram.svg` and docs/10 but not shipped. Internal names stay as they are: `utsb-*` crates, the `utsb:` log tag, `UTSB_*`, e2e tooling, the QML URI and the repo name. There is no migration code: the owner's data was copied once by adb (owner decision, #95). ![icon](https://code.austinschaefer.com/schaefera/utStudyBIble/raw/commit/a510cd48e46382062d1bc330e4e41c764c10f080/assets/icon.svg) ![monogram, kept](https://code.austinschaefer.com/schaefera/utStudyBIble/raw/commit/a510cd48e46382062d1bc330e4e41c764c10f080/assets/icon-monogram.svg) ## Blast radius **Tier:** trunk **Trunk paths touched:** `CMakeLists.txt`, `manifest.json`, `clickable.yaml`, `lectern.apparmor`, `.forgejo/workflows/ci.yml`, `tools/ci/`, `tools/e2e/`, `qml/Main.qml`, `qml/pages/ReadingPane.qml` **Testing tier:** maximum (CI config, packaging, app id moves the data paths); also standard (e2e cases) **Gate / rollback:** to roll back, revert the merge and reinstall the previous `.click`. The owner's data was copied, not moved, so the copy is the record (the old app was removed after sign-off). ## Proof - **CI:** green on a510cd4 (changes, rust, audit, app with mem-check, e2e, click). - **Local:** `cargo make`, `cargo make i18n` and `app-docker` passed. Locally, the slow-profile mem-check went over the baseline, which I read as host noise; CI's mem-check is green. These e2e cases passed: language-switch, install-queue-cancel, menu-page, display-settings. - **Click:** `cargo make click` built `lectern.aps_0.0.1_arm64.click` and click review passed. Its manifest name is `lectern.aps`, the title is Lectern and the hook is `lectern`. Its `icon.svg` is byte-identical to `assets/icon.svg` at a510cd4. - **Fails without the change:** the `paths.rs` tests (`home_defaults_and_relative_xdg_ignored`, `xdg_variables_win_over_home`) fail with the old APP_ID. `language-switch` fails with the old title code. - **Phone (a510cd4):** - Installed as `lectern.aps`, and the launcher shows the new icon. - The data was copied by adb: 45 + 104 files, and every md5 matches. - The log shows `restored BSB 244` and the owner's text scale of 120. There are no new AppArmor denials. - The owner signed off (comment 2846). They skipped the German system-language check; the `language-switch` e2e case covers it. - **Memory:** no change expected. CI mem-check is green. ## Review **Reviewer:** claude-review: review 385 (high, ea5ef2c, no findings) and delta review 386 (medium, ea5ef2c..a510cd4, no findings) **Review-Confidence:** 100 ## Confidence by part - Renames and packaging: high. Checked by the click build, the click review, CI and the phone install. - Data paths under the new id: high. The owner's data loads from `lectern.aps` on the phone. - Splash colour keys (`X-Lomiri-Splash-*`): owner-checked on the phone. UT documentation for these keys was not checked. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Rebrand to Lectern: app id lectern.aps, name, packaging, translation domain (#95)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / rust (pull_request) Successful in 6m46s
CI / audit (pull_request) Successful in 14s
CI / app (pull_request) Successful in 4m24s
CI / e2e (pull_request) Successful in 13m26s
CI / click (pull_request) Successful in 3m3s
ea5ef2c5ca
No migration: the app is AppArmor-confined, the data is copied by adb once.

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

Fresh-context review (claude-review)

  • Level: high (blast radius: trunk)
  • Reviewed commit: ea5ef2c5ca
  • Range: origin/main...HEAD

Findings: none (no high, medium or low).

What I checked:

  • Every old name is gone from build, packaging, CI and tests. A case-insensitive git grep for utstudybible, schaefera (app-id use) and Study Bible finds none outside the ones that should stay: the Rust i18n unit-test fixtures, which are arbitrary strings, the obsolete #~ entries in po/de.po, and the unrelated spikes/.
  • The binary name lectern, hook key lectern, Exec=lectern, kill: lectern, the CMake target, build-ci/lectern in the CI artifact and UTSB_APP for e2e, and tools/ci/{app,e2e}.sh all agree.
  • UTSB_APP_ID, paths::APP_ID, i18n::DOMAIN, the CMake .mo name, update.sh and po/lectern.aps.pot all use the same id. The .mo that CMake builds matches the name i18n.rs loads, and tools/i18n/update.sh --check passes locally.
  • The AppArmor rename keeps the include_str! in core/src/tasks/tests.rs pointing at the right file.
  • tools/i18n/check-app.sh: the utsb: N translated messages line is printed in qt/main.cpp before the engine loads, so the German count above 0 and the C-locale count of 0 are valid probes. The window title being "Lectern" in both locales matches the plain-string Main.qml. language-switch still proves the runtime switch through the Sprache heading.
  • The change adds no start-up work or allocations. The memory budget is judged by CI's mem-check.
  • The data-folder move to lectern.aps, with no migration, is an owner decision recorded in the PR body (copy by adb once after install, rollback by revert). It is not a defect.

Files reviewed: .forgejo/workflows/ci.yml, CLAUDE.md, CMakeLists.txt, NOTICES.md, README.md, assets/icon.svg, clickable.yaml, core/Cargo.toml, core/src/i18n.rs, core/src/paths.rs, core/src/tasks/tests.rs, docs/03-architecture.md, docs/09-quality-gates.md, docs/10-design.md, lectern.apparmor, lectern.desktop, manifest.json, po/de.po, po/lectern.aps.pot, qml/Main.qml, qml/pages/BuildInfoPopup.qml, qml/pages/ReadingPane.qml, qt/Cargo.toml, qt/stamp/Cargo.toml, qt/main.cpp (context), tools/ci/app.sh, tools/ci/e2e.sh, tools/e2e/cases/install-queue-cancel.sh, tools/e2e/cases/language-switch.sh, tools/e2e/lib.sh, tools/i18n/check-app.sh, tools/i18n/update.sh

Fresh-context review (claude-review) - Level: high (blast radius: trunk) - Reviewed commit: ea5ef2c5ca11def51dac692dd5aae3091aaa672f - Range: origin/main...HEAD Findings: none (no high, medium or low). What I checked: - Every old name is gone from build, packaging, CI and tests. A case-insensitive `git grep` for `utstudybible`, `schaefera` (app-id use) and `Study Bible` finds none outside the ones that should stay: the Rust i18n unit-test fixtures, which are arbitrary strings, the obsolete `#~` entries in `po/de.po`, and the unrelated `spikes/`. - The binary name `lectern`, hook key `lectern`, `Exec=lectern`, `kill: lectern`, the CMake target, `build-ci/lectern` in the CI artifact and `UTSB_APP` for e2e, and `tools/ci/{app,e2e}.sh` all agree. - `UTSB_APP_ID`, `paths::APP_ID`, `i18n::DOMAIN`, the CMake `.mo` name, `update.sh` and `po/lectern.aps.pot` all use the same id. The `.mo` that CMake builds matches the name `i18n.rs` loads, and `tools/i18n/update.sh --check` passes locally. - The AppArmor rename keeps the `include_str!` in `core/src/tasks/tests.rs` pointing at the right file. - `tools/i18n/check-app.sh`: the `utsb: N translated messages` line is printed in `qt/main.cpp` before the engine loads, so the German count above 0 and the C-locale count of 0 are valid probes. The window title being "Lectern" in both locales matches the plain-string `Main.qml`. `language-switch` still proves the runtime switch through the Sprache heading. - The change adds no start-up work or allocations. The memory budget is judged by CI's mem-check. - The data-folder move to `lectern.aps`, with no migration, is an owner decision recorded in the PR body (copy by adb once after install, rollback by revert). It is not a defect. Files reviewed: .forgejo/workflows/ci.yml, CLAUDE.md, CMakeLists.txt, NOTICES.md, README.md, assets/icon.svg, clickable.yaml, core/Cargo.toml, core/src/i18n.rs, core/src/paths.rs, core/src/tasks/tests.rs, docs/03-architecture.md, docs/09-quality-gates.md, docs/10-design.md, lectern.apparmor, lectern.desktop, manifest.json, po/de.po, po/lectern.aps.pot, qml/Main.qml, qml/pages/BuildInfoPopup.qml, qml/pages/ReadingPane.qml, qt/Cargo.toml, qt/stamp/Cargo.toml, qt/main.cpp (context), tools/ci/app.sh, tools/ci/e2e.sh, tools/e2e/cases/install-queue-cancel.sh, tools/e2e/cases/language-switch.sh, tools/e2e/lib.sh, tools/i18n/check-app.sh, tools/i18n/update.sh
icon: the pedestal lectern (H2) as the app icon; the L monogram kept in docs/10 (#95)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / rust (pull_request) Successful in 7m44s
CI / audit (pull_request) Successful in 13s
CI / app (pull_request) Successful in 4m13s
CI / e2e (pull_request) Successful in 13m16s
CI / click (pull_request) Successful in 2m29s
a510cd48e4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-review left a comment

Review level: medium (delta). Commit: a510cd48e4. Range: ea5ef2c..a510cd4.

Files reviewed: NOTICES.md, assets/icon.svg, assets/icon-monogram.svg, docs/10-design.md (plus clickable.yaml, lectern.desktop, CMakeLists.txt, tools/icons/render.sh for consumers).

Findings: none with a concrete failure scenario.

Checked:

  • Both SVGs pass xmllint and render with rsvg-convert. icon.svg is legible at 48 px.
  • Colours (#1E4FA8, #FAF8F3, #A3231A) match the docs/10-design.md palette.
  • clickable.yaml ships only assets/icon.svg, and lectern.desktop uses Icon=icon.svg. icon-monogram.svg is in no install rule, and tools/icons/render.sh only globs assets/icons/*.svg. So the NOTICES "not shipped" statement is accurate.
  • The relative image links in docs/10-design.md (../assets/...) resolve.
  • No stale description of the old rounded-square line-drawing icon remains in docs, manifest or desktop files.
Review level: medium (delta). Commit: a510cd48e46382062d1bc330e4e41c764c10f080. Range: ea5ef2c..a510cd4. Files reviewed: NOTICES.md, assets/icon.svg, assets/icon-monogram.svg, docs/10-design.md (plus clickable.yaml, lectern.desktop, CMakeLists.txt, tools/icons/render.sh for consumers). Findings: none with a concrete failure scenario. Checked: - Both SVGs pass xmllint and render with rsvg-convert. icon.svg is legible at 48 px. - Colours (#1E4FA8, #FAF8F3, #A3231A) match the docs/10-design.md palette. - clickable.yaml ships only assets/icon.svg, and lectern.desktop uses Icon=icon.svg. icon-monogram.svg is in no install rule, and tools/icons/render.sh only globs assets/icons/*.svg. So the NOTICES "not shipped" statement is accurate. - The relative image links in docs/10-design.md (../assets/...) resolve. - No stale description of the old rounded-square line-drawing icon remains in docs, manifest or desktop files.
Author
Collaborator

Phone check, a510cd4 (dev build feat/lectern-rebrand@a510cd48e, installed 17:43)

Already checked on the phone (ute2e, journal over adb):

  • lectern.aps 0.0.1 is installed next to utstudybible.schaefera.
  • Data copied by adb, with the old app stopped first. ~/.local/share has 45 files (20 MB) and ~/.cache has 104 files (1.3 MB); every file's checksum matches the old app's. The old app had no ~/.config folder.
  • Lectern opens on your data. The log shows restored BSB 244, Genesis 9–10, and your text scale of 120. The build log line reads feat/lectern-rebrand@a510cd48e.
  • The launcher shows the new H2 icon (the pedestal lectern, paper on lapis, red lip).
  • The only AppArmor denial is a libertine list call. The old app, the system apps and others hit the same one, so it isn't new.

For you (feel and system items):

  • The icon in the app drawer, and the name "Lectern" under it.
  • The launch splash is paper (#FAF8F3) with no white flash.
  • Your notes, history and installed Bibles look the same as in the old app.
  • Optional: with the system set to German, the title stays "Lectern". CI's language-switch case already checks this.

The old app and its folders stay installed. I'll remove them only when you say so.

**Phone check, a510cd4** (dev build `feat/lectern-rebrand@a510cd48e`, installed 17:43) Already checked on the phone (ute2e, journal over adb): - [x] `lectern.aps` 0.0.1 is installed next to `utstudybible.schaefera`. - [x] Data copied by adb, with the old app stopped first. `~/.local/share` has 45 files (20 MB) and `~/.cache` has 104 files (1.3 MB); every file's checksum matches the old app's. The old app had no `~/.config` folder. - [x] Lectern opens on your data. The log shows `restored BSB 244`, Genesis 9–10, and your text scale of 120. The build log line reads `feat/lectern-rebrand@a510cd48e`. - [x] The launcher shows the new H2 icon (the pedestal lectern, paper on lapis, red lip). - [x] The only AppArmor denial is a libertine `list` call. The old app, the system apps and others hit the same one, so it isn't new. For you (feel and system items): - [x] The icon in the app drawer, and the name "Lectern" under it. - [x] The launch splash is paper (#FAF8F3) with no white flash. - [x] Your notes, history and installed Bibles look the same as in the old app. - [ ] Optional: with the system set to German, the title stays "Lectern". CI's `language-switch` case already checks this. The old app and its folders stay installed. I'll remove them only when you say so.
Owner

All checks out. Skipped the optional step of checking German system language due to needing restart.

All checks out. Skipped the optional step of checking German system language due to needing restart.
claude-bot changed title from WIP: Rebrand to Lectern: app id lectern.aps, name, icon (#95 part 5) to Rebrand to Lectern: app id lectern.aps, name, icon (#95 part 5) 2026-10-31 17:13:16 +00:00
claude-review left a comment

Merge gate (claude-review), head a510cd4: APPROVED.

  • Findings: reviews 385 (high) and 386 (delta, medium) have none; nothing open.
  • Commits after the last review: none. origin/feat/lectern-rebrand is a510cd4, the head.
  • CI: all 6 statuses on a510cd4 are success (changes, rust, audit, app, e2e, click).
  • Proof: no unrun elevated, maximum or AI-behavior gate. The maximum tier's click build and phone install were done, and the owner signed off in comment 2846. They skipped the optional German system-language check, which the language-switch e2e case covers in CI.
  • Review-Confidence 100 from the audit.
Merge gate (claude-review), head a510cd4: APPROVED. - Findings: reviews 385 (high) and 386 (delta, medium) have none; nothing open. - Commits after the last review: none. origin/feat/lectern-rebrand is a510cd4, the head. - CI: all 6 statuses on a510cd4 are success (changes, rust, audit, app, e2e, click). - Proof: no unrun elevated, maximum or AI-behavior gate. The maximum tier's click build and phone install were done, and the owner signed off in comment 2846. They skipped the optional German system-language check, which the language-switch e2e case covers in CI. - Review-Confidence 100 from the audit.
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!147
No description provided.