Lekture · Internal QA · 10 September 2026

Lekture phone APK QA

No, the full plan is not working well enough to sign off. Android reader, URL import, OCR and session saving passed the exercised paths, and 97 targeted tests passed. A reproducible camera cleanup failure, mobile logging, deployment differences and untested speech/store/TestFlight requirements remain.

Physical phone
OPPO CPH2467 · Android 15
com.lekture · version 1 · code 28

Runtime tested
Existing debug APK + current Metro JavaScript
Local QA API and database

Coverage
Three Luna subagents + parent verification
All 44 original requirements and inventory rows

A source or mocked-test pass is evidence for a code path. It does not establish live speech quality, production deployment, store behavior or iPhone acceptance.

What prevents full sign-off

  1. Camera stays active after returning to the dashboard. Reproduced from a fresh launch: select profile, open Real-Time Reading, press Android Back. Android still lists Lekture as an active camera client. A longer scan/reader sequence also left the microphone running; that trigger needs further isolation. The app was force-stopped and both resources were confirmed released.
  2. The installed APK needs development services. It initially failed with Unable to load script. Metro forwarding restored launch, and the local QA API had to be started. This debug APK is not a standalone build for owner testing.
  3. Mobile profile data is still logged. Source still logs full profile lists and selected/edited profiles, plus names and age/grade fields. These calls leave the mobile PII-cleanup requirement incomplete.
  4. The public API does not match the tested local API. Subscription product IDs differ and public add-ons lack productId. Confirm store configuration and deployment before relying on the local billing results.
  5. Live tutor and iPhone acceptance remain open. The app can enter Listening, but real speech quality, VAD timing, hint order, no read-ahead and speech-triggered auto-turn still need a reader. TestFlight, real remote push, store callbacks and owner-only requirements were not certified.

What happened on the phone

Initial debug launch failed without Metro forwarding.
Initial debug launch failed without Metro forwarding.
Synthetic OCR returned all nine words correctly.
Synthetic OCR returned all nine words correctly.
The saved synthetic scan opened in the reader.
The saved synthetic scan opened in the reader.
Dashboard after Android Back. Android still reported an active Lekture camera client.
Dashboard after Android Back. Android still reported an active Lekture camera client.

Automated and API evidence

All targeted automated checks passed: 46 mobile tests across 13 suites and 51 backend tests across 10 suites. The API build also passed. Native modules and provider calls are mocked in these suites. The tutor agent repeated five API suites already included in the backend total, so those results are not counted twice.

The public and local subscription endpoints both return 150, 450 and 900 pages. The public response uses identifiers such as com.lekture.basic_monthly; the local response uses com.lekture.basic.monthly. Public add-ons omit productId. This proves a response mismatch; the correct store configuration still needs verification.

Source retention checks confirm tracing: null on Realtime and store: false on OCR/feedback calls. No provider account retention configuration was verified.

All 44 requirements and inventory rows

Original plan labels are preserved below each item. Verdicts reflect this QA run. “Blocked” means the required environment or interaction was unavailable, not that the feature necessarily fails.

44 of 44 rows

RequirementVerdictEvidence from this runRemaining acceptance
2.1
Clone repos v4 / v3
Plan listed: Done
ConfirmedBoth repositories are present. GitHub API confirms push access and default branches v4 and v3. Current tested working trees are feat/remote-push-pipeline with existing changes.This test does not establish merge or deployment status on the default branches.
2.2
Understand stack (RN, WebRTC, NestJS)
Plan listed: Done
Source reviewedReact Native mobile, WebRTC tutor, NestJS API and local database paths were inspected by three Luna agents and the parent agent.An onboarding inventory item, not a phone behavior test.
2.3
Local build setup
Plan listed: Partial
Phone checks partialInstalled Android v1, code 28 matches the local debug APK by SHA-256. Initial launch failed without Metro forwarding. App launched after adb reverse; API also had to be started.A standalone APK must bundle JavaScript and use a reachable API. No iOS build ran.
2.4
Physical iPhone test; sign-up crash
Plan listed: Test
BlockedAn Android phone cannot exercise Apple sign-in or the reported iPhone crash. Backend identity tests passed separately.Fresh TestFlight first signup, Hide My Email and returning login on iPhone.
3
Account access invites
Plan listed: Partial
Owner / opsGitHub write access was verified for both repositories. Other portals were not inspected.Confirm Apple Developer, App Store Connect, Play Console, Google Cloud, DigitalOcean, OpenAI and EAS access.
4.1
Fix dual VAD values
Plan listed: Test
Phone checks partialThe real reader connected and received tutor audio/transcript events. After the tutor response, the device log showed VAD re-enabled at beginner threshold 0.30 and 4000ms silence. Unit checks also pass.Actual quiet-speech recognition and interruption timing still need spoken input and TestFlight repetition.
4.2
Level-scaled silence + mic sensitivity
Plan listed: Test
Phone checks partialBeginner 4000ms/0.30 was observed after the tutor response on Android. Intermediate 3000ms/0.35 and expert 2500ms/0.40 were verified in source only.Measure all three levels with actual speech and post-response mic reuse.
4.3
Pause/Prompt/Praise prompt
Plan listed: Open
Mode-dependentThe ladder exists for per-sentence mode. Per-page mode intentionally stays silent mid-passage and limits coaching to the end. ReadingPage defaults to per-page.Verify actual hint order in per-sentence mode and silence in per-page mode. This conditional behavior is not a demonstrated defect.
4.4
Never read ahead rules
Plan listed: Test
Code checks passMobile and API prompts forbid previewing unattempted words. Backend request tests pass and exclude the supplied passage from server instructions.Read part of a passage and pause; observe whether live model responses reveal upcoming words.
4.5
TestFlight + child validation
Plan listed: Open
BlockedNo current TestFlight build or child validation was performed.Owner and child must test quiet speech, waits, hints and no read-ahead on a fresh iPhone build.
6.4a
Beginner leniency 70–80%
Plan listed: Test
Code checks passSource maps beginner to lenient 70% pass with an improvement band below 80%; expert uses strict 95%. Existing helper and session-metric checks passed.Test real pronunciation near the thresholds, including accented speech and resulting feedback.
6.4b
Pass age/grade to tutor
Plan listed: Test
Code checks passMobile paths send profileId and profile context. API validates profile ownership and injects age and grade into session instructions.Verify the exact runtime request and age-appropriate spoken responses with known test profiles.
6.4c
Backend read-ahead leak
Plan listed: Test
Code checks passCurrent backend instructions omit the supplied passage and first-word example. Existing request-shape tests passed.Verify deployed request and live tutor responses; source rules cannot prove model obedience.
6.1
Rotate all secrets at handover
Plan listed: Open
Owner / opsNo rotation receipts, droplet SSH configuration or prior-team revocation evidence was inspected.Verify secret rotation and access revocation with the owner. No secrets were changed.
6.2a
Disable TypeORM synchronize in prod
Plan listed: Test
Code checks passCurrent API booted against the QA database with NODE_ENV=production. Production synchronization is disabled in source; the read-only migration listing shows all 10 migrations applied in QA.Confirm deployed NODE_ENV, migrations and production boot. QA boot is not production evidence.
6.2b
Remove PII from logs (COPPA)
Plan listed: Test
Failure foundSource explicitly logs full profile lists and selected/edited child profile objects, plus names and age/grade fields in profile screens. Backend cleanup does not cover these mobile calls. A separate reported full-state dump could not be independently revalidated and is excluded from confirmed findings.Remove remaining mobile PII logs and check runtime logs for both platforms and deployed API.
6.2c
Replace hardcoded admin login
Plan listed: Open
Code checks passCurrent admin authentication has configured credentials, MFA, roles and invalidation checks. Existing admin tests passed.Test individual accounts, invitations, MFA and audit records in the deployed admin UI.
6.3a
Real remote push (APNs + FCM)
Plan listed: Not built
BlockedAPNs/FCM code now exists, although the original plan says not built. No real device delivery was verified; the local QA API has FCM sending disabled.Configure Firebase/APNs and verify foreground, background and terminated-app delivery on both platforms.
6.3b
Apple App Store Server Notifications
Plan listed: Not built
Code checks passApple notification signature and state-transition tests passed in current source. QA has Apple notifications disabled.Test real signed sandbox renewals, cancellations, expiry and refunds with the deployed callback.
6.3c
Subscription plans (7d / 150·450·900 pages)
Plan listed: Test
Phone checks partialPhone pricing shows 150/450/900-page tiers. Existing synthetic QA account shows 7 trial days and 140 remaining pages, so this is not fresh-signup proof of 150 pages. Restore was tapped without a visible error, but no entitlement restore was proven. Public product IDs differ from the local API.Fresh signup and real sandbox purchase/restore on both stores; reconcile configured product IDs.
6.5a
OpenAI store:false on live voice path
Plan listed: Test
Code checks passCurrent request tests confirm Realtime tracing:null and OCR/feedback store:false.These request fields do not establish the provider account retention configuration. Verify deployed requests and applicable account controls.
6.5b
Verify parental consent on iOS social sign-in
Plan listed: Unverified
BlockedConsent wiring and backend consent tests exist. No iOS social-sign-in flow was exercised.TestFlight consent gate and owner acceptance.
6.5c
Parent email verification / legal review
Plan listed: Legal
Owner / opsNo legal sign-off or parental-verification acceptance evidence was provided.Owner/legal review of parental verification and consent.
6.5d
Google Play content declarations (12 pending)
Plan listed: Open
Owner / opsPlay Console was not inspected; the original plan records 12 pending declarations.Confirm current privacy, data safety and target-audience declarations in the console.
6.6
Scaling (managed DB, backups, LB)
Plan listed: Future
DeferredThe plan places managed database, backups and load balancing in future scope. Current infrastructure was not audited.Owner approves scope and spend; verify restore procedures and capacity when scheduled.
6.7
Evaluate newer OpenAI realtime models
Plan listed: Open
Owner / opsNo model comparison study ran in this APK QA pass.Run a separate quality, latency, transcription and cost evaluation.
7.1
Real Figma files / asset export
Plan listed: Pending
Owner / opsEditable Figma files and asset delivery were not inspected.Owner confirms files and exports from the previous team.
7.2
Confirm push notifications work
Plan listed: Closed
Historical itemThe plan closes the original investigation as local notifications plus dummy tokens. Current source has a newer remote push implementation.Real delivery is tracked separately in 6.3a and remains unverified.
7.3
Confirm 7-day / 150-page trial in deployed build
Plan listed: Pending
BlockedPlan values and trial constants were checked, but no fresh deployed signup was completed.Create a fresh test account and verify exactly 7 days and 150 pages on deployed Android and TestFlight.
7.4
Exact line for realtime voice retention off
Plan listed: Test
Code checks passCurrent realtime OpenAI service includes tracing:null. This is the same evidence as 6.5a.No account-level retention acceptance is implied.
7.5
Which TestFlight build has consent gate
Plan listed: Pending
Owner / opsApp Store Connect build history was not inspected.Map the consent-gate commit to the first shipped TestFlight build.
7.6
Cleaned git history force-pushed
Plan listed: Pending
Owner / opsHistorical secret cleanup and any force-push were not audited.Repository owner confirms history cleanup separately from rotating secrets.
7.7
Written IP transfer on final payment
Plan listed: Legal
Owner / opsNo signed transfer document was inspected.Owner obtains written code, design and asset ownership transfer.
DM
Digital reading mode MVP (in-app reader)
Plan listed: Approved
Phone checks partialDigital Reading opened the library and an existing 10-page illustrated book. Manual next-page navigation changed text and progress. A Gutenberg URL imported Alice into 251 pages. Real OpenAI sessions connected, and session/progress records saved without the previous FK error in zero-speech runs. The too-short example.com URL showed a readable error.Speak enough of a page to cross 85% and verify one automatic turn. Check spoken scoring, long-article navigation, offline/error recovery and TestFlight.
—
Live camera + OCR + WebRTC tutor
Plan listed: Built
Failure foundReal-Time camera screen opens, but Android Back returns to the dashboard while com.lekture remains an active camera client. Reproduced from a fresh process without starting voice. Earlier mixed camera/scan/reader navigation also left the mic active at the dashboard.Fix and retest resource release for every exit. The mic trigger needs isolation. Repeat with a printed target and speech, then on TestFlight.
—
Scan → OCR → ReadingPage flow
Plan listed: Built
Phone checks partialA synthetic image imported through gallery/crop, OCR returned all 9 words correctly, and review/save/compile/book-preview/reader navigation succeeded. Testbook QA-Audit-20260910 was saved. Camera and microphone remained active after an earlier mixed navigation sequence.Live camera capture, OCR on real book pages, and iOS remain untested. Resolve resource cleanup before acceptance.
—
Profiles, level analysis, progress
Plan listed: Built
Phone checks partialThe pre-existing synthetic QA profile loaded and opened the dashboard. Reader exit showed summaries. Read-only backend checks confirm new session and progress persistence; runs had zero spoken words.Level analysis, goals, report delivery and complete progress persistence require separate end-to-end checks.
—
Local notifications (Notifee)
Plan listed: Built
BlockedNotification permission is granted on the Android phone. Permission alone does not prove delivery.Exercise a scheduled local notification, including background behavior; repeat on iOS.
—
Push registration stub (dummy token)
Plan listed: Test
Code checks passCurrent API rejects dummy-token-* in a direct service probe. Mobile has a real-token registration path.Observe actual device registration and verify no placeholder token is posted.
—
Apple + Google sign-in, consent UI
Plan listed: Unverified
BlockedThe app resumed an existing authenticated state. This is not a fresh Google or Apple login or consent test.Test first and returning Google login, then Apple Hide My Email and consent on TestFlight.
—
IAP + Google RTDN
Plan listed: Partial
Phone checks partialPricing and Restore Purchases were reachable; tapping restore produced no observed UI/log error. Existing IAP and restore unit tests passed. No known purchase was restored.Complete a real sandbox purchase and entitlement restore, plus Google RTDN lifecycle cases.
—
Admin dashboard (lektureadmin)
Plan listed: Built
Code checks passAdmin service and library controller tests passed. The browser admin workflow was not exercised.Validate deployed login, authorization, library changes and audit records.
—
EAS / cloud iOS build pipeline
Plan listed: Built
BlockedNo EAS or Xcode build was started in this pass.Build the accepted source for iOS and validate native configuration.
—
TestFlight beta
Plan listed: Live
BlockedThe plan lists a live TestFlight beta, but the current tester/build inventory was not checked.Confirm current build availability and run iPhone acceptance.

Build provenance and evidence limits

The installed APK and existing local debug output have the same SHA-256:

77a2479c4b6d4199b1610f889734b3ebd1fa621da9810fb8b6044869ed1b3e3c

No JavaScript bundle is packaged in this debug APK. The phone loaded current source through Metro after USB port forwarding. Its API address points to this Linux machine. The API was compiled from the current working tree and started against the existing isolated QA database with production synchronization disabled. No migrations were applied, store purchase made or remote push sent.

Mobile HEAD b5932d5; API HEAD 237fa50. Both working trees have pre-existing changes on feat/remote-push-pipeline. Testing did not change product source, install a new APK or deploy the API.

Raw logs, APKs, JavaScript bundles, tokens and profile data are excluded from this hosted report. Local evidence includes apk-provenance.json, device-results.md, tutor-results.md, backend-results.md, screenshots, test summaries and sanitized API responses.

Share/PDF imports are deferred in the original MVP plan. Cross-app capture and overlays are alternative proposals and were not part of this APK sign-off. Android checks cannot replace the TestFlight gate required by workspace AGENTS.md.

Sources: original handover plan, retrieved 10 September 2026; current repository source; physical phone screenshots and logs; local QA API responses; public plan endpoint, checked the same day.