@cat-factory/app 0.165.0 → 0.166.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.
@@ -0,0 +1,53 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import type { RiskPolicy } from '~/types/merge'
3
+ import { RISK_POLICY_AXES, RISK_POLICY_CEILING_FIELD, riskPolicyCeilings } from '~/utils/riskPolicy'
4
+
5
+ const policy = (over: Partial<RiskPolicy> = {}): RiskPolicy =>
6
+ ({
7
+ id: 'mp_balanced',
8
+ name: 'Balanced',
9
+ maxComplexity: 0.6,
10
+ maxRisk: 0.4,
11
+ maxImpact: 0.5,
12
+ ciMaxAttempts: 10,
13
+ maxRequirementIterations: 6,
14
+ maxRequirementConcernAllowed: 'none',
15
+ maxTesterQualityIterations: 3,
16
+ releaseWatchWindowMinutes: 30,
17
+ releaseMaxAttempts: 1,
18
+ humanReviewGraceMinutes: 10,
19
+ judgeMinScore: 0.7,
20
+ judgeMaxBounces: 2,
21
+ autoMergeEnabled: true,
22
+ classRules: {},
23
+ isDefault: true,
24
+ version: 1,
25
+ createdAt: 0,
26
+ updatedAt: 0,
27
+ ...over,
28
+ }) as RiskPolicy
29
+
30
+ describe('riskPolicyCeilings', () => {
31
+ it('groups the three axes in presentation order', () => {
32
+ expect(riskPolicyCeilings(policy()).map((c) => c.axis)).toEqual([
33
+ 'risk',
34
+ 'impact',
35
+ 'complexity',
36
+ ])
37
+ })
38
+
39
+ it('carries each axis ceiling as the stored 0..1 ratio', () => {
40
+ expect(riskPolicyCeilings(policy())).toEqual([
41
+ { axis: 'risk', max: 0.4 },
42
+ { axis: 'impact', max: 0.5 },
43
+ { axis: 'complexity', max: 0.6 },
44
+ ])
45
+ })
46
+
47
+ it('follows the shared axis order, which the settings editor iterates too', () => {
48
+ // The point of the exported order: the picker preview, the inspector summary and the
49
+ // settings editor all read it, so none of them can drift into its own sequence.
50
+ expect(riskPolicyCeilings(policy()).map((c) => c.axis)).toEqual([...RISK_POLICY_AXES])
51
+ expect(Object.keys(RISK_POLICY_CEILING_FIELD).sort()).toEqual([...RISK_POLICY_AXES].sort())
52
+ })
53
+ })
@@ -1,21 +1,42 @@
1
1
  import type { RiskPolicy } from '~/types/merge'
2
2
 
3
3
  /**
4
- * A compact one-line summary of a merge preset's auto-merge ceilings + CI-fix budget,
5
- * suitable for a dropdown option label so the user sees each preset's actual thresholds
6
- * (not just its name) while choosing one. Percentages are the stored 0..1 ratios
7
- * rendered as whole percents.
4
+ * The three axes a `merger` agent scores a pull request on. Presentation order is
5
+ * risk impact complexity: what the PR could break first, then how far it reaches, then
6
+ * how hard it was to write.
7
+ *
8
+ * This array IS the order — every surface that shows the three axes iterates it rather than
9
+ * hard-coding a sequence, so the picker's preview, the inspector's summary line and the
10
+ * settings editor cannot drift into three different orders (which is exactly what they had).
8
11
  */
9
- export function riskPolicySummary(p: RiskPolicy): string {
10
- // Auto-merge disabled: the thresholds don't apply, every PR goes to human review.
11
- if (!p.autoMergeEnabled) return `manual review only · ${p.ciMaxAttempts} CI fixes`
12
- const pct = (n: number) => `${Math.round(n * 100)}%`
13
- return `cx ≤${pct(p.maxComplexity)} · risk ≤${pct(p.maxRisk)} · impact ≤${pct(
14
- p.maxImpact,
15
- )} · ${p.ciMaxAttempts} CI fixes`
12
+ export const RISK_POLICY_AXES = ['risk', 'impact', 'complexity'] as const
13
+
14
+ export type RiskPolicyAxis = (typeof RISK_POLICY_AXES)[number]
15
+
16
+ /**
17
+ * Which `RiskPolicy` field carries each axis's auto-merge ceiling. Exhaustive over the axis
18
+ * union, so adding an axis fails the typecheck here rather than silently rendering two.
19
+ */
20
+ export const RISK_POLICY_CEILING_FIELD: Record<
21
+ RiskPolicyAxis,
22
+ 'maxRisk' | 'maxImpact' | 'maxComplexity'
23
+ > = {
24
+ risk: 'maxRisk',
25
+ impact: 'maxImpact',
26
+ complexity: 'maxComplexity',
16
27
  }
17
28
 
18
- /** The preset name followed by its thresholds, for a single-line dropdown option. */
19
- export function riskPolicyOptionLabel(p: RiskPolicy): string {
20
- return `${p.name} — ${riskPolicySummary(p)}`
29
+ /** One axis of a policy, with the ceiling a score must stay at or below to auto-merge. */
30
+ export interface RiskPolicyCeiling {
31
+ axis: RiskPolicyAxis
32
+ /** The stored 0..1 ratio. Render it through the `percent` number format, never raw. */
33
+ max: number
34
+ }
35
+
36
+ /**
37
+ * A policy's auto-merge ceilings, one entry per axis in presentation order, so every
38
+ * surface that explains a policy groups the three axes the same way.
39
+ */
40
+ export function riskPolicyCeilings(p: RiskPolicy): RiskPolicyCeiling[] {
41
+ return RISK_POLICY_AXES.map((axis) => ({ axis, max: p[RISK_POLICY_CEILING_FIELD[axis]] }))
21
42
  }
@@ -1318,8 +1318,8 @@
1318
1318
  "unassigned": "Nicht zugewiesen",
1319
1319
  "workspaceDefault": "Workspace-Standard",
1320
1320
  "workspaceDefaultParen": "(Workspace-Standard)",
1321
- "defaultPresetThresholds": "Standard ({name}): {thresholds}",
1322
- "defaultPreset": "Standard ({name})",
1321
+ "defaultRiskPolicy": "Standard ({name})",
1322
+ "defaultModelPreset": "Standard ({name})",
1323
1323
  "noDefault": "Kein Standard",
1324
1324
  "inheritWorkspace": "Vom Workspace erben",
1325
1325
  "on": "An",
@@ -1335,7 +1335,8 @@
1335
1335
  "pipelineEmpty": "Kein Standard. Wähle eine Pipeline, wenn du diese Aufgabe ausführst.",
1336
1336
  "pipelineHint": "Die Pipeline, die der Run-Button standardmäßig startet: die Abfolge der Agent-Schritte (zum Beispiel Spec, Code, Test, Merge), die für diese Aufgabe ausgeführt werden.",
1337
1337
  "mergePolicy": "Risikorichtlinie",
1338
- "riskPolicyDetail": "{name}: automatisch mergen, wenn Komplexität ≤ {complexity}, Risiko ≤ {risk}, Wirkung ≤ {impact}; bis zu {attempts} CI-Fix-Versuche.",
1338
+ "riskPolicyDetail": "{name}: mergt ohne menschliche Prüfung, wenn Risiko ≤ {risk}, Wirkung ≤ {impact} und Komplexität ≤ {complexity}; bis zu {attempts} CI-Fix-Versuche.",
1339
+ "riskPolicyManual": "{name}: mergt nie von selbst, jeder Pull Request wartet also auf eine menschliche Prüfung; bis zu {attempts} CI-Fix-Versuche.",
1339
1340
  "riskPolicyEmpty": "Keine Risikorichtlinie konfiguriert. Der Merger löst für jeden PR eine Prüfbenachrichtigung aus.",
1340
1341
  "mergePolicyHint": "Entscheidet, wann ein fertiger Pull Request automatisch mergt, statt auf eine menschliche Prüfung zu warten, und wie viele CI-Fix-Versuche ein Lauf erhält.",
1341
1342
  "modelPreset": "Modell-Preset",
@@ -2304,7 +2305,7 @@
2304
2305
  "chooseAtRunTime": "Zur Laufzeit auswählen",
2305
2306
  "mergePolicy": "Risikorichtlinie",
2306
2307
  "workspaceDefault": "Workspace-Standard",
2307
- "defaultPreset": "Standard ({name}) — {thresholds}",
2308
+ "defaultPreset": "Standard ({name})",
2308
2309
  "defaultModelPreset": "Standard ({name})",
2309
2310
  "modelPreset": "Modell-Preset",
2310
2311
  "bestPractices": "Best Practices",
@@ -5136,6 +5137,25 @@
5136
5137
  "toast": {
5137
5138
  "reseedFailed": "Risikorichtlinie konnte nicht erneut geseedet werden"
5138
5139
  }
5140
+ },
5141
+ "picker": {
5142
+ "workspaceDefaultCaption": "Gilt, weil diese Aufgabe keine eigene Richtlinie wählt.",
5143
+ "noneHint": "Keine Risikorichtlinie konfiguriert. Jeder Pull Request wartet auf eine menschliche Prüfung."
5144
+ },
5145
+ "preview": {
5146
+ "defaultBadge": "Standard",
5147
+ "autoMergeHeading": "Schwellen für automatisches Mergen",
5148
+ "axis": {
5149
+ "risk": "Risiko",
5150
+ "impact": "Wirkung",
5151
+ "complexity": "Komplexität"
5152
+ },
5153
+ "ceiling": "höchstens {value}",
5154
+ "autoMergeExplainer": "Sobald die CI grün ist, bewertet der Merger-Agent den Pull Request auf diesen drei Achsen. Bleibt jede Bewertung auf oder unter ihrer Obergrenze, mergt der Pull Request von selbst und überspringt die menschliche Prüfung; alles darüber geht an eine Person.",
5155
+ "manualHeading": "Nur manuelle Prüfung",
5156
+ "manualExplainer": "Diese Richtlinie mergt nie von selbst, jeder Pull Request wartet also unabhängig von den Bewertungen auf eine menschliche Prüfung.",
5157
+ "ciHeading": "CI-Fixes",
5158
+ "ciAttempts": "Der Lauf darf {count} Mal versuchen, eine rote CI grün zu bekommen, bevor er aufgibt. | Der Lauf darf {count} Mal versuchen, eine rote CI grün zu bekommen, bevor er aufgibt."
5139
5159
  }
5140
5160
  },
5141
5161
  "modelPreset": {
@@ -290,7 +290,7 @@
290
290
  "chooseAtRunTime": "Choose at run time",
291
291
  "mergePolicy": "Risk policy",
292
292
  "workspaceDefault": "Workspace default",
293
- "defaultPreset": "Default ({name}) — {thresholds}",
293
+ "defaultPreset": "Default ({name})",
294
294
  "defaultModelPreset": "Default ({name})",
295
295
  "modelPreset": "Model preset",
296
296
  "bestPractices": "Best practices",
@@ -1063,8 +1063,8 @@
1063
1063
  "unassigned": "Unassigned",
1064
1064
  "workspaceDefault": "Workspace default",
1065
1065
  "workspaceDefaultParen": "(workspace default)",
1066
- "defaultPresetThresholds": "Default ({name}): {thresholds}",
1067
- "defaultPreset": "Default ({name})",
1066
+ "defaultRiskPolicy": "Default ({name})",
1067
+ "defaultModelPreset": "Default ({name})",
1068
1068
  "noDefault": "No default",
1069
1069
  "inheritWorkspace": "Inherit workspace",
1070
1070
  "on": "On",
@@ -1080,7 +1080,8 @@
1080
1080
  "pipelineEmpty": "No default. Pick a pipeline when you run this task.",
1081
1081
  "pipelineHint": "The pipeline the Run button starts by default: the sequence of agent steps (for example spec, code, test, merge) executed for this task.",
1082
1082
  "mergePolicy": "Risk policy",
1083
- "riskPolicyDetail": "{name}: auto-merge when complexity {complexity}, risk ≤ {risk}, impact ≤ {impact}; up to {attempts} CI-fix attempts.",
1083
+ "riskPolicyDetail": "{name}: merges without human review when risk ≤ {risk}, impact ≤ {impact} and complexity ≤ {complexity}; up to {attempts} CI-fix attempts.",
1084
+ "riskPolicyManual": "{name}: never merges on its own, so every pull request waits for a human review; up to {attempts} CI-fix attempts.",
1084
1085
  "riskPolicyEmpty": "No risk policy configured. The merger raises a review notification for every PR.",
1085
1086
  "mergePolicyHint": "Decides when a finished pull request merges automatically instead of waiting for a human review, and how many CI-fix attempts a run gets.",
1086
1087
  "modelPreset": "Model preset",
@@ -3968,6 +3969,25 @@
3968
3969
  "toast": {
3969
3970
  "reseedFailed": "Could not reseed risk policy"
3970
3971
  }
3972
+ },
3973
+ "picker": {
3974
+ "workspaceDefaultCaption": "Applied because this task picks no policy of its own.",
3975
+ "noneHint": "No risk policy configured. Every pull request waits for a human review."
3976
+ },
3977
+ "preview": {
3978
+ "defaultBadge": "Default",
3979
+ "autoMergeHeading": "Automatic merge thresholds",
3980
+ "axis": {
3981
+ "risk": "Risk",
3982
+ "impact": "Impact",
3983
+ "complexity": "Complexity"
3984
+ },
3985
+ "ceiling": "at or below {value}",
3986
+ "autoMergeExplainer": "Once CI is green the merger agent scores the pull request on these three axes. Every score at or below its ceiling means the pull request merges on its own and skips human review; anything above sends it to a person instead.",
3987
+ "manualHeading": "Manual review only",
3988
+ "manualExplainer": "This policy never merges on its own, so every pull request waits for a human review whatever it scores.",
3989
+ "ciHeading": "CI fixes",
3990
+ "ciAttempts": "The run may try {count} time to turn a red CI green before it gives up. | The run may try {count} times to turn a red CI green before it gives up."
3971
3991
  }
3972
3992
  },
3973
3993
  "modelPreset": {
@@ -269,7 +269,7 @@
269
269
  "chooseAtRunTime": "Elegir al ejecutar",
270
270
  "mergePolicy": "Política de riesgo",
271
271
  "workspaceDefault": "Predeterminado del espacio",
272
- "defaultPreset": "Predeterminado ({name}): {thresholds}",
272
+ "defaultPreset": "Predeterminada ({name})",
273
273
  "defaultModelPreset": "Predeterminado ({name})",
274
274
  "modelPreset": "Preset de modelo",
275
275
  "bestPractices": "Buenas prácticas",
@@ -1003,8 +1003,8 @@
1003
1003
  "unassigned": "Sin asignar",
1004
1004
  "workspaceDefault": "Predeterminado del espacio de trabajo",
1005
1005
  "workspaceDefaultParen": "(predeterminado del espacio de trabajo)",
1006
- "defaultPresetThresholds": "Predeterminado ({name}): {thresholds}",
1007
- "defaultPreset": "Predeterminado ({name})",
1006
+ "defaultRiskPolicy": "Predeterminada ({name})",
1007
+ "defaultModelPreset": "Predeterminado ({name})",
1008
1008
  "noDefault": "Sin predeterminado",
1009
1009
  "inheritWorkspace": "Heredar del espacio de trabajo",
1010
1010
  "on": "Activado",
@@ -1020,7 +1020,8 @@
1020
1020
  "pipelineEmpty": "Sin predeterminado. Elige un pipeline cuando ejecutes esta tarea.",
1021
1021
  "pipelineHint": "El pipeline que el botón Ejecutar inicia por defecto: la secuencia de pasos de agente (por ejemplo especificación, código, pruebas, fusión) que se ejecuta para esta tarea.",
1022
1022
  "mergePolicy": "Política de riesgo",
1023
- "riskPolicyDetail": "{name}: fusión automática cuando complejidad {complexity}, riesgo ≤ {risk}, impacto ≤ {impact}; hasta {attempts} intentos de corrección de CI.",
1023
+ "riskPolicyDetail": "{name}: se fusiona sin revisión humana cuando riesgo ≤ {risk}, impacto ≤ {impact} y complejidad ≤ {complexity}; hasta {attempts} intentos de corrección de CI.",
1024
+ "riskPolicyManual": "{name}: nunca se fusiona por su cuenta, así que cada pull request espera una revisión humana; hasta {attempts} intentos de corrección de CI.",
1024
1025
  "riskPolicyEmpty": "No hay política de riesgo configurada. El fusionador genera una notificación de revisión para cada PR.",
1025
1026
  "mergePolicyHint": "Decide cuándo un pull request terminado se fusiona automáticamente en lugar de esperar una revisión humana, y cuántos intentos de arreglo de CI tiene una ejecución.",
1026
1027
  "modelPreset": "Preajuste de modelo",
@@ -5019,6 +5020,25 @@
5019
5020
  "toast": {
5020
5021
  "reseedFailed": "No se pudo regenerar la política de riesgo"
5021
5022
  }
5023
+ },
5024
+ "picker": {
5025
+ "workspaceDefaultCaption": "Se aplica porque esta tarea no elige una política propia.",
5026
+ "noneHint": "No hay ninguna política de riesgo configurada. Cada pull request espera una revisión humana."
5027
+ },
5028
+ "preview": {
5029
+ "defaultBadge": "Predeterminada",
5030
+ "autoMergeHeading": "Umbrales de fusión automática",
5031
+ "axis": {
5032
+ "risk": "Riesgo",
5033
+ "impact": "Impacto",
5034
+ "complexity": "Complejidad"
5035
+ },
5036
+ "ceiling": "igual o inferior a {value}",
5037
+ "autoMergeExplainer": "Cuando CI está en verde, el agente fusionador puntúa el pull request en estos tres ejes. Si todas las puntuaciones quedan en su límite o por debajo, el pull request se fusiona solo y se salta la revisión humana; cualquier valor superior lo envía a una persona.",
5038
+ "manualHeading": "Solo revisión manual",
5039
+ "manualExplainer": "Esta política nunca fusiona por su cuenta, así que cada pull request espera una revisión humana sea cual sea su puntuación.",
5040
+ "ciHeading": "Correcciones de CI",
5041
+ "ciAttempts": "La ejecución puede intentar {count} vez poner CI en verde antes de rendirse. | La ejecución puede intentar {count} veces poner CI en verde antes de rendirse."
5022
5042
  }
5023
5043
  },
5024
5044
  "modelPreset": {
@@ -269,7 +269,7 @@
269
269
  "chooseAtRunTime": "Choisir au lancement",
270
270
  "mergePolicy": "Politique de risque",
271
271
  "workspaceDefault": "Valeur par défaut de l’espace",
272
- "defaultPreset": "Par défaut ({name}) : {thresholds}",
272
+ "defaultPreset": "Par défaut ({name})",
273
273
  "defaultModelPreset": "Par défaut ({name})",
274
274
  "modelPreset": "Préréglage de modèle",
275
275
  "bestPractices": "Bonnes pratiques",
@@ -1003,8 +1003,8 @@
1003
1003
  "unassigned": "Non assigné",
1004
1004
  "workspaceDefault": "Valeur par défaut de l'espace de travail",
1005
1005
  "workspaceDefaultParen": "(valeur par défaut de l'espace de travail)",
1006
- "defaultPresetThresholds": "Par défaut ({name}) : {thresholds}",
1007
- "defaultPreset": "Par défaut ({name})",
1006
+ "defaultRiskPolicy": "Par défaut ({name})",
1007
+ "defaultModelPreset": "Par défaut ({name})",
1008
1008
  "noDefault": "Aucune valeur par défaut",
1009
1009
  "inheritWorkspace": "Hériter de l'espace de travail",
1010
1010
  "on": "Activé",
@@ -1020,7 +1020,8 @@
1020
1020
  "pipelineEmpty": "Aucune valeur par défaut. Choisissez un pipeline lorsque vous exécutez cette tâche.",
1021
1021
  "pipelineHint": "Le pipeline que le bouton Exécuter démarre par défaut : la séquence d'étapes d'agent (par exemple spécification, code, test, fusion) exécutée pour cette tâche.",
1022
1022
  "mergePolicy": "Politique de risque",
1023
- "riskPolicyDetail": "{name} : fusion automatique lorsque la complexité ≤ {complexity}, le risque ≤ {risk}, l'impact ≤ {impact} ; jusqu'à {attempts} tentatives de correction CI.",
1023
+ "riskPolicyDetail": "{name} : fusionne sans revue humaine lorsque le risque ≤ {risk}, l'impact ≤ {impact} et la complexité ≤ {complexity} ; jusqu'à {attempts} tentatives de correction CI.",
1024
+ "riskPolicyManual": "{name} : ne fusionne jamais de lui-même, chaque pull request attend donc une revue humaine ; jusqu'à {attempts} tentatives de correction CI.",
1024
1025
  "riskPolicyEmpty": "Aucune politique de risque configurée. Le fusionneur déclenche une notification de revue pour chaque PR.",
1025
1026
  "mergePolicyHint": "Décide quand une pull request terminée est fusionnée automatiquement au lieu d'attendre une revue humaine, et combien de tentatives de correction de CI une exécution obtient.",
1026
1027
  "modelPreset": "Preset de modèle",
@@ -5019,6 +5020,25 @@
5019
5020
  "toast": {
5020
5021
  "reseedFailed": "Impossible de régénérer la politique de risque"
5021
5022
  }
5023
+ },
5024
+ "picker": {
5025
+ "workspaceDefaultCaption": "Appliquée parce que cette tâche ne choisit aucune politique.",
5026
+ "noneHint": "Aucune politique de risque configurée. Chaque pull request attend une revue humaine."
5027
+ },
5028
+ "preview": {
5029
+ "defaultBadge": "Par défaut",
5030
+ "autoMergeHeading": "Seuils de fusion automatique",
5031
+ "axis": {
5032
+ "risk": "Risque",
5033
+ "impact": "Impact",
5034
+ "complexity": "Complexité"
5035
+ },
5036
+ "ceiling": "inférieur ou égal à {value}",
5037
+ "autoMergeExplainer": "Une fois la CI au vert, l'agent fusionneur note la pull request sur ces trois axes. Si chaque note reste sous son plafond, la pull request fusionne toute seule et saute la revue humaine ; au-dessus, elle part vers une personne.",
5038
+ "manualHeading": "Revue manuelle uniquement",
5039
+ "manualExplainer": "Cette politique ne fusionne jamais d'elle-même : chaque pull request attend une revue humaine, quelles que soient les notes.",
5040
+ "ciHeading": "Corrections CI",
5041
+ "ciAttempts": "L'exécution peut tenter {count} fois de remettre la CI au vert avant d'abandonner. | L'exécution peut tenter {count} fois de remettre la CI au vert avant d'abandonner."
5022
5042
  }
5023
5043
  },
5024
5044
  "modelPreset": {
@@ -269,7 +269,7 @@
269
269
  "chooseAtRunTime": "בחר בזמן הריצה",
270
270
  "mergePolicy": "מדיניות סיכון",
271
271
  "workspaceDefault": "ברירת מחדל של סביבת העבודה",
272
- "defaultPreset": "ברירת מחדל ({name}) — {thresholds}",
272
+ "defaultPreset": "ברירת מחדל ({name})",
273
273
  "defaultModelPreset": "ברירת מחדל ({name})",
274
274
  "modelPreset": "הגדרה קבועה של מודל",
275
275
  "bestPractices": "מומלצות עבודה",
@@ -1003,8 +1003,8 @@
1003
1003
  "unassigned": "לא משויך",
1004
1004
  "workspaceDefault": "ברירת מחדל של מרחב העבודה",
1005
1005
  "workspaceDefaultParen": "(ברירת מחדל של מרחב העבודה)",
1006
- "defaultPresetThresholds": "ברירת מחדל ({name}): {thresholds}",
1007
- "defaultPreset": "ברירת מחדל ({name})",
1006
+ "defaultRiskPolicy": "ברירת מחדל ({name})",
1007
+ "defaultModelPreset": "ברירת מחדל ({name})",
1008
1008
  "noDefault": "אין ברירת מחדל",
1009
1009
  "inheritWorkspace": "ירש ממרחב העבודה",
1010
1010
  "on": "פעיל",
@@ -1020,7 +1020,8 @@
1020
1020
  "pipelineEmpty": "אין ברירת מחדל. בחר פייפליין כשאתה מריץ משימה זו.",
1021
1021
  "pipelineHint": "הפייפליין שכפתור ההרצה מפעיל כברירת מחדל: רצף שלבי הסוכנים (למשל אפיון, קוד, בדיקות, מיזוג) שמורץ עבור משימה זו.",
1022
1022
  "mergePolicy": "מדיניות סיכון",
1023
- "riskPolicyDetail": "{name}: מיזוג אוטומטי כאשר מורכבות ≤ {complexity}, סיכון ≤ {risk}, השפעה ≤ {impact}; עד {attempts} ניסיונות תיקון CI.",
1023
+ "riskPolicyDetail": "{name}: ממזג ללא סקירה אנושית כאשר סיכון ≤ {risk}, השפעה ≤ {impact} ומורכבות ≤ {complexity}; עד {attempts} ניסיונות תיקון CI.",
1024
+ "riskPolicyManual": "{name}: לעולם לא ממזג מעצמו, ולכן כל בקשת משיכה ממתינה לסקירה אנושית; עד {attempts} ניסיונות תיקון CI.",
1024
1025
  "riskPolicyEmpty": "לא הוגדרה מדיניות סיכון. הממזג מעלה התראת סקירה עבור כל PR.",
1025
1026
  "mergePolicyHint": "קובע מתי בקשת משיכה שהושלמה ממוזגת אוטומטית במקום להמתין לסקירה אנושית, וכמה ניסיונות תיקון CI מקבלת הרצה.",
1026
1027
  "modelPreset": "תבנית מודל",
@@ -5030,6 +5031,25 @@
5030
5031
  "toast": {
5031
5032
  "reseedFailed": "לא ניתן לזרוע מחדש את מדיניות הסיכון"
5032
5033
  }
5034
+ },
5035
+ "picker": {
5036
+ "workspaceDefaultCaption": "חלה מפני שהמשימה הזו לא בוחרת מדיניות משלה.",
5037
+ "noneHint": "לא הוגדרה מדיניות סיכון. כל בקשת משיכה ממתינה לסקירה אנושית."
5038
+ },
5039
+ "preview": {
5040
+ "defaultBadge": "ברירת מחדל",
5041
+ "autoMergeHeading": "ספי מיזוג אוטומטי",
5042
+ "axis": {
5043
+ "risk": "סיכון",
5044
+ "impact": "השפעה",
5045
+ "complexity": "מורכבות"
5046
+ },
5047
+ "ceiling": "עד {value}",
5048
+ "autoMergeExplainer": "כאשר ה-CI ירוק, סוכן המיזוג מנקד את בקשת המשיכה בשלושת הצירים האלה. אם כל ניקוד נמצא בתקרה שלו או מתחתיה, בקשת המשיכה ממוזגת מעצמה ומדלגת על סקירה אנושית; ניקוד גבוה יותר שולח אותה לאדם.",
5049
+ "manualHeading": "סקירה ידנית בלבד",
5050
+ "manualExplainer": "מדיניות זו לעולם אינה ממזגת מעצמה, ולכן כל בקשת משיכה ממתינה לסקירה אנושית ללא קשר לניקוד.",
5051
+ "ciHeading": "תיקוני CI",
5052
+ "ciAttempts": "ההרצה רשאית לנסות פעם {count} להחזיר CI אדום למצב ירוק לפני שהיא מוותרת. | ההרצה רשאית לנסות {count} פעמים להחזיר CI אדום למצב ירוק לפני שהיא מוותרת."
5033
5053
  }
5034
5054
  },
5035
5055
  "modelPreset": {
@@ -1318,8 +1318,8 @@
1318
1318
  "unassigned": "Non assegnato",
1319
1319
  "workspaceDefault": "Predefinito del workspace",
1320
1320
  "workspaceDefaultParen": "(predefinito del workspace)",
1321
- "defaultPresetThresholds": "Predefinito ({name}): {thresholds}",
1322
- "defaultPreset": "Predefinito ({name})",
1321
+ "defaultRiskPolicy": "Predefinito ({name})",
1322
+ "defaultModelPreset": "Predefinito ({name})",
1323
1323
  "noDefault": "Nessun predefinito",
1324
1324
  "inheritWorkspace": "Eredita dal workspace",
1325
1325
  "on": "Attivo",
@@ -1335,7 +1335,8 @@
1335
1335
  "pipelineEmpty": "Nessun predefinito. Scegli una pipeline quando esegui questa attivita'.",
1336
1336
  "pipelineHint": "La pipeline che il pulsante Esegui avvia per impostazione predefinita: la sequenza di passaggi dell'agente (ad esempio spec, code, test, merge) eseguiti per questa attivita'.",
1337
1337
  "mergePolicy": "Criterio di rischio",
1338
- "riskPolicyDetail": "{name}: unione automatica quando complessita' ≤ {complexity}, rischio ≤ {risk}, impatto ≤ {impact}; fino a {attempts} tentativi di correzione CI.",
1338
+ "riskPolicyDetail": "{name}: unisce senza revisione umana quando rischio ≤ {risk}, impatto ≤ {impact} e complessita ≤ {complexity}; fino a {attempts} tentativi di correzione CI.",
1339
+ "riskPolicyManual": "{name}: non unisce mai da solo, quindi ogni pull request attende una revisione umana; fino a {attempts} tentativi di correzione CI.",
1339
1340
  "riskPolicyEmpty": "Nessun criterio di rischio configurato. Il merger genera una notifica di revisione per ogni PR.",
1340
1341
  "mergePolicyHint": "Decide quando una pull request completata viene unita automaticamente invece di attendere una revisione umana, e quanti tentativi di correzione CI ottiene un'esecuzione.",
1341
1342
  "modelPreset": "Preset del modello",
@@ -2304,7 +2305,7 @@
2304
2305
  "chooseAtRunTime": "Scegli al momento dell'esecuzione",
2305
2306
  "mergePolicy": "Criterio di rischio",
2306
2307
  "workspaceDefault": "Predefinito del workspace",
2307
- "defaultPreset": "Predefinito ({name}) — {thresholds}",
2308
+ "defaultPreset": "Predefinito ({name})",
2308
2309
  "defaultModelPreset": "Predefinito ({name})",
2309
2310
  "modelPreset": "Preset di modello",
2310
2311
  "bestPractices": "Best practice",
@@ -5136,6 +5137,25 @@
5136
5137
  "toast": {
5137
5138
  "reseedFailed": "Impossibile ripristinare il criterio di rischio"
5138
5139
  }
5140
+ },
5141
+ "picker": {
5142
+ "workspaceDefaultCaption": "Si applica perche questa attivita non sceglie un criterio proprio.",
5143
+ "noneHint": "Nessun criterio di rischio configurato. Ogni pull request attende una revisione umana."
5144
+ },
5145
+ "preview": {
5146
+ "defaultBadge": "Predefinito",
5147
+ "autoMergeHeading": "Soglie di unione automatica",
5148
+ "axis": {
5149
+ "risk": "Rischio",
5150
+ "impact": "Impatto",
5151
+ "complexity": "Complessita"
5152
+ },
5153
+ "ceiling": "pari o inferiore a {value}",
5154
+ "autoMergeExplainer": "Quando la CI e verde, l'agente merger valuta la pull request su questi tre assi. Se ogni punteggio resta entro il proprio limite, la pull request si unisce da sola e salta la revisione umana; qualsiasi valore superiore la manda a una persona.",
5155
+ "manualHeading": "Solo revisione manuale",
5156
+ "manualExplainer": "Questo criterio non unisce mai da solo, quindi ogni pull request attende una revisione umana qualunque sia il punteggio.",
5157
+ "ciHeading": "Correzioni CI",
5158
+ "ciAttempts": "L'esecuzione può fare {count} tentativo per rimettere in verde la CI prima di arrendersi. | L'esecuzione può fare {count} tentativi per rimettere in verde la CI prima di arrendersi."
5139
5159
  }
5140
5160
  },
5141
5161
  "modelPreset": {
@@ -269,7 +269,7 @@
269
269
  "chooseAtRunTime": "実行時に選択",
270
270
  "mergePolicy": "リスクポリシー",
271
271
  "workspaceDefault": "ワークスペースの既定",
272
- "defaultPreset": "既定({name})— {thresholds}",
272
+ "defaultPreset": "既定({name}",
273
273
  "defaultModelPreset": "既定({name})",
274
274
  "modelPreset": "モデルプリセット",
275
275
  "bestPractices": "ベストプラクティス",
@@ -1003,8 +1003,8 @@
1003
1003
  "unassigned": "未割り当て",
1004
1004
  "workspaceDefault": "ワークスペースの既定",
1005
1005
  "workspaceDefaultParen": "(ワークスペースの既定)",
1006
- "defaultPresetThresholds": "既定 ({name}): {thresholds}",
1007
- "defaultPreset": "既定 ({name})",
1006
+ "defaultRiskPolicy": "既定 ({name})",
1007
+ "defaultModelPreset": "既定 ({name})",
1008
1008
  "noDefault": "既定なし",
1009
1009
  "inheritWorkspace": "ワークスペースを継承",
1010
1010
  "on": "オン",
@@ -1020,7 +1020,8 @@
1020
1020
  "pipelineEmpty": "既定なし。このタスクを実行するときにパイプラインを選択してください。",
1021
1021
  "pipelineHint": "実行ボタンが既定で開始するパイプライン: このタスクのために実行されるエージェントステップの並び (例: 仕様、コード、テスト、マージ)。",
1022
1022
  "mergePolicy": "リスクポリシー",
1023
- "riskPolicyDetail": "{name}: 複雑度 ≤ {complexity}、リスク ≤ {risk}、影響度 ≤ {impact} のとき自動マージ。CI 修正は最大 {attempts} 回まで。",
1023
+ "riskPolicyDetail": "{name}: リスク ≤ {risk}、影響度 ≤ {impact}、複雑度 ≤ {complexity} のとき人のレビューなしでマージ。CI 修正は最大 {attempts} 回まで。",
1024
+ "riskPolicyManual": "{name}: 自動ではマージせず、すべてのプルリクエストが人のレビューを待ちます。CI 修正は最大 {attempts} 回まで。",
1024
1025
  "riskPolicyEmpty": "リスクポリシーが設定されていません。マージャーはすべての PR についてレビュー通知を発行します。",
1025
1026
  "mergePolicyHint": "完成したプルリクエストを人のレビューを待たずに自動マージする条件と、実行が得られる CI 修正の試行回数を決めます。",
1026
1027
  "modelPreset": "モデルプリセット",
@@ -5031,6 +5032,25 @@
5031
5032
  "toast": {
5032
5033
  "reseedFailed": "リスクポリシーを再シードできませんでした"
5033
5034
  }
5035
+ },
5036
+ "picker": {
5037
+ "workspaceDefaultCaption": "このタスクが独自のポリシーを選んでいないため、これが適用されます。",
5038
+ "noneHint": "リスクポリシーが設定されていません。すべてのプルリクエストは人のレビューを待ちます。"
5039
+ },
5040
+ "preview": {
5041
+ "defaultBadge": "既定",
5042
+ "autoMergeHeading": "自動マージのしきい値",
5043
+ "axis": {
5044
+ "risk": "リスク",
5045
+ "impact": "影響度",
5046
+ "complexity": "複雑度"
5047
+ },
5048
+ "ceiling": "{value} 以下",
5049
+ "autoMergeExplainer": "CI が green になると、マージャーエージェントがプルリクエストをこの 3 軸で採点します。すべての点数が上限以下なら、プルリクエストは人のレビューを飛ばして自動でマージされます。1 つでも上限を超えると、人に回されます。",
5050
+ "manualHeading": "手動レビューのみ",
5051
+ "manualExplainer": "このポリシーは自動でマージしないため、点数にかかわらずすべてのプルリクエストが人のレビューを待ちます。",
5052
+ "ciHeading": "CI 修正",
5053
+ "ciAttempts": "実行は CI を green に戻す試行を最大 {count} 回行ってから諦めます。 | 実行は CI を green に戻す試行を最大 {count} 回行ってから諦めます。"
5034
5054
  }
5035
5055
  },
5036
5056
  "modelPreset": {
@@ -269,7 +269,7 @@
269
269
  "chooseAtRunTime": "Wybierz przy uruchomieniu",
270
270
  "mergePolicy": "Zasada ryzyka",
271
271
  "workspaceDefault": "Domyślne dla obszaru roboczego",
272
- "defaultPreset": "Domyślny ({name}): {thresholds}",
272
+ "defaultPreset": "Domyślna ({name})",
273
273
  "defaultModelPreset": "Domyślny ({name})",
274
274
  "modelPreset": "Preset modelu",
275
275
  "bestPractices": "Dobre praktyki",
@@ -1003,8 +1003,8 @@
1003
1003
  "unassigned": "Nieprzypisane",
1004
1004
  "workspaceDefault": "Domyślne obszaru roboczego",
1005
1005
  "workspaceDefaultParen": "(domyślne obszaru roboczego)",
1006
- "defaultPresetThresholds": "Domyślny ({name}): {thresholds}",
1007
- "defaultPreset": "Domyślny ({name})",
1006
+ "defaultRiskPolicy": "Domyślna ({name})",
1007
+ "defaultModelPreset": "Domyślny ({name})",
1008
1008
  "noDefault": "Brak domyślnego",
1009
1009
  "inheritWorkspace": "Dziedzicz z obszaru roboczego",
1010
1010
  "on": "Wł.",
@@ -1020,7 +1020,8 @@
1020
1020
  "pipelineEmpty": "Brak domyślnego. Wybierz potok przy uruchamianiu tego zadania.",
1021
1021
  "pipelineHint": "Potok uruchamiany domyślnie przyciskiem uruchamiania: sekwencja kroków agentów (np. specyfikacja, kod, testy, scalenie) wykonywana dla tego zadania.",
1022
1022
  "mergePolicy": "Zasada ryzyka",
1023
- "riskPolicyDetail": "{name}: automatyczne scalanie, gdy złożoność ≤ {complexity}, ryzyko ≤ {risk}, wpływ ≤ {impact}; do {attempts} prób naprawy CI.",
1023
+ "riskPolicyDetail": "{name}: scala bez ludzkiej recenzji, gdy ryzyko ≤ {risk}, wpływ ≤ {impact} i złożoność ≤ {complexity}; do {attempts} prób naprawy CI.",
1024
+ "riskPolicyManual": "{name}: nigdy nie scala samodzielnie, więc każdy pull request czeka na ludzką recenzję; do {attempts} prób naprawy CI.",
1024
1025
  "riskPolicyEmpty": "Nie skonfigurowano zasady ryzyka. Element scalający zgłasza powiadomienie o recenzji dla każdego PR.",
1025
1026
  "mergePolicyHint": "Decyduje, kiedy ukończony pull request jest scalany automatycznie zamiast czekać na ludzką recenzję, oraz ile prób naprawy CI otrzymuje uruchomienie.",
1026
1027
  "modelPreset": "Preset modelu",
@@ -5019,6 +5020,25 @@
5019
5020
  "toast": {
5020
5021
  "reseedFailed": "Nie udało się zregenerować zasady ryzyka"
5021
5022
  }
5023
+ },
5024
+ "picker": {
5025
+ "workspaceDefaultCaption": "Stosowana, ponieważ to zadanie nie wybiera własnej zasady.",
5026
+ "noneHint": "Nie skonfigurowano żadnej zasady ryzyka. Każdy pull request czeka na ludzką recenzję."
5027
+ },
5028
+ "preview": {
5029
+ "defaultBadge": "Domyślna",
5030
+ "autoMergeHeading": "Progi automatycznego scalania",
5031
+ "axis": {
5032
+ "risk": "Ryzyko",
5033
+ "impact": "Wpływ",
5034
+ "complexity": "Złożoność"
5035
+ },
5036
+ "ceiling": "na poziomie {value} lub niżej",
5037
+ "autoMergeExplainer": "Gdy CI jest zielone, agent scalający ocenia pull requesta na tych trzech osiach. Jeśli każda ocena mieści się w swoim limicie, pull request scala się sam i pomija ludzką recenzję; cokolwiek powyżej trafia do człowieka.",
5038
+ "manualHeading": "Tylko recenzja ręczna",
5039
+ "manualExplainer": "Ta zasada nigdy nie scala samodzielnie, więc każdy pull request czeka na ludzką recenzję niezależnie od ocen.",
5040
+ "ciHeading": "Naprawy CI",
5041
+ "ciAttempts": "Uruchomienie może podjąć {count} próbę naprawy czerwonego CI, zanim się podda. | Uruchomienie może podjąć {count} próby naprawy czerwonego CI, zanim się podda. | Uruchomienie może podjąć {count} prób naprawy czerwonego CI, zanim się podda."
5022
5042
  }
5023
5043
  },
5024
5044
  "modelPreset": {
@@ -269,7 +269,7 @@
269
269
  "chooseAtRunTime": "Çalıştırma sırasında seç",
270
270
  "mergePolicy": "Risk ilkesi",
271
271
  "workspaceDefault": "Çalışma alanı varsayılanı",
272
- "defaultPreset": "Varsayılan ({name}) — {thresholds}",
272
+ "defaultPreset": "Varsayılan ({name})",
273
273
  "defaultModelPreset": "Varsayılan ({name})",
274
274
  "modelPreset": "Model ön ayarı",
275
275
  "bestPractices": "En iyi uygulamalar",
@@ -1003,8 +1003,8 @@
1003
1003
  "unassigned": "Atanmamış",
1004
1004
  "workspaceDefault": "Çalışma alanı varsayılanı",
1005
1005
  "workspaceDefaultParen": "(çalışma alanı varsayılanı)",
1006
- "defaultPresetThresholds": "Varsayılan ({name}): {thresholds}",
1007
- "defaultPreset": "Varsayılan ({name})",
1006
+ "defaultRiskPolicy": "Varsayılan ({name})",
1007
+ "defaultModelPreset": "Varsayılan ({name})",
1008
1008
  "noDefault": "Varsayılan yok",
1009
1009
  "inheritWorkspace": "Çalışma alanından devral",
1010
1010
  "on": "Açık",
@@ -1020,7 +1020,8 @@
1020
1020
  "pipelineEmpty": "Varsayılan yok. Bu görevi çalıştırırken bir pipeline seçin.",
1021
1021
  "pipelineHint": "Çalıştır düğmesinin varsayılan olarak başlattığı pipeline: bu görev için yürütülen ajan adımları dizisi (örneğin spesifikasyon, kod, test, birleştirme).",
1022
1022
  "mergePolicy": "Risk ilkesi",
1023
- "riskPolicyDetail": "{name}: karmaşıklık ≤ {complexity}, risk ≤ {risk}, etki ≤ {impact} olduğunda otomatik birleştir; en fazla {attempts} CI düzeltme denemesi.",
1023
+ "riskPolicyDetail": "{name}: risk ≤ {risk}, etki ≤ {impact} ve karmaşıklık ≤ {complexity} olduğunda insan incelemesi olmadan birleştirir; en fazla {attempts} CI düzeltme denemesi.",
1024
+ "riskPolicyManual": "{name}: asla kendiliğinden birleştirmez, bu yüzden her pull request insan incelemesini bekler; en fazla {attempts} CI düzeltme denemesi.",
1024
1025
  "riskPolicyEmpty": "Yapılandırılmış risk ilkesi yok. Birleştirici her PR için bir inceleme bildirimi oluşturur.",
1025
1026
  "mergePolicyHint": "Tamamlanan bir pull request'in insan incelemesi beklemeden ne zaman otomatik birleştirileceğini ve bir çalıştırmanın kaç CI düzeltme denemesi alacağını belirler.",
1026
1027
  "modelPreset": "Model ön ayarı",
@@ -5031,6 +5032,25 @@
5031
5032
  "toast": {
5032
5033
  "reseedFailed": "Risk ilkesi yeniden tohumlanamadı"
5033
5034
  }
5035
+ },
5036
+ "picker": {
5037
+ "workspaceDefaultCaption": "Bu görev kendine bir ilke seçmediği için uygulanır.",
5038
+ "noneHint": "Yapılandırılmış risk ilkesi yok. Her pull request insan incelemesini bekler."
5039
+ },
5040
+ "preview": {
5041
+ "defaultBadge": "Varsayılan",
5042
+ "autoMergeHeading": "Otomatik birleştirme eşikleri",
5043
+ "axis": {
5044
+ "risk": "Risk",
5045
+ "impact": "Etki",
5046
+ "complexity": "Karmaşıklık"
5047
+ },
5048
+ "ceiling": "{value} ve altı",
5049
+ "autoMergeExplainer": "CI yeşile döndüğünde birleştirici ajan pull request'i bu üç eksende puanlar. Her puan kendi tavanında veya altındaysa pull request kendiliğinden birleşir ve insan incelemesini atlar; tavanı aşan her puan onu bir kişiye yönlendirir.",
5050
+ "manualHeading": "Yalnızca elle inceleme",
5051
+ "manualExplainer": "Bu ilke asla kendiliğinden birleştirmez, bu yüzden puanı ne olursa olsun her pull request insan incelemesini bekler.",
5052
+ "ciHeading": "CI düzeltmeleri",
5053
+ "ciAttempts": "Çalıştırma, kırmızı bir CI'yi yeşile çevirmek için pes etmeden önce {count} deneme yapabilir. | Çalıştırma, kırmızı bir CI'yi yeşile çevirmek için pes etmeden önce {count} deneme yapabilir."
5034
5054
  }
5035
5055
  },
5036
5056
  "modelPreset": {