Pre-flight checks before publishing a StudyHabit release (Android APK + Windows installer + backend + web).
-
cd backend && npx tsc --noEmitpasses. -
cd backend && npm run buildsucceeds. -
npx prisma migrate deployapplies cleanly against a fresh database (verifies the migration history inbackend/prisma/migrations/). -
npx prisma migrate statusshows no pending/drifted migrations on the production DB. - Secrets (
DB_PASSWORD,JWT_SECRET) sourced from the secret manager — not from a checked-out.env. SeeSECURITY.md. -
CORS_ORIGINset to the production web origin (not*). -
npm audit --productionreviewed for new advisories.
-
cd web && npm run lintpasses. -
cd web && VITE_API_URL=<prod url> npm run buildsucceeds. (A production build fails ifVITE_API_URLis unset — this is intentional, to avoid shipping a SPA that points at localhost.) - Keyboard-only walkthrough of dashboard / subjects / settings / a modal (Tab, Shift+Tab, Escape on open dialog).
- axe-core browser check on the main pages.
-
flutter analyzepasses. -
flutter build apk --releaseproduces a signed APK. - Foreground service (Pomodoro timer) survives backgrounding on Android 14+.
- A crafted settings-import JSON that sets
sync.serverUrlis rejected (import key whitelist).
-
flutter build windows --releasesucceeds. - Window title is "Study Habit" and cannot be resized below 450×600.
- Code-sign
studyhabit.exeand the Inno Setup installer with an Authenticode certificate (currently a TODO — seeSECURITY.md). Unsigned builds trigger SmartScreen. -
installer.issAppVersionmatchespubspec.yaml(CI does this automatically; verify for manual builds).
- The version-bump commit does not force-push (no
--force). - Android and Windows jobs report the same
versionCode. -
flutter analyzepasses in CI without the removedsed custom_lintstep.
- GitHub Release created with both artifacts.
- If secrets were rotated, confirm refresh-token flow still works.