@cat-factory/app 0.213.0 → 0.214.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +107 -13
  2. package/app/components/observability/StepMetricsBar.vue +11 -0
  3. package/app/components/panels/AgentStepDetail.vue +14 -0
  4. package/app/components/panels/MergerResultView.vue +20 -2
  5. package/app/components/panels/ObservabilityPanel.vue +57 -0
  6. package/app/components/panels/ResultWindowShell.vue +77 -0
  7. package/app/components/panels/StepReproductionReport.vue +167 -0
  8. package/app/components/tutorial/TutorialCatalogue.vue +14 -1
  9. package/app/components/tutorial/TutorialNudge.vue +107 -0
  10. package/app/components/tutorial/TutorialOverlay.vue +92 -11
  11. package/app/composables/api/execution.ts +5 -2
  12. package/app/composables/api/tutorial.ts +25 -0
  13. package/app/composables/useApi.ts +2 -0
  14. package/app/composables/usePipelineErrorToast.ts +8 -0
  15. package/app/composables/useTutorialNudge.ts +77 -0
  16. package/app/composables/useTutorialSync.ts +141 -0
  17. package/app/modular/external-tools.spec.ts +1 -0
  18. package/app/modular/nav-contributions.spec.ts +2 -0
  19. package/app/modular/nav-contributions.ts +11 -0
  20. package/app/modular/nav-gates.ts +10 -0
  21. package/app/modular/registry.spec.ts +1 -0
  22. package/app/modular/tutorial-tours.spec.ts +55 -4
  23. package/app/modular/tutorial-tours.ts +231 -9
  24. package/app/pages/index.vue +20 -1
  25. package/app/stores/tutorial.prompt.ts +59 -0
  26. package/app/stores/tutorial.record.ts +191 -0
  27. package/app/stores/tutorial.spec.ts +207 -0
  28. package/app/stores/tutorial.ts +78 -91
  29. package/app/stores/workspace/hydrate.ts +5 -0
  30. package/app/types/domain.ts +3 -0
  31. package/app/types/reproduction.ts +11 -0
  32. package/app/utils/observability.spec.ts +44 -1
  33. package/app/utils/observability.ts +50 -0
  34. package/app/utils/reproduction.ts +51 -0
  35. package/app/utils/tutorial.spec.ts +255 -0
  36. package/app/utils/tutorial.ts +173 -0
  37. package/i18n/locales/de.json +149 -6
  38. package/i18n/locales/en.json +153 -6
  39. package/i18n/locales/es.json +149 -6
  40. package/i18n/locales/fr.json +149 -6
  41. package/i18n/locales/he.json +149 -6
  42. package/i18n/locales/it.json +149 -6
  43. package/i18n/locales/ja.json +149 -6
  44. package/i18n/locales/pl.json +149 -6
  45. package/i18n/locales/tr.json +149 -6
  46. package/i18n/locales/uk.json +149 -6
  47. package/package.json +2 -2
@@ -565,7 +565,9 @@
565
565
  "foundational_service_exists": "El servicio fundacional ya existe",
566
566
  "binary_output_service_invalid": "No se puede resolver el servicio de salidas binarias",
567
567
  "binary_output_generator_invalid": "No se puede resolver el generador de salidas binarias",
568
- "foundational_service_not_inherited": "Este tablero registró ese servicio"
568
+ "foundational_service_not_inherited": "Este tablero registró ese servicio",
569
+ "ticket_already_linked": "Esta incidencia ya tiene una tarea",
570
+ "dry_run_not_mergeable": "Una ejecución de prueba no se puede fusionar"
569
571
  },
570
572
  "description": {
571
573
  "dependencies_unmet": "Esta tarea depende de otras que aún no están terminadas. Complétalas o desbloquéalas y vuelve a iniciarla.",
@@ -597,7 +599,9 @@
597
599
  "foundational_service_exists": "Ya hay un servicio fundacional con este identificador registrado en este ámbito. Abre la entrada existente y edítala: dos servicios no pueden compartir un identificador, porque es el nombre que un arquitecto usa en su diseño.",
598
600
  "binary_output_service_invalid": "Un paso que genera salidas binarias selecciona un servicio fundacional que el catálogo de este espacio de trabajo no puede resolver: el identificador es desconocido, o el servicio de almacenamiento elegido no tiene la capacidad asset-storage. Corrige la selección del paso o registra el servicio y vuelve a iniciarlo.",
599
601
  "binary_output_generator_invalid": "Un paso que genera salidas binarias selecciona una integración generativa que esta instalación no registra, o ninguna de las integraciones seleccionadas produce un tipo de contenido que el paso debe entregar. Las integraciones generativas se registran en el código de la instalación, no en este espacio de trabajo: regístrala o corrige la selección del paso y vuelve a iniciar.",
600
- "foundational_service_not_inherited": "La exclusión se aplica a un servicio heredado de la cuenta. Este id está registrado por este tablero, así que no hay nada que excluir: elimina la entrada propia del tablero."
602
+ "foundational_service_not_inherited": "La exclusión se aplica a un servicio heredado de la cuenta. Este id está registrado por este tablero, así que no hay nada que excluir: elimina la entrada propia del tablero.",
603
+ "ticket_already_linked": "Una incidencia solo puede respaldar una tarea, así que volver a vincularla dejaría a la tarea existente sin el contexto con el que se creó. Abre esa tarea o desvincula antes la incidencia.",
604
+ "dry_run_not_mergeable": "Esta pull request proviene de una ejecución de prueba, así que no se puede fusionar desde aquí. Vuelve a iniciar la tarea como ejecución real para producir una pull request que este espacio de trabajo sí fusionará."
601
605
  },
602
606
  "action": {
603
607
  "connectGitHub": "Conectar GitHub",
@@ -1241,7 +1245,9 @@
1241
1245
  "merge_failed": "Las puntuaciones estaban dentro de los umbrales de {preset}, pero la fusión automática no pudo completarse (por ejemplo, protección de rama o un conflicto), por lo que el PR espera a que una persona lo fusione.",
1242
1246
  "merge_partial": "Algunas de las solicitudes de incorporación de la tarea se fusionaron, pero una posterior no pudo, por lo que el cambio espera a que una persona termine o revierta la fusión multirrepositorio.",
1243
1247
  "class_auto_merge": "Este preajuste fusiona siempre esta categoría de cambio de forma automática, así que no se compararon las puntuaciones.",
1244
- "class_requires_review": "Este preajuste envía siempre esta categoría de cambio a una persona, sean cuales sean las puntuaciones."
1248
+ "class_requires_review": "Este preajuste envía siempre esta categoría de cambio a una persona, sean cuales sean las puntuaciones.",
1249
+ "role_requires_review": "Esta configuración obliga a que las ejecuciones iniciadas por un {role} pasen por revisión humana para este tipo de cambio, sean cuales sean las puntuaciones. Un compañero con un nivel superior puede fusionar este PR tal como está.",
1250
+ "dry_run": "Esta fue una ejecución de prueba, así que la pull request quedó abierta para una persona y no se compararon las puntuaciones. Vuelve a iniciar la tarea como ejecución real para producir una pull request que este espacio de trabajo sí fusionará."
1245
1251
  },
1246
1252
  "scores": "Puntuaciones",
1247
1253
  "axis": {
@@ -1400,6 +1406,33 @@
1400
1406
  "failedSummary": "{failed} de {total} comprobaciones seguían fallando tras {attempts} de {maxAttempts} intentos, así que no se abrió ninguna solicitud de incorporación.",
1401
1407
  "exitCode": "código de salida {code}",
1402
1408
  "timedOut": "tiempo agotado"
1409
+ },
1410
+ "reproduction": {
1411
+ "heading": "Prueba de reproducción",
1412
+ "status": {
1413
+ "reproduced": "Reproducido",
1414
+ "inconclusive": "No demostrado",
1415
+ "declared_infeasible": "No reproducible"
1416
+ },
1417
+ "verdict": {
1418
+ "reproduced": "La comprobación declarada falló en el árbol previo a la corrección y pasa en este.",
1419
+ "inconclusive": "La comprobación no demostró el defecto a ambos lados de la corrección, por lo que la corrección no queda evidenciada.",
1420
+ "declared_infeasible": "El agente declaró que este error no se puede reproducir en una prueba e indicó qué verificó en su lugar."
1421
+ },
1422
+ "tree": {
1423
+ "base": "Árbol previo a la corrección",
1424
+ "final": "Árbol final"
1425
+ },
1426
+ "command": "Comando",
1427
+ "reason": "Por qué no se puede reproducir",
1428
+ "alternative": "Verificado en su lugar",
1429
+ "passed": "pasó",
1430
+ "exitCode": "código de salida {code}",
1431
+ "timedOut": "tiempo agotado",
1432
+ "setupFailed": "fallo en la preparación",
1433
+ "notRun": "no ejecutado",
1434
+ "attempts": "Intento {attempts} de {maxAttempts}",
1435
+ "omittedTestPaths": "Se descartó {count} archivo de prueba declarado antes de ejecutar la prueba, por lo que el árbol previo a la corrección se reconstruyó a partir de una reproducción incompleta. | Se descartaron {count} archivos de prueba declarados antes de ejecutar la prueba, por lo que el árbol previo a la corrección se reconstruyó a partir de una reproducción incompleta."
1403
1436
  }
1404
1437
  },
1405
1438
  "inspector": {
@@ -1476,6 +1509,9 @@
1476
1509
  "contextError": "No se pudo cargar el contexto proporcionado.",
1477
1510
  "summary": {
1478
1511
  "calls": "Llamadas",
1512
+ "cost": "Coste estimado",
1513
+ "costHint": "Calculado a precios de lista, cada clase de entrada con su propia tarifa: una lectura de caché cuesta alrededor de una décima parte de la entrada nueva y una escritura de caché aproximadamente un cuarto más. Una ejecución por suscripción no paga nada por token, así que esto es lo que habrían costado los mismos tokens con pago por uso.",
1514
+ "costIncomplete": "No se muestra: al menos una fase se ejecutó con un modelo para el que esta instalación no tiene tarifa, así que el total de la ejecución quedaría incompleto. Las fases con precio aparecen abajo.",
1479
1515
  "tokensInOut": "Tokens (entrada / salida)",
1480
1516
  "transportOverhead": "Sobrecarga de transporte",
1481
1517
  "modelExecution": "Ejecución del modelo",
@@ -1495,8 +1531,10 @@
1495
1531
  "phase": "Fase",
1496
1532
  "turns": "Turnos",
1497
1533
  "tokensInOut": "Tokens (entrada / salida)",
1534
+ "cost": "Coste",
1498
1535
  "carryCost": "Coste de arrastre"
1499
1536
  },
1537
+ "costHint": "Coste estimado de los tokens de esta fase a precios de lista. Un guion indica que esta instalación no tiene tarifa para el modelo que se ejecutó.",
1500
1538
  "carryCostHint": "Cuánto cargó cada fase sobre los turnos posteriores: su contexto contado una vez por cada turno que tuvo que reenviarlo. Compara entre sí las fases de una ejecución; por sí sola la cifra no significa nada. Una fase que se ejecuta al final arrastra poco por mucho que haya gastado, así que lee esta columna junto a los tokens de al lado.",
1501
1539
  "unattributed": "Sin atribuir",
1502
1540
  "unattributedHint": "registrado por un canal que no informa de la fase"
@@ -1504,6 +1542,7 @@
1504
1542
  "metricsBar": {
1505
1543
  "calls": "{count} llamada | {count} llamadas",
1506
1544
  "inputCompletionTokens": "Tokens totales de entrada / salida. La entrada tambien cuenta los tokens en caché: siguen ocupando la ventana de contexto, igual que los cuenta el medidor de contexto de Claude Code.",
1545
+ "costHint": "Coste estimado de los tokens de este paso a precios de lista, cada clase de entrada con su propia tarifa. Una ejecución por suscripción no paga nada por token, así que esto es lo que habrían costado los mismos tokens con pago por uso.",
1507
1546
  "fresh": "{tokens} frescos",
1508
1547
  "freshHint": "Entrada procesada desde cero, sin nada servido desde la caché",
1509
1548
  "cacheRead": "{tokens} leídos de caché",
@@ -6277,6 +6316,12 @@
6277
6316
  "minor": "Comentarios menores",
6278
6317
  "major": "Retrabajo real",
6279
6318
  "classHistory": "{merged} fusionados en esta categoría, {autoShare} de forma automática"
6319
+ },
6320
+ "role": {
6321
+ "admin": "administrador",
6322
+ "member": "miembro",
6323
+ "viewer": "observador",
6324
+ "unattributed": "un inicio automático"
6280
6325
  }
6281
6326
  },
6282
6327
  "vcs": {
@@ -6378,7 +6423,10 @@
6378
6423
  "finishedRun": "Una ejecución terminada correctamente",
6379
6424
  "integrationsManage": "Permiso para gestionar integraciones",
6380
6425
  "settingsManage": "Permiso para gestionar los ajustes del espacio de trabajo",
6381
- "library": "La biblioteca de fragmentos de contexto habilitada en este despliegue"
6426
+ "library": "La biblioteca de fragmentos de contexto habilitada en este despliegue",
6427
+ "failedRun": "Una ejecución que ha fallado",
6428
+ "infrastructure": "Un backend de ejecución conectado a este espacio de trabajo",
6429
+ "advancedTier": "El modo de interfaz avanzado"
6382
6430
  },
6383
6431
  "overlay": {
6384
6432
  "next": "Siguiente",
@@ -6390,7 +6438,9 @@
6390
6438
  "announcement": "Paso {current} de {total}. {title}. {body}",
6391
6439
  "abridged": "Se omitió 1 paso: ese control no forma parte de este tablero. | Se omitieron {count} pasos: esos controles no forman parte de este tablero.",
6392
6440
  "searching": "Buscando el control resaltado...",
6393
- "clickHint": "Haz clic en el control resaltado para continuar"
6441
+ "clickHint": "Haz clic en el control resaltado para continuar",
6442
+ "nextUp": "A continuación",
6443
+ "takeNext": "Hacer este"
6394
6444
  },
6395
6445
  "tours": {
6396
6446
  "boardBasics": {
@@ -6513,7 +6563,7 @@
6513
6563
  },
6514
6564
  "finish": {
6515
6565
  "title": "Ese es el ciclo",
6516
- "body": "Planificar una tarea, elegir un pipeline, arrancarla y seguirla. Cuando una ejecución necesita algo de ti se detiene y lo dice, que es lo que cubre el siguiente recorrido."
6566
+ "body": "Planificar una tarea, elegir un pipeline, arrancarla y seguirla. Los recorridos posteriores a este leen una ejecución real, así que se desbloquean en cuanto arranques una de verdad."
6517
6567
  }
6518
6568
  }
6519
6569
  },
@@ -6668,7 +6718,100 @@
6668
6718
  "body": "Algunas entradas son tuyas y no del tablero, como un token de acceso personal o un plan, y solo se usan en las ejecuciones que arrancas tú. El hub marca cuál es cuál, y Mi configuración reúne las que son tuyas."
6669
6719
  }
6670
6720
  }
6721
+ },
6722
+ "diagnoseFailure": {
6723
+ "title": "Leer un fallo",
6724
+ "description": "Una ejecución se ha detenido con un error. Averigua qué se ha roto y qué hacer al respecto.",
6725
+ "steps": {
6726
+ "intro": {
6727
+ "title": "Las ejecuciones fallan, y es normal",
6728
+ "body": "Una ejecución fallida no es un callejón sin salida. El tablero conserva el error, la causa suele ser una línea y la mayoría se arregla con un ajuste, no reescribiendo la tarea."
6729
+ },
6730
+ "banner": {
6731
+ "title": "Qué ha ido mal",
6732
+ "body": "La tarjeta cambia su barra de progreso por este aviso. Nombra la causa, los detalles guardan la salida en bruto y algunas causas ofrecen un botón directo al ajuste que las corrige."
6733
+ },
6734
+ "retry": {
6735
+ "title": "Volver a ejecutarla",
6736
+ "body": "Reintentar vuelve a ejecutar el trabajo. Los errores anteriores se quedan en la tarea, bajo «Errores anteriores», para que puedas comparar intentos en vez de perder el rastro."
6737
+ },
6738
+ "finish": {
6739
+ "title": "Un fallo es información",
6740
+ "body": "Corrige la causa, reintenta, compara. Si el mismo error vuelve una y otra vez, los detalles son lo que hay que llevarle a quien pueda ampliar un permiso o conectar lo que falta."
6741
+ }
6742
+ }
6743
+ },
6744
+ "prepareInfrastructure": {
6745
+ "title": "Dónde se ejecuta todo",
6746
+ "description": "Las máquinas donde corren los agentes, los entornos donde prueban y las credenciales que pueden usar.",
6747
+ "steps": {
6748
+ "intro": {
6749
+ "title": "Los agentes necesitan dónde ejecutarse",
6750
+ "body": "Cada paso en contenedor corre sobre un backend de ejecución, las pruebas se levantan en un entorno y algunas capacidades necesitan una credencial. Las tres cosas se configuran en una sola ventana."
6751
+ },
6752
+ "open": {
6753
+ "title": "Abrir Infraestructura",
6754
+ "body": "Todo lo relativo a dónde y cómo se ejecutan las ejecuciones está aquí."
6755
+ },
6756
+ "tabs": {
6757
+ "title": "Una pestaña por asunto",
6758
+ "body": "Contenedores de agentes es donde se ejecuta el trabajo. Entornos de prueba es a partir de qué se levanta un servicio. La lista de credenciales muestra qué claves pueden resolver realmente las capacidades que usan tus agentes, y cuáles siguen faltando."
6759
+ },
6760
+ "finish": {
6761
+ "title": "Los fallos apuntan aquí",
6762
+ "body": "Cuando una ejecución falla al aprovisionar, esta es la ventana que su aviso te pide abrir. Mejor saberlo antes de que pase que después."
6763
+ }
6764
+ }
6765
+ },
6766
+ "panelReviews": {
6767
+ "title": "Revisión por panel",
6768
+ "description": "Que varios modelos revisen el mismo trabajo en lugar de uno, en las tareas que lo merecen.",
6769
+ "steps": {
6770
+ "intro": {
6771
+ "title": "Un revisor, o varios",
6772
+ "body": "Un paso de revisión ejecuta normalmente un agente. En su lugar puede ejecutar un panel de varios modelos y comparar lo que dicen, lo que detecta lo que a un solo revisor se le escapa en trabajos más pesados."
6773
+ },
6774
+ "open": {
6775
+ "title": "Abrir Configuración de modelos",
6776
+ "body": "Los paneles están hechos de modelos, así que se configuran junto a ellos."
6777
+ },
6778
+ "groups": {
6779
+ "title": "Definir un panel",
6780
+ "body": "Un grupo nombra los modelos del panel y lo exigente que debe ser una tarea para usarlo. Un paso selecciona entonces un grupo en vez de nombrar modelos uno a uno."
6781
+ },
6782
+ "finish": {
6783
+ "title": "El coste sigue al esfuerzo",
6784
+ "body": "Un panel cuesta tantas llamadas a modelo como miembros tiene, y por eso un grupo puede limitarse a las tareas cuya estimación supere su umbral. El trabajo pequeño se queda con un único revisor."
6785
+ }
6786
+ }
6787
+ },
6788
+ "shareServices": {
6789
+ "title": "Los servicios que ya tienes",
6790
+ "description": "Dile a los agentes qué sistemas compartidos existen y cómo son sus API.",
6791
+ "steps": {
6792
+ "intro": {
6793
+ "title": "No reconstruyas lo que ya tienes",
6794
+ "body": "Los agentes diseñan a ciegas si no saben qué tiene ya tu organización en marcha. Este catálogo nombra esos sistemas y guarda sus contratos de API."
6795
+ },
6796
+ "open": {
6797
+ "title": "Abrir Servicios fundamentales",
6798
+ "body": "El catálogo de capacidades compartidas disponible para todos los tableros de este espacio de trabajo."
6799
+ },
6800
+ "catalog": {
6801
+ "title": "Registrar, subir o sincronizar",
6802
+ "body": "Añade un servicio a mano, sube sus documentos de API, o enlaza un repositorio y deja que se sincronicen. Los diseños referencian entonces lo registrado aquí en vez de inventarse una interfaz."
6803
+ },
6804
+ "finish": {
6805
+ "title": "Los pasos de diseño leen esto",
6806
+ "body": "Un diseño que declara cuáles de estos usa recibe sus contratos completos en el paso siguiente. Uno que no declara nada no recibe nada: mantener esto al día es lo que lo hace funcionar."
6807
+ }
6808
+ }
6671
6809
  }
6810
+ },
6811
+ "nudge": {
6812
+ "label": "Nuevo recorrido disponible",
6813
+ "start": "Enséñame",
6814
+ "dismiss": "Descartar"
6672
6815
  }
6673
6816
  },
6674
6817
  "externalTools": {
@@ -565,7 +565,9 @@
565
565
  "foundational_service_exists": "Ce service fondamental existe déjà",
566
566
  "binary_output_service_invalid": "Service des sorties binaires introuvable",
567
567
  "binary_output_generator_invalid": "Générateur de sorties binaires introuvable",
568
- "foundational_service_not_inherited": "Ce tableau a enregistré ce service"
568
+ "foundational_service_not_inherited": "Ce tableau a enregistré ce service",
569
+ "ticket_already_linked": "Ce ticket a déjà une tâche",
570
+ "dry_run_not_mergeable": "Une exécution à blanc ne peut pas être fusionnée"
569
571
  },
570
572
  "description": {
571
573
  "dependencies_unmet": "Cette tâche dépend d'autres qui ne sont pas encore terminées. Terminez-les ou débloquez-les, puis relancez-la.",
@@ -597,7 +599,9 @@
597
599
  "foundational_service_exists": "Un service fondamental portant cet identifiant est déjà enregistré dans cette portée. Ouvrez l’entrée existante et modifiez-la : deux services ne peuvent pas partager un identifiant, car c’est le nom qu’un architecte emploie dans sa conception.",
598
600
  "binary_output_service_invalid": "Une étape qui génère des sorties binaires sélectionne un service fondamental que le catalogue de cet espace de travail ne peut pas résoudre : l’identifiant est inconnu, ou le service de stockage choisi ne porte pas la capacité asset-storage. Corrigez la sélection de l’étape ou enregistrez le service, puis relancez.",
599
601
  "binary_output_generator_invalid": "Une étape qui génère des sorties binaires sélectionne une intégration générative que ce déploiement n’enregistre pas, ou aucune des intégrations sélectionnées ne produit un type de contenu que l’étape doit livrer. Les intégrations génératives sont enregistrées dans le code du déploiement, pas dans cet espace de travail : enregistrez-la ou corrigez la sélection de l’étape, puis relancez.",
600
- "foundational_service_not_inherited": "L'écartement s'applique à un service hérité du compte. Cet identifiant est enregistré par ce tableau : il n'y a donc rien à écarter - supprimez plutôt l'entrée propre au tableau."
602
+ "foundational_service_not_inherited": "L'écartement s'applique à un service hérité du compte. Cet identifiant est enregistré par ce tableau : il n'y a donc rien à écarter - supprimez plutôt l'entrée propre au tableau.",
603
+ "ticket_already_linked": "Un ticket ne peut alimenter qu'une seule tâche : le relier à nouveau priverait la tâche existante du contexte avec lequel elle a été créée. Ouvrez plutôt cette tâche, ou dissociez d'abord le ticket.",
604
+ "dry_run_not_mergeable": "Cette pull request provient d'une exécution à blanc et ne peut pas être fusionnée ici. Relancez la tâche en exécution réelle pour produire une pull request que cet espace de travail fusionnera."
601
605
  },
602
606
  "action": {
603
607
  "connectGitHub": "Connecter GitHub",
@@ -1241,7 +1245,9 @@
1241
1245
  "merge_failed": "Les scores étaient dans les seuils de {preset}, mais la fusion automatique n'a pas pu aboutir (par exemple protection de branche ou conflit), la PR attend donc une fusion par une personne.",
1242
1246
  "merge_partial": "Certaines des pull requests de la tâche ont été fusionnées, mais une suivante n'a pas pu l'être, le changement attend donc qu'une personne termine ou annule la fusion multi-dépôt.",
1243
1247
  "class_auto_merge": "Ce préréglage fusionne toujours automatiquement cette catégorie de changement : les scores n’ont donc pas été comparés.",
1244
- "class_requires_review": "Ce préréglage envoie toujours cette catégorie de changement à un humain, quels que soient les scores."
1248
+ "class_requires_review": "Ce préréglage envoie toujours cette catégorie de changement à un humain, quels que soient les scores.",
1249
+ "role_requires_review": "Ce préréglage soumet les exécutions lancées par un {role} à une revue humaine pour ce type de modification, quels que soient les scores. Un collègue d'un niveau supérieur peut fusionner cette PR telle quelle.",
1250
+ "dry_run": "Il s'agissait d'une exécution à blanc : la pull request est restée ouverte pour une personne et les scores n'ont pas été comparés. Relancez la tâche en exécution réelle pour produire une pull request que cet espace de travail fusionnera."
1245
1251
  },
1246
1252
  "scores": "Scores",
1247
1253
  "axis": {
@@ -1400,6 +1406,33 @@
1400
1406
  "failedSummary": "{failed} vérifications sur {total} échouaient encore après {attempts} tentatives sur {maxAttempts}, aucune demande de tirage n'a donc été ouverte.",
1401
1407
  "exitCode": "code de sortie {code}",
1402
1408
  "timedOut": "délai dépassé"
1409
+ },
1410
+ "reproduction": {
1411
+ "heading": "Preuve de reproduction",
1412
+ "status": {
1413
+ "reproduced": "Reproduit",
1414
+ "inconclusive": "Non démontré",
1415
+ "declared_infeasible": "Non reproductible"
1416
+ },
1417
+ "verdict": {
1418
+ "reproduced": "La vérification déclarée a échoué sur l’arbre d’avant le correctif et réussit sur celui-ci.",
1419
+ "inconclusive": "La vérification n’a pas démontré le défaut de part et d’autre du correctif, le correctif n’est donc pas étayé.",
1420
+ "declared_infeasible": "L’agent a déclaré que ce bogue ne peut pas être reproduit dans un test et a indiqué ce qu’il a vérifié à la place."
1421
+ },
1422
+ "tree": {
1423
+ "base": "Arbre d’avant le correctif",
1424
+ "final": "Arbre final"
1425
+ },
1426
+ "command": "Commande",
1427
+ "reason": "Pourquoi c’est irreproductible",
1428
+ "alternative": "Vérifié à la place",
1429
+ "passed": "réussi",
1430
+ "exitCode": "code de sortie {code}",
1431
+ "timedOut": "délai dépassé",
1432
+ "setupFailed": "échec de la préparation",
1433
+ "notRun": "non exécuté",
1434
+ "attempts": "Tentative {attempts} sur {maxAttempts}",
1435
+ "omittedTestPaths": "{count} fichier de test déclaré a été écarté avant l’exécution de la preuve, l’arbre d’avant le correctif a donc été reconstruit à partir d’une reproduction incomplète. | {count} fichiers de test déclarés ont été écartés avant l’exécution de la preuve, l’arbre d’avant le correctif a donc été reconstruit à partir d’une reproduction incomplète."
1403
1436
  }
1404
1437
  },
1405
1438
  "inspector": {
@@ -1476,6 +1509,9 @@
1476
1509
  "contextError": "Impossible de charger le contexte fourni.",
1477
1510
  "summary": {
1478
1511
  "calls": "Appels",
1512
+ "cost": "Coût estimé",
1513
+ "costHint": "Calculé aux tarifs publics, chaque classe d'entrée à son propre taux : une lecture de cache coûte environ un dixième d'une entrée fraîche, une écriture de cache environ un quart de plus. Une exécution sur abonnement ne paie rien au token ; ceci est donc ce que les mêmes tokens auraient coûté à l'usage.",
1514
+ "costIncomplete": "Non affiché : au moins une phase a utilisé un modèle pour lequel cette installation n'a aucun tarif, un total serait donc incomplet. Les phases tarifées sont listées ci-dessous.",
1479
1515
  "tokensInOut": "Tokens (entrée / sortie)",
1480
1516
  "transportOverhead": "Surcoût de transport",
1481
1517
  "modelExecution": "Exécution du modèle",
@@ -1495,8 +1531,10 @@
1495
1531
  "phase": "Phase",
1496
1532
  "turns": "Tours",
1497
1533
  "tokensInOut": "Tokens (entrée / sortie)",
1534
+ "cost": "Coût",
1498
1535
  "carryCost": "Coût de report"
1499
1536
  },
1537
+ "costHint": "Coût estimé des tokens de cette phase aux tarifs publics. Un tiret signifie que cette installation n'a aucun tarif pour le modèle utilisé.",
1500
1538
  "carryCostHint": "Ce que chaque phase a fait peser sur les tours suivants : son contexte compté une fois pour chaque tour ultérieur ayant dû le renvoyer. Comparez les phases d'une exécution entre elles ; isolée, la valeur ne signifie rien. Une phase qui s'exécute en dernier reporte peu, quoi qu'elle ait dépensé : lisez donc cette colonne avec les tokens voisins.",
1501
1539
  "unattributed": "Non attribué",
1502
1540
  "unattributedHint": "enregistré par un canal qui ne rapporte aucune phase"
@@ -1504,6 +1542,7 @@
1504
1542
  "metricsBar": {
1505
1543
  "calls": "{count} appel | {count} appels",
1506
1544
  "inputCompletionTokens": "Total des tokens d'entrée / de sortie. L'entree compte aussi les tokens en cache : ils occupent toujours la fenêtre de contexte, exactement comme les compte la jauge de contexte de Claude Code.",
1545
+ "costHint": "Coût estimé des tokens de cette étape aux tarifs publics, chaque classe d'entrée à son propre taux. Une exécution sur abonnement ne paie rien au token ; ceci est donc ce que les mêmes tokens auraient coûté à l'usage.",
1507
1546
  "fresh": "{tokens} frais",
1508
1547
  "freshHint": "Entrée traitée de zero, sans rien servi depuis le cache",
1509
1548
  "cacheRead": "{tokens} lus depuis le cache",
@@ -6277,6 +6316,12 @@
6277
6316
  "minor": "Remarques mineures",
6278
6317
  "major": "Reprise importante",
6279
6318
  "classHistory": "{merged} fusionnés dans cette catégorie, dont {autoShare} automatiquement"
6319
+ },
6320
+ "role": {
6321
+ "admin": "administrateur",
6322
+ "member": "membre",
6323
+ "viewer": "lecteur",
6324
+ "unattributed": "un démarrage automatique"
6280
6325
  }
6281
6326
  },
6282
6327
  "vcs": {
@@ -6378,7 +6423,10 @@
6378
6423
  "finishedRun": "Une exécution terminée avec succès",
6379
6424
  "integrationsManage": "L'autorisation de gérer les intégrations",
6380
6425
  "settingsManage": "L'autorisation de gérer les paramètres de l'espace de travail",
6381
- "library": "La bibliothèque de fragments de contexte activée sur ce déploiement"
6426
+ "library": "La bibliothèque de fragments de contexte activée sur ce déploiement",
6427
+ "failedRun": "Une exécution en échec",
6428
+ "infrastructure": "Un backend d’exécution connecté à cet espace de travail",
6429
+ "advancedTier": "Le mode d’interface avancé"
6382
6430
  },
6383
6431
  "overlay": {
6384
6432
  "next": "Suivant",
@@ -6390,7 +6438,9 @@
6390
6438
  "announcement": "Étape {current} sur {total}. {title}. {body}",
6391
6439
  "abridged": "1 étape a été ignorée : ce contrôle ne fait pas partie de ce tableau. | {count} étapes ont été ignorées : ces contrôles ne font pas partie de ce tableau.",
6392
6440
  "searching": "Recherche du contrôle mis en évidence...",
6393
- "clickHint": "Cliquez sur le contrôle mis en évidence pour continuer"
6441
+ "clickHint": "Cliquez sur le contrôle mis en évidence pour continuer",
6442
+ "nextUp": "Ensuite",
6443
+ "takeNext": "Faire celle-ci"
6394
6444
  },
6395
6445
  "tours": {
6396
6446
  "boardBasics": {
@@ -6513,7 +6563,7 @@
6513
6563
  },
6514
6564
  "finish": {
6515
6565
  "title": "Voilà la boucle",
6516
- "body": "Planifier une tâche, choisir un pipeline, la lancer, la suivre. Quand une exécution a besoin de vous, elle s'arrête et le dit, ce que couvre la visite suivante."
6566
+ "body": "Planifier une tâche, choisir un pipeline, la lancer, la suivre. Les visites suivantes lisent une exécution réelle : elles se débloquent dès que vous en avez lancé une pour de vrai."
6517
6567
  }
6518
6568
  }
6519
6569
  },
@@ -6668,7 +6718,100 @@
6668
6718
  "body": "Certaines entrées vous appartiennent plutôt qu'au tableau, comme un jeton d'accès personnel ou un abonnement, et ne servent qu'aux exécutions que vous lancez. Le hub indique lesquelles, et Ma configuration rassemble les vôtres."
6669
6719
  }
6670
6720
  }
6721
+ },
6722
+ "diagnoseFailure": {
6723
+ "title": "Lire un échec",
6724
+ "description": "Une exécution s’est arrêtée sur une erreur. Comprenez ce qui a cassé, et quoi y faire.",
6725
+ "steps": {
6726
+ "intro": {
6727
+ "title": "Les exécutions échouent, c’est normal",
6728
+ "body": "Une exécution en échec n’est pas une impasse. Le tableau conserve l’erreur, la cause tient souvent en une ligne, et la plupart des causes se corrigent par un réglage plutôt qu’en réécrivant la tâche."
6729
+ },
6730
+ "banner": {
6731
+ "title": "Ce qui s’est mal passé",
6732
+ "body": "La carte remplace sa barre de progression par ce bandeau. Il nomme la cause, les détails contiennent la sortie brute, et certaines causes proposent un bouton menant droit au réglage qui les corrige."
6733
+ },
6734
+ "retry": {
6735
+ "title": "Relancer",
6736
+ "body": "Réessayer relance le travail. Les erreurs précédentes restent sur la tâche, sous « Erreurs précédentes », pour comparer les tentatives au lieu de perdre la trace."
6737
+ },
6738
+ "finish": {
6739
+ "title": "Un échec est une information",
6740
+ "body": "Corriger la cause, réessayer, comparer. Si la même erreur revient sans cesse, les détails sont ce qu’il faut apporter à la personne qui peut élargir une autorisation ou brancher ce qui manque."
6741
+ }
6742
+ }
6743
+ },
6744
+ "prepareInfrastructure": {
6745
+ "title": "Où les exécutions ont lieu",
6746
+ "description": "Les machines où tournent les agents, les environnements où ils testent, et les identifiants qu’ils peuvent utiliser.",
6747
+ "steps": {
6748
+ "intro": {
6749
+ "title": "Les agents ont besoin d’un endroit pour tourner",
6750
+ "body": "Chaque étape en conteneur tourne sur un backend d’exécution, les tests se lèvent dans un environnement, et certaines capacités demandent un identifiant. Les trois se configurent dans une seule fenêtre."
6751
+ },
6752
+ "open": {
6753
+ "title": "Ouvrir Infrastructure",
6754
+ "body": "Tout ce qui concerne où et comment les exécutions se déroulent est ici."
6755
+ },
6756
+ "tabs": {
6757
+ "title": "Un onglet par sujet",
6758
+ "body": "Conteneurs d’agents, c’est là que le travail s’exécute. Environnements de test, c’est à partir de quoi un service est levé. La liste des identifiants montre quelles clés les capacités utilisées par vos agents peuvent réellement résoudre, et lesquelles manquent encore."
6759
+ },
6760
+ "finish": {
6761
+ "title": "Les échecs renvoient ici",
6762
+ "body": "Quand une exécution échoue au provisionnement, c’est la fenêtre que son bandeau vous demande d’ouvrir. Mieux vaut le savoir avant que cela arrive qu’après."
6763
+ }
6764
+ }
6765
+ },
6766
+ "panelReviews": {
6767
+ "title": "Relecture par comité",
6768
+ "description": "Faites relire le même travail par plusieurs modèles au lieu d’un seul, sur les tâches qui le justifient.",
6769
+ "steps": {
6770
+ "intro": {
6771
+ "title": "Un relecteur, ou plusieurs",
6772
+ "body": "Une étape de relecture exécute normalement un agent. Elle peut à la place exécuter un comité de plusieurs modèles et comparer ce qu’ils disent, ce qui rattrape ce qu’un relecteur unique laisse passer sur les travaux lourds."
6773
+ },
6774
+ "open": {
6775
+ "title": "Ouvrir Configuration des modèles",
6776
+ "body": "Les comités sont faits de modèles : ils se configurent juste à côté."
6777
+ },
6778
+ "groups": {
6779
+ "title": "Définir un comité",
6780
+ "body": "Un groupe nomme les modèles du comité et le niveau d’exigence qu’une tâche doit atteindre pour qu’il serve. Une étape choisit ensuite un groupe au lieu de nommer les modèles un par un."
6781
+ },
6782
+ "finish": {
6783
+ "title": "Le coût suit l’effort",
6784
+ "body": "Un comité coûte autant d’appels de modèle qu’il a de membres, d’où la possibilité de limiter un groupe aux tâches dont l’estimation dépasse son seuil. Le petit travail garde un seul relecteur."
6785
+ }
6786
+ }
6787
+ },
6788
+ "shareServices": {
6789
+ "title": "Les services que vous avez déjà",
6790
+ "description": "Dites aux agents quels systèmes partagés existent, et à quoi ressemblent leurs API.",
6791
+ "steps": {
6792
+ "intro": {
6793
+ "title": "Ne reconstruisez pas ce que vous avez",
6794
+ "body": "Les agents conçoivent à l’aveugle s’ils ignorent ce que votre organisation fait déjà tourner. Ce catalogue nomme ces systèmes et porte leurs contrats d’API."
6795
+ },
6796
+ "open": {
6797
+ "title": "Ouvrir Services fondamentaux",
6798
+ "body": "Le catalogue des capacités partagées disponible pour tous les tableaux de cet espace de travail."
6799
+ },
6800
+ "catalog": {
6801
+ "title": "Enregistrer, déposer ou synchroniser",
6802
+ "body": "Ajoutez un service à la main, déposez ses documents d’API, ou reliez un dépôt et laissez-les se synchroniser. Les conceptions référencent alors ce qui est enregistré ici au lieu d’inventer une interface."
6803
+ },
6804
+ "finish": {
6805
+ "title": "Les étapes de conception lisent ceci",
6806
+ "body": "Une conception qui déclare lesquels elle utilise reçoit leurs contrats complets à l’étape suivante. Celle qui ne déclare rien ne reçoit rien : tenir ceci à jour est ce qui fait que cela marche."
6807
+ }
6808
+ }
6671
6809
  }
6810
+ },
6811
+ "nudge": {
6812
+ "label": "Nouvelle visite disponible",
6813
+ "start": "Montrez-moi",
6814
+ "dismiss": "Masquer"
6672
6815
  }
6673
6816
  },
6674
6817
  "externalTools": {