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 8 open
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