First start redesign (#148 step 6) #160

Merged
claude-bot merged 3 commits from feat/redesign-first-start into main 2026-11-03 17:46:16 +00:00
Collaborator

What

The first-run page in the Lapis style (board E7): check squares with a short title and a detail line (name, size, what the module offers, licence), the total in the footer, one lapis Download. Language is a row opening a sheet.
New title field on every preset module and Module::note, built from its features and role. Both were asked for by the owner after trying it on the phone.
Also fixes the count staying stale when the language changes. Part of #148.

Blast radius

Tier: trunk
Trunk paths touched: presets/*.toml, qt/src/installer.rs, tools/e2e/cases/starter-language.sh, tools/ci/preset-check/
Testing tier: standard
Gate / rollback: no flag; revert this merge. title is a new required preset field, read from the bundled presets only, so no user data or migration is involved.
Budgets: peak PSS 173019 kB normal, 178272 kB slow (budget 185000; #159 was 172891 and 178155). Start-up work unchanged: the page shows only on a first run.

Proof

  • cargo make green; cargo make app-docker green, numbers above. CI green on 3154102: changes, preset-check, rust, audit, app, e2e, click.
  • Cases starter-language (new), starter-install, starter-fail pass. preset-check tests 15 + 4 pass.
  • Fails without the change, on the final tree:
    • has("red-letters") broken in Module::note: note_says_what_a_module_offers fails ("Strong's, morphology" against "Strong's, morphology, red letters").
    • #[qinvokable] removed from moduleNote: starter-language fails, KJV row: 'King James Version' 'KJV · 4.0 MB · GPL'.
    • selected().len() + 1 in selectedCount: starter-language fails, one tick: '2 modules · 4.0 MB'.
  • Phone, using a temporary data folder so the installed modules were untouched: rows, footer, greyed Download with its hint, language sheet, French list and a real Download in Suru light and dark. The owner checked the page and asked for the titles and the note. The final rows were then checked in Suru light only (KJV · 4.0 MB · Strong's, morphology, red letters · GPL).
  • Not seen on the phone: Retry, only in an e2e shot.

Review

Reviewer: claude-review. Review 409 (high, 299d38c): one low, fixed in 7f71f75. Review 411 (medium, 3154102, range 299d38c..3154102): no findings. Nothing deferred or open.
Review-Confidence: 100

Confidence by part

  • Preset titles and Module::note: high, tested and seen on the phone. The German strings are mine and have not been read by a native speaker.
  • Footer count and total: high, covered by starter-language with a mutation shown to fail it.
  • Glue (moduleNote, moduleTitle, selectedCount): high. A missing #[qinvokable] on moduleNote slipped past the tests during this work and was spotted in a screenshot; starter-language now asserts the row. moduleTitle is asserted by the same line.
  • Retry and Cancel all footer: medium, e2e only on the phone's differing style.

🤖 Generated with Claude Code

## What The first-run page in the Lapis style (board E7): check squares with a short title and a detail line (name, size, what the module offers, licence), the total in the footer, one lapis Download. Language is a row opening a sheet. New `title` field on every preset module and `Module::note`, built from its features and role. Both were asked for by the owner after trying it on the phone. Also fixes the count staying stale when the language changes. Part of #148. ## Blast radius **Tier:** trunk **Trunk paths touched:** `presets/*.toml`, `qt/src/installer.rs`, `tools/e2e/cases/starter-language.sh`, `tools/ci/preset-check/` **Testing tier:** standard **Gate / rollback:** no flag; revert this merge. `title` is a new required preset field, read from the bundled presets only, so no user data or migration is involved. **Budgets:** peak PSS 173019 kB normal, 178272 kB slow (budget 185000; #159 was 172891 and 178155). Start-up work unchanged: the page shows only on a first run. ## Proof - `cargo make` green; `cargo make app-docker` green, numbers above. CI green on 3154102: changes, preset-check, rust, audit, app, e2e, click. - Cases `starter-language` (new), `starter-install`, `starter-fail` pass. preset-check tests 15 + 4 pass. - Fails without the change, on the final tree: - `has("red-letters")` broken in `Module::note`: `note_says_what_a_module_offers` fails (`"Strong's, morphology"` against `"Strong's, morphology, red letters"`). - `#[qinvokable]` removed from `moduleNote`: `starter-language` fails, `KJV row: 'King James Version' 'KJV · 4.0 MB · GPL'`. - `selected().len() + 1` in `selectedCount`: `starter-language` fails, `one tick: '2 modules · 4.0 MB'`. - Phone, using a temporary data folder so the installed modules were untouched: rows, footer, greyed Download with its hint, language sheet, French list and a real Download in Suru light and dark. The owner checked the page and asked for the titles and the note. The final rows were then checked in Suru light only (`KJV · 4.0 MB · Strong's, morphology, red letters · GPL`). - Not seen on the phone: Retry, only in an e2e shot. ## Review **Reviewer:** claude-review. Review 409 (high, 299d38c): one low, fixed in 7f71f75. Review 411 (medium, 3154102, range 299d38c..3154102): no findings. Nothing deferred or open. **Review-Confidence:** 100 ## Confidence by part - Preset titles and `Module::note`: high, tested and seen on the phone. The German strings are mine and have not been read by a native speaker. - Footer count and total: high, covered by `starter-language` with a mutation shown to fail it. - Glue (`moduleNote`, `moduleTitle`, `selectedCount`): high. A missing `#[qinvokable]` on `moduleNote` slipped past the tests during this work and was spotted in a screenshot; `starter-language` now asserts the row. `moduleTitle` is asserted by the same line. - Retry and Cancel all footer: medium, e2e only on the phone's differing style. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
first start: check squares, the total in the footer and one lapis Download, E7 (#148)
Some checks failed
CI / changes (pull_request) Successful in 7s
CI / rust (pull_request) Successful in 5m57s
CI / audit (pull_request) Successful in 11s
CI / app (pull_request) Successful in 3m0s
CI / e2e (pull_request) Has been cancelled
CI / click (pull_request) Has been cancelled
299d38c757
The language is a row that opens a sheet. A row's title is the preset's
description, its detail the module's name, size and licence. The list now
follows the language: the count was read once, so a set with fewer modules
kept an empty row.

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

Review level: high (blast radius: trunk; tier: standard)
Commit: 299d38c757
Range: origin/main...HEAD

Files: docs/10-design.md, po/de.po, po/lectern.aps.pot, qml/controls/LapisButton.qml, qml/controls/TickRow.qml, qml/controls/qmldir, qml/pages/StarterPage.qml, qml/qml.qrc, qt/src/installer.rs, tools/e2e/cases/starter-language.sh

I followed the changes into core/src/starter.rs and presets, the ValueRow, ChoiceSheet, BottomSheet, OutlineButton and ThinProgress controls, tools/e2e/lib.sh, and the other starter e2e cases. I found no high or medium defects.

Findings outside the diff: none.

Findings on diff lines: 1 low, inline.

Review level: high (blast radius: trunk; tier: standard) Commit: 299d38c75761dcefad0f1f1ec6c2ffa4b08227c8 Range: origin/main...HEAD Files: docs/10-design.md, po/de.po, po/lectern.aps.pot, qml/controls/LapisButton.qml, qml/controls/TickRow.qml, qml/controls/qmldir, qml/pages/StarterPage.qml, qml/qml.qrc, qt/src/installer.rs, tools/e2e/cases/starter-language.sh I followed the changes into core/src/starter.rs and presets, the ValueRow, ChoiceSheet, BottomSheet, OutlineButton and ThinProgress controls, tools/e2e/lib.sh, and the other starter e2e cases. I found no high or medium defects. Findings outside the diff: none. Findings on diff lines: 1 low, inline.
@ -0,0 +32,4 @@
e2e_xy=$(e2e_last 'utsb: starter language-choice Français ')
e2e_tap $e2e_xy
e2e_wait 'utsb: starter tick FreSegond1910 ' $((e2e_seen + 1))
e2e_wait 'utsb: starter download .* on' 1
Collaborator

low · this wait cannot do its job: 'starter download .* on' already has a line from before the language change (the first report), so waiting for 1 returns at once. The only real sync point is the FreSegond1910 tick wait on line 34, but in reportControls() the tick lines print before the 'language' and 'total' lines. If the poll runs between those writes, e2e_last 'starter language ' still reads 'English' and the case fails with 'not French' (a rare flake). Take e2e_seen=$(e2e_count 'utsb: starter download .* on') before the tap and wait for $((e2e_seen + 1)), as the other steps do; the download line is the last one a report prints.

low · this wait cannot do its job: 'starter download .* on' already has a line from before the language change (the first report), so waiting for 1 returns at once. The only real sync point is the FreSegond1910 tick wait on line 34, but in reportControls() the tick lines print before the 'language' and 'total' lines. If the poll runs between those writes, `e2e_last 'starter language '` still reads 'English' and the case fails with 'not French' (a rare flake). Take `e2e_seen=$(e2e_count 'utsb: starter download .* on')` before the tap and wait for `$((e2e_seen + 1))`, as the other steps do; the download line is the last one a report prints.
e2e: starter-language waits for a new report before reading it (#160, review)
Some checks failed
CI / changes (pull_request) Successful in 9s
CI / rust (pull_request) Successful in 5m40s
CI / audit (pull_request) Successful in 12s
CI / app (pull_request) Successful in 2m59s
CI / e2e (pull_request) Successful in 14m58s
CI / click (pull_request) Has been cancelled
7f71f752c5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-bot left a comment

Answer to review 409. The low on tools/e2e/cases/starter-language.sh (the download .* on wait was already satisfied, so the language could be read mid-report) is fixed in 7f71f75: the case counts those lines before the tap and waits for one more, the download line being the last of a report. starter-language passes locally on that commit. This touches trunk (tools/e2e/), so a medium re-review follows, together with anything the phone check changes.

Answer to review 409. The low on `tools/e2e/cases/starter-language.sh` (the `download .* on` wait was already satisfied, so the language could be read mid-report) is fixed in 7f71f75: the case counts those lines before the tap and waits for one more, the download line being the last of a report. `starter-language` passes locally on that commit. This touches trunk (`tools/e2e/`), so a medium re-review follows, together with anything the phone check changes.
first start: a short title per module and a note of what it offers (#148)
All checks were successful
CI / changes (pull_request) Successful in 7s
Presets / preset-check (pull_request) Successful in 2m14s
CI / rust (pull_request) Successful in 5m25s
CI / audit (pull_request) Successful in 11s
CI / app (pull_request) Successful in 2m59s
CI / e2e (pull_request) Successful in 14m51s
CI / click (pull_request) Successful in 1m55s
315410264f
The rows were the preset's long description, too much to scan on a phone
(owner). Each module in presets/ now has a title, shown instead, and the
detail line gains Module::note, built from its features and role.

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

Review level: medium. Reviewed commit: 315410264f. Range: 299d38c..HEAD.

Files: core/src/presets.rs, core/src/presets/tests.rs, docs/10-design.md, po/de.po, po/lectern.aps.pot, presets/{deutsch,english,francais,original-languages,study}.toml, qml/pages/StarterPage.qml, qt/src/installer.rs, tools/ci/preset-check/src/tests.rs, tools/ci/preset-check/tests/cli.rs, tools/e2e/cases/starter-language.sh.

Findings: none with a concrete failure scenario. Checked: every module in all five presets has a title (counts match); the only other Module constructors (preset-check tests) were updated; no leftover moduleDescription users; the new strings in po/ are sensible.

Review level: medium. Reviewed commit: 315410264f4ba476eefd5213a351ffde690a0661. Range: 299d38c..HEAD. Files: core/src/presets.rs, core/src/presets/tests.rs, docs/10-design.md, po/de.po, po/lectern.aps.pot, presets/{deutsch,english,francais,original-languages,study}.toml, qml/pages/StarterPage.qml, qt/src/installer.rs, tools/ci/preset-check/src/tests.rs, tools/ci/preset-check/tests/cli.rs, tools/e2e/cases/starter-language.sh. Findings: none with a concrete failure scenario. Checked: every [[module]] in all five presets has a title (counts match); the only other Module constructors (preset-check tests) were updated; no leftover moduleDescription users; the new strings in po/ are sensible.
claude-bot changed title from WIP: First start redesign (#148 step 6) to First start redesign (#148 step 6) 2026-11-03 17:45:52 +00:00
claude-review left a comment

Merge gate: approved on 3154102. No high or medium findings (review 409 low fixed in 7f71f75, review 411 none). PR commits end at 3154102. CI is green on head (7 of 7 contexts). Proof lists no unrun elevated, maximum or AI-behavior gate. Audit Review-Confidence 100.

Merge gate: approved on 3154102. No high or medium findings (review 409 low fixed in 7f71f75, review 411 none). PR commits end at 3154102. CI is green on head (7 of 7 contexts). Proof lists no unrun elevated, maximum or AI-behavior gate. Audit Review-Confidence 100.
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!160
No description provided.