Projects / Adaptive SAT
Adaptive SAT active
adaptive-sat · last seen 2026-07-23 20:59
Docs now PUSHED (updates prior status): owner ran ship.sh → PR #113 (d437cd8) merged to main — docs/BRD5_RESUBMISSION_2026_07_23.md + .gitignore asc_submission/. Working tree clean. Remaining from tonight: only #17 (REQ-13.11 cron 7 clean runs) — verify with the gcloud command in the comment on #17, close if clean. iOS submission still Waiting for Review (Apple email ~48h, auto-release on approval).
todo 9 open
Exam: within-module back/forward navigation + change answers + question navigator (Bluebook parity) — web AND mobile
high
Owner noticed the full exam has no back/forth between answered questions. Root cause: exam engine is forward-only by design. Backend get_next_exam_question serves the next UNSEEN question and immediately consumes it (status→ANSWERED); /answer records a single Attempt; no endpoint to re-fetch a prior question, change an answer, or list the module; ExamQuestionStatusEnum has only UNSEEN/ANSWERED/SKIPPED (no FLAGGED/REVIEW). Same limitation on WEB (frontend ExamSession.tsx) since it's the same backend — whole-product gap, not mobile-only. Real Digital SAT (Bluebook) allows free within-module navigation, changing answers, and a question navigator with mark-for-review until the module timer ends. SCOPE (multi-day, cross-cutting): backend — serve whole module, mutable per-question answers until module submit/timer, add flag/review state, add submit-module step (stop consume-on-serve); web+mobile — question navigator UI (grid + flags), Back/Next, module answer state, submit at module end. NOT an App Store blocker — sequence AFTER build 7 clears review. Refs: backend/app/services/exam_service.py (get_next_exam_question, submit_exam_answer), backend/app/models/exam_module_question.py, mobile/src/screens/ExamSessionScreen.tsx, frontend/src/app/pages/ExamSession.tsx.
backend/app/services/exam_service.pybackend/app/models/exam_module_question.pymobile/src/screens/ExamSessionScreen.tsxfrontend/src/app/pages/ExamSession.tsx
added 08-10 14:05
· by saravanan@scrumclaw.ai
· claude-cowork
from the conversationsaravanan: I need the option to go back and forth for the questions in the full test — why is it not enabled?
claude: Exam engine is forward-only (serves next UNSEEN, consumes it, one Attempt each; no revisit/flag) on web+mobile. Real feature to add; not an App Store blocker — do after build 7.
BUILT (full feature, per owner decision to include in the review build). Backend: migration 026 (exam_module_questions.selected_answer + flagged), GET /exam/module, POST /exam/flag, /answer now UPSERTs (mutable answers + fixes duplicate-Attempt bug) — backward compatible (old /next path untouched). Mobile (ExamSessionScreen) + Web (frontend ExamSession.tsx): whole-module load, Back/Next, change answers, mark-for-review flag, question-navigator grid, review-before-submit; timer/break/calculator preserved; web endExam also fixed to POST /exam/end. All verified: backend py_compile OK, mobile tsc exit 0, web tsc no new errors (only pre-existing TS6133 React-unused noise). NOT runtime-tested (no device/DB here). DEPLOY GATE: migration 026 MUST run (run-migrations) with/before the backend deploy or /answer + /module 500 on the missing column. Owner chose to bundle into the App Store review build without a separate QA pass (risk acknowledged). Files: backend/app/{services/exam_service.py,api/routes/exam.py,schemas/exam.py,models/exam_module_question.py}, alembic/versions/026_exam_answer_flag.py, mobile/src/{screens/ExamSessionScreen.tsx,api/client.ts}, frontend/src/app/{pages/ExamSession.tsx,api/client.ts}.
RESOLVED prod outage: after PR #117 deployed the new exam model, Start Exam 500'd because migration 026 hadn't run. Root cause of the migration failures: run-migrations.yml PROJECT_ID still pointed at the old GCP project (prj-crypto538-prod-260529) — fixed to prediction-383914 in PR #118, and the CI service account was missing secretmanager.secretAccessor on adaptive-sat-database-url (+ cloudsql.client on the crypto instance) — granted. Migration then ran successfully (025 -> 026), columns selected_answer + flagged now exist in prod. Exam start unblocked. Follow-up option: add `alembic upgrade head` to deploy-backend.yml so migrations auto-run on deploy and this can't recur.
Web exam highlighter shipped (PR #119, frontend deploy): ExamSession now uses the full PassageHighlighter (two-pane Bluebook layout via splitPassageStem — passage+highlight left, stem+choices right) for RW questions, single-column fallback for math/non-splitting items. Parity with PracticeSession. tsc clean. Web-only (no migration, doesn't affect mobile build). Note: mobile exam highlighter is the simpler tap-a-word style; could later be upgraded to the richer drag-select+notes version if desired.
PREVENTION wired: deploy-backend.yml now runs `alembic upgrade head` (Cloud SQL Auth Proxy → prediction-383914 secret, crypto-project instance) between build and Cloud Run deploy — build → migrate → deploy. A failed migration blocks the deploy, so new code can't serve against an un-migrated schema (the 026 outage can't recur). Uses the CI SA grants added earlier (secretAccessor + cloudsql.client). run-migrations.yml stays as the manual escape hatch. YAML validated.
iOS 2nd rejection (2026-07-24) remediation → build 7 resubmit
high
Apple rejected build 6 (reviewed on iPad Air M3, iPadOS 26.5.2). Four items. CODE FIXES DONE (mobile, typecheck clean, not yet committed/built): (1) 3.1.2(c) MobilePaywall now has tappable Terms of Use (EULA) + Privacy Policy links and shows title/length/price; (2) 2.1(b) SettingsScreen has a visible 'Upgrade to Premium' row opening the paywall so reviewers can locate the IAP; (3) 2.1(a) ExamStartScreen adds a 30s timeout + clear retry error so 'Start Exam' can't silently hang. ASC METADATA DONE: EULA link added to App Description (saved), Privacy Policy URL confirmed (adaptivesat.ai/privacy). PENDING (owner): check/top-up OpenAI credits (prime suspect for the iPad 'Start Exam did nothing' hang) and retest on iPad; commit+push mobile changes via ship.sh; new EAS production build (build 7); fresh screen recording (Start Exam works + Settings→Upgrade to Premium paywall + sandbox purchase); paste reply (asc_submission/apple_reply_draft.md) in Resolution Center; resubmit app+subscription+group together. Refs: MobilePaywall.tsx, SettingsScreen.tsx, ExamStartScreen.tsx.
mobile/src/components/MobilePaywall.tsxmobile/src/screens/SettingsScreen.tsxmobile/src/screens/ExamStartScreen.tsxasc_submission/apple_reply_draft.md
added 07-25 04:08
· by saravanan@scrumclaw.ai
· claude-cowork
from the conversationsaravanan: [pasted Apple's 2nd rejection: 3.1.2c EULA, 2.1a Start Exam no action on iPad, 2.1b can't find IAP]
claude: Made the 3 code fixes + ASC EULA link; remaining = OpenAI check + build 7 + recording + resubmit with reply.
ROOT CAUSE found for 2.1(a): "Start Exam did nothing" was NOT primarily OpenAI credits — it was slowness. exam_service.build_module_blueprint builds 27 questions synchronously at start, and get_question_for_exam GENERATES a question live (OpenAI + judge, ~5-15s each) the moment a specific skill+difficulty cell is empty in the bank, instead of first checking other bank cells. Thin cells → many live generations → 60s+ wait with no UI feedback → reviewer saw "nothing". (User topped up OpenAI and exam then "loaded after a while" — confirms slow-not-broken.) FIX (backend, exam-only, deploys via ship.sh→deploy-backend.yml): _get_exam_question_with_fallbacks now scans the ENTIRE existing bank first (bank-only pass, no OpenAI) and only generates as a last resort → start is near-instant when the bank has ~27 usable RW questions. FIX (mobile): ExamStart timeout 30s→60s + "Building your exam…" loading message so it never looks frozen. Both compile/typecheck clean. Residual risk: if the RW bank is genuinely thin (<27 usable), Pass-2 generation still runs — would need bulk question generation to fully de-risk. Files: backend/app/services/exam_service.py, mobile/src/screens/ExamStartScreen.tsx.
NEW BUG found in on-device testing (build with #115): pressing "Exit" during an exam → confirm popup → stayed on the same page. Cause: there was no end/abandon endpoint; mobile api.endExam faked it by LOOPING advanceExam until non-ACTIVE, which builds all 3 remaining modules (81 questions) just to quit (very slow), and handleEndExam swallowed any error silently → stuck. FIX (uncommitted, deploys via ship.sh→deploy-backend.yml): new backend POST /api/exam/end + exam_service.abandon_exam() that calls _finalize_exam (scores from answers so far, sets session ENDED) WITHOUT building remaining modules → instant exit; mobile api.endExam now calls it once then getExamResult; handleEndExam now shows an Alert on failure instead of silently sticking. py compile + tsc clean. Files: backend/app/api/routes/exam.py, backend/app/services/exam_service.py, mobile/src/api/client.ts, mobile/src/screens/ExamSessionScreen.tsx. Sequencing: push (backend endpoint deploys) BEFORE building build 7, so the new mobile endExam isn't calling a 404.
Ship Android to Google Play — build config DONE; account/store/parity pending
high
Was deferred; now started. Same Expo codebase as iOS. DONE in code/config: eas.json Android build profiles (APK dev/preview, AAB production) + submit track:internal; app.json android block already complete (package com.hopewellpartners.adaptivesat, adaptive icon, App Links intent filters) — no change needed (appVersionSource:remote manages versionCode). Apple Sign-In correctly iOS-gated; Google sign-in works on Android. PENDING (owner): Google Play Developer account ($25); `eas build --platform android --profile preview` then production AAB; Android OAuth client (SHA-1 → add to GOOGLE_OAUTH_CLIENT_IDS); App Links assetlinks.json (SHA-256) on adaptivesat.ai; Play Console listing + IARC content rating (teen audience) + Data Safety + privacy URL; service account + eas submit. Follow-ons: Google Play Billing IAP (source='google' already supported), FCM push (deferred). Full steps: docs/ANDROID_PLAY_STORE_RUNBOOK.md.
docs/ANDROID_PLAY_STORE_RUNBOOK.mdmobile/eas.jsonmobile/app.json
added 06-22 03:03
· by saravanan@scrumclaw.ai
· claude-cowork
Deploy nightly question-quality audit cron and confirm 7 consecutive clean runs (REQ-13.11)
high
BRD v3.0 REQ-13.11 is Pending Deploy. Runbook with ready-to-paste gcloud commands exists; needs the Cloud Scheduler job created and 7 days of error-free runs to close the acceptance.
docs/QUESTION_QUALITY_CRON_SETUP.mddocs/BRD_V3_TRACKER.md
added 06-13 11:14
· by saravanan@scrumclaw.ai
· claude-cowork
Verification attempted 2026-07-23 but BLOCKED: this Cowork sandbox has no gcloud/DB/console access, so the run history can't be read from here — run from an authed env. Check for 7 consecutive successful nightly runs (REQ-13.11):
gcloud logging read 'resource.type="cloud_scheduler_job" AND resource.labels.job_id="question-nightly-audit"' --project=prediction-383914 --freshness=10d --limit=30 --format='table(timestamp, jsonPayload.status, httpRequest.status)'
Job: question-nightly-audit (prediction-383914 / us-central1), runs 09:00 UTC daily, hits https://api.adaptivesat.ai/api/notifications/cron/nightly-question-audit. Need 7 consecutive HTTP 200 / no-error invocations; window starts at first successful run, not job creation. Runbook: docs/QUESTION_QUALITY_CRON_SETUP.md. If 7 clean → close this item.
Mobile exam: add passage highlighting (parity with web PassageHighlighter, REQ-9.2)
Web has frontend/src/app/components/PassageHighlighter.tsx (Bluebook-style select-to-highlight + per-highlight notes, char-offset ranges). Mobile ExamSessionScreen renders question_text as a plain <Text> (line ~503) with no highlight/annotate. Gap noticed by owner while testing the full exam on mobile. Non-trivial in RN: no DOM selection; needs a custom passage renderer (tappable/selectable spans → highlight ranges), persisted per-question highlights, optional notes, erase/clear. NOT an App Store blocker — sequence AFTER the build-7 resubmission clears review. Ref: mobile/src/screens/ExamSessionScreen.tsx, frontend/src/app/components/PassageHighlighter.tsx.
mobile/src/screens/ExamSessionScreen.tsxfrontend/src/app/components/PassageHighlighter.tsx
added 07-27 21:18
· by saravanan@scrumclaw.ai
· claude-cowork
IMPLEMENTED for build 7 (per owner decision to include in this build). Mobile RN approach = word-level tap-to-highlight (no DOM select in RN): new mobile/src/components/PassageHighlighter.tsx (tokenizes passage, tap a word to highlight, Highlight/Erase/Clear toolbar, yellow bg; ephemeral per question, keyed by question_id). Wired into ExamSessionScreen for RW questions only (math renders plain text). tsc clean. Notes/drag-select deferred (web has notes; mobile v1 is highlight+erase+clear). Pending: ship + on-device test. Not yet committed (in the same uncommitted batch as the backend bank-first exam fix).
Technical debt: test enforcement + quality gates + silent-failure/dead-code cleanup
Consolidated tech-debt item (full register: docs/TECH_DEBT.md). Verified against the repo after a whitebox gate report (run 61e7d93e, commit 11639ae) whose own scores were unreliable. Sev1 (test enforcement): backend 51 pytest files but conditional-skip → no-op in CI (seed DB + key/mock); frontend+mobile have 0 unit tests; tsc --noEmit + lint not required PR checks (TS6133 noise). Sev2 (silent failures): bare except:pass in exam_service.py:175/194 + note_service.py:278; insights_service.py:479 most_improved/needs_attention hard-coded None (parent digest degrades). Sev3 (gates): no pre-commit secret scanning (gitleaks), no npm audit/pip-audit in CI. Sev4 (cleanup): delete mobile/App.tsx.full duplicate; remove dead comingSoon/*_ENABLED branches. Sequence Sev1→4; each ships as a small PR. No feature impact.
docs/TECH_DEBT.mdbackend/app/services/exam_service.py:175backend/app/services/insights_service.py:479mobile/App.tsx.full
added 06-22 02:17
· by saravanan@scrumclaw.ai
· claude-cowork
Run deferred QA walkthroughs once shipped: Rush (15.8), Vocab mastery (18.7), Planner scratch→dashboard (19.6), dashboard <500ms p50 (14.8), report→queue→DELETE (13.10)
These BRD v3.0 acceptance items are code-complete but marked Ready for QA / Pending QA — manual walkthroughs and the prod p50 latency measurement were deferred until ship.
docs/BRD_V3_TRACKER.md
added 06-13 11:14
· by saravanan@scrumclaw.ai
· claude-cowork
[Phase TBD] Add iPad support for iOS app (deferred — not required for initial launch)
low
Per decision on 2026-06-13, iPad support is not required for the initial App Store submission (iPhone-only). Revisit in a future phase: iPad layout/adaptivity pass + iPad screenshots in App Store Connect. No target date.
docs/BRD5_PHASE_5A_5B_NOTES.md
added 06-13 11:19
· by saravanan@scrumclaw.ai
· claude-cowork
Implement real PDF score-report parser (REQ-19.7, currently stub + manual entry)
low
BRD v3.0 REQ-19.7 is Deferred. A stub parser ships with manual-entry fallback so users aren't blocked; the real ≥90%-extraction PDF parser is outstanding.
docs/BRD_V3_TRACKER.md
added 06-13 11:14
· by saravanan@scrumclaw.ai
· claude-cowork
note 1 open
#20 Ask AI Tutor (REQ-20.1–20.7) deferred to v3.1 per decision D6
low
All 7 Ask AI Tutor requirements are intentionally Deferred (decision D6, 2026-05-17). v3.0 scope is 13 enhancements (#9–#22 minus #20), 108 in-scope REQs. Tracking as a note so it isn't mistaken for unplanned work.
docs/BRD_V3_TRACKER.md
added 06-13 11:14
· by saravanan@scrumclaw.ai
· claude-cowork
Add item
Recently completed
Configure + ship native iOS IAP (RevenueCat) — code done, account/config + sandbox test pending
todo
done 07-23 20:56
· by saravanan@scrumclaw.ai
iOS App Store resubmission: ASC metadata fix + EAS production rebuild + screen recording
todo
done 07-23 20:56
· by saravanan@scrumclaw.ai
Collect 50-question sample to confirm zero named-entity hallucinations (REQ-13.9)
todo
done 06-28 03:42
· by saravanan@scrumclaw.ai
Migrate AdaptiveSAT off shared GCP project prj-crypto538-prod-260529 into its own project
todo
done 06-27 05:30
· by saravanan@scrumclaw.ai
Finish Predicted Tests Pro upgrade-flow routing — replace "Pro coming soon" alert (REQ-17.3)
todo
done 06-20 01:23
· by saravanan@scrumclaw.ai
Seed 20 hand-authored d5 questions (10 Math + 10 R&W) into question_bank as APPROVED
todo
done 06-19 16:33
· by saravanan@scrumclaw.ai
Verify subscription flow in Stripe Test mode, then switch to Live mode
todo
done 06-16 00:32
· by saravanan@scrumclaw.ai
Create 3 GCP secrets + IAM grant for Stripe keys, then ship Bundle F (deploy wiring)
todo
done 06-15 19:10
· by saravanan@scrumclaw.ai
Stripe go-live setup: create product/price, enable Tax, activate Customer Portal, create webhook endpoint
todo
done 06-15 19:10
· by saravanan@scrumclaw.ai
Fix "math questions appearing in Reading & Writing" — exam header section-label desync
todo
done 06-13 13:28
· by saravanan@scrumclaw.ai
Decide iPad support for iOS submission (open) — blocks iPad screenshots in App Store Connect
decision
done 06-13 11:19
· by saravanan@scrumclaw.ai
Log
activeDocs now PUSHED (updates prior status): owner ran ship.sh → PR #113 (d437cd8) merged to main — docs/BRD5_RESUBMISSION_2026_07_23.md + .gitignore asc_submission/. Working tree clean. Remaining from tonight: only #17 (REQ-13.11 cron 7 clean runs) — verify with the gcloud command in the comment on #17, close if clean. iOS submission still Waiting for Review (Apple email ~48h, auto-release on approval).
d437cd8
· saravanan@scrumclaw.ai
from the conversationsaravanan: item 1 done [ran ship.sh] — what about project tracker update from your side?
claude: Confirmed PR #113 (d437cd8) on main; posted this tracker update marking docs shipped, only #17 verification left.
activeiOS resubmission SHIPPED 2026-07-23: one App Review submission bundling app v1.0 build 6 + Premium Annual subscription + AdaptiveSAT Premium subscription group — status Waiting for Review (~48h, auto-release on approval). Rejection fixes: SIWA (4.8), age rating Parental Controls→None=4+ (2.3.6), account-delete + screen recording (5.1.1v). Closed tracker #22 (resubmission) and #34 (native IAP). Documented in docs/BRD5_RESUBMISSION_2026_07_23.md (+ .gitignore asc_submission/); NOT yet pushed — no git creds in sandbox, owner runs `rm -f .git/index.lock && ./scripts/ship.sh "..."`. #17 (REQ-13.11 cron 7 clean runs) could NOT be verified from sandbox (no gcloud) — see comment on #17.
· saravanan@scrumclaw.ai
from the conversationsaravanan: Do the resubmission now ... then close #22/#34 ... good night, update tracker on status.
claude: Submitted app+sub+group together (Waiting for Review); closed #22 & #34; #17 verification needs gcloud from your env.
activeSession wrap 2026-07-01 — iOS monetization + Apple auth + a production exam bug.
IOS IAP (BRD #8 follow-on) — fully wired end-to-end (config, not just code):
• App Store Connect: created subscription group "AdaptiveSAT Premium" + auto-renewable sub product `com.adaptivesat.premium.annual`, $9.99/yr across 175 countries, English localization, and a 7-day free-trial introductory offer (Jun 2026–Jun 2027). Paid Apps agreement confirmed Active. (Review screenshot still needed at submission time.)
• RevenueCat: project + App Store app (bundle com.hopewellpartners.adaptivesat, .p8 IAP key uploaded by owner), entitlement `premium`, product, default offering ($rc_annual → App Store product), webhook → https://api.adaptivesat.ai/api/billing/revenuecat/webhook (auth secret in GCP `adaptive-sat-revenuecat-webhook-auth`, wired into deploy-backend.yml; webhook verified 401→live).
• Repo: appl_ SDK key in eas.json (PR #100); ascAppId corrected 667811167→6766082796 (was the team id — would’ve broken eas submit). Kept the existing custom MobilePaywall (chose not to adopt RevenueCat prebuilt Paywalls/Customer Center). Decision recorded: the pasted “integrate SDK” prompt was RevenueCat’s generic one — SDK already integrated; ignored its test_ key + placeholder ids.
Sign in with Apple — was missing on the new backend after migration:
• iOS native fixed: APPLE_OAUTH_AUDIENCES=com.hopewellpartners.adaptivesat added to deploy-backend.yml env.
• Web SIWA enabled (owner wanted it — Mac/US users): created Apple Services ID com.hopewellpartners.adaptivesat.web (domain adaptivesat.ai + return URL /auth/apple/callback), frontend VITE_APPLE_SERVICE_ID set (PR #103), backend audience appended (…,…adaptivesat.web). No SIWA private key needed (client id_token flow verified against Apple JWKS).
Predicted Tests discoverability (real gap the owner caught): the Premium paper hub had NO UI entry point on web or mobile (URL-only). Fixed: web top-nav + mobile-web menu link (PR #105); iOS Dashboard card (PR #106, ships next build).
PROD BUG — “Failed to start exam” (browser 503 → actually 500): root cause = OpenAI account out of quota (429 insufficient_quota) during on-the-fly question generation in exam start. NOT migration-related. Fixes: PR #107 (exam-start survives generation failures → falls back to existing bank questions, clean 400 instead of 500), #108 (email the owner on quota exhaustion, throttled hourly; openai_alert_email default saravanan.hp@gmail.com / OPENAI_ALERT_EMAIL), #109 (missing `import time` that re-crashed it), #110 (quota cool-down so it fast-fails instead of hanging ~60s). VERIFIED: exam/start now returns 200 (session created) building entirely from the existing bank — OpenAI credits now OPTIONAL (only needed for fresh/no-repeat generation). Owner got the alert email.
Also earlier this session: retired old backend (deleted adaptive-sat-api in prj-crypto538); DB pw rotation deferred (shared role); tracker items #37 (migration) + #18 (REQ-13.9) closed; REQ-13.11 cron clock running (reminder set for Jul 4).
OPEN / NEXT: (1) Task “iOS sandbox purchase test” — owner needs a fresh EAS preview build (has appl_ key + Predicted Tests card) + a Free test account (early-member accounts bypass the paywall) + sandbox Apple ID. (2) ASC subscription review screenshot before submission. (3) Top up OpenAI whenever (optional). (4) Rotate the migration GitHub PAT. (5) Android Play Store, iOS resubmission still pending per prior items.
· saravanan@scrumclaw.ai
from the conversationsaravanan: [exam/start test] 200 9.5s — session created. I received an email as well.
claude: 200 = exam works, built entirely from the existing bank; OpenAI credits now optional. Root cause was OpenAI quota exhaustion, now graceful (resilience + email alert + cool-down). Wrapping.
saravanan: yes wrap
activeSession wrap 2026-06-27. Closed the accuracy phase. (1) REQ-13.11 nightly quality cron DEPLOYED in prediction-383914 → api.adaptivesat.ai (both Scheduler jobs live + verified 2xx; 7-day clock running, closes ~2026-07-04; reminder scheduled for July 4 to verify + flip to Done). (2) REQ-13.9 DONE (item #18 closed): nightly audit re-judged all 48 served questions through the fact_safe gate — {"sampled":48,"failed_judge":0,"queued":0} = zero named-entity hallucinations; owner accepted the served-only sample (306 live-but-unserved questions get audited as they accrue attempts). Docs corrected post-migration: cron runbook (PR #97), BRD_V3_TRACKER (PR #98), IAP runbook (PR #99). NEXT (owner-gated, paused by request): mobile monetization — #34 iOS IAP config (ASC sub + .p8 key, RevenueCat project/entitlement 'premium'/offering/webhook, then wire REVENUECAT_WEBHOOK_AUTH secret line + EXPO_PUBLIC_REVENUECAT_IOS_KEY in eas.json) → #22 iOS resubmission → #36 Android. All code shipped/dormant; remaining work is Apple/RevenueCat/Google account actions only the owner can do.
· saravanan@scrumclaw.ai
activeREQ-13.11 nightly question-quality cron DEPLOYED (2026-06-27). Both Cloud Scheduler jobs created in the NEW project prediction-383914 pointing at api.adaptivesat.ai: question-wrong-rate-flag (daily 10:00 UTC) and question-nightly-audit (nightly 09:00 UTC). Enabled cloudscheduler.googleapis.com in the new project; admin key confirmed present. Verified: wrong-rate manual run = 200; nightly-audit first scheduled run (09:00 UTC) returned 2xx (status {}). The 7-consecutive-clean-runs acceptance clock for REQ-13.11 starts now — closes ~2026-07-04 if no errors. Runbook corrected to the new project + stable domain (PR #97). Remaining on item #17: confirm 7 consecutive clean runs, then mark REQ-13.11 Done.
· saravanan@scrumclaw.ai
activeGCP project migration fully closed out. AdaptiveSAT now runs entirely on its own project prediction-383914: backend on Cloud Run behind stable api.adaptivesat.ai, frontend on the new Firebase site serving adaptivesat.ai, CI (deploy-backend/frontend) retargeted to the new project. DB kept in place in prj-crypto538 and reached cross-project (cloudsql.client grant + --add-cloudsql-instances). Stripe webhook repointed to api.adaptivesat.ai AND the pre-existing 500 bug fixed (PR #90: process raw JSON dict since stripe-python StripeObject dropped dict .get(); read current_period_end from items fallback) — subscription rows now write; test user confirmed status=active. Mobile config + eas.json on the stable domain (PR #95). Old Cloud Run service adaptive-sat-api deleted from prj-crypto538; api.adaptivesat.ai still 200 after. DB password rotation DEFERRED by decision (shared adaptive_app role). Only loose end: revoke the migration GitHub PAT. Checklist closed out in docs/MIGRATION_CUTOVER_CHECKLIST.md (PR #96).
· saravanan@scrumclaw.ai
from the conversationsaravanan: deleted and run - but got 200
claude: old backend gone; api.adaptivesat.ai 200 is the NEW backend answering — clean retirement.
saravanan: lets keep the password same - my other connections will fail
claude: agreed, adaptive_app is shared; skipping rotation. push updates to tracker.
activeNative iOS IAP (RevenueCat) build SHIPPED + dormant. Code merged to main via ship.sh; migration 025 applied in prod (Run-migrations workflow, success); webhook route live and returns 503 until configured (correct dormant state). Predicted Tests Pro routing finished (REQ-17.3 Done): web Paywall, iOS native RevenueCat paywall, Android web-fallback. Docs updated: BRD8_TRACKER (operational done + IAP follow-on), BRD8_SUBSCRIPTION_SPEC §17, BRD_V3_TRACKER (REQ-17.3 + changelog), IAP_SETUP_RUNBOOK.md. Remaining (owner): App Store Connect product + RevenueCat config + GCP secret + deploy-backend.yml line + EAS build + sandbox test (item #34).
· saravanan@scrumclaw.ai
idleSession wrap. Done this session: (1) math-in-reading bug fixed + shipped (PR #83) — exam-header section-label desync, not a data bug; (2) BRD #8 Subscriptions fully LIVE — Stripe setup, GCP secrets, Bundle F (PR #84), passing trial-signup smoke test; (3) seeded 20 hand-authored+self-judged d5 questions (10 Math/10 R&W) APPROVED via scripts/seed_d5_claude_questions.sql (tag source_model='claude-d5-v1'). Open follow-ups: in-app symbol-render spot-check of the d5 batch; optional save as JSON seeds. Top remaining items: #17 nightly quality cron, #22 iOS resubmission, #19 Predicted Tests Pro routing.
· saravanan@scrumclaw.ai
activeSession wrap: (1) Math-in-reading bug fixed + shipped (PR #83) — was an exam-header section-label desync, not a data bug. (2) BRD #8 Subscriptions fully LIVE — Stripe setup, GCP secrets, Bundle F deploy (PR #84), live trial-signup smoke test passed (7-day free trial before first charge). Items #14/#15/#16 closed. User chose to let the test subscription's first charge happen in ~7 days and sort it out then.
· saravanan@scrumclaw.ai
doneBRD #8 Subscriptions COMPLETE — live checkout smoke test passed end-to-end (signup → Stripe Checkout → payment → webhook). All three go-live items (#14 Stripe setup, #15 GCP secrets + Bundle F deploy, #16 verify/live) closed. Billing live in production.
· saravanan@scrumclaw.ai
activeBRD #8 billing LIVE. Stripe dashboard (Live mode) set up: product AdaptiveSAT Premium $9.99/yr, Tax on (origin Frisco TX), Customer Portal active, webhook with 6 events. 3 Stripe secrets in GCP Secret Manager + IAM. Bundle F (deploy-backend.yml secrets wiring) merged via PR #84, backend deployed. Webhook endpoint returns 400 (signature verify active) = endpoints off 503. Remaining: end-to-end live checkout smoke test (item #16).
· saravanan@scrumclaw.ai
idleProject initialized: Adaptive SAT
· saravanan@scrumclaw.ai