CognxSafeTrack commited on
Commit
c1cf9c6
·
1 Parent(s): b80a3ef

fix(progression): atomic logic inversion and command unlocking

Browse files
apps/api/src/services/ai/index.ts CHANGED
@@ -319,6 +319,7 @@ class AIService {
319
  - Tu NE DOIS PLUS JAMAIS demander à l'utilisateur de s'expliquer davantage (ex: "Quel est l'âge exact ?", "Combien gagnes-tu ?").
320
  - S'il manque un détail mais que l'idée est claire, c'est TOI qui apportes le savoir (donne les tranches d'âges classiques du secteur, donne les revenus moyens du pays).
321
  - Tu es là pour ENRICHIR sa vision, pas pour lui faire passer un interrogatoire. Ne pose AUCUNE question bloquante à la fin.
 
322
 
323
  INVITATION DEEP-DIVE OBLIGATOIRE :
324
  ${hasQuestion ? `L'utilisateur ayant posé une question, tu DOIS systématiquement proposer l'option d'approfondissement pour explorer des alternatives stratégiques.` : ''}
 
319
  - Tu NE DOIS PLUS JAMAIS demander à l'utilisateur de s'expliquer davantage (ex: "Quel est l'âge exact ?", "Combien gagnes-tu ?").
320
  - S'il manque un détail mais que l'idée est claire, c'est TOI qui apportes le savoir (donne les tranches d'âges classiques du secteur, donne les revenus moyens du pays).
321
  - Tu es là pour ENRICHIR sa vision, pas pour lui faire passer un interrogatoire. Ne pose AUCUNE question bloquante à la fin.
322
+ - **CRITÈRE DE VALIDATION (isQualified)** : Dès que l'utilisateur fournit une réponse sérieuse liée à son projet (même courte), mets 'isQualified: true'. Ne sois pas trop sévère. S'il y a un doute, valide et enrichis dans ton feedback.
323
 
324
  INVITATION DEEP-DIVE OBLIGATOIRE :
325
  ${hasQuestion ? `L'utilisateur ayant posé une question, tu DOIS systématiquement proposer l'option d'approfondissement pour explorer des alternatives stratégiques.` : ''}
apps/api/src/services/whatsapp.ts CHANGED
@@ -361,9 +361,14 @@ export class WhatsAppService {
361
  where: { userId_trackId: { userId: user.id, trackId: activeEnrollment.trackId } }
362
  });
363
 
364
- // Strict check: you can jump if completed OR if currently in a deep dive (user skips it).
365
- if (userProgress?.exerciseStatus !== 'COMPLETED' && userProgress?.exerciseStatus !== 'PENDING_DEEPDIVE') {
366
- console.log(`[SUITE-BLOCKED] User ${user.id} tried SUITE but status is ${userProgress?.exerciseStatus || 'null'}`);
 
 
 
 
 
367
  await scheduleMessage(user.id, user.language === 'WOLOF'
368
  ? "Dafa laaj nga tontu laaj bi ci kaw dëbb (audio walla texte) balaa nga dem ci kanam ! 🎙️"
369
  : "Tu dois d'abord répondre à l'exercice ci-dessus pour continuer ! 🎙️"
@@ -394,13 +399,26 @@ export class WhatsAppService {
394
  where: { userId_trackId: { userId: user.id, trackId: activeEnrollment.trackId } }
395
  });
396
 
397
- if (userProgress?.exerciseStatus === 'COMPLETED') {
398
- // Start the Deep Dive process
399
- await prisma.userProgress.update({
400
- where: { id: userProgress.id },
401
- data: { exerciseStatus: 'PENDING_DEEPDIVE' }
402
- });
403
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
404
  await scheduleMessage(user.id, user.language === 'WOLOF'
405
  ? "Baax na ! Wax ma ndox mi nga yor ci sa mbir (njëg, jafe-jafe, njëgëndal, njàngat, etc.) ngir ma gën a deesi njàngat bi :"
406
  : "Très bien ! Quelle information précise issue de ton terrain veux-tu ajouter ? (ex: un prix précis, un obstacle, un fournisseur, etc.) :"
 
361
  where: { userId_trackId: { userId: user.id, trackId: activeEnrollment.trackId } }
362
  });
363
 
364
+ // 🚨 UNBLOCKING GUARD: Allow SUITE if a response has been recorded for the current day OR if status is valid.
365
+ const lastResponse = await prisma.response.findFirst({
366
+ where: { userId: user.id, dayNumber: activeEnrollment.currentDay },
367
+ orderBy: { createdAt: 'desc' }
368
+ });
369
+
370
+ if (userProgress?.exerciseStatus !== 'COMPLETED' && userProgress?.exerciseStatus !== 'PENDING_DEEPDIVE' && !lastResponse) {
371
+ console.log(`[SUITE-BLOCKED] User ${user.id} tried SUITE but status is ${userProgress?.exerciseStatus || 'null'} and no response found.`);
372
  await scheduleMessage(user.id, user.language === 'WOLOF'
373
  ? "Dafa laaj nga tontu laaj bi ci kaw dëbb (audio walla texte) balaa nga dem ci kanam ! 🎙️"
374
  : "Tu dois d'abord répondre à l'exercice ci-dessus pour continuer ! 🎙️"
 
399
  where: { userId_trackId: { userId: user.id, trackId: activeEnrollment.trackId } }
400
  });
401
 
402
+ // 🚨 UNBLOCKING GUARD: Allow 1/APPROFONDIR if a response exists.
403
+ const lastResponse = await prisma.response.findFirst({
404
+ where: { userId: user.id, dayNumber: activeEnrollment.currentDay },
405
+ orderBy: { createdAt: 'desc' }
406
+ });
 
407
 
408
+ if (userProgress?.exerciseStatus === 'COMPLETED' || (userProgress?.exerciseStatus === 'PENDING' && lastResponse)) {
409
+ // Force state transition if it was stuck
410
+ if (userProgress?.exerciseStatus === 'PENDING') {
411
+ await prisma.userProgress.update({
412
+ where: { id: userProgress.id },
413
+ data: { exerciseStatus: 'PENDING_DEEPDIVE' }
414
+ });
415
+ } else {
416
+ await prisma.userProgress.update({
417
+ where: { id: userProgress.id },
418
+ data: { exerciseStatus: 'PENDING_DEEPDIVE' }
419
+ });
420
+ }
421
+
422
  await scheduleMessage(user.id, user.language === 'WOLOF'
423
  ? "Baax na ! Wax ma ndox mi nga yor ci sa mbir (njëg, jafe-jafe, njëgëndal, njàngat, etc.) ngir ma gën a deesi njàngat bi :"
424
  : "Très bien ! Quelle information précise issue de ton terrain veux-tu ajouter ? (ex: un prix précis, un obstacle, un fournisseur, etc.) :"