Skip to content

Dev#58

Open
navidshad wants to merge 22 commits into
mainfrom
dev
Open

Dev#58
navidshad wants to merge 22 commits into
mainfrom
dev

Conversation

@navidshad

@navidshad navidshad commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

📋 Summary

This PR includes various fixes and features mainly focused on analytics instrumentation, UI improvements, and system enhancements. Key updates are:

  • Fix guarding pricing-page_viewed tracking to avoid aborting subscription page mount without a Mixpanel token.
  • Add wiring for account_created, first-save, and pricing-page analytics, along with enriching Stripe lifecycle events.
  • Replace Leitner end-of-session alert with a PilotUI modal toast and use real review RPCs.
  • Implement Pool system improvements including queue encoding, routing, age-out, and settings UI enhancements.
  • Enhance review items to return confirmed chunk and source sentence for level 3+ fill-in reviews.
  • Show dashboard version globally in footer and gate dashboard release on unit tests.

🔗 Related Tasks

#86exkh107 - Instrumentation activation funnel trial to paid
#86exnxphy - Replace Leitner end-of-session alert with a PilotUI modal toast
#86exnxp4t - Pool system: Forgot 2 Pool routing, data model, age-out, settings persistence
#86exnxpez - Pool system board/settings surfaces
#86exnxph5 - Update get review bundle return confirmed chunk and source sentence for L3+ fill-in
#86exqazkq - Show versions on both dashboard and extension

📝 Additional Details

  • Added .playwright-mcp directory to .gitignore to prevent committing test artifacts.
  • Updated documentation to require ClickUp task IDs in commit subjects and PR titles.
  • CI now gates dashboard release on passing unit tests to improve release reliability.

📜 Commit List

  • 71cf5e0 fix: guard pricing-page_viewed track so a token-less Mixpanel can't abort the subscription page mount #86exkh107
  • 5f49c7c feat: wire account_created, first-save & pricing-page analytics + enrich Stripe lifecycle events #86exkh107
  • 9543401 fix(leitner): use real review RPCs and replace end-of-session alert with pilotui modal #86exnxphy
  • d5e35bc style(settings): tabbed Study settings page + study nav terminology
  • f6ebc1d feat(pool): Pool encode queue, Forgot×2 routing, age-out, and board/settings surfaces #86exnxp4t #86exnxpez
  • 2856a3b feat(leitner): return confirmed_chunk + source_sentence on review items for L3+ fill-in #86exnxph5
  • 5a8e246 docs: correct stale "release automation not wired up" note in CLAUDE.md #86exqazkq
  • 7228660 ci: gate dashboard release on unit tests before publishing #86exqazkq
  • ea095dc docs: require ClickUp # in commit subject and PR title #86exqazkq
  • 8e58fb5 feat: show dashboard version in a global footer #86exqazkq

navidshad and others added 22 commits June 19, 2026 19:46
Stand up a semantic-release pipeline (mirroring the extension's) that owns
the dashboard version in frontend/package.json, expose it to the SPA via
Nuxt runtimeConfig, and render it in a global footer on every authenticated
page.

- frontend/package.json: name, version placeholder, release scripts, and
  semantic-release devDeps
- frontend/release.config.cjs: dual changelog, main + dev-prerelease, runs
  from frontend/ so @semantic-release/npm bumps frontend/package.json
- .github/workflows/release.yml: release-only job on push to main/dev
- frontend/nuxt.config.ts: bake APP_VERSION from package.json into
  runtimeConfig.public
- AppVersionFooter.vue wired into the DashboardShell #footer slot, with an
  app.version i18n string

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…azkq

Document the convention in CLAUDE.md's Commits & versioning section:
append the bare ClickUp task id as `#<taskId>` to the commit subject and
the PR title (so it survives a squash-merge into dev). The Conventional
Commits type prefix still drives the semver bump.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The release job ran `yarn release` with nothing verifying first, so a push
to main/dev with failing tests could still cut a version. Add a `yarn test`
step before the Release step. E2E is left out (needs Playwright browsers +
a live backend); PRs already run the full suite via test.yml.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…md #86exqazkq

This PR's feat commit wires up semantic-release for the frontend, so the
existing blockquote claiming no release automation exists is now false and
would mislead future contributors. Update it: frontend release automation
is live (release.config.cjs, release.yml, versioned frontend/package.json);
the server remains unversioned (0.0.0, no pipeline).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…-both-dashboard-and-Exension_Navid-Shad

feat: show dashboard version in a global footer #86exqazkq
# 1.0.0-dev.1 (2026-06-19)

### Bug Fixes

* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y clear toasted activity card after session completion ([faf73fb](https://github.com/codebridger/subturtle-dashboard-app/commit/faf73fbe9cf05475c029516e862ea87161e8150e)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y fix toggle active color and persist bundle selection when box filtering ([14502c4](https://github.com/codebridger/subturtle-dashboard-app/commit/14502c4224cf794f09d8790cc958b2105d587611))
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y refactor to content/gap row pattern for correct centering ([707651e](https://github.com/codebridger/subturtle-dashboard-app/commit/707651ea993a5a2d1b90fe194f6a380f125c5ca9)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y resolved HourSelector overlap issue ([018bd5d](https://github.com/codebridger/subturtle-dashboard-app/commit/018bd5d26a640577e11bac8b78b994ad2f65e0fb))
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y verify and optimize Leitner auto-entry in phrase triggers ([9a4acf2](https://github.com/codebridger/subturtle-dashboard-app/commit/9a4acf2e008b8d2bba617312a4e6f7dd845a7791)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exgqfpu stabilize auth lifecycle and fix logout button ([7810302](https://github.com/codebridger/subturtle-dashboard-app/commit/78103029804980041fb4c0de032a03b9af1c6763))
* add null check for transcript before updating conversation dialogs and live session record ([8c0e95c](https://github.com/codebridger/subturtle-dashboard-app/commit/8c0e95cad63017e09ed1a336c560a7728ba53ca6))
* **analytics:** align Stripe lifecycle events with the metrics plan ([2f8f0e0](https://github.com/codebridger/subturtle-dashboard-app/commit/2f8f0e053cff093f92f8acc6a63c0a849c26dd28))
* **analytics:** fire flashcard_review_started only when a review has cards ([914c210](https://github.com/codebridger/subturtle-dashboard-app/commit/914c21028c5638e69903f7a78998acb9dceca0ca))
* cap freemium voice session at server-computed remaining minutes ([9337182](https://github.com/codebridger/subturtle-dashboard-app/commit/9337182286cb17ce410e7a73c67b4d52aebe8b04))
* **checkout:** don't pass returnUrl to confirm() (session already sets return_url) ([9b52103](https://github.com/codebridger/subturtle-dashboard-app/commit/9b52103736949e20747a6235cb746097d90ff7d7))
* **checkout:** mount Stripe Elements after render + scroll tall panel ([797777d](https://github.com/codebridger/subturtle-dashboard-app/commit/797777ddd4bfae86007dce307400acaa0d991622))
* **ci:** set DASHBOARD_BASE_URL so getSubscriptionDetails resolves a paid tier; revert period diag ([0f0d48f](https://github.com/codebridger/subturtle-dashboard-app/commit/0f0d48ffb7379259b8047e8f388fd969f0d01423))
* correct button click handler in DetailCard component and add max follow-up practice limit in live session instructions ([14d3a15](https://github.com/codebridger/subturtle-dashboard-app/commit/14d3a158078cfdbb090a611e3b568f7ca9a8cbdb))
* correct redirect URI in auth router to remove hash mode for proper token exchange ([c8b368c](https://github.com/codebridger/subturtle-dashboard-app/commit/c8b368c2a495c80ee352155bf1cfccd6a8137523))
* correct routing path for subscription navigation in ProfileButton component ([e6a9e7a](https://github.com/codebridger/subturtle-dashboard-app/commit/e6a9e7a968f47000f6c9f6df44fc0410d23b19fb))
* correct unknown cost percentage and adjust token calculations in live session; ensure accurate cost representation by subtracting cached tokens from total tokens ([7407198](https://github.com/codebridger/subturtle-dashboard-app/commit/7407198865dcf77e47978d4a1285b0d57319c223))
* **docker:** copy subscription module so frontend build resolves tier types ([943572c](https://github.com/codebridger/subturtle-dashboard-app/commit/943572caa8d204591269ea631fbe5ed086a3df87))
* downgrade @codebridger/lib-vue-components to version 1.16.0 and update ProfileButton component to use computed profilePicture ([005a746](https://github.com/codebridger/subturtle-dashboard-app/commit/005a746cb59c9750be64d1cbbe665f132ee710f5))
* **layout:** clip horizontal overflow from decorative page backgrounds ([8998654](https://github.com/codebridger/subturtle-dashboard-app/commit/899865437f8b503d920b3a8b02f7273abf0015c9))
* **live-session:** drop empty parameters from no-arg finish_practice tool [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exr424h ([aad0f83](https://github.com/codebridger/subturtle-dashboard-app/commit/aad0f8303dfa809a634b37ddbcc44fbbfc31338d)), closes [#86exr424h](https://github.com/codebridger/subturtle-dashboard-app/issues/86exr424h)
* **live-session:** freemium card no longer overlaps the voice-minutes line ([20dc3bf](https://github.com/codebridger/subturtle-dashboard-app/commit/20dc3bf8f4e5c50cac29e7c731d46750fb6a3039))
* **live-session:** persist Gemini token usage for the final/AI-only turn ([01f6b47](https://github.com/codebridger/subturtle-dashboard-app/commit/01f6b47f312903e63c6aecb0499fdc02a38e4c34))
* **live-session:** preserve Gemini thought_signature so text tool-calling works [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exr424h ([82ebc77](https://github.com/codebridger/subturtle-dashboard-app/commit/82ebc776d1f43c291f8ced7d0d1ac8e5de373d4b)), closes [#86exr424h](https://github.com/codebridger/subturtle-dashboard-app/issues/86exr424h)
* **live-session:** restrict text-session model to the priced allow-list [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exr424h ([5674854](https://github.com/codebridger/subturtle-dashboard-app/commit/5674854464b0df67c86801624231a91925a6972c)), closes [#86exr424h](https://github.com/codebridger/subturtle-dashboard-app/issues/86exr424h)
* **live-session:** scroll the session modal on small screens, pin the footer ([d1f757c](https://github.com/codebridger/subturtle-dashboard-app/commit/d1f757c868d2a5d6d7807e3de196e10af841b963))
* **live-session:** UTF-8-safe base64 for the session request (non-ASCII bundle titles) ([72d708b](https://github.com/codebridger/subturtle-dashboard-app/commit/72d708b7e1dba7ad4e485af74f92aa1a009ae117))
* merge voice minutes into freemium session card as inline pill ([1274a81](https://github.com/codebridger/subturtle-dashboard-app/commit/1274a8140f07f55b9b437e872e8ea37617e3ad4a))
* **phrase,translation:** chunk subdoc schema, match-by-phrase, token headroom ([50af640](https://github.com/codebridger/subturtle-dashboard-app/commit/50af64013bade30c36597e1bb1c96a5e0e0f1713))
* redirect to the subscription page after a successful payment, with refetch and animated waiting state ([3f6d88f](https://github.com/codebridger/subturtle-dashboard-app/commit/3f6d88f206ca77f3ba5ee6d36e0dc992997ac3a9))
* refine auth middleware for improved login handling and update button links to remove hash mode for consistent routing ([dcdf282](https://github.com/codebridger/subturtle-dashboard-app/commit/dcdf28255111ccde8cae9bd265ff30bd336302bc))
* refresh voice-minute balance when a live session ends ([8f44a04](https://github.com/codebridger/subturtle-dashboard-app/commit/8f44a0400fb202b458dd2a3d9a66fda513389339))
* remove default color from Button in PracticeToolScaffold component ([4b80fdd](https://github.com/codebridger/subturtle-dashboard-app/commit/4b80fddf5b5880f113f7fd2e752eaa27889d26fe))
* restrict phrase marking as practiced to user input instead of trigger actions [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([f8650de](https://github.com/codebridger/subturtle-dashboard-app/commit/f8650de19738925bf7258a0e283e962fe62e8f6d)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu)
* route Start New Session through the live-session dispatcher instead of a 404 route ([358cc1d](https://github.com/codebridger/subturtle-dashboard-app/commit/358cc1d4c6bd9b9edb466e1d923402457c3e4783))
* **schedule:** [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet add timezone support testing and fix catch-up logic ([bb7d155](https://github.com/codebridger/subturtle-dashboard-app/commit/bb7d15526a4573f9000a5286a15f13ac060ddf2e))
* **schedule:** make scheduled-job creation idempotent to prevent duplicate-key crash ([04b5159](https://github.com/codebridger/subturtle-dashboard-app/commit/04b5159846e805286dd8fb755dc56903961f3d41))
* **subscription:** apply plan upgrades fully (tier, budgets, label) and block stacking ([a28b485](https://github.com/codebridger/subturtle-dashboard-app/commit/a28b485df7dead00dd1de09af852aae04554c5a0))
* **subscription:** read current_period bounds item-first with subscription fallback; revert e2e collection rename ([e3424a2](https://github.com/codebridger/subturtle-dashboard-app/commit/e3424a24a5c30d41ed25f657f6e4c81381b76422))
* **subscription:** rewrite Stripe product metadata authoritatively in setup-stripe-pricing ([260be05](https://github.com/codebridger/subturtle-dashboard-app/commit/260be05db07291dd53fad543ae133a9c5b4d95db))
* **subscription:** show price skeleton while probing local currency to avoid GBP flash ([96b4ed1](https://github.com/codebridger/subturtle-dashboard-app/commit/96b4ed10b6703f051e7e2b315574f4aeeeb76a97))
* **subscription:** show real text-chat usage on the active-plan card (was "Unlimited") ([93ef5ef](https://github.com/codebridger/subturtle-dashboard-app/commit/93ef5efbd410fde1a99e16570048eb5ab525ded9))
* **subscription:** use Stripe's true fx rate for localized card prices ([30bca53](https://github.com/codebridger/subturtle-dashboard-app/commit/30bca535ec93fe86a88e84172eebf695f2b5e3de))
* suppress the global tier-limit modal when a page renders the lock inline ([ca443e2](https://github.com/codebridger/subturtle-dashboard-app/commit/ca443e2aac740bf61c4118d1ae3fa579cd210806))
* **translation:** only extract chunks from the marked text, not its context ([f408e83](https://github.com/codebridger/subturtle-dashboard-app/commit/f408e832825f1ac9115d6db47d66221d48765cbc))
* **translation:** retry + validate structured LLM output to cut error rate ([dd5019b](https://github.com/codebridger/subturtle-dashboard-app/commit/dd5019b0dce4a6580a9c70ca745a8a0f7a9c0700))
* **ui:** use IconPlayCircle — IconPlay is not a pilotui icon (rendered nothing) ([594c3f6](https://github.com/codebridger/subturtle-dashboard-app/commit/594c3f64f7d82b8180a90c3083214c046df18264))
* update audio transcription model in live session to use gpt-4o-mini-transcribe ([be7494a](https://github.com/codebridger/subturtle-dashboard-app/commit/be7494af71a43be5f6c2c5e8c1128e6b1e2f8036))
* update auth middleware to use fullPath for root redirect and adjust login route to hash mode ([3662084](https://github.com/codebridger/subturtle-dashboard-app/commit/36620844cf48becabd36fa45c37f03f9f2b9c39c))
* update button links to use hash mode for consistent routing in live session and flashcard navigation ([5e243f9](https://github.com/codebridger/subturtle-dashboard-app/commit/5e243f9ca28fbcda5c8649ee9cb1ecfcbb94a01d))
* update docker-compose.yml to change service port mapping from 8080 to 80 ([f52d9b6](https://github.com/codebridger/subturtle-dashboard-app/commit/f52d9b63a446f22cdfe5aa572123b4f59445de5c))
* update login_with_token component to use loginWithToken method and add error logging on authentication failure ([7afcd91](https://github.com/codebridger/subturtle-dashboard-app/commit/7afcd91a16774dc64b87375a9e50d40bb2360caf))
* update loginWithToken method to include second parameter for enhanced authentication flow ([0769ef5](https://github.com/codebridger/subturtle-dashboard-app/commit/0769ef5a2f3f7e7bba00601dd6c818c89e0f95b9))
* update redirect URIs in auth router to use hash mode for improved routing ([9173430](https://github.com/codebridger/subturtle-dashboard-app/commit/917343083e7c77ea6532f45c89e8535483de92f2))
* update return_url in getSubscription function to use DASHBOARD_BASE_URL instead of FRONTEND_URL; remove FRONTEND_URL from sample.env ([3a60399](https://github.com/codebridger/subturtle-dashboard-app/commit/3a60399479e87adcdf8fd71ed6e97a0a7c5e3321))
* update router configuration to enable hash mode and adjust redirect logic in auth middleware ([b8451ba](https://github.com/codebridger/subturtle-dashboard-app/commit/b8451ba04a6dd0aaa0f3119d490802cbbaf19c5e))
* update routing for subscription navigation in ProfileButton component ([e3ec16e](https://github.com/codebridger/subturtle-dashboard-app/commit/e3ec16e473e9cbd40c96e6a7bdbe5c8665ecce3d))
* update vocabulary handling in live-session component to use selectedPhrases for accurate word indexing ([e7fc12a](https://github.com/codebridger/subturtle-dashboard-app/commit/e7fc12a24bdfa0e2a3f71f08262bebaa14cb1e48))
* use singular "Sign in with Google" copy on login page [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkh11q ([3c506ab](https://github.com/codebridger/subturtle-dashboard-app/commit/3c506ab7a0cc2a6171583ebba5bb86ab575a3e02)), closes [#86exkh11q](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkh11q)

### Features

* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Add an empty trigger slot to the LeitnerPhrasePicker Modal. ([ab1940e](https://github.com/codebridger/subturtle-dashboard-app/commit/ab1940ebe644136826411ab5327d36e748fac738)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y add configurable review interval to Leitner settings. ([24b67fe](https://github.com/codebridger/subturtle-dashboard-app/commit/24b67fe4f67d69a9aa05066e6f3e93d24b2a2772)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Add Daily Limit configuration and enforcement ([a61c6e1](https://github.com/codebridger/subturtle-dashboard-app/commit/a61c6e15f5236460c65f91e068e39473f349efaa)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Bring back the Total box input on the Leitner box setting section ([e57672b](https://github.com/codebridger/subturtle-dashboard-app/commit/e57672b9f679f81a61e309fbec333778dcc4f58e)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y create reusable Toggle component and fix empty box filtering logic ([3ac08f4](https://github.com/codebridger/subturtle-dashboard-app/commit/3ac08f495391d2f2175d447f61976b14097dec07))
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Ensure the leitner-review-job always performs catch-up regardless of its explicit catchUp flag. ([17ed4cc](https://github.com/codebridger/subturtle-dashboard-app/commit/17ed4cc34aa5db4b0adbbb9a8baca8ac3a6df8ca)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y fix search input spacing and add box-only filter toggle ([e585404](https://github.com/codebridger/subturtle-dashboard-app/commit/e585404cc0742e9346615098787cbe041814defe))
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Implement a catch-up mechanism for recurrent scheduled jobs and pass execution times to job callbacks. ([27e2c24](https://github.com/codebridger/subturtle-dashboard-app/commit/27e2c24dd6596efcb418e5eae9c563a7a0d3f8d2)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Implement Leitner Box Spaced Repetition System ([b4a806a](https://github.com/codebridger/subturtle-dashboard-app/commit/b4a806af7f04b5f8497b2dba76a3ee7c96c54657)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y implement leitner box user preferences and settings ui ([2bbf1dc](https://github.com/codebridger/subturtle-dashboard-app/commit/2bbf1dc404cedea1e58ef8b2c6574302e1965861)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Implement Leitner System and Board Activity ([63ef0af](https://github.com/codebridger/subturtle-dashboard-app/commit/63ef0af67ebef3d536d44cf4dda43d3639133d7d)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Implement persistent board activities with `meta.isActive` for Leitner box reviews and add `BoardService` tests. ([e257177](https://github.com/codebridger/subturtle-dashboard-app/commit/e257177b6246751260d6d47c1c5d75a65cc79c8a)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y implement phrase-to-box tracking and refactor picker to dataProvider.list ([94da625](https://github.com/codebridger/subturtle-dashboard-app/commit/94da625eb50ccf183c07db8c52ae4c6478814853)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y implement refined Leitner notification system ([3152be9](https://github.com/codebridger/subturtle-dashboard-app/commit/3152be91ddbe875b799dd4b0c6244319fbe5f4f7)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y overhaul board page aesthetics and fix rendering issues ([b93f1cf](https://github.com/codebridger/subturtle-dashboard-app/commit/b93f1cf37dd8e1378f530e5d9139096a7d7e4fd4))
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y prevent phrase picker auto-close and defer state refresh until modal closure ([52f651d](https://github.com/codebridger/subturtle-dashboard-app/commit/52f651d1052798b6b7d6fa42d2ac7d82ee8b9691))
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y set up documentation download and conversion script in server/scripts ([8f8f7bf](https://github.com/codebridger/subturtle-dashboard-app/commit/8f8f7bf18ff0f81a902664cfdd02b1ef429c0034)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y sync phrase removal and refine user context in Leitner system ([dcb92c4](https://github.com/codebridger/subturtle-dashboard-app/commit/dcb92c44dbe0740ddacd4f1ba869702d61201c36)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Update Leitner Box due date logic to include items due by the end of the current day, add corresponding tests, and remove the `initLeitner` function. ([390ab2d](https://github.com/codebridger/subturtle-dashboard-app/commit/390ab2d125ce055a1d9333723a89068adc8da0a8)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y use custom Toggle component for Auto-Entry in Preferences ([d3eeb1e](https://github.com/codebridger/subturtle-dashboard-app/commit/d3eeb1ea1a16162ee7cec2ad81f2564b7c718a1c)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erzxm7p - add new collections for subscription and daily credits in config ([3d763b0](https://github.com/codebridger/subturtle-dashboard-app/commit/3d763b0d5c44e45e66592a08c2289835e03b457e)), closes [#86erzxm7p](https://github.com/codebridger/subturtle-dashboard-app/issues/86erzxm7p)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erzxm7p add subscription details retrieval and integrate triggers in payment processing to add creadit into subscription system after succesfull payment. ([b891eca](https://github.com/codebridger/subturtle-dashboard-app/commit/b891eca054d3d78a64ecd1d9f71b06a2374693f6)), closes [#86erzxm7p](https://github.com/codebridger/subturtle-dashboard-app/issues/86erzxm7p)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erzxm7p enhance payment gateway with multi-provider support, including webhook handling and payment verification improvements ([915af8c](https://github.com/codebridger/subturtle-dashboard-app/commit/915af8c3304125c24cedb7129bfaacfc581584f2)), closes [#86erzxm7p](https://github.com/codebridger/subturtle-dashboard-app/issues/86erzxm7p)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erzxm7p implement Stripe payment integration with checkout session handling, payment verification, and user subscription management ([90ff598](https://github.com/codebridger/subturtle-dashboard-app/commit/90ff59856459a0a0deac3657425af29dbc617aff)), closes [#86erzxm7p](https://github.com/codebridger/subturtle-dashboard-app/issues/86erzxm7p)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)et6azkg add text-to-speech functionality and voice listing in translation module ([4ecb1fa](https://github.com/codebridger/subturtle-dashboard-app/commit/4ecb1fa7c4353f79c736a7e472c4788deb95dcd0)), closes [#86et6azkg](https://github.com/codebridger/subturtle-dashboard-app/issues/86et6azkg)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdg7 implement freemium credit allocation system with default values and user management ([8e94091](https://github.com/codebridger/subturtle-dashboard-app/commit/8e94091787f29800398076ada1857a594cbac679)), closes [#86etkgdg7](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdg7)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdg7 update freemium credit allocation to 1M and adjust subscription handling in usage recording ([d10f676](https://github.com/codebridger/subturtle-dashboard-app/commit/d10f676d0dba2d76d2bd7fbdd1010e2f77e5d1c3)), closes [#86etkgdg7](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdg7)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu implement Gemini Live API for live sessions ([fbf147b](https://github.com/codebridger/subturtle-dashboard-app/commit/fbf147b96883aa42b3e5e2557514e0d051a4312b)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etp28k1 enhance freemium limitation modals across components for improved user experience and consistency ([d80207f](https://github.com/codebridger/subturtle-dashboard-app/commit/d80207f582b3279fb36fcc843a3a99217dc6fb17)), closes [#86etp28k1](https://github.com/codebridger/subturtle-dashboard-app/issues/86etp28k1)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etp28k1 implement freemium timer functionality in live session with modal alerts for session expiration ([3e87839](https://github.com/codebridger/subturtle-dashboard-app/commit/3e8783981341bf7c4a544f01052287b042ae8271)), closes [#86etp28k1](https://github.com/codebridger/subturtle-dashboard-app/issues/86etp28k1)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)eu01jz0 enhance PhraseCard component to handle 'linguistic' phrases by disabling submit button and preventing submission ([81796c6](https://github.com/codebridger/subturtle-dashboard-app/commit/81796c6c8cfcaacd14fac44ac4c6af25411094c4)), closes [#86eu01jz0](https://github.com/codebridger/subturtle-dashboard-app/issues/86eu01jz0)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)eu01jz0 enhance PhraseSchema and createPhrase function to support 'linguistic' type phrases, including additional fields for context and language information ([9a57ffe](https://github.com/codebridger/subturtle-dashboard-app/commit/9a57ffee336f6b0d0540279934532dd33014f37c)), closes [#86eu01jz0](https://github.com/codebridger/subturtle-dashboard-app/issues/86eu01jz0)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)eu01jz0 extend PhraseSchema to include detailed linguistic data structure, enhancing support for translation and contextual information ([93b9ae0](https://github.com/codebridger/subturtle-dashboard-app/commit/93b9ae0e94d7b525931541ec1c73293446102bf9)), closes [#86eu01jz0](https://github.com/codebridger/subturtle-dashboard-app/issues/86eu01jz0)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)eu01jz0 update PhraseCard component to dynamically handle translation and definition placeholders based on phrase type, and introduce computed property for translation value ([8769580](https://github.com/codebridger/subturtle-dashboard-app/commit/8769580d93a89e97b27e33ef5440fe611fdd89ad)), closes [#86eu01jz0](https://github.com/codebridger/subturtle-dashboard-app/issues/86eu01jz0)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewevg3v Internationalize Leitner components and integrate Leitner box statistics fetching and display. ([b3f9c4e](https://github.com/codebridger/subturtle-dashboard-app/commit/b3f9c4e48b69f7a1610881e89641747c9a8eb589)), closes [#86ewevg3v](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewevg3v)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewevg3v Update "Quota" label to "Cards Per Session" in English localization. ([531f124](https://github.com/codebridger/subturtle-dashboard-app/commit/531f1247c4f4841e6bff6d2a3ab93388751e3889)), closes [#86ewevg3v](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewevg3v)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewevg3y Implement common `PageHeader` and `Breadcrumb` components, updating bundle pages and documentation. ([93731d9](https://github.com/codebridger/subturtle-dashboard-app/commit/93731d9aeb9023245b8c5053cb22e7ad75d48b64)), closes [#86ewevg3y](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewevg3y)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewevg42 Implement custom Leitner review sessions for bundles with a dedicated frontend component and server-side logic. ([273304d](https://github.com/codebridger/subturtle-dashboard-app/commit/273304ddf5946d8db177a22ca3d08361bb6972b7)), closes [#86ewevg42](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewevg42)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet Enhance Leitner settings with timezone clarification for review intervals and add related translations. ([c2348f2](https://github.com/codebridger/subturtle-dashboard-app/commit/c2348f2e200de41eeee00826bfc9d536fc15b9eb)), closes [#86ewfyjet](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewfyjet)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet Implement a new TimezonePicker component and integrate it into the profile settings page, replacing the native select dropdown. ([b2dc50c](https://github.com/codebridger/subturtle-dashboard-app/commit/b2dc50c2705a5db234ee22456357bc829ff675cb)), closes [#86ewfyjet](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewfyjet)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet Implement automatic Leitner box schedule resynchronization when a user's timezone is updated. ([f747592](https://github.com/codebridger/subturtle-dashboard-app/commit/f747592008985a60639b4ab996bf73a2ce071c9e)), closes [#86ewfyjet](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewfyjet)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet Implement timezone support for Leitner box review scheduling and display. ([b3f240e](https://github.com/codebridger/subturtle-dashboard-app/commit/b3f240edeaefe3fd4639e96a497e34fe98a39db8)), closes [#86ewfyjet](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewfyjet)
* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet Implement user timezone setting ([2d3aef5](https://github.com/codebridger/subturtle-dashboard-app/commit/2d3aef5b94c60c3389a256ca5dd535365f5cd08c)), closes [#86ewfyjet](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewfyjet)
* Add @nuxtjs/i18n module for internationalization support ([03d7548](https://github.com/codebridger/subturtle-dashboard-app/commit/03d754824f29f1c2f705f3063a1a33aea581bfc6))
* add 3-tier pricing backend with 3-day credit-card trial [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkhcza ([5b37c61](https://github.com/codebridger/subturtle-dashboard-app/commit/5b37c61dc9e30298ba5204d6f90fcf7be210a4ba)), closes [#86exkhcza](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkhcza)
* add Billing and Settings pages with navigation and subscription details ([48c6bc6](https://github.com/codebridger/subturtle-dashboard-app/commit/48c6bc67aa76447b3578384a448a7bd88723ab96))
* add ClickUp rules documentation and update package dependencies for improved functionality ([4759cb8](https://github.com/codebridger/subturtle-dashboard-app/commit/4759cb80e195b7ec896d61a8533f55c2c5b992f1))
* add CORS configuration to server for specified origins and methods ([b1836f0](https://github.com/codebridger/subturtle-dashboard-app/commit/b1836f0f7cf2506ae8806bb239801af2d4956249))
* add deployment workflows for EC2 and ECR, create Dockerfile for dashboard-v2, and update .gitignore and .dockerignore files ([856970e](https://github.com/codebridger/subturtle-dashboard-app/commit/856970e472d66e7e9d15a548436a53d6dd60801b))
* add dialog filtering in live session query and enhance live session record handling ([382b40d](https://github.com/codebridger/subturtle-dashboard-app/commit/382b40d371263b00af77e7470ea061793cedf554))
* Add e2e testing guide and apply authentication middleware to the board page. ([789f22a](https://github.com/codebridger/subturtle-dashboard-app/commit/789f22a7e714eaaa40a05094b2e468c8c4829bca))
* add error messages and navigation button to live session page ([025183e](https://github.com/codebridger/subturtle-dashboard-app/commit/025183eeb01003f074cf3285d70d8ff2adb25ec3))
* add expiration index for freemium credits based on duration configuration ([f3d99f9](https://github.com/codebridger/subturtle-dashboard-app/commit/f3d99f95ac958f647806f09a7adeafd8a36945ff))
* add freemium user limitation for allowed lived sessions and update related functionality ([04b5fa4](https://github.com/codebridger/subturtle-dashboard-app/commit/04b5fa424aa03b19ae6dbaf1c818835ea9681312))
* Add Google Meet to allowed CORS origins. ([247aa76](https://github.com/codebridger/subturtle-dashboard-app/commit/247aa769c0136460c8d5b1713cc25c8cdf6d865e))
* add install-extension nudge banner on dashboard [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkh0z3 ([a656a3d](https://github.com/codebridger/subturtle-dashboard-app/commit/a656a3de71405e91e0d475de881750323fda88da)), closes [#86exkh0z3](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkh0z3)
* add mic level visualization and spacebar toggle, and include translation-masking mode in live sessions [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([042e67f](https://github.com/codebridger/subturtle-dashboard-app/commit/042e67fd375777b1c10e32bd4713ca309163b8a2)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu)
* add native language selection for AI sessions and implement text input for live practice [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([a0b77ab](https://github.com/codebridger/subturtle-dashboard-app/commit/a0b77ab3fd97db6fb1480abe4b7bc8c2002e74f8)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu)
* add new translation keys for Subscription and Billing sections, and update Sign Out labels ([0384fb8](https://github.com/codebridger/subturtle-dashboard-app/commit/0384fb808daa8eeb558f4785ce8e3dd57cf58307))
* add opt-in text-based message composer with microphone toggle fallback [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([de37822](https://github.com/codebridger/subturtle-dashboard-app/commit/de378220de14f04da75b7d50a63c7ff35bef641f)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu)
* add profile reset functionality to subscription settings for testing purposes, including UI updates and backend integration ([dde8bde](https://github.com/codebridger/subturtle-dashboard-app/commit/dde8bdef6746016b4a6ba3dbda29b486a128fbe2))
* add README.md for SubTurtle Dashboard App and update live-session component to handle audio transcript deltas; refactor server to use environment variable for MongoDB prefix ([fa73f32](https://github.com/codebridger/subturtle-dashboard-app/commit/fa73f329456719f2178112f1b904597884477a77))
* add session expiry message and update UI to display session expiration details ([8302996](https://github.com/codebridger/subturtle-dashboard-app/commit/8302996a641b4a474a907f9598819a72cd854cf9))
* add Sidebar component for profile navigation with tabs for Profile, Subscription, and Billing ([fb69dd5](https://github.com/codebridger/subturtle-dashboard-app/commit/fb69dd54e002d7af4c49b34dad9db686b4cff48f))
* add subscription settings page and profile management, update translations for subscription features ([d1e00ac](https://github.com/codebridger/subturtle-dashboard-app/commit/d1e00ac55d6e4af38d7b7c03ae958cfd1ceacac1))
* Add Teams.microsoft.com to allowed CORS origins. ([1b3d84c](https://github.com/codebridger/subturtle-dashboard-app/commit/1b3d84c837e8bb61c8d6d0c92a7bae56b1ca9d48))
* add ThemeSwitcher component and update layout to include theme selection; redirect root route to /statistic ([9d67f85](https://github.com/codebridger/subturtle-dashboard-app/commit/9d67f855e878ccb585217279ed27229460874a37))
* allow all origins in CORS configuration for dashboard server ([ef8ced8](https://github.com/codebridger/subturtle-dashboard-app/commit/ef8ced87be3bad7992222b7266da3be610d03318))
* allow wildcard origin in CORS configuration ([73282d4](https://github.com/codebridger/subturtle-dashboard-app/commit/73282d4f8092d9845c1cd821b30211ae75d0eb23))
* **analytics:** convention-named lifecycle events + missing engagement events ([001209f](https://github.com/codebridger/subturtle-dashboard-app/commit/001209fb7ce9f240cf7d0f0827c76c888ab8bd8a))
* **checkout:** embedded Custom Checkout with Adaptive Pricing localized prices ([3210cdd](https://github.com/codebridger/subturtle-dashboard-app/commit/3210cdd93a9ec3131244c93cf2eda0115e9be7d2))
* decrement freemium allocation on phrase deletion in bundle store for improved resource management ([b4b48c3](https://github.com/codebridger/subturtle-dashboard-app/commit/b4b48c35be5811d788fb00d04632706b7cc26531))
* disable submit button when phrase or translation is empty in PhraseCard component ([5495555](https://github.com/codebridger/subturtle-dashboard-app/commit/54955557011b5ab4292ea9eb803e5996c4253eae))
* Enhance `development/SKILL.md` with E2E testing and navigation guidelines, and new principles for testing, documentation, and UI component usage. ([16d4f81](https://github.com/codebridger/subturtle-dashboard-app/commit/16d4f816152322923bec3e8343b631d88fa15239))
* enhance CORS configuration to dynamically handle origins and log unauthorized requests ([fce9b74](https://github.com/codebridger/subturtle-dashboard-app/commit/fce9b7452abd0237f1dabae487bfa046536f3c05))
* enhance GenerativeCard and WordGenerativeCover components with click handling and navigation ([7e8b5ef](https://github.com/codebridger/subturtle-dashboard-app/commit/7e8b5ef39e251484db440c29a476f85865356700))
* enhance live session features by adding metadata support and updating UI components for session details and history ([f980555](https://github.com/codebridger/subturtle-dashboard-app/commit/f9805557072b097f7b1d407670541458025ffa65))
* enhance live session functionality with dynamic word handling and improved instructions ([d64023b](https://github.com/codebridger/subturtle-dashboard-app/commit/d64023b2ecea00540787dcdbb2f6669d38b1545e))
* enhance live session page with empty state handling and new session prompts ([b3274f7](https://github.com/codebridger/subturtle-dashboard-app/commit/b3274f793a26e5e91968b5b733ef5e80f01fc5ae))
* enhance phrase management with improved delete functionality and freemium allocation tracking ([2419740](https://github.com/codebridger/subturtle-dashboard-app/commit/2419740de425e123f8f5cbe2f36df0a01dec86ad))
* enhance PracticeToolScaffold with dynamic body class and integrate into live session page ([729cc0d](https://github.com/codebridger/subturtle-dashboard-app/commit/729cc0d119da468744698a6e565e23db11062cba))
* enhance subscription handling with freemium allocation and type updates ([6683bb1](https://github.com/codebridger/subturtle-dashboard-app/commit/6683bb1bca82314bd1bb902a9691013e7e1f8796))
* fetch subscription to update freemium allocation after starting live session ([88b4535](https://github.com/codebridger/subturtle-dashboard-app/commit/88b4535fd3d947d0d5a58a86b6a979bf401c91dd))
* **flashcard:** modularize card modes + unified flip toggle ([4249a0c](https://github.com/codebridger/subturtle-dashboard-app/commit/4249a0cd81df37c63bf4a16f5e352e0c1ba8af4c))
* **flashcard:** new translation shape + L3+ fill-in cloze ([62613d4](https://github.com/codebridger/subturtle-dashboard-app/commit/62613d4c7b57c7d32a6e5ad542aa676b05ed81e4))
* **gateway:** single-currency GBP checkout with Stripe Adaptive Pricing (S7) ([9bb38f5](https://github.com/codebridger/subturtle-dashboard-app/commit/9bb38f50cca530d4a3f084d5c9440c8fd95c475d))
* implement cancelSubscriptionByProviderAndSubscriptionId function in subscription service; enhance StripeAdapter to handle subscription deletion events and update subscription status management ([2ed6f15](https://github.com/codebridger/subturtle-dashboard-app/commit/2ed6f15799171c7aae7fa06f00a51a997ebf2913))
* implement create and update phrase functionality with freemium allocation management in bundle store and backend ([0c24754](https://github.com/codebridger/subturtle-dashboard-app/commit/0c24754806c4d11ba110d41d90ffd297a411b582))
* implement empty state for bundles page with user prompts and loading state management ([de51624](https://github.com/codebridger/subturtle-dashboard-app/commit/de51624fac483d0b5ae170df734ae143fc8478fe))
* implement freemium alerts with add phrase functionality in a new component ([50c78c9](https://github.com/codebridger/subturtle-dashboard-app/commit/50c78c96691ce93238cf414168bf7f02264b3df0))
* implement freemium allocation updates on phrase bundle creation and deletion ([f4a38d2](https://github.com/codebridger/subturtle-dashboard-app/commit/f4a38d2efb9a338372b1a3a7c3c52371a99959f9))
* implement getSubscription function to streamline subscription retrieval; refactor getSubscriptionDetails to utilize new function and enhance response normalization for Stripe payments ([096d06a](https://github.com/codebridger/subturtle-dashboard-app/commit/096d06a485bb6a1eafa55becb358f71b6ccf4cdc))
* implement live session store with conversation dialog handling ([805c7a2](https://github.com/codebridger/subturtle-dashboard-app/commit/805c7a2b63a859dabac9923336cbedda50baac8f))
* implement removePhrase function with freemium allocation update ([efc06dc](https://github.com/codebridger/subturtle-dashboard-app/commit/efc06dc7933ea2c31114c7801f54e1a96a0e6435))
* implement subscription page with monthly plan details and checkout functionality ([b8bedf6](https://github.com/codebridger/subturtle-dashboard-app/commit/b8bedf6507692c5d17be480baa5469c7a30688f5))
* implement subscription renewal [cacelletion and extnesion] for stripe integration ([9ce3808](https://github.com/codebridger/subturtle-dashboard-app/commit/9ce3808a14fa850918a707c305153f14b96b8975))
* improve phrase display and refactor active phrase handling in live session ([ffa987e](https://github.com/codebridger/subturtle-dashboard-app/commit/ffa987e6e7c9b8092a73f8c56de692ac530e6c1c))
* integrate StartLiveSessionForm component into bundle page and update modal trigger for improved user experience ([454382c](https://github.com/codebridger/subturtle-dashboard-app/commit/454382c24ead67c9cbccbcc33d29aabe56679708))
* **live-session:** add text-only conversation mode [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exr424h ([d9abac4](https://github.com/codebridger/subturtle-dashboard-app/commit/d9abac4a7e008d7889706918756bc39e532aa563)), closes [#86exr424h](https://github.com/codebridger/subturtle-dashboard-app/issues/86exr424h)
* **live-session:** mode-aware limits in the Start-Live-Session modal ([f51aa46](https://github.com/codebridger/subturtle-dashboard-app/commit/f51aa46a0fad9a5060f91e026e612b58f3d008e7))
* **live-session:** mode-aware limits on the /sessions/new start screen ([4ea1c8a](https://github.com/codebridger/subturtle-dashboard-app/commit/4ea1c8afcbd0e02475e1bf86ccdf8aeb7ad134b3))
* **live-session:** single /practice/live-session gate + server voice list ([9bb25ec](https://github.com/codebridger/subturtle-dashboard-app/commit/9bb25ecf93f866d32f936399b1a5a03f378cb9be))
* **live-session:** single /practice/live-session gate + server voice list ([9dcea17](https://github.com/codebridger/subturtle-dashboard-app/commit/9dcea1798c01372f1f54d82ddd22d72f6c3835a5))
* persist Google profile picture as base64 in localStorage with broken-URL fallback [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkh0z3 ([8011909](https://github.com/codebridger/subturtle-dashboard-app/commit/8011909a49412e3bba3db17d4cff0034ea9f5adc)), closes [#86exkh0z3](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkh0z3)
* rebuild subscription page for 3-tier pricing and cap-moment upgrades [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkhcza ([0430e26](https://github.com/codebridger/subturtle-dashboard-app/commit/0430e26a86165a86c54b902219c1e610df55a309)), closes [#86exkhcza](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkhcza)
* refactor audio transcription handling in live session to improve event processing ([57c243e](https://github.com/codebridger/subturtle-dashboard-app/commit/57c243e05d77534a9e8bb5ff941d37f249f58d8f))
* refactor phrase schema and enhance createPhrase function to include translation_language and prevent duplicate phrases in bundles ([4c4cb3d](https://github.com/codebridger/subturtle-dashboard-app/commit/4c4cb3daddb2fb704941bb6bef62bcd3896b6ddd))
* Reorganize agent documentation by introducing a development skill, integrating lib-vue-components docs, and updating doc download paths with conditional markdown conversion. ([dcca8b2](https://github.com/codebridger/subturtle-dashboard-app/commit/dcca8b2c41fc47e735c18dda3ffc4f0a84f23606))
* reset session state on creation and improve native language detection for live sessions [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([9b8a85f](https://github.com/codebridger/subturtle-dashboard-app/commit/9b8a85fc620cb1bcaab0fbbb7587cff8100bb2a4)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu)
* **schedule:** implement schedule service and tests CU-86erqa08y ([8a99fb8](https://github.com/codebridger/subturtle-dashboard-app/commit/8a99fb87678dc6bfc872b66ec37d336d62660be8))
* **sessions:** show live-session duration on history and detail pages ([f461783](https://github.com/codebridger/subturtle-dashboard-app/commit/f461783fc0e6c9110d9a33cfa5d2b51094c6242d))
* show dashboard version in a global footer [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exqazkq ([8e58fb5](https://github.com/codebridger/subturtle-dashboard-app/commit/8e58fb5febba3aec837c6ac35b1c5aa2c9969db2)), closes [#86exqazkq](https://github.com/codebridger/subturtle-dashboard-app/issues/86exqazkq) [#footer](https://github.com/codebridger/subturtle-dashboard-app/issues/footer)
* simplify get_next_word handler and enhance session creation response ([ada1855](https://github.com/codebridger/subturtle-dashboard-app/commit/ada1855f419f5687849fd43d06048918b1e0eba6))
* **subscription:** add Stripe metadata entitlement parser and resolver (S1) ([873a1a0](https://github.com/codebridger/subturtle-dashboard-app/commit/873a1a0c4082baaf01d3d50f35bafa4bcebb3a9f))
* **subscription:** add voice-minute fields to subscription + free_credit, seed on grant (S4) ([ed1de09](https://github.com/codebridger/subturtle-dashboard-app/commit/ed1de09f61336992b9df11e0e5d9099907ac7c23))
* **subscription:** build getSubscriptionPlans from live Stripe with last-known-good cache (S3) ([97b92dc](https://github.com/codebridger/subturtle-dashboard-app/commit/97b92dc688539a37085997bc9d42764c4410d64a)), closes [hi#traffic](https://github.com/hi/issues/traffic)
* **subscription:** cap Reader text chat — 60 chats/mo + 60 msgs/chat (S16) ([0de9fa6](https://github.com/codebridger/subturtle-dashboard-app/commit/0de9fa64dbc398eef7a8cf0537fc57cc4bd42ab0))
* **subscription:** enforce save_words, weekly_insights & live-session caps from entitlements ([1d76506](https://github.com/codebridger/subturtle-dashboard-app/commit/1d765068085ea78c57636781d8e078bddafd00eb))
* **subscription:** gate full session history behind session_history (Learner+) via list-live-sessions RPC ([de43b4c](https://github.com/codebridger/subturtle-dashboard-app/commit/de43b4cd674d571182aea4595372f81cbe77b981))
* **subscription:** gate the sessions page via list-live-sessions RPC and debit voice minutes on session end ([f7ab65b](https://github.com/codebridger/subturtle-dashboard-app/commit/f7ab65b335e9d9abf01060210cec845cc3b344a7))
* **subscription:** global upgrade modal when a tier limit blocks an RPC ([1e67ae9](https://github.com/codebridger/subturtle-dashboard-app/commit/1e67ae9cf7a6faa96c46319aefbabc67b8206de2))
* **subscription:** grant entitlements from Stripe metadata with idempotency (S2) ([fb760b7](https://github.com/codebridger/subturtle-dashboard-app/commit/fb760b7384fa89623f8c2d0139ab1173c5f24cfc))
* **subscription:** localize pricing-card prices via Adaptive Pricing (EUR for EU) ([a8c453f](https://github.com/codebridger/subturtle-dashboard-app/commit/a8c453f981d240a9ce6733ae52df35c70ed7fec1))
* **subscription:** make paid-tier copy, badge, highlight & trial Stripe-driven (single source of truth) ([6ea0bc9](https://github.com/codebridger/subturtle-dashboard-app/commit/6ea0bc998169e513a8cd12eb202fdd08318fab9e))
* **subscription:** meter voice minutes per tier (gate + debit) and fix paid-tier entitlement lookup ([b0b55c6](https://github.com/codebridger/subturtle-dashboard-app/commit/b0b55c6dedeb02ce5838b2e5561eb6d564c192ba))
* **subscription:** Reader text-chat counter + Reader-specific limit copy (S17) ([06460d0](https://github.com/codebridger/subturtle-dashboard-app/commit/06460d064c0993f3f94ab3baada60a25d51181d3))
* **subscription:** render pricing page from backend plans, drop currency picker (S9) ([0b27c00](https://github.com/codebridger/subturtle-dashboard-app/commit/0b27c00c2c0ae5b1e9b3ef47c8bd0f44b92e0e96))
* **subscription:** script-provision the Stripe portal config, with setup guards and a startup check ([7762f00](https://github.com/codebridger/subturtle-dashboard-app/commit/7762f00ef9e7f2ae9a053ac8132ff927e1d01b38))
* **subscription:** shared FeatureLocked panel — gate /statistic, refactor /sessions (S15) ([4f0563c](https://github.com/codebridger/subturtle-dashboard-app/commit/4f0563c696e20c521a8eebef5c43142c4f7d1f7a))
* **subscription:** show all plan entitlements on the active-plan "This month" card ([6248228](https://github.com/codebridger/subturtle-dashboard-app/commit/62482284c742343d2671b7925a3ec2c1e64548cc))
* **subscription:** show Starter as a plan card with current-plan and downgrade-to-free states ([31355ef](https://github.com/codebridger/subturtle-dashboard-app/commit/31355eff2432689652cd38fca6401b8e9514567c))
* **subscription:** Starter free-tier usage card on the subscription page ([455fe63](https://github.com/codebridger/subturtle-dashboard-app/commit/455fe63478f3ad61f771fa8c581a737ade11415b))
* **subscription:** voice balance meter + "This month" section (S12) ([2ab6a20](https://github.com/codebridger/subturtle-dashboard-app/commit/2ab6a209ab021ef779476c10df8202b399e4bdee))
* **subscription:** voice top-up packs — grant webhook + active_top_ups payload (S11) ([aeaf21c](https://github.com/codebridger/subturtle-dashboard-app/commit/aeaf21c0ee90017ee23c45e59b477f6deb72640e))
* **subscription:** voice top-up purchase flow + /settings/billing (S14) ([2d8ff15](https://github.com/codebridger/subturtle-dashboard-app/commit/2d8ff156cc24fc5516a849ac589652732d0b1ed7))
* **subscription:** voice-cap 80% banner + 100% Start-Voice-Chat modal (S13) ([60cd505](https://github.com/codebridger/subturtle-dashboard-app/commit/60cd505c57a9a826438d86da5b6934e4fb1da66a))
* **translation,phrase:** chunk-aware save schema, AI advisor, bundle suggestion ([82abb5e](https://github.com/codebridger/subturtle-dashboard-app/commit/82abb5edfe456028d4d9c540bcc9f1cb3e96645a))
* **translation:** per-chunk definition for chunk-aware save ([363fe39](https://github.com/codebridger/subturtle-dashboard-app/commit/363fe395daecf55f4fac5fc3266b47134a79e46d))
* update @modular-rest/server dependency to version 1.15.0 ([325a9d8](https://github.com/codebridger/subturtle-dashboard-app/commit/325a9d845c26c9cd83169866278de29a47347e12))
* update createPhrase functionality to support multiple bundle IDs for improved phrase management and access verification ([ef151f5](https://github.com/codebridger/subturtle-dashboard-app/commit/ef151f5df68b4f92e0ab76bacca88b237bbdc8b7))
* update dashboard navigator to reduce the nesting complexity, the nvigator dosent has nested items now. ([94be814](https://github.com/codebridger/subturtle-dashboard-app/commit/94be8147685c00d8cb61cf1fbaa468f314ad33d5))
* update Dockerfile to include .npmrc and modify GitHub Actions workflow to create .npmrc file during deployment ([8394f42](https://github.com/codebridger/subturtle-dashboard-app/commit/8394f42b32411c6ecd2c3ff1674d59ff24c3fb2c))
* update Gemini token tracking to include tool use, thoughts, and dedicated video token metrics [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([8cebf65](https://github.com/codebridger/subturtle-dashboard-app/commit/8cebf65672a1d4088d2284f42ea71349bbd946f6)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu)
* update live session page to ensure bundleId is a string and maintain consistent structure ([ea8cb07](https://github.com/codebridger/subturtle-dashboard-app/commit/ea8cb07673eb9bfff2a510993bb33b9541457f8a))
* update live session page with improved layout and dynamic phrase display ([a65814a](https://github.com/codebridger/subturtle-dashboard-app/commit/a65814a124346f258231f6b3f1876ffab8e594c5))
* update membership plans page with new subscription terminology and enhanced UI components ([f101e12](https://github.com/codebridger/subturtle-dashboard-app/commit/f101e1251da72386196fdc655584e8ab5854d54b))
* update Pro plan feature label to reflect 60 monthly chat limit ([1f17577](https://github.com/codebridger/subturtle-dashboard-app/commit/1f175774f832deed9d2d17bab7cfe26b12ec7f08))
* update subscription button logic in settings page; differentiate between freemium and paid plans for better user experience ([26631c0](https://github.com/codebridger/subturtle-dashboard-app/commit/26631c0a0de6fb087f50db1eed52d75cad2169a7))
* update subscription status handling to include additional states and modify active subscription query logic ([3d74382](https://github.com/codebridger/subturtle-dashboard-app/commit/3d743822bdd8cd8041164487d8e148e3a1c1a88e))

### Performance Improvements

* **live-session:** cache static text-turn prefix to cut token cost [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exr424h ([636a25a](https://github.com/codebridger/subturtle-dashboard-app/commit/636a25a1fe2ce1e63412b7d19d824aa665c320dd)), closes [#86exr424h](https://github.com/codebridger/subturtle-dashboard-app/issues/86exr424h)
…ms for L3+ fill-in #86exnxph5

Surface two flat fields on every item returned by get-review-session (getDueItems)
and get-custom-review-session (getCustomReviewItems):

- confirmed_chunk: text of the phrase's primary chunk (highest confidence,
  tie-break earliest), or null when the phrase has no chunks so the renderer
  falls back to the recognition card.
- source_sentence: the phrase's context, kept whole (no AI-trim), or null.

Read-path only; no schema change. Ratified by Council 005 (primary-chunk rule).
Adds a ReviewItem type and unit tests covering highest-confidence selection,
tie-break, and the null-fallback cases.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…w-bundle-return-confirmed_chunk-source_sentence-L3-fill-in_Navid-Shad

feat(leitner): return confirmed_chunk + source_sentence on review items for L3+ fill-in #86exnxph5
# [1.0.0-dev.2](v1.0.0-dev.1...v1.0.0-dev.2) (2026-07-03)

### Features

* **leitner:** return confirmed_chunk + source_sentence on review items for L3+ fill-in [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exnxph5 ([2856a3b](2856a3b)), closes [#86exnxph5](https://github.com/codebridger/subturtle-dashboard-app/issues/86exnxph5)
…ettings surfaces #86exnxp4t #86exnxpez

Introduce a per-user Pool that holds newly saved phrases for a first-encounter
(encode) step before they enter Leitner spaced repetition.

Backend (86exnxp4t):
- New pool module (collection, PoolService, get-pool / complete-pool-session RPCs).
- Route phrase saves (insert-one/insert-many) into the Pool instead of Leitner L1.
- Forgot×2 at L1 re-routes a stuck card back to the Pool (reuses consecutiveIncorrect).
- Daily 03:00 age-out job promotes items past the user's cut-off into L1 silently.
- Consolidate reviewHour/reviewInterval + new poolAgeCutoffDays/poolChunkSize on the
  profile doc, with a profile-first fallback and a one-time backfill script.
- promote() is crash-safe/idempotent via addPhraseToBox onlyIfAbsent; encountered flag
  distinguishes encoded-then-promoted from aged-out.

Frontend (86exnxpez):
- Pinia pool store; count-adaptive PoolCard on /board (Start / Do the next N).
- PoolReviewSession + PoolReviewItem encode flow reusing ClozeCard; progress dots.
- Pool settings section on /settings/preferences (age cut-off, chunk size, review time).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Split the preferences page into a segmented Smart Review / Pool switcher so
  only one settings domain (and its single save bar) shows at a time, replacing
  the two stacked blocks with dueling save controls.
- Rebuild the Pool settings as a self-contained card (icon header, divided rows,
  one save footer).
- Adopt "Study" terminology in the sidebar: PRACTICE section -> STUDY, and the
  settings link renamed to "Study Settings" and moved to the end of the section
  (nav + profile menu). The in-tab card title stays "Smart Review Settings".

Presentation/labels only — no behavior change; the update-settings flow is intact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ot-2-Pool-routing-data-model-age-out-settings-persistence_Navid-Shad

Pool system forgot 2 pool routing data model age out settings persistence navid shad #86exnxp4t #86exnxpez
…ith pilotui modal #86exnxphy

The Leitner flashcard runner called non-existent RPCs (get-review-bundle /
submit-review-result), so its review mode never loaded cards, and ended a
session with a raw browser alert(). Repoint it to the real get-review-session
/ submit-review endpoints (matching LeitnerReviewSession's shapes), replace the
completion alert with a pilotui Modal (confetti + "Back to Board"), and convert
the sibling save-error alert to a toastError.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…end-of-session-alert-with-a-pilotui-modal-toast_Navid-Shad

fix(leitner): use real review RPCs and replace end-of-session alert with pilotui modal #86exnxphy
# [1.0.0-dev.4](v1.0.0-dev.3...v1.0.0-dev.4) (2026-07-04)

### Bug Fixes

* **leitner:** use real review RPCs and replace end-of-session alert with pilotui modal [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exnxphy ([9543401](9543401)), closes [#86exnxphy](https://github.com/codebridger/subturtle-dashboard-app/issues/86exnxphy)
…ich Stripe lifecycle events #86exkh107

Close the Step 5 instrumentation gaps against the metrics framework
(codebridger/subturtle-docs). Adds the activation-funnel and trial-to-paid
events that were still missing, using the canonical [object]_[action]
naming convention:

- account_created (server-truth) on the new-user branch of both Google
  OAuth paths; props signup_provider, oauth_timezone, referrer.
- phrase_saved_first-time (server-truth) on a user's first-ever phrase in
  createPhrase; props source_platform, language_pair.
- pricing-page_viewed (client) on the subscription page with from_surface,
  threaded from the cap/limit banner entry points.
- Enrich the Stripe lifecycle events: trial_started +currency;
  subscription_started +currency +subscription_id; subscription_canceled
  +tier +lifetime_value_cents (summed from payment records) +cancel_reason.

Out of scope (per decisions): extension_installed (extension repo) and
fluent_waitlist_signed_up (no dashboard trigger yet). Mixpanel funnels and
the L1 Forgot-rate aggregate are defined for build-out once these deploy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…bort the subscription page mount #86exkh107

When NUXT_PUBLIC_MIXPANEL_PROJECT_TOKEN is unset (CI/e2e), the Mixpanel
plugin skips init and analytic.track() throws on the uninitialised
instance. Fired at the top of onMounted, that aborted the mount before
fetchPlans(), so the plan cards never rendered (Playwright
subscription-ui "four plan cards" failed). Wrap the analytics call in
try/catch — instrumentation is best-effort and must never break the page.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…tation-activation-funnel-trial-to-paid_Navid-Shad

Cu 86exkh107 step 5 instrumentation activation funnel trial to paid navid shad
# [1.0.0-dev.5](v1.0.0-dev.4...v1.0.0-dev.5) (2026-07-10)

### Bug Fixes

* guard pricing-page_viewed track so a token-less Mixpanel can't abort the subscription page mount [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkh107 ([71cf5e0](71cf5e0)), closes [#86exkh107](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkh107)

### Features

* wire account_created, first-save & pricing-page analytics + enrich Stripe lifecycle events [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkh107 ([5f49c7c](5f49c7c)), closes [#86exkh107](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkh107)
@navidshad navidshad added the review Claude Routine will take this and review the PR label Jul 10, 2026

Copy link
Copy Markdown
Contributor Author

Automated PR Review

Primary PR: Dev → Main (rolling integration PR)
Tasks covered: #86exkh107 · #86exnxphy · #86exnxp4t · #86exnxpez · #86exnxph5 · #86exqazkq


Task alignment

#86exkh107 — Instrumentation (activation funnel + trial-to-paid)

  • account_created — fired in both OAuth paths in auth/router.ts
  • phrase_saved_first_time — fired in phrase_bundle/functions.ts with pre-insert count check
  • pricing_page_viewed — guarded with try/catch in subscription.vue so Mixpanel absence can't abort mount
  • ✅ Stripe lifecycle events enriched (currency, subscription_id, lifetime_value_cents, cancel_reason)
  • ⚠️ Several events from the task spec are absent from this diff: extension_installed, weekly_active aggregate, starter_ai_credits_exhausted, starter_save_cap_hit, fluent_waitlist_signed_up, Mixpanel funnel build, and the L1 Forgot-rate baseline query. If these are intentionally deferred to a follow-up, no action needed — but the task is marked "ready for prod."

#86exnxphy — Replace Leitner end-of-session alert()

  • ✅ Both alert() calls replaced: completion uses a pilotui Modal; failure uses toastError from pilotui/toast
  • endFlashcardSession redirect preserved
  • ℹ️ The same commit also renames get-review-bundleget-review-session and submit-review-resultsubmit-review. That's beyond the task scope but appears intentional per the commit message.

#86exnxp4t — Pool system backend

  • server/src/config.tsDATABASE_POOL + POOL_COLLECTION added (follows CLAUDE.md "always add new collections to config.ts")
  • pool/db.ts — schema with userId, items[], idiomatic modular-rest defineCollection
  • pool/service.tsadd, remove, list, promote, ageOutAllUsers with crash-safe promote ordering (add-before-remove)
  • pool/functions.tsget-pool and complete-pool-session RPCs with server-auth context
  • phrase_bundle/triggers.ts — auto-entry routes to Pool instead of Leitner L1
  • leitner_box/service.ts — Forgot ×2 → Pool routing with consecutive-counter reset on Learned
  • profile/db.tsreviewHour, reviewInterval, poolAgeCutoffDays, poolChunkSize added with defaults
  • ✅ Age-out job wired in index.ts (0 3 * * *, idempotent createJob call)
  • ℹ️ No server/src/modules/pool/triggers.ts — the task spec listed it as a touch, but the functionality was implemented directly in index.ts. Deliberate and fine.

#86exnxpez — Pool UI surfaces

  • PoolCard.vue — count-adaptive copy, "Start" + "Do the next N" buttons (conditional on poolCount > chunkSize)
  • board/index.vue — PoolCard mounted, empty-state guard updated to activities.length === 0 && poolCount === 0
  • stores/pool.tsfetchPool, startSession, completeSession with analytics tracking
  • PoolReviewItem.vue, practice/PoolReviewSession.vue — review UI
  • Pool/PoolSettings.vue + settings/preferences.vue — age-cut-off, chunk-size settings

#86exnxph5 — get-review-bundle returns confirmed_chunk + source_sentence

  • ReviewItem interface added to leitner_box/db.ts with confirmed_chunk: string | null and source_sentence: string | null
  • LeitnerService.pickConfirmedChunk — picks highest-confidence chunk, returns null when absent
  • ✅ Both getReviewBundle and getCustomReviewItems updated
  • ✅ Test files for the new behaviour present (leitner_box/__tests__/review_bundle.test.ts, forgot_routing.test.ts)

#86exqazkq — Show versions

  • AppVersionFooter.vue — renders version from runtimeConfig.public.APP_VERSION
  • nuxt.config.tsAPP_VERSION baked from package.json at build time
  • release.config.cjs — dual-changelog setup mirroring extension repo
  • .github/workflows/release.yml — unit-test gate before yarn release
  • CLAUDE.md — stale "not wired up" note corrected; ClickUp task-ID convention documented

Commit messages

Commit Assessment
71cf5e0 fix: guard pricing-page_viewed…
5f49c7c feat: wire account_created, first-save & pricing-page analytics…
9543401 fix(leitner): use real review RPCs and replace end-of-session alert… ✅ — dual-purpose but both halves are fixes
d5e35bc style(settings): tabbed Study settings page + study nav terminology ⚠️ style: means code-formatting (no bump). A tabbed settings page is a user-facing UI change — this should be feat:. As-is, semantic-release produces no version bump for this change.
f6ebc1d feat(pool): Pool encode queue, Forgot×2 routing, age-out, and board/settings surfaces
2856a3b feat(leitner): return confirmed_chunk + source_sentence…
5a8e246 docs: correct stale note in CLAUDE.md
7228660 ci: gate dashboard release on unit tests
ea095dc docs: require ClickUp # in commit subject
8e58fb5 feat: show dashboard version in a global footer

Convention check

🔴 frontend/stores/pool.tsauthUser used without import

fetchPool() and completeSession() both call authUser.value?.id, but authUser is never imported or defined in this file. The component-side equivalent (e.g. PoolSettings.vue) correctly does const { authUser } = storeToRefs(useProfileStore()). If this store is not covered by a Nuxt auto-imported composable that exposes authUser as a top-level reactive ref, both functions will throw ReferenceError: authUser is not defined at runtime. The server-side RPCs (get-pool, complete-pool-session) read userId from the auth context rather than args, so server behaviour would be unaffected, but the client-side code would crash.

Action needed: confirm the auto-import path, or add:

const { authUser } = storeToRefs(useProfileStore())

at the top of the defineStore setup function.


🟡 server/src/utils/analytics.ts — event name has a hyphen

PHRASE_SAVED_FIRST_TIME: "phrase_saved_first-time",

All other events use underscores throughout (trial_started, subscription_started, etc.). The task spec and naming convention ([object]_[action]) call for phrase_saved_first_time. The hyphen before "time" will create a separate Mixpanel event name that never matches a filter built on the spec name.


🟡 pickConfirmedChunk duplicated

LeitnerService.pickConfirmedChunk and PoolService.pickConfirmedChunk are byte-for-byte identical (both even carry the same comment about confidence tie-breaking). Both are private static, so they can't be shared as-is. Moving to a shared utility function (server/src/utils/chunk.ts or similar) would keep them in sync. Not a blocker, but a divergence risk.


🟡 Circular dependency via require() at runtime

Both LeitnerService.submitReviewResult and PoolService.promote use const { … } = require("../…/service") inside the function body to avoid the Pool ↔ LeitnerBox import cycle. This is documented with comments, but breaks TypeScript type checking at the call sites. A shared interface (IPoolService) or an event-emitter pattern would make the coupling explicit and type-safe.


Prior review follow-up

No prior automated or manual reviews found on this PR.


Verdict

REQUEST CHANGES

The authUser reference in stores/pool.ts is unresolved — if it isn't an auto-import, both fetchPool and completeSession throw at runtime, breaking the Pool card on the board. The phrase_saved_first-time event name inconsistency will silently track under the wrong key in Mixpanel. Both need confirmation or a fix before this merges to main. The style(settings) commit type is a minor versioning concern but does not block production functionality.


Generated by Claude Code

@navidshad navidshad removed the review Claude Routine will take this and review the PR label Jul 10, 2026 — with Claude
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants