From 32e1f07418c597edea1c42c5312c97f5cd809ae2 Mon Sep 17 00:00:00 2001 From: Froidefond Julien Date: Thu, 26 Feb 2026 08:14:43 +0100 Subject: [PATCH] feat: add template V2 with updated rubrics and fix ActionResult runtime error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add RUBRICS_V2 with improved rubrics for prompts, conception, iteration, evaluation, alignment and cost_control dimensions - Add "Full - 15 dimensions (V2)" template using RUBRICS_V2; V1 unchanged - Set V2 as default template by ordering templates by id desc in getTemplates - Point demo seed evaluations to full-15-v2 - Remove `export type { ActionResult }` from "use server" files (evaluations, admin, share) — Turbopack treats all exports as server actions, causing a runtime ReferenceError when the type is erased at compile time Co-Authored-By: Claude Sonnet 4.6 --- prisma/seed.ts | 95 +++++++++++++++++++++++++++++++++++++- src/actions/admin.ts | 1 - src/actions/evaluations.ts | 1 - src/actions/share.ts | 1 - src/lib/server-data.ts | 1 + 5 files changed, 95 insertions(+), 4 deletions(-) diff --git a/prisma/seed.ts b/prisma/seed.ts index 84ea511..9416cd9 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -120,6 +120,22 @@ const RUBRICS: Record = { "1:Pas de réflexion — aucune idée de comment contribuer au partage;2:Passif — ouvert à partager si sollicité;3:Contributeur ponctuel — partage ses pratiques de temps en temps;4:Multiplicateur — anime des retours d'expérience, documente ses outils;5:Levier d'équipe — impulse une dynamique de diffusion, produit des ressources réutilisables", }; +const RUBRICS_V2: Record = { + ...RUBRICS, + prompts: + "1:Vague — instructions floues ou incomplètes, l'IA doit deviner l'intention, résultats aléatoires;2:Clair — instructions compréhensibles avec une intention explicite, adapte le niveau de détail à la tâche;3:Précis — donne du contexte utile, précise les contraintes et le résultat attendu, ajuste selon les réponses;4:Méthodique — sait trouver et réutiliser des prompts efficaces, adapte sa formulation selon l'outil et la tâche;5:Maîtrise — spécification \"verrouillée\" : périmètre + définitions + hypothèses + priorités en cas de conflit + critères de sortie/acceptation, minimise l'interprétation et la variabilité des réponses", + conception: + "1:Code direct — pas de phase conception, passage direct au code;2:Conception informelle — réflexion mentale ou notes rapides, pas de formalisation;3:Conception assistée — IA pour esquisser des designs, SDD ou schémas;4:Mode plan structuré — IA utilisée pour explorer options, challenger, documenter les décisions;5:Conception maîtrisée — boucle conception-validation itérative, alternatives comparées et trade-offs explicites avant de coder", + iteration: + "1:One-shot — une seule tentative, pas de retry si le résultat est insuffisant;2:Quelques itérations — 2-3 essais manuels, reformulation si la première réponse échoue;3:Itératif — retry systématique avec reformulation ciblée, sait identifier ce qui ne va pas pour corriger le tir;4:Planifié — découpage en étapes avant de commencer, chaque étape traitée et validée avant la suivante;5:IA sparring partner — dialogue continu avec l'IA pour explorer, affiner, challenger les réponses", + evaluation: + "1:Acceptation — acceptation des sorties sans vérification significative;2:Relecture superficielle — lecture rapide, pas de critères explicites;3:Vérif fonctionnelle — tests manuels ou automatisés, vérification du comportement;4:Regard archi — évaluation de la maintenabilité, cohérence avec les patterns existants;5:Vigilance avancée — détection active des hallucinations et erreurs subtiles, vérification croisée avec d'autres sources, checklist personnelle de contrôle", + alignment: + "1:Hors standards — code généré souvent non conforme, rework systématique;2:Rework fréquent — modifications régulières nécessaires pour aligner le code aux standards;3:Globalement aligné — code généralement conforme, ajustements mineurs, NFR basiques (logs, erreurs) pris en compte;4:Proactif — rules ou instructions dédiées pour respecter standards, archi et NFR (perf, sécurité, observabilité);5:Intégré — NFR systématiquement couverts, garde-fous automatisés (rules, linters, templates), peu ou pas de rework", + cost_control: + "1:Inconscient — pas de visibilité sur les coûts, usage sans limite;2:Aware — conscience des coûts, consulte sa consommation de temps en temps;3:Attentif — choisit le modèle selon la tâche (léger pour le simple, puissant pour le complexe), limite le contexte inutile;4:Économe — optimise activement ses usages (taille du contexte, regroupement de requêtes, évite les générations inutiles);5:Exemplaire — pratiques de sobriété maîtrisées, sait arbitrer coût vs qualité, partage ses astuces d'optimisation", +}; + // Réponses réalistes par dimension et score (justification + exemples observés) const DEMO_RESPONSES: Record< string, @@ -407,6 +423,83 @@ const TEMPLATES_DATA = [ }, ], }, + { + id: "full-15-v2", + name: "Full - 15 dimensions (V2)", + dimensions: [ + { + id: "tools", + title: "Maîtrise individuelle de l'outillage", + rubric: RUBRICS_V2.tools, + }, + { id: "prompts", title: "Clarté des prompts", rubric: RUBRICS_V2.prompts }, + { + id: "conception", + title: "Conception & mode plan (SDD, design)", + rubric: RUBRICS_V2.conception, + }, + { + id: "context", + title: "Gestion du contexte", + rubric: RUBRICS_V2.context, + }, + { + id: "iteration", + title: "Capacité d'itération", + rubric: RUBRICS_V2.iteration, + }, + { + id: "evaluation", + title: "Évaluation critique", + rubric: RUBRICS_V2.evaluation, + }, + { + id: "exploration", + title: "Exploration & veille (workflows, astuces, pertinence)", + rubric: RUBRICS_V2.exploration, + }, + { + id: "alignment", + title: "Alignement archi & standards", + rubric: RUBRICS_V2.alignment, + }, + { + id: "quality_usage", + title: "Usage pour la qualité (tests, review)", + rubric: RUBRICS_V2.quality_usage, + }, + { + id: "learning", + title: "Montée en compétence via IA", + rubric: RUBRICS_V2.learning, + }, + { + id: "cost_control", + title: "Maîtrise des coûts", + rubric: RUBRICS_V2.cost_control, + }, + { + id: "integration", + title: "[Optionnel] Intégration dans les pratiques d'équipe", + rubric: RUBRICS_V2.integration, + }, + { + id: "impact", + title: "[Optionnel] Impact sur la delivery", + rubric: RUBRICS_V2.impact, + }, + { + id: "accompagnement", + title: "[Optionnel] Accompagnement & besoins", + rubric: RUBRICS_V2.accompagnement, + }, + { + id: "scaling", + title: "[Optionnel] Mise à l'échelle des compétences & outils", + rubric: RUBRICS_V2.scaling, + }, + ], + }, ]; async function main() { @@ -452,7 +545,7 @@ async function main() { // Upsert répondants (candidates) par nom : create si absent, update si existant. Ne vide pas les évaluations. const template = await prisma.template.findUnique({ - where: { id: "full-15" }, + where: { id: "full-15-v2" }, }); if (!template) throw new Error("Template not found"); diff --git a/src/actions/admin.ts b/src/actions/admin.ts index 4ae96e7..8229195 100644 --- a/src/actions/admin.ts +++ b/src/actions/admin.ts @@ -4,7 +4,6 @@ import { prisma } from "@/lib/db"; import { requireAuth, type ActionResult } from "@/lib/action-helpers"; import { revalidatePath } from "next/cache"; -export type { ActionResult }; export async function setUserRole(userId: string, role: "admin" | "evaluator"): Promise { const session = await requireAuth(); diff --git a/src/actions/evaluations.ts b/src/actions/evaluations.ts index 9249838..8805b38 100644 --- a/src/actions/evaluations.ts +++ b/src/actions/evaluations.ts @@ -5,7 +5,6 @@ import { getEvaluation } from "@/lib/server-data"; import { requireAuth, requireEvaluationAccess, type ActionResult } from "@/lib/action-helpers"; import { revalidatePath } from "next/cache"; -export type { ActionResult }; export async function fetchEvaluation(id: string): Promise>>> { const session = await requireAuth(); diff --git a/src/actions/share.ts b/src/actions/share.ts index 8e3a12a..e851ab0 100644 --- a/src/actions/share.ts +++ b/src/actions/share.ts @@ -4,7 +4,6 @@ import { prisma } from "@/lib/db"; import { requireAuth, requireEvaluationAccess, type ActionResult } from "@/lib/action-helpers"; import { revalidatePath } from "next/cache"; -export type { ActionResult }; export async function addShare(evaluationId: string, userId: string): Promise { const session = await requireAuth(); diff --git a/src/lib/server-data.ts b/src/lib/server-data.ts index 9097dea..91ea306 100644 --- a/src/lib/server-data.ts +++ b/src/lib/server-data.ts @@ -73,6 +73,7 @@ export const getTemplates = cache(async () => { include: { dimensions: { orderBy: { orderIndex: "asc" } }, }, + orderBy: { id: "desc" }, }); return templates; });