feat: add template V2 with updated rubrics and fix ActionResult runtime error
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 4m22s
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 4m22s
- 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 <noreply@anthropic.com>
This commit is contained in:
@@ -120,6 +120,22 @@ const RUBRICS: Record<string, string> = {
|
|||||||
"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",
|
"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<string, string> = {
|
||||||
|
...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)
|
// Réponses réalistes par dimension et score (justification + exemples observés)
|
||||||
const DEMO_RESPONSES: Record<
|
const DEMO_RESPONSES: Record<
|
||||||
string,
|
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() {
|
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.
|
// Upsert répondants (candidates) par nom : create si absent, update si existant. Ne vide pas les évaluations.
|
||||||
const template = await prisma.template.findUnique({
|
const template = await prisma.template.findUnique({
|
||||||
where: { id: "full-15" },
|
where: { id: "full-15-v2" },
|
||||||
});
|
});
|
||||||
if (!template) throw new Error("Template not found");
|
if (!template) throw new Error("Template not found");
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { prisma } from "@/lib/db";
|
|||||||
import { requireAuth, type ActionResult } from "@/lib/action-helpers";
|
import { requireAuth, type ActionResult } from "@/lib/action-helpers";
|
||||||
import { revalidatePath } from "next/cache";
|
import { revalidatePath } from "next/cache";
|
||||||
|
|
||||||
export type { ActionResult };
|
|
||||||
|
|
||||||
export async function setUserRole(userId: string, role: "admin" | "evaluator"): Promise<ActionResult> {
|
export async function setUserRole(userId: string, role: "admin" | "evaluator"): Promise<ActionResult> {
|
||||||
const session = await requireAuth();
|
const session = await requireAuth();
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { getEvaluation } from "@/lib/server-data";
|
|||||||
import { requireAuth, requireEvaluationAccess, type ActionResult } from "@/lib/action-helpers";
|
import { requireAuth, requireEvaluationAccess, type ActionResult } from "@/lib/action-helpers";
|
||||||
import { revalidatePath } from "next/cache";
|
import { revalidatePath } from "next/cache";
|
||||||
|
|
||||||
export type { ActionResult };
|
|
||||||
|
|
||||||
export async function fetchEvaluation(id: string): Promise<ActionResult<Awaited<ReturnType<typeof getEvaluation>>>> {
|
export async function fetchEvaluation(id: string): Promise<ActionResult<Awaited<ReturnType<typeof getEvaluation>>>> {
|
||||||
const session = await requireAuth();
|
const session = await requireAuth();
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { prisma } from "@/lib/db";
|
|||||||
import { requireAuth, requireEvaluationAccess, type ActionResult } from "@/lib/action-helpers";
|
import { requireAuth, requireEvaluationAccess, type ActionResult } from "@/lib/action-helpers";
|
||||||
import { revalidatePath } from "next/cache";
|
import { revalidatePath } from "next/cache";
|
||||||
|
|
||||||
export type { ActionResult };
|
|
||||||
|
|
||||||
export async function addShare(evaluationId: string, userId: string): Promise<ActionResult> {
|
export async function addShare(evaluationId: string, userId: string): Promise<ActionResult> {
|
||||||
const session = await requireAuth();
|
const session = await requireAuth();
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ export const getTemplates = cache(async () => {
|
|||||||
include: {
|
include: {
|
||||||
dimensions: { orderBy: { orderIndex: "asc" } },
|
dimensions: { orderBy: { orderIndex: "asc" } },
|
||||||
},
|
},
|
||||||
|
orderBy: { id: "desc" },
|
||||||
});
|
});
|
||||||
return templates;
|
return templates;
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user