← All Projects

Archived Reports

Project: Lenci V0.2.0 R1

#13 2026-02-28 22:15:42

Description

Issue Description On the Arabic (RTL) UI, the “Generation completed” toast shows English text (e.g., “Generation completed”, “View”, “Dismiss”) instead of Arabic translations. Additionally, the View button inside the toast does not perform any action (it doesn’t navigate to the generated image, open a modal, scroll to results, or focus the generated item). This results in: Localization mismatch (English UI fragments in Arabic experience). Broken primary CTA (“View” is the most important action in the toast, but it’s non-functional). Expected Behavior When the app language is Arabic, the toast content and buttons must be fully localized (Arabic strings + RTL-friendly layout). Clicking View should reliably take the user to the generated output using the intended behavior (e.g., open the generated image viewer, navigate to “Generated Results”, or scroll/focus the created item). The toast should remain accessible and functional regardless of the current section the user is in (as long as the generated output exists). Acceptance Criteria With Arabic selected: Toast title and message are displayed in Arabic (no English fallback strings). View and Dismiss labels are Arabic and correctly rendered in RTL. Clicking View triggers a visible outcome every time: Option A: Opens the generated image in a viewer/lightbox, or Option B: Navigates to the page/section where the generated image is listed, or Option C: Scrolls to and highlights/focuses the generated item in the current page. If the generated output is not available (edge case), clicking View shows a clear localized message (Arabic) explaining that the result is not ready yet, instead of failing silently. No console errors are produced when clicking View in Arabic mode.

Console Output

api-DnxV09yk.js:1 [PerformanceService] Initialized
api-DnxV09yk.js:1 [PerformanceService] Auto-initialized, session: session_1772316684253_9pey1o393
creditHistoryService-Dglymeu_.js:1 🚀 [AuthContext] Initializing authentication...
creditHistoryService-Dglymeu_.js:1 ✅ [AuthContext] Session found for user: ash4-test-lenci@25hraf.com
creditHistoryService-Dglymeu_.js:1 🔍 [AuthContext] Fetching profile for user: ash4-test-lenci@25hraf.com 5bfe0858-56fe-4629-9b3c-d4995974d65d
main-CWxUIURF.js:9837 [AutoSave] Draft restored for apparel
creditHistoryService-Dglymeu_.js:1 ✅ [AuthContext] User profile loaded from API: {id: '5bfe0858-56fe-4629-9b3c-d4995974d65d', email: 'ash4-test-lenci@25hraf.com', email_verified: true, display_name: 'ash f', avatar_url: null, …}
creditHistoryService-Dglymeu_.js:1 📊 [AuthContext] Final user profile: {id: '5bfe0858-56fe-4629-9b3c-d4995974d65d', email: 'ash4-test-lenci@25hraf.com', plan: 'pro', generationsUsed: 0, creditsBalance: '108.38'}
creditHistoryService-Dglymeu_.js:1 ✅ [AuthContext] User profile set in state
creditHistoryService-Dglymeu_.js:1 [WS] Connected
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 0, stage: 'Starting generation...', generationType: 'apparel'}
main-CWxUIURF.js:9575 🎬 Starting Apparel Generation
main-CWxUIURF.js:9575 📊 Current Scene State: {lighting: 'Flat & Even', lightingId: 'l7', background: 'Modern Loft', backgroundId: 'b5', backgroundType: 'scene', …}
main-CWxUIURF.js:9575 📊 Current Apparel Controls: {shotType: 'Back View', shotTypeId: 'st2', expression: 'Neutral', expressionId: 'e1', cameraAngle: 'Eye-Level', …}
main-CWxUIURF.js:9575 🎨 AI Concept Applied: Yes (ID: p06)
main-CWxUIURF.js:9575 🎯🎯🎯 REGULAR GENERATION PATH - Full apparelControls State: {shotType: 'Back View', shotTypeId: 'st2', shotTypeDesc: 'in a full-body shot from the back to showcase the rear of the garment, shot at eye-level.', expression: 'Neutral', expressionId: 'e1', …}
main-CWxUIURF.js:9575 🎯🎯🎯 REGULAR GENERATION PATH - Passing to promptService: {shotType: 'Back View', shotTypeDesc: 'in a full-body shot from the back to showcase the rear of the garment, shot at eye-level.', expression: 'Neutral', expressionDesc: 'a neutral, high-fashion expression.', sceneBackground: 'Modern Loft', …}
main-CWxUIURF.js:9300 🎨 PromptService - Custom prompt exists: false
main-CWxUIURF.js:9470 🎯 APPAREL CONTROLS: {shotType: 'Back View', shotTypeDesc: 'in a full-body shot from the back to showcase the rear of the garment, shot at eye-level.', expression: 'Neutral', expressionDesc: 'a neutral, high-fashion expression.'}
main-CWxUIURF.js:9574 📤 FINAL PROMPT BEING SENT TO GEMINI (First 1000 chars): **Face & Body Preservation (CRITICAL):**
Maintain the model's exact facial features, skin tone, body proportions, and hair. No beautification, no aging, no smoothing, no feature changes. The person must be recognizably identical to the reference. For female models: preserve ALL natural details (skin texture, pores, wrinkles, freckles, moles) — zero beautification. Only clothing and pose should change.

**MASTER PHOTOSHOOT DIRECTIVE — NON-NEGOTIABLE RULES:**
1.  **FACIAL IDENTITY IS SACRED:** The face from the reference is ABSOLUTE and UNTOUCHABLE. No exceptions — especially for female models.
2.  **STRICT MODULARITY:** MODEL, APPAREL, POSE, and SCENE instructions are independent. Do not infer details from one to another.
3.  **INPUTS ARE LAW:** Follow text descriptions and image assets as the definitive source of truth.
4.  **APPAREL ACCURACY:** Apparel design, pattern, and color come *exclusively* from provided apparel images.
5.  **PERSON IN APPAREL IMAGE ≠ MODEL:** Apparel images ma
main-CWxUIURF.js:9574 📤 Prompt includes background: false
main-CWxUIURF.js:9574 📤 Prompt includes lighting: false
main-CWxUIURF.js:9574 📤 Total prompt length: 8935 characters
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 0, stage: 'Starting generation...', generationType: 'apparel', estimatedTimeRemaining: 25}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 5, stage: 'Generating image 1 of 1...', generationType: 'apparel', estimatedTimeRemaining: 0.019}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 10, stage: 'Uploading images for image 1...', generationType: 'apparel', estimatedTimeRemaining: 0.108}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 0, stage: 'Starting generation...', generationType: 'apparel', estimatedTimeRemaining: 25}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 20, stage: 'Uploading images...', generationType: 'apparel', estimatedTimeRemaining: 0}
main-CWxUIURF.js:8330 📡 Calling server endpoint: /api/imaging/process (Gemini)
main-CWxUIURF.js:8330 ⚙️ Settings: {shotType: {…}, cameraAngle: {…}, focalLength: {…}, aperture: {…}, lighting: {…}, …}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 40, stage: 'Processing with AI...', generationType: 'apparel', estimatedTimeRemaining: 0}
main-CWxUIURF.js:8330 📦 Compressing images for upload...
main-CWxUIURF.js:8330 ✅ Images compressed successfully
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {stage: 'Credits reserved, generating image...', progress: 30, generationType: 'apparel', estimatedTimeRemaining: 0.487}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {stage: 'AI is generating your image...', progress: 60, generationType: 'apparel', estimatedTimeRemaining: 0.488}
main-CWxUIURF.js:8330 ✅ Server returned data via SSE (attempt 1/4)
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 70, stage: 'Rendering image...', generationType: 'apparel', estimatedTimeRemaining: 3.8905714285714286}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 90, stage: 'Finalizing...', generationType: 'apparel', estimatedTimeRemaining: 1.0086666666666666}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 95, stage: 'Image received, still processing...', generationType: 'apparel', estimatedTimeRemaining: 0.47778947368421143}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 75, stage: 'Image 1 generated', generationType: 'apparel', estimatedTimeRemaining: 3.030666666666667}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 90, stage: 'Image 1 complete', generationType: 'apparel', estimatedTimeRemaining: 1.0108888888888892}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 90, stage: 'Finalizing...', generationType: 'apparel', estimatedTimeRemaining: 1.0108888888888892}
main-CWxUIURF.js:8324 [ProgressTracking] Emitting progress: {progress: 100, stage: 'Complete', generationType: 'apparel', estimatedTimeRemaining: 0}
main-CWxUIURF.js:8330  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
processImages @ main-CWxUIURF.js:8330
await in processImages
(anonymous) @ main-CWxUIURF.js:8769
generatePhotoshootImage @ main-CWxUIURF.js:8769
(anonymous) @ main-CWxUIURF.js:9575
generateAsset @ main-CWxUIURF.js:9575
await in generateAsset
onClick @ main-CWxUIURF.js:9777
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1 [PerformanceService] Skipping sync of 17 metrics (Supabase migration - not persisted)
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/generation-jobs/a44b3c2c-559d-4f8c-81ef-bc1a7aceb2f4/claim 404 (Not Found)
tt @ api-DnxV09yk.js:1
await in tt
rt @ api-DnxV09yk.js:1
(anonymous) @ main-CWxUIURF.js:9814
c @ main-CWxUIURF.js:9814
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
api-DnxV09yk.js:1 [PerformanceService] Skipping sync of 11 metrics (Supabase migration - not persisted)

Screenshots & Video

#12 2026-02-28 22:10:45

Description

Issue Description The “Generation completed!” toast (with View / Dismiss) remains visible indefinitely and persists across route/menu navigation. It does not auto-dismiss and only disappears after a full page refresh, which suggests the toast state is either: stored in a global/persistent layout layer and never cleared on navigation, and/or missing a timeout/auto-dismiss behavior and proper dismissal handling. This creates a sticky UI overlay that can distract users and partially cover page content while they move between studios/pages. Expected Behavior The “Generation completed!” toast should auto-dismiss after a short duration (unless it’s intentionally designed as persistent). When the user navigates to another page/studio, the toast should either dismiss automatically or remain only if there’s a deliberate “global notifications” design with clear lifecycle rules. Clicking Dismiss should always remove it immediately and persist that dismissal (it should not reappear on next navigation). Acceptance Criteria The toast auto-dismisses after N seconds (define a consistent value, e.g., 5–10s) when no user action is taken. The toast does not remain visible indefinitely. Navigating between sidebar pages/studios results in one of the following (pick one behavior and apply consistently): Option A (recommended): Toast is cleared on route change (it should not follow the user to other pages). Option B: Toast may persist across navigation only until it times out or the user dismisses it, and it never outlives its intended duration. Dismiss hides the toast immediately and it stays hidden without requiring a page refresh. Only one completion toast is visible per completed generation event (no stacking duplicates on repeated navigation).

Screenshots & Video

#11 2026-02-28 20:46:30

Description

Issue Description When generating a package, the request fails with a backend error: ❌ UsageService RPC failed: invalid input syntax for type integer: "1.08" This indicates the package-generation flow is sending a decimal string value ("1.08") into a field/argument that the RPC (and underlying database type) expects to be an integer. As a result, the usage/credit calculation step crashes before generation can proceed. Expected Behavior Package generation should succeed when the user has sufficient credits, and the usage/credits RPC should receive correctly typed numeric inputs (integers for integer fields). If fractional credits/pricing are supported, they should be handled using a compatible numeric type (e.g., decimal) and never passed into integer-only parameters. Acceptance Criteria Generating a package does not throw invalid input syntax for type integer for any numeric value. The usage/credits RPC accepts and processes the package cost consistently: If the system uses integer credits: all package costs are converted/rounded deterministically before calling the RPC (no decimal strings). If the system supports fractional credits: the RPC/database types support decimals and the UI/backend send a numeric decimal type (not an integer field). The same package can be generated repeatedly (when credits allow) without intermittent type errors. The UI displays a clear, correct error only when there is a real business rule failure (e.g., insufficient credits), not a type mismatch. Logs for the failing call include the payload fields and confirm the numeric field is sent as the correct type (number) and expected scale (integer or decimal).

Console Output

api-DnxV09yk.js:1  POST https://test-lenci.siyadatech.studio/api/packages/generate 500 (Internal Server Error)
tt @ api-DnxV09yk.js:1
await in tt
generatePackage @ main-CWxUIURF.js:9590
onClick @ main-CWxUIURF.js:9777
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49
main-CWxUIURF.js:9878 [generatePackage] Package generation failed: {status: 500, statusText: '', error: 'server_error', message: 'UsageService RPC failed: invalid input syntax for type integer: "1.08"', details: undefined, …}
DIe.console.error @ main-CWxUIURF.js:9878
generatePackage @ main-CWxUIURF.js:9590
await in generatePackage
onClick @ main-CWxUIURF.js:9777
Mf @ LanguageContext-D5j2HYtZ.js:48
(anonymous) @ LanguageContext-D5j2HYtZ.js:48
Iu @ LanguageContext-D5j2HYtZ.js:48
gc @ LanguageContext-D5j2HYtZ.js:48
Dc @ LanguageContext-D5j2HYtZ.js:49
dv @ LanguageContext-D5j2HYtZ.js:49

Screenshots & Video

#9 2026-02-26 21:01:20

Description

Issue description (better) The onboarding trial logic grants only 10 credits when the user starts a paid-plan trial, while the free plan grants 100 credits. This makes the “upgrade/trial” path feel objectively worse than staying on the free plan, which is counterintuitive and undermines conversion: users perceive the paid plan as offering less value during evaluation. In the screenshot, the “Free Trial Started!” step explicitly states 10 free credits (sidebar also shows 10), reinforcing that the trial experience is more limited than the free tier. Expected behavior A paid-plan trial should provide equal or higher evaluation value than the free plan (credits and/or capabilities). Credit grants should align with the product’s value ladder: Free plan = baseline credits. Paid trial = at least baseline credits (or fewer credits only if compensated by clearly superior capabilities/limits). The UI copy should reflect a coherent pricing narrative (trial ≠ downgrade). Acceptance criteria AC1 — Value ladder sanity: Paid-plan trial credits are ≥ free plan credits, or if credits are lower, the product clearly communicates compensating benefits (e.g., higher quality models, faster queue, advanced features) in the same onboarding step. AC2 — Plan-consistent messaging: The trial screen accurately shows: the plan being trialed, credits granted for that plan, and why that amount makes sense relative to free. AC3 — No “trial downgrade” outcome: A user comparing free vs paid trial cannot conclude “paid trial gives less value” based on credits/limits displayed in onboarding and sidebar. AC4 — Configurable & deterministic: Trial credit amounts are driven by plan configuration (not hardcoded), and switching trial plan types reliably changes the granted credit amount accordingly. AC5 — Regression check: New accounts starting: Free plan → receive the configured free credits. Paid-plan trial → receive the configured trial credits (meeting AC1), and sidebar matches onboarding.

Console Output

api-DwqDtze-.js:1 [PerformanceService] Initialized
api-DwqDtze-.js:1 [PerformanceService] Auto-initialized, session: session_1772139012519_szs9pkshq
creditHistoryService-DnIqKhcN.js:1 🚀 [AuthContext] Initializing authentication...
creditHistoryService-DnIqKhcN.js:1 ✅ [AuthContext] Session found for user: ash5-test-lenci@25hraf.com
creditHistoryService-DnIqKhcN.js:1 🔍 [AuthContext] Fetching profile for user: ash5-test-lenci@25hraf.com 6075f653-6566-4796-8486-f46b7cc4123a
creditHistoryService-DnIqKhcN.js:1 ✅ [AuthContext] User profile loaded from API: {id: '6075f653-6566-4796-8486-f46b7cc4123a', email: 'ash5-test-lenci@25hraf.com', email_verified: true, display_name: 'ash f', avatar_url: null, …}
creditHistoryService-DnIqKhcN.js:1 📊 [AuthContext] Final user profile: {id: '6075f653-6566-4796-8486-f46b7cc4123a', email: 'ash5-test-lenci@25hraf.com', plan: 'starter', generationsUsed: 0, creditsBalance: 10}
creditHistoryService-DnIqKhcN.js:1 ✅ [AuthContext] User profile set in state
creditHistoryService-DnIqKhcN.js:1 WebSocket connection to 'wss://test-lenci.siyadatech.studio/api/ws?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzIxNDI1MDgsImlhdCI6MTc3MjEzODkwOCwic3ViIjoiNjA3NWY2NTMtNjU2Ni00Nzk2LTg0ODYtZjQ2YjdjYzQxMjNhIiwiZW1haWwiOiJhc2g1LXRlc3QtbGVuY2lAMjVocmFmLmNvbSIsInBob25lIjoiIiwiYXBwX21ldGFkYXRhIjp7InByb3ZpZGVyIjoiZW1haWwiLCJwcm92aWRlcnMiOlsiZW1haWwiXX0sInVzZXJfbWV0YWRhdGEiOnsiZGlzcGxheV9uYW1lIjoiYXNoIGYifSwicm9sZSI6IiIsImFhbCI6ImFhbDEiLCJhbXIiOlt7Im1ldGhvZCI6InBhc3N3b3JkIiwidGltZXN0YW1wIjoxNzcyMTM4OTA4fV0sInNlc3Npb25faWQiOiI5ZTQ0ZjZlNS02MWJkLTQ5ZTQtYjc2Ny02NjYwNzYwNjQ0M2UifQ.rlhvansA3V8OYZ4Fxfqi8d1Gpb5yTtyCbj_50hxdetY' failed: 
connect @ creditHistoryService-DnIqKhcN.js:1
creditHistoryService-DnIqKhcN.js:1 [WS] Connected
api-DwqDtze-.js:1 [PerformanceService] Skipping sync of 9 metrics (Supabase migration - not persisted)
main-w6z9O1el.js:9877 [AutoSave] Draft restored for apparel
api-DwqDtze-.js:1 [PerformanceService] Skipping sync of 3 metrics (Supabase migration - not persisted)

Screenshots & Video