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.
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
- 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.
- 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.
- 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.
- 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.
- 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 launch failed without the JavaScript bundle. Existing Metro plus USB forwarding loaded the app; starting the isolated local QA API restored profile and dashboard data.
- The existing synthetic QA profile opened the dashboard. Its trial banner showed 7 days and 140 pages remaining. This account already existed and does not prove a fresh 150-page allocation.
- Pricing showed the correct 150/450/900 tiers. Restore Purchases was reachable and produced no observed error, but no purchased entitlement was available to verify a successful restore.
- Digital Reading opened the library. A 10-page illustrated book loaded; next-page navigation changed the displayed text and progress. A valid Gutenberg URL opened Alice in 251 pages. example.com returned the expected No readable text dialog.
- Real tutor sessions reached OpenAI. The phone received tutor audio/transcript events and showed Listening. After a tutor response, logs showed beginner VAD restored to 4000ms and 0.30.
- Reader exit showed a summary and cleanup events. Backend logs and QA database records confirm session/progress saves without the earlier FK error. These were zero-speech runs, so they do not validate pronunciation, live timing, no read-ahead or automatic page turns.
- Scan & Read imported the synthetic image, extracted all nine words accurately, saved QA-Audit-20260910, and opened it in the reader. The copied image was removed afterward; the clearly named test book remains in the isolated QA account.
- Final resource checks found the camera still active after Real-Time mode was closed with Android Back. A longer sequence also left the mic running. After force-stop, neither camera nor microphone remained active.
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
| Requirement | Verdict | Evidence from this run | Remaining acceptance |
|---|---|---|---|
| 2.1 Clone repos v4 / v3 Plan listed: Done | Confirmed | Both 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 reviewed | React 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 partial | Installed 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 | Blocked | An 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 / ops | GitHub 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 partial | The 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 partial | Beginner 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-dependent | The 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 pass | Mobile 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 | Blocked | No 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 pass | Source 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 pass | Mobile 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 pass | Current 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 / ops | No 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 pass | Current 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 found | Source 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 pass | Current 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 | Blocked | APNs/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 pass | Apple 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 partial | Phone 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 pass | Current 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 | Blocked | Consent 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 / ops | No 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 / ops | Play 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 | Deferred | The 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 / ops | No 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 / ops | Editable 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 item | The 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 | Blocked | Plan 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 pass | Current 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 / ops | App 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 / ops | Historical 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 / ops | No 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 partial | Digital 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 found | Real-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 partial | A 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 partial | The 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 | Blocked | Notification 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 pass | Current 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 | Blocked | The 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 partial | Pricing 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 pass | Admin 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 | Blocked | No EAS or Xcode build was started in this pass. | Build the accepted source for iOS and validate native configuration. |
| — TestFlight beta Plan listed: Live | Blocked | The 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.



