Skip to content

feat: product and QA review against the PRD, twenty findings fixed and driven in the web harness - #74

Merged
jag3773 merged 10 commits into
mainfrom
claude/gifted-bohr-70el9i
Oct 6, 2026
Merged

jag3773 merged 10 commits into
mainfrom
claude/gifted-bohr-70el9i

Conversation

@jag3773

@jag3773 jag3773 commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

What this is

A product-owner and QA review of the built app against docs/PRD.md, then the fixes. Every Must requirement in sections 7 to 13 was compared with its code, its scenario and its strings. Twenty misalignments were found where a scenario proved a kernel fact the screen did not show, or proved a narrower proxy than the requirement. GitHub refused issue creation from the session at the time, so the findings were fixed directly; they are listed below with the extra defects found while testing.

The twenty findings

Study

  • ST-3, ST-1: a saved "Everyday words" choice made a literal-only language unreadable, with no toggle to escape. The reading now falls back to the text the language carries.
  • ST-7: a downloaded Hebrew or Greek text could not be opened unless the language had both a literal and a simplified text. The originals join the reading choices whenever installed, and a language with no text offers them from its empty state, with a way back.
  • ST-1, ST-10: Study reopened at the chapter and bookmarks were chapter-only. A tapped verse is journaled through a new corpus.opened, so last-read, Home's Continue reading and bookmarks are at the verse.
  • ST-4: the audio bar offered a download for a chapter the installed Audio Pack did not carry. It now says the chapter has no audio.
  • ST-5: most library cards had no count. Every card counts in its own unit; the header counts resource types.
  • ST-6, ST-2: an unresolvable article link was silent, and "helps not on this phone" showed when the chapter simply had none.

Home, onboarding, settings

  • HO-5: the download card hid what was on the phone and what was missing. It now states both, and shows the last install failure for the language in place.
  • HO-5, ON-2: "Downloading continues when you are online" promised a resumption nothing performed. The copy now says to connect, then tap.
  • ON-3: the Settings first-name field did not opt out of system autofill the way onboarding did. It does, and ON-4 refuses a name field that does not.
  • SE-1: the Settings footer named four of the seven counted folds. It now summarises without a partial list.

Formation

  • FO-2, FO-3: a movement's text was dropped whenever it had questions. Text and questions render together, with the kernel naming where the questions came from.
  • FO-5: turning on the English movements removed the local-language study questions. "Alongside" now means both.
  • FO-1: Training was a flat lesson walk. It has a course outline grouped by manual, with the active group's lesson marked.
  • FO-3, FO-4: Play silently moved a group forward. It starts the session at the opened story and asks in one sentence before moving the group.

Languages

  • LA-1: the offline copy said only installed languages were listed while the cached catalog was shown; the empty state misreported its cause. Both are honest now.
  • LA-1, PRD 8.4: language rows showed no size before download, and the resource count included other publishers' copies. Catalog releases carry the sum of their ingredient sizes, rows say "about {size}", and the count is what the pack offers.

Partners and About

  • PA-2, PA-6, PRD 9: opening the full story from the Home invitation was not counted as an impact-story open. It goes through partners.open now.
  • PA-6: a placeholder security note was asserted for feed stories that had none. The note shows only when the story carries one; the shipped story carries its own.
  • PA-2: the region test was locale OR time zone, which would show the partner card to any en-US phone worldwide. It now needs a United States time zone and a locale region that is US or unknown (decision 97).
  • PRD 10.2, decision 68: About lacked the full lockup, and "opens in your browser" was only a screen-reader hint. Both are visible now.
  • PRD 10.1: product names left the running copy in Languages and Transfer.

Found while testing, also fixed

Driving the real screens in Chromium over the memory adapters found four defects the extended scenarios had not caught: choosing the Hebrew text did nothing when Study opened at its last-read place (open() ignored the request); the library's Five movements card could not install the formation row; "Continue in English" on a fresh phone failed with pack.empty-plan because no catalog had been fetched yet and Home showed nothing wrong; and Home never redrew its download card when a pack landed in the background, because it listened to preferences and bookmarks only. The packs module now records an install-wide failure per pack and exposes onChange.

An adversarial read of the diff found seven more: the original-text view was a dead end for a language with no text, every verse tap re-assembled the chapter and journaled an event, the Home count over-counted during an update, the Training outline could split a manual in two, its empty state misreported the cause, the Languages count and size disagreed, and the move prompt appeared after a failed start.

Decisions taken

Recorded in the PRD decision log (row 97) and the scenarios: the invitation's region test needs both signals; last-read and bookmarks are at the verse; Play never moves a group without a confirm; the Languages count is what the language pack offers; the Library header counts resource types. Each is a product call the PRD left open; say so if any should go the other way.

Strings

21 keys added and 9 reworded in English and drafted in the 15 locales with each locale's plural categories (docs/strings-review.md). impact.securityNote, formation.coverage.questions and study.audio.streaming removed everywhere. strings check: 491 keys in 16 locales, each 491/491.

Verification

  • npm run verify green on the final tree: lint and format, typecheck, 822 tests, knip, 9 checks, 63 scenarios, 51 Must requirements traced (0 unproven), 21 fixture burritos, both bundles clean of sim code. The live contract step was skipped: git.door43.org answers 403 from the sandbox.
  • Each extended scenario was observed red before its fix (ST-1, ST-3, ST-4, ST-5, ST-7, HO-5, HO-7, ON-2, ON-4, FO-1, FO-3, FO-4, FO-5, LA-1, PA-2, PA-6).
  • npm run shots: 182 screenshots across light, dark, reduced blur, RTL, Urdu, Hindi and large text; 0 text boxes escaping their parent; 39 targets under 44 px, all inline links exempt under decision 86; no page errors.
  • Driven flows in Chromium, light and dark: onboarding and Continue in English, Home, Study with verse taps and bookmarks, the library downloads, the originals, Formation sessions with and without the five movements, the Training outline, the move-the-group confirm, Languages, Settings, About and the impact story. No page errors.
  • Not run: anything on a phone, an emulator or a simulator. The sandbox has no KVM or CPU virtualization and cannot reach the Android SDK host. The device CI on this PR is the first native run of these changes. Please look at the new Training screen, the move confirm in the session dock and the no-audio state in light, dark and reduced blur, and with VoiceOver or TalkBack.

Progress tracker entry: docs/progress_tracker.md, 2026-10-05 Q1.

No new dependencies.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SLy4DDVTydCyFA38LqekuJ


Generated by Claude Code

claude added 9 commits October 5, 2026 16:47
…e verse, count every card

The reading preference now falls back to the text the language carries, so a saved
"Everyday words" choice no longer makes a literal-only language unreadable (ST-3, ST-1).
The Hebrew and Greek texts join the reading choices whenever their pack is installed,
and a language with no text offers them from its empty state with a way back (ST-7).
A tapped verse is journaled through corpus.opened without reassembling the chapter, so
last-read and bookmarks are at the verse (ST-1, ST-10). The audio bar says when a chapter
has no audio instead of offering a download (ST-4). Every library card carries a count in
its own unit and the header counts resource types (ST-5). A missing article link says so,
and the helps panel tells absent from empty (ST-6, ST-2).

Scenarios ST-1, ST-3, ST-4, ST-5 and ST-7 were extended and observed red first.
… when a pack lands

The download card states what is on the phone and what is missing, and shows the last
install failure for the language in place; the offline copy now says what the app does
(HO-5, ON-2). The packs module records an install-wide failure per pack and tells
listeners when a pack lands, fails or leaves, so Home redraws without polling. Choosing a
language before any catalog refresh fetches the catalog first, so "Continue in English"
on a fresh phone no longer fails with an empty plan. The Settings name field opts out of
system autofill like onboarding, and ON-4 refuses a name field that does not (ON-3).
…ongside English, a Training course outline, Play asks before moving a group

A movement renders its text and, under Talk about it, its questions, with the kernel
naming where the questions came from (FO-2, FO-3). The local-language study questions
stay in the outline when the English movements are shown alongside (FO-5). Training has a
course outline screen grouped by manual, with the active group's lesson marked (FO-1).
Play starts a session at the opened story without moving the group; the dock asks in one
sentence before moving it (FO-3, FO-4).
…oad, a count that matches the pack

The offline notice says new languages cannot be downloaded until the phone reconnects,
and the empty list names its cause. Catalog releases carry the sum of their ingredient
sizes, so a language row shows about how much the pack downloads. The resource count is
what the language pack offers (LA-1). Running copy drops product names (PRD 10.1).
…both region signals, the lockup on About

Opening the full story from the invitation card goes through partners.open, so it counts
as an impact-story open (PA-2, PA-6, PRD 9). A security note shows only when the story
carries one; the shipped story carries its own. The United States test needs a US time
zone and a locale region that is US or unknown (PA-2, decision 97). About carries the full
lockup (PRD 10.2), and external links say visibly that they open in the browser.
21 keys added and 9 reworded in English and drafted in the 15 locales, with each locale's
plural categories; impact.securityNote, formation.coverage.questions and
study.audio.streaming removed everywhere. strings check: 491 keys in 16 locales.
Progress tracker entry Q1: the twenty findings, what was observed red, what the driven web
harness and the adversarial read found, and what did not run (no emulator in the sandbox).
InstallProgress.bytes counts downloaded bytes while a resource transfers and measured bytes once it is
unpacked, so the line read "174 MB so far" for a 41 MB download on the iOS device run. The percent and the
resource counts carry the status; home.download.detail leaves every locale.
On main a fresh phone never downloaded English in CI, because choosing before any catalog refresh failed
with pack.empty-plan, so Home sat idle while the flows ran. With that fixed the real English install runs
during every flow, and on the software-rendered simulator the progress card updating every second kept
XCTest from taking the view snapshot Maestro asserts on: the Settings and Languages flows failed twice while
the failure screenshots show the screens open. The required main pass now points git.door43.org,
cdn.door43.org and unfoldingword.org at the runner through /etc/hosts, so the download fails fast and the
flows drive a quiet Home; the optional pass restores them for download-language.yaml. The Android emulator
passed with the download running and keeps its own resolver.

jag3773 commented Oct 5, 2026

Copy link
Copy Markdown
Contributor Author

CI on 0aae23f: verify, shots and ios are green. android shows cancelled, not failed: its required main pass passed in 4m37s and the optional pass finished at 18:28 (large-text passed), then the emulator runner's own "Terminate Emulator" post step hung for 43 minutes until the job's 75-minute timeout cancelled it. Nothing in this diff touches that step, and the first run of the same workflow on this PR tore the emulator down normally. Re-running the cancelled job once; a second hang would be the runner, and then the job needs a shorter emulator teardown, not a change here.

The earlier ios failure is explained and fixed in 0aae23f: on main a fresh phone never actually downloaded English in CI (the pack.empty-plan path this PR fixes), so Home sat idle during the flows; with a real install running, the software-rendered simulator's progress card kept XCTest from snapshotting the view tree. The required iOS pass now runs with the content hosts offline; the optional pass keeps them online for download-language.yaml.


Generated by Claude Code

…ear an answered replace question from the pack status
@jag3773
jag3773 merged commit fc4ada9 into main Oct 6, 2026
5 checks passed
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.

2 participants