Project

General

Profile

Feature #21 » qa-redmine-21-rapport-technique.txt

Redmine Admin, 06/11/2026 09:45 PM

 
================================================================================
QA #21 — Enhance Matching Results & AI Assistant (Company Enrichment + Insights)
Agent : QA manuelle (#25) Date : 2026-06-11
Worktree : .worktrees/redmine-21-insights-ui Branche : feat/redmine-21-insights-ui
PR #239 (base dev) Commits : 6775adb #58, de4b286 #61+#63, aa371db #64, d33026c #66, cd2d2c4 #67
================================================================================

RESULTAT GLOBAL : FAIL (regression i18n bloquante introduite par #66)

--------------------------------------------------------------------------------
COMMANDES EXECUTEES
--------------------------------------------------------------------------------
$ npx prisma generate -> OK (client genere)
$ npx vitest run <7 suites de l'epic> -> 7 fichiers / 43 tests PASS
$ npx tsc --noEmit -> erreurs (voir analyse)
$ node (transpile en.ts/fr.ts + resolution runtime) -> preuve de collision de cle

Secrets : aucun secret (cle Mistral, DB URL, tokens) n'apparait dans cette preuve.

--------------------------------------------------------------------------------
TESTS UNITAIRES AJOUTES PAR L'EPIC -> 43/43 PASS
--------------------------------------------------------------------------------
PASS src/domain/services/__tests__/MarketInsightsService.test.ts (11)
PASS src/app/api/market-insights/__tests__/route.test.ts ( 8)
PASS src/components/molecules/__tests__/CompanyEnrichmentCard.test.tsx ( 5)
PASS src/components/molecules/__tests__/MarketInsightsSection.test.tsx ( 5)
PASS src/infrastructure/ai/__tests__/assistantCompanyAndInsights.test.ts ( 5)
PASS src/application/use-cases/__tests__/SendAssistantMessageUseCase.prompt.test.ts (4)
PASS src/lib/__tests__/attachCompanyData.enrichment.test.ts ( 5)

--------------------------------------------------------------------------------
ACCEPTANCE — inspection source + tests
--------------------------------------------------------------------------------
AC1 Carte entreprise inline (#64/#58) : OK (code + tests)
- CompanyEnrichmentCard.tsx : rendu present-only, retourne null si aucune
enrichment (pas de champ invente), lien /companies/<slug>, expand/collapse.
- attachCompanyData.ts : objet companyEnrichment construit uniquement a partir
des champs non-null ; omis entierement si vide. NO-FAKE-DATA respecte.
- Rendu dans OfferMatchDetail.tsx (l.776/792) + MatchedOfferCard.tsx.

AC2 Section Market Insights (#66/#61/#63) : KO <-- voir REGRESSION
- Logique d'agregation (MarketInsightsService.computeMarketInsights) correcte :
compte reel par offre, % work-mode sur lignes classifiables seulement,
corpus vide -> agregats vides (pas de chiffre invente). Endpoint
GET /api/market-insights?role=&location= present, filtre active-offer
canonique (findActiveMarketInsightRows / buildWhereClause), cache 30 min.
- MAIS la livraison #66 introduit une REGRESSION i18n bloquante (ci-dessous).

AC3 Assistant (#67) : OK (cablage outils)
- Outils get_company_data / get_market_insights declares dans
AssistantToolRegistry.ts et implementes dans AssistantToolExecutor.ts
(present-only, "donnee indisponible" si absent ; agregat reel sinon).
- System prompt (SendAssistantMessageUseCase) : sections "Donnees entreprise
(proactif)" + "Competences AVANT localisation (priorite)" avec consigne
"aucune valeur inventee". Tests prompt + tool-wiring PASS.

--------------------------------------------------------------------------------
REGRESSION BLOQUANTE — collision de cle i18n "marketInsights" (#66, commit d33026c)
--------------------------------------------------------------------------------
Fichiers : src/infrastructure/i18n/translations/en.ts et fr.ts

tsc :
en.ts(3114,3): error TS1117: An object literal cannot have multiple properties
with the same name.
fr.ts(3123,3): error TS1117: (idem)

Cause :
Il existe DEJA un bloc top-level `marketInsights:` (en.ts l.2771 / fr.ts l.2780)
= toute la page "Market Statistics" (title, subtitle, tabs, kpi, compensation...).
#66 a ajoute un SECOND bloc top-level `marketInsights:` (en.ts l.3114 / fr.ts
l.3123) avec seulement ~14 cles pour la nouvelle section.
En litteral objet JS, la DERNIERE cle dupliquee ECRASE la premiere.

Preuve de resolution runtime (transpile + eval) :
EN marketInsights.title => "Market insights" (attendu "Market Statistics")
EN marketInsights.tabs => undefined (bloc d'origine ecrase)
EN marketInsights.kpi => undefined
FR marketInsights.title => "Tendances du marche"
FR marketInsights.tabs => undefined
FR marketInsights.kpi => undefined

Impact :
La page existante /profile/developer/market-insights consomme ~40+ cles
t('marketInsights.title' | '.tabs.*' | '.kpi.*' | '.compensation.*' ...).
Toutes ces cles renvoient desormais undefined / la cle brute a l'execution.
=> page Market Statistics cassee (titres, onglets, labels) en EN et FR.

Correctif attendu :
Renommer le nouveau bloc (ex. `marketInsightsSection:`) ou fusionner ses cles
DANS le bloc existant (l.2771) plutot que de creer un 2e top-level. Mettre a
jour MarketInsightsSection.tsx en consequence. Idem en.ts ET fr.ts.

--------------------------------------------------------------------------------
NOTE tsc : le reste des erreurs tsc du projet (remotion/, importer mappers,
scripts/, subscription-limits, companyPageData...) sont pre-existantes et hors
scope de cet epic. Seules les 2 erreurs i18n ci-dessus + l'erreur de type
MatchOffersForDeveloperUseCase l.369 touchent les fichiers de l'epic ; la
collision i18n est la regression fonctionnelle bloquante.
================================================================================
(4-4/8)