Lekture · Klever Kiddoz · confidential

Handover requirements & status

Everything from the August 2026 work package and owner messages — what’s done, what’s open, and what’s actually shippable on iOS and Android.

v4 / v3 TestFlight 18 (23) Security first Digital reader approved

Account access

Invite acceptance checklist

Owner sent invites 26 Aug 2026. Developer confirms each portal manually — platform consoles cannot be verified from the dev machine alone.

GitHub (NtelUpApps)Write access
Apple DeveloperConfirm in email
App Store ConnectConfirm in email
Google Play ConsoleConfirm in email
Google Cloud (lekturer-app)Confirm in email
DigitalOcean dropletConfirm in email

GitHub verified programmatically: NtelUpApps/lekture-mobile-app and lekture-api both show WRITE. Remaining portals — log in once each and reply to owner if any invite expired or wrong email.

Timeline

Four-week plan (Aug 27 → Sep 23)

Security lockout moved to week 1 per owner request. Digital reader MVP in week 3. Assumes one developer, Android-first local QA, TestFlight for child validation.

Week 1 · Security lockout + §4 tutor

Aug 27 – Sep 2

  • Days 1–2: SSH — new keys only, disable root password login, revoke previous team access
  • Days 1–2: Rotate OpenAI key, JWT secret, PostgreSQL password, SMTP password; update droplet env + redeploy API
  • Days 2–5: Cherry-pick §4 commits (VAD, Pause/Prompt/Praise, read-ahead ban) onto v4
  • Days 3–5: Fix backend read-ahead leak in openai.service.ts + API deploy

Week 2 · Round-two tutor + TestFlight

Sep 3 – Sep 9

  • Beginner leniency 70–80% wired to reading level
  • Pass profileId → age/grade through session API and WebRTC prompt
  • Android smoke test on physical device
  • Fresh TestFlight build → owner child QA (waits, hears, no read-ahead)

Week 3 · Digital reading mode MVP

Sep 10 – Sep 16

  • Dashboard entry: third mode “Digital Reading”
  • Paste URL → backend article extraction → paginated text
  • Reuse ReadingPage + WebRTC tutor + auto page turn on 85% completion
  • Testable build for owner on iOS + Android (Share extension deferred)

Week 4 · Hardening + iterate

Sep 17 – Sep 23

  • Digital mode feedback loop from owner testing
  • COPPA: store:false on live voice path, PII out of logs
  • Disable TypeORM synchronize in production; subscription plan values
  • PDF import or Share extension — scope based on week 3 feedback

After week 4 · Pre-launch backlog

Sep 24+

  • Remote push (APNs + FCM), Apple App Store Server Notifications
  • Google Play content declarations, parental consent live verification
  • OpenAI model evaluation (§6.7)

From owner messages

Immediate owner priorities

These override generic handover ordering. P0 items block the child QA loop on TestFlight.

§4 AI tutor foundation

Open

Cherry-pick b0807d5 (VAD + Pause/Prompt/Praise) and 1264b1d (read-ahead ban) onto clean v4. Skip EAS experiments from ai-tutor-round1.

VAD is unified via getTurnDetection/applyTurnDetection — verify unmute keeps level-scaled wait time.

Beginner leniency 70–80%

Test

Wire textUtils.js strict mode to reading level. Accept ~70–80% for beginners; flag “could be improved” without forced re-read.

Beginners use lenient scoring at 70% pass; experts stay strict at 95%.

Pass age & grade to tutor

Test

Profile data exists in Redux. Mobile must send profileId to session API so backend and WebRTC prompt get age/grade.

Mobile now sends profileId on session create — verify age/grade appear in tutor prompt on device.

Backend read-ahead leak

Test · deploy

Fix openai.service.ts — remove full passage in instructions and first-word hint example (~line 70).

Instructions no longer embed passage text — deploy API and verify tutor waits for app text.

TestFlight baseline

Guidance

Ignore builds 18 (31) and 18 (33). Treat 18 (23) as stable. Build fresh from repo.

Do not debug owner EAS compile attempts.

Account access

Pending owner

Invites to Apple Developer, App Store Connect, Play Console, Google Cloud. Developer sends Apple ID + Google emails.

Blocks TestFlight push and Play Console work.

Third reading mode (Digital)

Design

Owner wants background mic + auto screen OCR while reading in other apps. Full auto not viable on iOS — see tiered options below.

Recommended: in-app reader + Share extension, not file upload UX.

This pass · 2 September 2026

In testing

Code-fixable handover bugs are implemented on the open PRs. Features, ops, legal, and device QA remain. Amber Test means: exercise on device / logs, then mark done.

lekture-mobile-app PR #1 (base v4) · lekture-api PR #1 (base v3)

  • 4.1
    Fix dual VAD values
    BugMobile PR
    Unmute used to reset wait to 1500ms / 0.5. Now applyTurnDetection() reuses the connect config. Verify after the tutor speaks: wait time stays at the level value.
    Test
  • 4.2
    Level-scaled silence + mic sensitivity
    BugMobile PR
    Beginner 4000ms / 0.3 · intermediate 3000ms / 0.35 · expert 2500ms / 0.4. Confirm a beginner profile gets a longer pause before the tutor talks.
    Test
  • 4.4
    Never read ahead (app prompt)
    BugMobile PR
    WebRTC practice prompt now forbids previewing upcoming words. Pause should get “take your time”, not the next word.
    Test
  • 6.4a
    Beginner leniency 70–80%
    BugMobile PR
    Scoring options follow reading level. Beginner: lenient match, 70% pass, gentle “could improve” up to 80%. Expert: strict, 95% excellent.
    Test
  • 6.4b
    Pass age/grade to tutor
    BugMobile PR
    profileId is sent on session create. Live WebRTC prompt also includes age and grade via setProfileContext. Confirm tutor vocabulary matches the child’s profile.
    Test
  • 6.4c
    Backend read-ahead leak
    BugAPI PR
    Server session instructions no longer embed the passage or a first-word hint. Needs API merge + deploy before production sessions change.
    Test · deploy
  • 6.2a
    Disable TypeORM synchronize in prod
    BugAPI PR
    synchronize is off when NODE_ENV=production. Confirm production boot does not auto-rewrite schema.
    Test
  • 6.2b
    Remove PII from logs (COPPA)
    BugAPI PR
    Auth, mail, weekly-report, purchase, and session logs no longer print passwords, parent emails, or child profile names. Grep logs after social login or cron.
    Test
  • 6.3c
    Subscription trial 7d / 150 pages
    BugAPI PR
    New signups get 7 days and 150 pages. Mobile trial banner/status now reads trialDaysRemaining / isTrial (was looking at wrong field names). Confirm on a new account after API deploy.
    Test · deploy
  • 6.5a
    Realtime voice tracing off
    BugAPI + Mobile PR
    Live Realtime sessions send tracing: null. OCR and mock-test GPT calls now send store: false. Needs API deploy for the Realtime path.
    Test · deploy
  • 7.4
    Exact line for realtime voice retention off
    BugAPI PR
    Same change as 6.5a — openai.service.ts session payload includes tracing: null.
    Test
  • —
    Push registration stub (dummy token)
    BugMobile + API PR
    App no longer POSTs dummy-token-*. API rejects those tokens. Real push is still 6.3a.
    Test
  • 2.4
    Apple sign-up crash / Hide My Email
    BugMobile + API PR
    Apple button is iOS-only. providerUserId is always the Apple user id. Returning users can log in without an email; first signup still needs the relay/email. Confirm on TestFlight with Hide My Email.
    Test

Section 4 + 6.4

AI tutoring behavior

Root defect confirmed

On connect: VAD is 2500ms / threshold 0.4. After tutor speaks and mic unmutes: resets to 1500ms / 0.5. Child gets less thinking time and a less sensitive mic for the rest of the session — exactly the handover bug.

Unified turn detection

Test

getTurnDetection() + applyTurnDetection(). Beginner 4000ms/0.3 · intermediate 3000ms/0.35 · expert 2500ms/0.4.

WebRTCService.js

Pause → Prompt → Praise

Not done

Full prompt ladder from behaviour spec. Smallest hint first; supply word only after two failed hints.

WebRTCService.js · b0807d5

Never read ahead

Test

Absolute ban on previewing upcoming words. “Keep going” without content leaks.

WebRTCService.js · 1264b1d

Natural tutor persona

Partial

Calm teacher tone, varied praise, per-sentence / per-page feedback modes.

WebRTCService.js

Reading level in prompt

Partial

setReadingLevel() injects level guidance into prompt.

WebRTCService.js

Beginner scoring tolerance

Test

70–80% acceptance band; summary flags “could be improved”.

textUtils.js · WebRTCService.js

Age/grade in tutor context

Test

Backend + mobile prompt use profile age and grade on session create and in the live WebRTC practice prompt.

RealTimeMode.jsx · openai.service.ts

Backend session leak

Test

Remove full-text injection and first-word example from server instructions.

openai.service.ts

Child QA on TestFlight

Blocked

Owner tests with child: waits, hears, does not read ahead.

Needs §4 + round-two + fresh build.

Product request

Digital Reading Mode

Owner vision: background mic, auto screen OCR, page-turn detection while child reads in Kindle, Safari, or any app — zero manual steps.
Reality: iOS blocks silent cross-app capture. We can still build a modern experience in tiers.

Recommended tiers (best UX we can ship)

Power mode

Tier 1 — Screen helper session

One broadcast tap per session (parent). Then auto page-turn via OCR on frames. Not per-page manual steps. Kindle DRM still blocked.

Android only

Tier 3 — Overlay assist

Floating tutor + MediaProjection. Closer to true background — requires explicit owner approval for Android-only feature.

Platform limits

iOS

  • ReplayKit Broadcast Extension — user taps “Start Broadcast” each session
  • 50 MB extension memory cap; no silent auto-start
  • Audio background mode keeps mic alive during session
  • Kindle / Apple Books often blank (DRM)

Verdict: One consent per session, then auto page-turn possible. Fully silent capture: no.

Android

  • MediaProjection + foreground service — persistent notification
  • Mic background more permissive than iOS
  • Frame diff for page turns possible but battery-heavy
  • DRM-protected surfaces may still fail

Verdict: Closer to background assist; still not invisible to the user.

Reading modes today

Live camera

RealTimeMode + Vision Camera OCR + WebRTC. Physical books.

Scan & read

Photo OCR → compiled book → ReadingPage. Manual scan steps.

Digital mode (new)

Approved. Week 3 MVP: URL paste + in-app reader + tutor. Share/PDF after owner test.

Handover doc §2–7

Full requirements matrix

Source of truth for the August 2026 work package. Each row: what it is, what’s wrong, who acts, and how to classify it.

Bug broken, wrong, or unfinished wiring of intended behavior Feature new capability not in the codebase yet Ops access, infra, forms, handover QA verify on device / staging Shipped already in app — inventory only Legal lawyer / owner sign-off Developer engineering Owner owner-only action Both split responsibility

Bug vs Feature: If data or APIs already exist but aren’t connected (age/grade, leniency, profileId), that’s a Bug. If nothing exists yet (remote push, Apple ASN, digital reader), that’s a Feature.

Phase 1 — Onboarding

  • 2.1
    Clone repos v4 / v3
    OpsDeveloper
    Get mobile and API source from NtelUpApps GitHub onto the correct default branches — foundation for all other work.
    Done
  • 2.2
    Understand stack (RN, WebRTC, NestJS)
    OpsDeveloper
    Map how camera OCR, Realtime voice, profiles, and the droplet-hosted API fit together before changing tutor behavior.
    Done
  • 2.3
    Local build setup
    OpsDeveloper
    yarn, Node 20.19.4, Android dev loop working on a physical device; iOS via EAS or Mac when needed.
    Partial
  • 2.4
    Physical iPhone test; sign-up crash
    BugDeveloper
    Owner saw a crash on sign-up in their EAS build — may be build-specific or a real Apple/Google Sign-In config bug; needs repro on a fresh build.
    Test
  • 3
    Account access invites
    OpsBoth
    Owner sends invites; developer accepts and confirms GitHub, Apple, Google Play/Cloud, DigitalOcean, OpenAI, and EAS access.
    Partial

Phase 3 — §4 AI tutor

  • 4.1
    Fix dual VAD values
    BugDeveloper
    Mic wait time resets from 2500ms to 1500ms after the tutor speaks — causes interruptions and missed quiet speech mid-session.
    Test
  • 4.2
    Level-scaled silence + mic sensitivity
    BugDeveloper
    Handover spec requires level-based VAD (beginner vs expert); code uses one-size values and overrides them worse after unmute — part of the same §4 fix as 4.1.
    Test
  • 4.3
    Pause/Prompt/Praise prompt
    FeatureDeveloper
    New tutoring protocol from behaviour spec — replaces generic prompt text; not a regression fix, net-new coaching rules.
    Open
  • 4.4
    Never read ahead rules
    BugDeveloper
    Tutor must not say upcoming words aloud — child was repeating the AI instead of decoding the page.
    Test
  • 4.5
    TestFlight + child validation
    QABoth
    Developer ships TestFlight build; owner tests with a real child — tutor waits, hears quiet speech, does not preview text.
    Open

Section 6.4 — Tutor round two

  • 6.4a
    Beginner leniency 70–80%
    BugDeveloper
    Scoring machinery exists but strict mode is hardcoded off — young/accented readers get marked wrong when they’re close enough to move on.
    Test
  • 6.4b
    Pass age/grade to tutor
    BugDeveloper
    Profile stores age and grade but mobile never sends profileId to the session API — tutor can’t adapt vocabulary to the child.
    Test
  • 6.4c
    Backend read-ahead leak
    BugDeveloper
    Server session instructions embed the full page text and a first-word hint example — primes the model to read ahead before app rules apply.
    Test

Section 6 — Security, subscriptions, launch

  • 6.1
    Rotate all secrets at handover
    OpsBoth
    Previous team had plaintext access to OpenAI, JWT, DB, SMTP, Apple .p8, and SSH — owner provides new secrets; developer rotates and deploys.
    Open
  • 6.2a
    Disable TypeORM synchronize in prod
    BugDeveloper
    Live DB schema auto-rewrites on every API boot — one bad deploy can corrupt production data; needs migrations instead.
    Test
  • 6.2b
    Remove PII from logs (COPPA)
    BugDeveloper
    Parent emails are written to application logs on social login and weekly report cron — privacy and COPPA violation risk.
    Test
  • 6.2c
    Replace hardcoded admin login
    FeatureDeveloper
    Admin dashboard uses a single shared account (admin@lekture.com) — no individual users, roles, or audit trail.
    Open
  • 6.3a
    Real remote push (APNs + FCM)
    FeatureDeveloper
    Not built — only local Notifee alerts and a dummy device token in DB. No Firebase/APNs, no server send path. Milestone reminders cannot reach users off-app.
    Not built
  • 6.3b
    Apple App Store Server Notifications
    FeatureDeveloper
    Google Play renewals/cancels are handled server-side; Apple subscriptions are client-only — renewals and refunds can desync.
    Not built
  • 6.3c
    Subscription plans (7d / 150·450·900 pages)
    BugDeveloper
    Product spec is 7-day trial and tiered page limits; code still runs test values (30 days, 10,000 pages).
    Test
  • 6.5a
    OpenAI store:false on live voice path
    BugDeveloper
    Zero-retention is set for level analysis but not confirmed on the child’s live Realtime voice session — COPPA data-retention concern.
    Test
  • 6.5b
    Verify parental consent on iOS social sign-in
    QABoth
    Consent modal exists in code — developer verifies flow on TestFlight iPhone; owner confirms it meets product/COPPA expectations.
    Unverified
  • 6.5c
    Parent email verification / legal review
    LegalOwner
    Social sign-in marks parent email verified without a verification email — whether that meets COPPA “verifiable parental consent” needs legal sign-off.
    Legal
  • 6.5d
    Google Play content declarations (12 pending)
    OpsBoth
    Play Console requires privacy, data safety, target audience, and related forms — developer supplies accurate answers; owner submits in Play Console.
    Open
  • 6.6
    Scaling (managed DB, backups, LB)
    OpsBoth
    App and PostgreSQL share one droplet with no autoscale — owner approves spend; developer implements when traffic requires it.
    Future
  • 6.7
    Evaluate newer OpenAI realtime models
    OpsDeveloper
    App uses gpt-realtime-2 + whisper-1 — check if newer models sound better, transcribe more accurately, or cost less before scaling usage.
    Open

Section 7 — Pending from previous team

  • 7.1
    Real Figma files / asset export
    OpsOwner
    Only a prototype link exists so far — owner must obtain from previous team; limits matching new UI to the original design system.
    Pending
  • 7.2
    Confirm push notifications work
    OpsDeveloper
    Handover question to previous team — closed by code audit: local Notifee only, dummy device tokens, no APNs/FCM. Real push is separate item 6.3a.
    Closed
  • 7.3
    Confirm 7-day / 150-page trial in deployed build
    QABoth
    Code shows test values (30d / 10k pages) — developer confirms in source; owner confirms on live/TestFlight build.
    Pending
  • 7.4
    Exact line for realtime voice retention off
    BugDeveloper
    Same gap as 6.5a — live Realtime voice path lacks confirmed store:false; developer must locate or add it for COPPA audit.
    Test
  • 7.5
    Which TestFlight build has consent gate
    OpsBoth
    Unknown which build first shipped the parental consent modal — check App Store Connect build history vs git tags.
    Pending
  • 7.6
    Cleaned git history force-pushed
    OpsOwner
    Previous team was supposed to remove committed secrets from history — owner confirms with previous team / GitHub.
    Pending
  • 7.7
    Written IP transfer on final payment
    LegalOwner
    Formal ownership transfer of code, designs, and assets — legal/handover dependency, not engineering.
    Legal

Approved add-on — Digital reading mode

  • DM
    Digital reading mode MVP (in-app reader)
    FeatureDeveloper
    Owner-approved week 3 work — URL paste, backend article extract, in-app reading with existing WebRTC tutor + auto page turn. Not in original handover numbering.
    Approved

Already built (inventory)

  • —
    Live camera + OCR + WebRTC tutor
    Shipped—
    Core product loop: point camera at book, on-device OCR, Realtime voice tutor listens and coaches pronunciation.
    Built
  • —
    Scan → OCR → ReadingPage flow
    Shipped—
    Photograph pages, compile a digital book, read pre-extracted text with the same tutor stack — manual scan steps.
    Built
  • —
    Profiles, level analysis, progress
    Shipped—
    Child profiles with reading level assessment, session history, goals, and weekly progress reporting.
    Built
  • —
    Local notifications (Notifee)
    Shipped—
    On-device alerts and scheduled notifications via Notifee — works locally only.
    Built
  • —
    Push registration stub (dummy token)
    BugDeveloper
    App registers fake device tokens with the API — implies push works but nothing can be sent. Fixed by building 6.3a.
    Test
  • —
    Apple + Google sign-in, consent UI
    Shipped—
    Social auth and consent modal exist in code — live verification still open (see 6.5b).
    Unverified
  • —
    IAP + Google RTDN
    Shipped—
    Google Play subscriptions with server-side RTDN — Apple server notifications still missing (see 6.3b).
    Partial
  • —
    Admin dashboard (lektureadmin)
    Shipped—
    React admin UI on the API droplet — functional but weak auth (see 6.2c).
    Built
  • —
    EAS / cloud iOS build pipeline
    Shipped—
    Expo EAS builds iOS without a Mac — baseline build 18 (23); ignore owner experiments 18 (31)/(33).
    Built
  • —
    TestFlight beta
    ShippedBoth
    Live TestFlight staging — developer builds; owner manages App Store Connect testers.
    Live

Recommended

Build order

1

Confirm account invites — GitHub done; Apple, Google, DO logins verified.

2

Security lockout P0 — SSH keys, disable root password, rotate OpenAI / JWT / DB / SMTP. Lock out previous team.

3

Cherry-pick §4 commits onto v4 — unified VAD, Pause/Prompt/Praise, read-ahead ban.

4

Fix backend read-ahead leak in openai.service.ts deploy.

5

Round-two tutor — leniency band, age/grade via profileId.

6

TestFlight build → owner child QA.

7

Digital reader MVP — URL paste, article extract, in-app reading + tutor + auto page turn.

8

COPPA + stability — store:false, PII logs, disable synchronize, plan values.

9

Pre-launch backlog — push, Apple ASN, Play declarations, Share/PDF extensions.

Sources

References

  • Lekture - New Developer Handover and Work Package.docx — August 2026
  • Owner messages — TestFlight baseline, tutor priorities, digital mode thread
  • Repo audit — lekture-mobile-app @ v4, lekture-api @ v3
  • Commits b0807d5, 1264b1d on ai-tutor-round1
  • Workspace AGENTS.md — dual-platform rule