@cat-factory/app 0.195.1 → 0.196.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.
- package/app/components/board/nodes/BlockNode.vue +23 -4
- package/app/components/judge/JudgeResultView.vue +5 -1
- package/app/components/merge/MergeEffortChips.vue +5 -1
- package/app/components/panels/ReportsPanel.vue +5 -2
- package/app/components/panels/ReportsSpendBreakdown.vue +5 -1
- package/app/components/panels/StepEffortReport.vue +11 -2
- package/app/components/panels/StepFragmentAdherence.vue +7 -2
- package/app/components/panels/StepMetadataCard.vue +20 -1
- package/app/components/panels/StepRunMeta.vue +18 -0
- package/app/components/pipeline/EstimateThresholdFields.vue +74 -0
- package/app/components/pipeline/OutputBudgetInput.vue +1 -0
- package/app/components/pipeline/PipelineBuilder.vue +94 -96
- package/app/components/settings/ConsensusGroupsSection.vue +12 -3
- package/app/composables/api/errors.ts +7 -0
- package/app/composables/usePipelineErrorToast.spec.ts +119 -5
- package/app/composables/usePipelineErrorToast.ts +140 -10
- package/app/composables/useStepPromptVariant.spec.ts +75 -0
- package/app/composables/useStepPromptVariant.ts +50 -0
- package/app/stores/agents.spec.ts +30 -0
- package/app/stores/agents.ts +33 -1
- package/app/stores/pipelines/draftStepConfig.ts +24 -1
- package/app/stores/workspace/hydrate.ts +3 -0
- package/app/types/domain.ts +1 -0
- package/app/utils/estimateGating.spec.ts +44 -0
- package/app/utils/estimateGating.ts +60 -0
- package/i18n/locales/de.json +49 -4
- package/i18n/locales/en.json +58 -4
- package/i18n/locales/es.json +49 -4
- package/i18n/locales/fr.json +49 -4
- package/i18n/locales/he.json +49 -4
- package/i18n/locales/it.json +49 -4
- package/i18n/locales/ja.json +49 -4
- package/i18n/locales/pl.json +49 -4
- package/i18n/locales/tr.json +49 -4
- package/i18n/locales/uk.json +49 -4
- package/package.json +2 -2
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import {
|
|
3
|
+
ESTIMATE_AXES,
|
|
4
|
+
ESTIMATE_AXIS_FIELD,
|
|
5
|
+
ESTIMATE_AXIS_HINT_KEYS,
|
|
6
|
+
ESTIMATE_AXIS_LABEL_KEYS,
|
|
7
|
+
parseAxisThreshold,
|
|
8
|
+
} from './estimateGating'
|
|
9
|
+
|
|
10
|
+
describe('parseAxisThreshold', () => {
|
|
11
|
+
it('clears the axis on an empty or unparseable field rather than storing a zero floor', () => {
|
|
12
|
+
// The two are opposites: an unset axis is not considered, where a 0 floor always passes.
|
|
13
|
+
expect(parseAxisThreshold('')).toBeUndefined()
|
|
14
|
+
expect(parseAxisThreshold(' ')).toBeUndefined()
|
|
15
|
+
expect(parseAxisThreshold('abc')).toBeUndefined()
|
|
16
|
+
expect(parseAxisThreshold('0')).toBe(0)
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
it('keeps a value inside the estimator scale', () => {
|
|
20
|
+
expect(parseAxisThreshold('0.6')).toBe(0.6)
|
|
21
|
+
expect(parseAxisThreshold(' 0.25 ')).toBe(0.25)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
it('clamps out-of-range input instead of rejecting it', () => {
|
|
25
|
+
// A fat-fingered extra digit lands on the ceiling rather than failing the save with a 422.
|
|
26
|
+
expect(parseAxisThreshold('10')).toBe(1)
|
|
27
|
+
expect(parseAxisThreshold('-3')).toBe(0)
|
|
28
|
+
})
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
describe('estimate axis vocabulary', () => {
|
|
32
|
+
it('covers every axis in both key maps and the field map', () => {
|
|
33
|
+
for (const axis of ESTIMATE_AXES) {
|
|
34
|
+
expect(ESTIMATE_AXIS_LABEL_KEYS[axis]).toBeTruthy()
|
|
35
|
+
expect(ESTIMATE_AXIS_HINT_KEYS[axis]).toBeTruthy()
|
|
36
|
+
expect(ESTIMATE_AXIS_FIELD[axis]).toBeTruthy()
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
it('gives each axis its own hint, so no two axes explain the same thing', () => {
|
|
41
|
+
const hints = ESTIMATE_AXES.map((axis) => ESTIMATE_AXIS_HINT_KEYS[axis])
|
|
42
|
+
expect(new Set(hints).size).toBe(ESTIMATE_AXES.length)
|
|
43
|
+
})
|
|
44
|
+
})
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The three axes a `task-estimator` step scores a task on, and the presentation vocabulary every
|
|
3
|
+
* surface that lets a human gate work on them shares.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately NOT `RISK_POLICY_AXES`: those are the axes a `merger` scores a finished pull
|
|
6
|
+
* request on, and although the three names coincide, the two are produced by different agents at
|
|
7
|
+
* different points in a run and mean different things to a reader. Folding them together would
|
|
8
|
+
* make a rename in one silently retitle the other.
|
|
9
|
+
*/
|
|
10
|
+
export const ESTIMATE_AXES = ['complexity', 'risk', 'impact'] as const
|
|
11
|
+
|
|
12
|
+
export type EstimateAxis = (typeof ESTIMATE_AXES)[number]
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Axis → label key. Exhaustive over the union with LITERAL catalog keys, so the typed-message-key
|
|
16
|
+
* check sees them and a new axis fails the typecheck rather than rendering a raw key.
|
|
17
|
+
*/
|
|
18
|
+
export const ESTIMATE_AXIS_LABEL_KEYS: Record<EstimateAxis, string> = {
|
|
19
|
+
complexity: 'pipeline.builder.complexityThreshold',
|
|
20
|
+
risk: 'pipeline.builder.riskThreshold',
|
|
21
|
+
impact: 'pipeline.builder.impactThreshold',
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Axis → the `StepGating`/`ConsensusGating` field carrying its floor. Both schemas spell the
|
|
26
|
+
* three the same way, which is what lets one editor serve every gate in the builder.
|
|
27
|
+
*/
|
|
28
|
+
export const ESTIMATE_AXIS_FIELD: Record<EstimateAxis, 'minComplexity' | 'minRisk' | 'minImpact'> =
|
|
29
|
+
{
|
|
30
|
+
complexity: 'minComplexity',
|
|
31
|
+
risk: 'minRisk',
|
|
32
|
+
impact: 'minImpact',
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Axis → the tooltip explaining what the axis measures and on what scale. Same discipline. */
|
|
36
|
+
export const ESTIMATE_AXIS_HINT_KEYS: Record<EstimateAxis, string> = {
|
|
37
|
+
complexity: 'pipeline.builder.complexityThresholdHint',
|
|
38
|
+
risk: 'pipeline.builder.riskThresholdHint',
|
|
39
|
+
impact: 'pipeline.builder.impactThresholdHint',
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Read one axis threshold field back into a stored floor.
|
|
44
|
+
*
|
|
45
|
+
* An emptied or unparseable field CLEARS the axis rather than storing `0`, which is the whole
|
|
46
|
+
* reason this is a function: the two are opposites. An unset axis is not considered at all,
|
|
47
|
+
* where a floor of `0` is cleared by every estimate there is — so a user who deletes the number
|
|
48
|
+
* to stop gating on risk would, under a `?? 0`, have gated on it permanently instead.
|
|
49
|
+
*
|
|
50
|
+
* The scale is the estimator's 0..1, and a value outside it is CLAMPED rather than rejected, so
|
|
51
|
+
* a fat-fingered `10` lands on the ceiling instead of silently failing the pipeline save with a
|
|
52
|
+
* 422 from the contract's score bounds.
|
|
53
|
+
*/
|
|
54
|
+
export function parseAxisThreshold(raw: string): number | undefined {
|
|
55
|
+
const trimmed = raw.trim()
|
|
56
|
+
if (trimmed === '') return undefined
|
|
57
|
+
const parsed = Number.parseFloat(trimmed)
|
|
58
|
+
if (!Number.isFinite(parsed)) return undefined
|
|
59
|
+
return Math.min(1, Math.max(0, parsed))
|
|
60
|
+
}
|
package/i18n/locales/de.json
CHANGED
|
@@ -1629,6 +1629,7 @@
|
|
|
1629
1629
|
},
|
|
1630
1630
|
"subtasks": "Teilaufgaben · {completed}/{total}",
|
|
1631
1631
|
"standardsApplied": "Angewendete Standards",
|
|
1632
|
+
"standardsAppliedHint": "Die Best-Practice-Standards, die in den System-Prompt dieses Schritts eingefügt wurden. Ein umsetzender Agent erhält von jedem eine gekürzte Fassung; Reviewer und Planer bekommen den vollen Text.",
|
|
1632
1633
|
"decision": "Entscheidung",
|
|
1633
1634
|
"awaitingChoice": "Wartet auf eine menschliche Wahl",
|
|
1634
1635
|
"approvalGate": "Freigabe-Gate",
|
|
@@ -1646,7 +1647,11 @@
|
|
|
1646
1647
|
"approved": "Freigegeben",
|
|
1647
1648
|
"changes_requested": "Änderungen angefordert",
|
|
1648
1649
|
"rejected": "Abgelehnt"
|
|
1649
|
-
}
|
|
1650
|
+
},
|
|
1651
|
+
"promptVariant": "Prompt-Variante",
|
|
1652
|
+
"promptVariantAdditionOnly": "Nur die Ergänzung dieser Variante wurde angewendet. Der Workspace-Prompt für diesen Agenten hat ihren Basistext ersetzt.",
|
|
1653
|
+
"promptVariantSuperseded": "Diese Variante wurde nicht angewendet. Der Workspace-Prompt für diesen Agenten hatte Vorrang.",
|
|
1654
|
+
"promptVariantWithdrawn": "Diese Variante ist nicht mehr registriert, daher lief der Schritt mit dem ausgelieferten Prompt."
|
|
1650
1655
|
},
|
|
1651
1656
|
"stepDetail": {
|
|
1652
1657
|
"contents": "Inhalte",
|
|
@@ -1696,13 +1701,16 @@
|
|
|
1696
1701
|
"effort": {
|
|
1697
1702
|
"heading": "Agenten-Aufwand",
|
|
1698
1703
|
"difficulty": "Schwierigkeit",
|
|
1704
|
+
"difficultyHint": "Die eigene Einschätzung des Agenten, wie schwer dieser Schritt war, von zehn. Selbst angegeben, nicht gemessen.",
|
|
1699
1705
|
"outOfTen": "{value}/10",
|
|
1700
1706
|
"reduced": "Was die Effektivität verringert hat",
|
|
1701
1707
|
"obstacles": "Wichtigste Hindernisse"
|
|
1702
1708
|
},
|
|
1703
1709
|
"adherence": {
|
|
1704
1710
|
"heading": "Einhaltung der Best Practices",
|
|
1711
|
+
"headingHint": "Die Best-Practice-Standards, die in den Prompt dieses Reviewers eingefügt wurden, und wie genau die Änderung ihnen nach seinem Urteil folgt.",
|
|
1705
1712
|
"outOfTen": "{value}/10",
|
|
1713
|
+
"ratingHint": "Die eigene Bewertung des Reviewers, wie genau die Änderung diesem Standard folgt, von zehn. Selbst angegeben, nicht gemessen.",
|
|
1706
1714
|
"relatedFindings": "Zugehörige Befunde",
|
|
1707
1715
|
"unnamed": "Standard"
|
|
1708
1716
|
},
|
|
@@ -2558,6 +2566,14 @@
|
|
|
2558
2566
|
"pr_ready": "Aktiv",
|
|
2559
2567
|
"done": "Live"
|
|
2560
2568
|
},
|
|
2569
|
+
"statusHint": {
|
|
2570
|
+
"planned": "Für diesen Service gibt es noch keine Aufgaben. Ein Service wird nie fertig, das hier ist also der Anfang und kein Stillstand.",
|
|
2571
|
+
"ready": "Alle Aufgaben unter diesem Service ruhen oder sind gemergt. Es läuft nichts und nichts wartet auf Sie.",
|
|
2572
|
+
"in_progress": "Mindestens eine Aufgabe unter diesem Service läuft oder hat einen offenen Pull Request.",
|
|
2573
|
+
"blocked": "Mindestens eine Aufgabe oder Initiative unter diesem Service wartet auf eine Entscheidung von Ihnen.",
|
|
2574
|
+
"pr_ready": "Mindestens eine Aufgabe unter diesem Service läuft oder hat einen offenen Pull Request.",
|
|
2575
|
+
"done": "Alle Aufgaben unter diesem Service ruhen oder sind gemergt. Es läuft nichts und nichts wartet auf Sie."
|
|
2576
|
+
},
|
|
2561
2577
|
"shared": "Geteilt",
|
|
2562
2578
|
"sharedTitle": "Über Workspaces in dieser Organisation hinweg geteilt",
|
|
2563
2579
|
"bootstrapping": "Wird gebootstrappt…",
|
|
@@ -3241,7 +3257,9 @@
|
|
|
3241
3257
|
},
|
|
3242
3258
|
"legend": {
|
|
3243
3259
|
"metered": "Abgerechnet",
|
|
3244
|
-
"
|
|
3260
|
+
"meteredHint": "Vom Anbieter pro Token abgerechnet. Das ist echtes Geld.",
|
|
3261
|
+
"subscription": "Abo",
|
|
3262
|
+
"subscriptionHint": "Nur zur Veranschaulichung. Diese Aufrufe liefen über einen Pauschaltarif; der Betrag zeigt, was dieselben Token über eine abgerechnete API gekostet hätten. Er wurde nie in Rechnung gestellt und zählt nie als Ausgabe."
|
|
3245
3263
|
},
|
|
3246
3264
|
"spend": {
|
|
3247
3265
|
"byModel": "Kosten nach Modell",
|
|
@@ -3598,9 +3616,14 @@
|
|
|
3598
3616
|
"companionGateTooltip": "Diesen Companion nur ausführen, wenn die Aufgabenschätzung einen Schwellenwert überschreitet (benötigt vorher einen Task Estimator)",
|
|
3599
3617
|
"consensusGateTooltip": "Konsens nur ausführen, wenn die Aufgabenschätzung einen Schwellenwert überschreitet (sonst läuft der Standard-Agent)",
|
|
3600
3618
|
"runWhenAny": "ausführen wenn (beliebig):",
|
|
3619
|
+
"gatingRunWhenAnyHint": "Der Schritt läuft, sobald eine dieser Achsen erreicht oder überschritten wird, und wird sonst übersprungen. Liegt keine Schätzung vor, läuft er trotzdem.",
|
|
3620
|
+
"gatingRunWhenAnyConsensusHint": "Das Panel tagt, sobald eine dieser Achsen erreicht oder überschritten wird; darunter läuft stattdessen der einzelne Agent. Liegt keine Schätzung vor, tagt das Panel trotzdem.",
|
|
3601
3621
|
"complexityThreshold": "Komplexität ≥",
|
|
3622
|
+
"complexityThresholdHint": "Wie aufwendig die Umsetzung ist, bewertet vom Task Estimator weiter oben in der Pipeline. Die Skala reicht von 0 bis 1, nicht von 1 bis 10. Leer lassen, um diese Achse zu ignorieren.",
|
|
3602
3623
|
"riskThreshold": "Risiko ≥",
|
|
3624
|
+
"riskThresholdHint": "Wie viel die Änderung kaputt machen könnte, bewertet vom Task Estimator weiter oben in der Pipeline. Die Skala reicht von 0 bis 1, nicht von 1 bis 10. Leer lassen, um diese Achse zu ignorieren.",
|
|
3603
3625
|
"impactThreshold": "Auswirkung ≥",
|
|
3626
|
+
"impactThresholdHint": "Wie weit die Änderung ins System hineinreicht, bewertet vom Task Estimator weiter oben in der Pipeline. Die Skala reicht von 0 bis 1, nicht von 1 bis 10. Leer lassen, um diese Achse zu ignorieren.",
|
|
3604
3627
|
"strategy": "Strategie",
|
|
3605
3628
|
"rounds": "Runden",
|
|
3606
3629
|
"purposeLabel": "Zweck",
|
|
@@ -3672,7 +3695,9 @@
|
|
|
3672
3695
|
"consensusGroups": "Konsensgruppen",
|
|
3673
3696
|
"consensusGroupsHint": "Wähle die wiederverwendbaren Panels, auf die dieser Schritt hochstufen darf. Jedes hat seine eigene Schätzungsschwelle; es läuft das anspruchsvollste, das die Aufgabe erreicht.",
|
|
3674
3697
|
"consensusGroupsActive": "Dieser Schritt führt die ausgewählte Gruppe aus. Hebe die Auswahl aller Gruppen auf, um die Teilnehmer hier zu konfigurieren.",
|
|
3675
|
-
"consensusGroupAlways": "immer"
|
|
3698
|
+
"consensusGroupAlways": "immer",
|
|
3699
|
+
"variantLabel": "Prompt-Variante",
|
|
3700
|
+
"variantShipped": "Ausgelieferter Prompt"
|
|
3676
3701
|
},
|
|
3677
3702
|
"progress": {
|
|
3678
3703
|
"status": {
|
|
@@ -3755,6 +3780,7 @@
|
|
|
3755
3780
|
"stepLabel": "Ausgabebudget",
|
|
3756
3781
|
"kindLabel": "Ausgabebudget",
|
|
3757
3782
|
"kindHint": "Gilt für jeden Lauf dieses Agenten. Ein Pipeline-Schritt kann es überschreiben.",
|
|
3783
|
+
"hint": "Der Höchstumfang einer einzelnen Antwort dieses Agenten. Leer lassen heißt vom nächsthöheren Level erben, nicht das Limit aufheben. Der Wert eines Pipeline-Schritts sticht die Vorgabe des Workspace.",
|
|
3758
3784
|
"inherits": "Übernommen",
|
|
3759
3785
|
"inheritsValue": "Übernommen ({tokens})"
|
|
3760
3786
|
}
|
|
@@ -4614,6 +4640,22 @@
|
|
|
4614
4640
|
"reports": "Berichte"
|
|
4615
4641
|
},
|
|
4616
4642
|
"errors": {
|
|
4643
|
+
"generic": {
|
|
4644
|
+
"showDetail": "Details anzeigen",
|
|
4645
|
+
"requestId": "Anfrage-ID {id}",
|
|
4646
|
+
"description": {
|
|
4647
|
+
"not_found": "Das Objekt dieser Aktion existiert nicht mehr. Lade die Seite neu, um den aktuellen Stand zu sehen.",
|
|
4648
|
+
"validation": "Der Server hat diese Anfrage als ungültig abgelehnt. Prüfe die eingegebenen Werte und versuche es erneut.",
|
|
4649
|
+
"credential_required": "Diese Aktion benötigt einen persönlichen Zugang, der nicht entsperrt ist. Entsperre dein Abonnement oder verbinde es neu und versuche es dann erneut.",
|
|
4650
|
+
"forbidden": "Deine Rolle in diesem Workspace erlaubt diese Aktion nicht. Bitte einen Workspace-Admin, sie auszuführen oder deine Rolle zu erweitern.",
|
|
4651
|
+
"unavailable": "In diesem Deployment ist die für diese Aktion benötigte Funktion nicht konfiguriert. Bitte den Betreiber des Deployments, sie einzurichten.",
|
|
4652
|
+
"unauthorized": "Deine Sitzung ist nicht mehr gültig. Melde dich erneut an und versuche es dann noch einmal.",
|
|
4653
|
+
"rate_limited": "Zu viele Anfragen in kurzer Zeit. Warte einen Moment und versuche es erneut.",
|
|
4654
|
+
"internal": "Auf dem Server ist ein Fehler aufgetreten. Versuche es erneut und gib die Details an den Betreiber des Deployments weiter, wenn es weiterhin auftritt.",
|
|
4655
|
+
"network": "Der Server war nicht erreichbar. Prüfe deine Verbindung und versuche es erneut.",
|
|
4656
|
+
"unexpected": "Der Server hat eine unerwartete Antwort zurückgegeben. Versuche es erneut und gib die Details an den Betreiber des Deployments weiter, wenn es weiterhin auftritt."
|
|
4657
|
+
}
|
|
4658
|
+
},
|
|
4617
4659
|
"action": {
|
|
4618
4660
|
"retryFailed": "Wiederholung fehlgeschlagen",
|
|
4619
4661
|
"startFailed": "Start fehlgeschlagen",
|
|
@@ -4895,6 +4937,7 @@
|
|
|
4895
4937
|
"empty": "Dieser Schritt hat noch kein Urteil erzeugt.",
|
|
4896
4938
|
"notScored": "Nicht bewertet",
|
|
4897
4939
|
"threshold": "Schwellenwert {threshold}",
|
|
4940
|
+
"thresholdHint": "Der Wert, den dieser Schritt erreichen musste, aus der Merge-Policy der Aufgabe. Darunter schickt der Judge die Arbeit mit seinen Befunden als Nacharbeit an den erzeugenden Schritt zurück oder parkt den Lauf für Sie, wenn kein Versuchsbudget mehr übrig ist.",
|
|
4898
4941
|
"rubricOverridden": "Raster des Arbeitsbereichs",
|
|
4899
4942
|
"reworkRounds": "Überarbeitung {spent}/{budget}",
|
|
4900
4943
|
"findingsHeading": "Was das Bewertungsraster beanstandet hat",
|
|
@@ -5816,10 +5859,12 @@
|
|
|
5816
5859
|
"config": "Konfiguration & CI",
|
|
5817
5860
|
"source": "Quellcode",
|
|
5818
5861
|
"schema": "Schema & Migrationen",
|
|
5819
|
-
"unknown": "Nicht klassifiziert"
|
|
5862
|
+
"unknown": "Nicht klassifiziert",
|
|
5863
|
+
"hint": "Was der Diff berührt hat, ermittelt aus den geänderten Dateien. Die Merge-Policy kann pro Klasse eine eigene Regel setzen; ein Diff über mehrere Klassen zählt als die schwerste davon."
|
|
5820
5864
|
},
|
|
5821
5865
|
"effort": {
|
|
5822
5866
|
"prompt": "Review-Aufwand",
|
|
5867
|
+
"promptHint": "Hält fest, wie viel Review dieser Pull Request wirklich gebraucht hat. Ihre Antwort ist die Referenz, an der die Auto-Merge-Schwellen kalibriert werden. Das Taggen ist freiwillig, Sie können auch ohne mergen.",
|
|
5823
5868
|
"none": "Keine Anmerkungen",
|
|
5824
5869
|
"minor": "Kleine Anmerkungen",
|
|
5825
5870
|
"major": "Echte Nacharbeit",
|
package/i18n/locales/en.json
CHANGED
|
@@ -409,6 +409,14 @@
|
|
|
409
409
|
"pr_ready": "Active",
|
|
410
410
|
"done": "Live"
|
|
411
411
|
},
|
|
412
|
+
"statusHint": {
|
|
413
|
+
"planned": "No tasks on this service yet. A service is never finished, so this is where one starts rather than a stalled state.",
|
|
414
|
+
"ready": "Every task under this service is idle or merged. Nothing is running and nothing is waiting on you.",
|
|
415
|
+
"in_progress": "At least one task under this service is running or has an open pull request.",
|
|
416
|
+
"blocked": "At least one task or initiative under this service is waiting on a decision from you.",
|
|
417
|
+
"pr_ready": "At least one task under this service is running or has an open pull request.",
|
|
418
|
+
"done": "Every task under this service is idle or merged. Nothing is running and nothing is waiting on you."
|
|
419
|
+
},
|
|
412
420
|
"shared": "Shared",
|
|
413
421
|
"sharedTitle": "Shared across workspaces in this org",
|
|
414
422
|
"bootstrapping": "Bootstrapping…",
|
|
@@ -507,6 +515,31 @@
|
|
|
507
515
|
"importsOnAdd": "imports on add"
|
|
508
516
|
},
|
|
509
517
|
"errors": {
|
|
518
|
+
"generic": {
|
|
519
|
+
"showDetail": "Show details",
|
|
520
|
+
"@showDetail": {
|
|
521
|
+
"description": "Button label on an error toast that swaps the generic explanation for the raw technical detail (the server message, validation issues, request id). An imperative verb phrase, not a heading."
|
|
522
|
+
},
|
|
523
|
+
"requestId": "Request ID {id}",
|
|
524
|
+
"@requestId": {
|
|
525
|
+
"description": "Keep the {id} placeholder. \"Request ID\" is the correlation id an operator greps for in the server logs, so keep it recognizable as a technical identifier rather than translating it as prose."
|
|
526
|
+
},
|
|
527
|
+
"description": {
|
|
528
|
+
"not_found": "What this action refers to no longer exists. Reload the page to see the current state.",
|
|
529
|
+
"validation": "The server rejected this request as invalid. Check the values you entered, then try again.",
|
|
530
|
+
"credential_required": "This action needs a personal credential that is not unlocked. Unlock or reconnect your subscription, then try again.",
|
|
531
|
+
"forbidden": "Your role in this workspace does not allow this action. Ask a workspace admin to do it, or to raise your role.",
|
|
532
|
+
"unavailable": "This deployment has not configured the capability this action needs. Ask your deployment operator to set it up.",
|
|
533
|
+
"unauthorized": "Your session is no longer valid. Sign in again, then retry.",
|
|
534
|
+
"rate_limited": "Too many requests in a short time. Wait a moment, then try again.",
|
|
535
|
+
"internal": "Something went wrong on the server. Try again, and share the details with your deployment operator if it keeps happening.",
|
|
536
|
+
"network": "The server could not be reached. Check your connection, then try again.",
|
|
537
|
+
"unexpected": "The server returned an unexpected response. Try again, and share the details with your deployment operator if it keeps happening.",
|
|
538
|
+
"@unexpected": {
|
|
539
|
+
"description": "Shown when the response was NOT one of our own error shapes at all (a gateway or proxy page, an unrecognised status code). Deliberately distinct from \"internal\", which is our own server reporting its own fault: word this one as an unexpected or unrecognised RESPONSE, not as a server error."
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
},
|
|
510
543
|
"action": {
|
|
511
544
|
"retryFailed": "Retry failed",
|
|
512
545
|
"startFailed": "Failed to start",
|
|
@@ -1318,6 +1351,7 @@
|
|
|
1318
1351
|
},
|
|
1319
1352
|
"subtasks": "Subtasks · {completed}/{total}",
|
|
1320
1353
|
"standardsApplied": "Standards applied",
|
|
1354
|
+
"standardsAppliedHint": "The best-practice standards folded into this step's system prompt. An implementing agent receives a condensed version of each; reviewers and planners get the full text.",
|
|
1321
1355
|
"decision": "Decision",
|
|
1322
1356
|
"awaitingChoice": "Awaiting a human choice",
|
|
1323
1357
|
"approvalGate": "Approval gate",
|
|
@@ -1335,7 +1369,11 @@
|
|
|
1335
1369
|
"approved": "Approved",
|
|
1336
1370
|
"changes_requested": "Changes requested",
|
|
1337
1371
|
"rejected": "Rejected"
|
|
1338
|
-
}
|
|
1372
|
+
},
|
|
1373
|
+
"promptVariant": "Prompt variant",
|
|
1374
|
+
"promptVariantAdditionOnly": "Only this variant's addition applied. The workspace prompt for this agent replaced its base text.",
|
|
1375
|
+
"promptVariantSuperseded": "This variant did not apply. The workspace prompt for this agent took precedence.",
|
|
1376
|
+
"promptVariantWithdrawn": "This variant is no longer registered, so the step ran the shipped prompt."
|
|
1339
1377
|
},
|
|
1340
1378
|
"stepDetail": {
|
|
1341
1379
|
"contents": "Contents",
|
|
@@ -1385,13 +1423,16 @@
|
|
|
1385
1423
|
"effort": {
|
|
1386
1424
|
"heading": "Agent effort",
|
|
1387
1425
|
"difficulty": "Difficulty",
|
|
1426
|
+
"difficultyHint": "The agent's own assessment of how hard this step was, out of ten. Self-reported, not measured.",
|
|
1388
1427
|
"outOfTen": "{value}/10",
|
|
1389
1428
|
"reduced": "What reduced effectiveness",
|
|
1390
1429
|
"obstacles": "Key obstacles"
|
|
1391
1430
|
},
|
|
1392
1431
|
"adherence": {
|
|
1393
1432
|
"heading": "Best-practice adherence",
|
|
1433
|
+
"headingHint": "The best-practice standards folded into this reviewer's prompt, and how closely it judged the change to follow each one.",
|
|
1394
1434
|
"outOfTen": "{value}/10",
|
|
1435
|
+
"ratingHint": "The reviewer's own rating of how closely the change follows this standard, out of ten. Self-reported, not measured.",
|
|
1395
1436
|
"relatedFindings": "Related findings",
|
|
1396
1437
|
"unnamed": "Standard"
|
|
1397
1438
|
},
|
|
@@ -1666,7 +1707,9 @@
|
|
|
1666
1707
|
},
|
|
1667
1708
|
"legend": {
|
|
1668
1709
|
"metered": "Metered",
|
|
1669
|
-
"
|
|
1710
|
+
"meteredHint": "Billed per token by the provider. This is real money.",
|
|
1711
|
+
"subscription": "Subscription",
|
|
1712
|
+
"subscriptionHint": "Illustrative only. These calls ran on a flat-rate plan, so this is what the same tokens would have cost through a metered API. It was never billed and never counts as spend."
|
|
1670
1713
|
},
|
|
1671
1714
|
"spend": {
|
|
1672
1715
|
"byModel": "Spend by model",
|
|
@@ -4036,9 +4079,14 @@
|
|
|
4036
4079
|
"companionGateTooltip": "Only run this companion when the task estimate clears a threshold (needs a Task Estimator earlier)",
|
|
4037
4080
|
"consensusGateTooltip": "Only run consensus when the task estimate clears a threshold (else the standard agent runs)",
|
|
4038
4081
|
"runWhenAny": "run when (any):",
|
|
4082
|
+
"gatingRunWhenAnyHint": "The step runs when any one of these axes is met or exceeded, and is skipped otherwise. If no estimate is available it runs anyway.",
|
|
4083
|
+
"gatingRunWhenAnyConsensusHint": "The panel convenes when any one of these axes is met or exceeded; below that the single agent runs instead. If no estimate is available the panel convenes anyway.",
|
|
4039
4084
|
"complexityThreshold": "complexity ≥",
|
|
4085
|
+
"complexityThresholdHint": "How hard the work is to carry out, scored by the Task Estimator step earlier in the pipeline. The scale is 0 to 1, not 1 to 10. Leave it empty to ignore this axis.",
|
|
4040
4086
|
"riskThreshold": "risk ≥",
|
|
4087
|
+
"riskThresholdHint": "How much the change could break, scored by the Task Estimator step earlier in the pipeline. The scale is 0 to 1, not 1 to 10. Leave it empty to ignore this axis.",
|
|
4041
4088
|
"impactThreshold": "impact ≥",
|
|
4089
|
+
"impactThresholdHint": "How far the change reaches across the system, scored by the Task Estimator step earlier in the pipeline. The scale is 0 to 1, not 1 to 10. Leave it empty to ignore this axis.",
|
|
4042
4090
|
"strategy": "Strategy",
|
|
4043
4091
|
"rounds": "Rounds",
|
|
4044
4092
|
"purposeLabel": "Purpose",
|
|
@@ -4110,7 +4158,9 @@
|
|
|
4110
4158
|
"consensusGroups": "Consensus groups",
|
|
4111
4159
|
"consensusGroupsHint": "Pick the reusable panels this step may escalate to. Each carries its own estimate bar; the most demanding one the task clears is the one that runs.",
|
|
4112
4160
|
"consensusGroupsActive": "This step runs the selected group. Deselect every group to configure participants here instead.",
|
|
4113
|
-
"consensusGroupAlways": "always"
|
|
4161
|
+
"consensusGroupAlways": "always",
|
|
4162
|
+
"variantLabel": "Prompt variant",
|
|
4163
|
+
"variantShipped": "Shipped prompt"
|
|
4114
4164
|
},
|
|
4115
4165
|
"progress": {
|
|
4116
4166
|
"status": {
|
|
@@ -4193,6 +4243,7 @@
|
|
|
4193
4243
|
"stepLabel": "Output budget",
|
|
4194
4244
|
"kindLabel": "Output budget",
|
|
4195
4245
|
"kindHint": "Applies to every run of this agent. A pipeline step can override it.",
|
|
4246
|
+
"hint": "The most a single reply from this agent may run to. Leave it empty to inherit the next level up rather than to lift the limit. A pipeline step's own value wins over the workspace default.",
|
|
4196
4247
|
"inherits": "Inherited",
|
|
4197
4248
|
"inheritsValue": "Inherited ({tokens})"
|
|
4198
4249
|
}
|
|
@@ -4394,6 +4445,7 @@
|
|
|
4394
4445
|
"empty": "This step has not produced a verdict yet.",
|
|
4395
4446
|
"notScored": "Not scored",
|
|
4396
4447
|
"threshold": "threshold {threshold}",
|
|
4448
|
+
"thresholdHint": "The score this step had to reach, taken from the task's merge policy. Below it the judge sends the work back to the step that produced it, with its findings as rework, or parks the run for you when no attempt budget is left.",
|
|
4397
4449
|
"rubricOverridden": "workspace rubric",
|
|
4398
4450
|
"reworkRounds": "rework {spent}/{budget}",
|
|
4399
4451
|
"findingsHeading": "What the rubric flagged",
|
|
@@ -6002,10 +6054,12 @@
|
|
|
6002
6054
|
"description": "'Source' here means program source code (as opposed to docs/config/tests), NOT the origin of something."
|
|
6003
6055
|
},
|
|
6004
6056
|
"schema": "Schema & migrations",
|
|
6005
|
-
"unknown": "Unclassified"
|
|
6057
|
+
"unknown": "Unclassified",
|
|
6058
|
+
"hint": "What the diff touched, worked out from the changed files. Merge policy can set its own rule per class, and a diff spanning several classes takes the heaviest one."
|
|
6006
6059
|
},
|
|
6007
6060
|
"effort": {
|
|
6008
6061
|
"prompt": "Review effort",
|
|
6062
|
+
"promptHint": "Records how much review this pull request really needed. Your answer is the ground truth the auto-merge thresholds are calibrated against. Tagging is optional and you can merge without it.",
|
|
6009
6063
|
"none": "No comments",
|
|
6010
6064
|
"@none": {
|
|
6011
6065
|
"description": "Answer to 'how much review effort did this PR need?': means the reviewer had NOTHING to say, not that no review happened."
|
package/i18n/locales/es.json
CHANGED
|
@@ -376,6 +376,14 @@
|
|
|
376
376
|
"pr_ready": "Activo",
|
|
377
377
|
"done": "Activo"
|
|
378
378
|
},
|
|
379
|
+
"statusHint": {
|
|
380
|
+
"planned": "Aun no hay tareas en este servicio. Un servicio nunca se termina, asi que este es su punto de partida y no un estado atascado.",
|
|
381
|
+
"ready": "Todas las tareas de este servicio estan inactivas o fusionadas. No hay nada en ejecucion ni nada esperandote.",
|
|
382
|
+
"in_progress": "Al menos una tarea de este servicio esta en ejecucion o tiene un pull request abierto.",
|
|
383
|
+
"blocked": "Al menos una tarea o iniciativa de este servicio esta esperando una decision tuya.",
|
|
384
|
+
"pr_ready": "Al menos una tarea de este servicio esta en ejecucion o tiene un pull request abierto.",
|
|
385
|
+
"done": "Todas las tareas de este servicio estan inactivas o fusionadas. No hay nada en ejecucion ni nada esperandote."
|
|
386
|
+
},
|
|
379
387
|
"shared": "Compartido",
|
|
380
388
|
"sharedTitle": "Compartido entre espacios de trabajo de esta organización",
|
|
381
389
|
"bootstrapping": "Arrancando…",
|
|
@@ -468,6 +476,22 @@
|
|
|
468
476
|
"importsOnAdd": "se importa al añadir"
|
|
469
477
|
},
|
|
470
478
|
"errors": {
|
|
479
|
+
"generic": {
|
|
480
|
+
"showDetail": "Ver detalles",
|
|
481
|
+
"requestId": "ID de solicitud {id}",
|
|
482
|
+
"description": {
|
|
483
|
+
"not_found": "Lo que esta acción referencia ya no existe. Recarga la página para ver el estado actual.",
|
|
484
|
+
"validation": "El servidor rechazó esta solicitud por no ser válida. Revisa los valores que introdujiste y vuelve a intentarlo.",
|
|
485
|
+
"credential_required": "Esta acción necesita una credencial personal que no está desbloqueada. Desbloquea o vuelve a conectar tu suscripción y reinténtalo.",
|
|
486
|
+
"forbidden": "Tu rol en este espacio de trabajo no permite esta acción. Pide a un administrador del espacio de trabajo que la realice o que amplíe tu rol.",
|
|
487
|
+
"unavailable": "Este despliegue no tiene configurada la capacidad que necesita esta acción. Pide al operador del despliegue que la configure.",
|
|
488
|
+
"unauthorized": "Tu sesión ya no es válida. Inicia sesión de nuevo y vuelve a intentarlo.",
|
|
489
|
+
"rate_limited": "Demasiadas solicitudes en poco tiempo. Espera un momento y vuelve a intentarlo.",
|
|
490
|
+
"internal": "Algo falló en el servidor. Vuelve a intentarlo y comparte los detalles con el operador del despliegue si sigue ocurriendo.",
|
|
491
|
+
"network": "No se pudo contactar con el servidor. Comprueba tu conexión y vuelve a intentarlo.",
|
|
492
|
+
"unexpected": "El servidor devolvió una respuesta inesperada. Vuelve a intentarlo y comparte los detalles con el operador del despliegue si sigue ocurriendo."
|
|
493
|
+
}
|
|
494
|
+
},
|
|
471
495
|
"action": {
|
|
472
496
|
"retryFailed": "El reintento falló",
|
|
473
497
|
"startFailed": "No se pudo iniciar",
|
|
@@ -1235,6 +1259,7 @@
|
|
|
1235
1259
|
"spinningUpContainer": "Iniciando contenedor…",
|
|
1236
1260
|
"subtasks": "Subtareas · {completed}/{total}",
|
|
1237
1261
|
"standardsApplied": "Estándares aplicados",
|
|
1262
|
+
"standardsAppliedHint": "Los estandares de buenas practicas incorporados al prompt de sistema de este paso. Un agente que implementa recibe una version condensada de cada uno; los revisores y planificadores reciben el texto completo.",
|
|
1238
1263
|
"decision": "Decisión",
|
|
1239
1264
|
"awaitingChoice": "Esperando una elección humana",
|
|
1240
1265
|
"approvalGate": "Verificación de aprobación",
|
|
@@ -1271,7 +1296,11 @@
|
|
|
1271
1296
|
"url": "Dirección",
|
|
1272
1297
|
"copyId": "Copiar id del contenedor",
|
|
1273
1298
|
"copyUrl": "Copiar dirección"
|
|
1274
|
-
}
|
|
1299
|
+
},
|
|
1300
|
+
"promptVariant": "Variante del prompt",
|
|
1301
|
+
"promptVariantAdditionOnly": "Solo se aplicó el añadido de esta variante. El prompt del espacio de trabajo para este agente reemplazó su texto base.",
|
|
1302
|
+
"promptVariantSuperseded": "Esta variante no se aplicó. El prompt del espacio de trabajo para este agente tuvo prioridad.",
|
|
1303
|
+
"promptVariantWithdrawn": "Esta variante ya no está registrada, por lo que el paso se ejecutó con el prompt original."
|
|
1275
1304
|
},
|
|
1276
1305
|
"stepDetail": {
|
|
1277
1306
|
"contents": "Contenidos",
|
|
@@ -1321,13 +1350,16 @@
|
|
|
1321
1350
|
"effort": {
|
|
1322
1351
|
"heading": "Esfuerzo del agente",
|
|
1323
1352
|
"difficulty": "Dificultad",
|
|
1353
|
+
"difficultyHint": "La valoracion del propio agente sobre lo dificil que fue este paso, sobre diez. Autodeclarada, no medida.",
|
|
1324
1354
|
"outOfTen": "{value}/10",
|
|
1325
1355
|
"reduced": "Qué redujo la efectividad",
|
|
1326
1356
|
"obstacles": "Obstáculos clave"
|
|
1327
1357
|
},
|
|
1328
1358
|
"adherence": {
|
|
1329
1359
|
"heading": "Cumplimiento de buenas prácticas",
|
|
1360
|
+
"headingHint": "Los estandares de buenas practicas incorporados al prompt de este revisor, y con cuanta fidelidad juzgo que el cambio sigue cada uno.",
|
|
1330
1361
|
"outOfTen": "{value}/10",
|
|
1362
|
+
"ratingHint": "La valoracion del propio revisor sobre con cuanta fidelidad el cambio sigue este estandar, sobre diez. Autodeclarada, no medida.",
|
|
1331
1363
|
"relatedFindings": "Hallazgos relacionados",
|
|
1332
1364
|
"unnamed": "Estándar"
|
|
1333
1365
|
},
|
|
@@ -1599,7 +1631,9 @@
|
|
|
1599
1631
|
},
|
|
1600
1632
|
"legend": {
|
|
1601
1633
|
"metered": "Medido",
|
|
1602
|
-
"
|
|
1634
|
+
"meteredHint": "Facturado por token por el proveedor. Esto es dinero real.",
|
|
1635
|
+
"subscription": "Suscripción",
|
|
1636
|
+
"subscriptionHint": "Solo ilustrativo. Estas llamadas se ejecutaron con un plan de tarifa plana, asi que esta cifra es lo que habrian costado los mismos tokens a traves de una API con medicion. Nunca se facturo ni cuenta como gasto."
|
|
1603
1637
|
},
|
|
1604
1638
|
"spend": {
|
|
1605
1639
|
"byModel": "Gasto por modelo",
|
|
@@ -3921,9 +3955,14 @@
|
|
|
3921
3955
|
"companionGateTooltip": "Ejecutar este compañero solo cuando la estimación de la tarea supere un umbral (requiere un Task Estimator antes)",
|
|
3922
3956
|
"consensusGateTooltip": "Ejecutar el consenso solo cuando la estimación de la tarea supere un umbral (de lo contrario se ejecuta el agente estándar)",
|
|
3923
3957
|
"runWhenAny": "ejecutar cuando (cualquiera):",
|
|
3958
|
+
"gatingRunWhenAnyHint": "El paso se ejecuta cuando se alcanza o supera cualquiera de estos ejes, y se omite en caso contrario. Si no hay estimacion, se ejecuta igualmente.",
|
|
3959
|
+
"gatingRunWhenAnyConsensusHint": "El panel se reune cuando se alcanza o supera cualquiera de estos ejes; por debajo se ejecuta el agente unico. Si no hay estimacion, el panel se reune igualmente.",
|
|
3924
3960
|
"complexityThreshold": "complejidad ≥",
|
|
3961
|
+
"complexityThresholdHint": "Lo dificil que es llevar a cabo el trabajo, puntuado por el Task Estimator anterior en el pipeline. La escala va de 0 a 1, no de 1 a 10. Dejalo vacio para ignorar este eje.",
|
|
3925
3962
|
"riskThreshold": "riesgo ≥",
|
|
3963
|
+
"riskThresholdHint": "Cuanto podria romper el cambio, puntuado por el Task Estimator anterior en el pipeline. La escala va de 0 a 1, no de 1 a 10. Dejalo vacio para ignorar este eje.",
|
|
3926
3964
|
"impactThreshold": "impacto ≥",
|
|
3965
|
+
"impactThresholdHint": "Hasta donde llega el cambio en el sistema, puntuado por el Task Estimator anterior en el pipeline. La escala va de 0 a 1, no de 1 a 10. Dejalo vacio para ignorar este eje.",
|
|
3927
3966
|
"strategy": "Estrategia",
|
|
3928
3967
|
"rounds": "Rondas",
|
|
3929
3968
|
"purposeLabel": "Propósito",
|
|
@@ -3995,7 +4034,9 @@
|
|
|
3995
4034
|
"consensusGroups": "Grupos de consenso",
|
|
3996
4035
|
"consensusGroupsHint": "Elige los paneles reutilizables a los que este paso puede escalar. Cada uno lleva su propio umbral de estimación; se ejecuta el más exigente que la tarea supere.",
|
|
3997
4036
|
"consensusGroupsActive": "Este paso ejecuta el grupo seleccionado. Deselecciona todos los grupos para configurar aquí los participantes.",
|
|
3998
|
-
"consensusGroupAlways": "siempre"
|
|
4037
|
+
"consensusGroupAlways": "siempre",
|
|
4038
|
+
"variantLabel": "Variante del prompt",
|
|
4039
|
+
"variantShipped": "Prompt original"
|
|
3999
4040
|
},
|
|
4000
4041
|
"progress": {
|
|
4001
4042
|
"status": {
|
|
@@ -4078,6 +4119,7 @@
|
|
|
4078
4119
|
"stepLabel": "Presupuesto de salida",
|
|
4079
4120
|
"kindLabel": "Presupuesto de salida",
|
|
4080
4121
|
"kindHint": "Se aplica a todas las ejecuciones de este agente. Un paso del pipeline puede anularlo.",
|
|
4122
|
+
"hint": "El maximo al que puede llegar una sola respuesta de este agente. Dejarlo vacio hereda del nivel superior; no elimina el limite. El valor propio de un paso del pipeline prevalece sobre el predeterminado del espacio de trabajo.",
|
|
4081
4123
|
"inherits": "Heredado",
|
|
4082
4124
|
"inheritsValue": "Heredado ({tokens})"
|
|
4083
4125
|
}
|
|
@@ -4207,6 +4249,7 @@
|
|
|
4207
4249
|
"empty": "Este paso todavía no ha producido un veredicto.",
|
|
4208
4250
|
"notScored": "Sin puntuar",
|
|
4209
4251
|
"threshold": "umbral {threshold}",
|
|
4252
|
+
"thresholdHint": "La puntuacion que este paso tenia que alcanzar, tomada de la politica de fusion de la tarea. Por debajo, el juez devuelve el trabajo al paso que lo produjo con sus hallazgos como retrabajo, o aparca la ejecucion para ti cuando ya no queda presupuesto de intentos.",
|
|
4210
4253
|
"rubricOverridden": "rúbrica del espacio de trabajo",
|
|
4211
4254
|
"reworkRounds": "revisión {spent}/{budget}",
|
|
4212
4255
|
"findingsHeading": "Lo que señaló la rúbrica",
|
|
@@ -5804,10 +5847,12 @@
|
|
|
5804
5847
|
"config": "Configuración y CI",
|
|
5805
5848
|
"source": "Código fuente",
|
|
5806
5849
|
"schema": "Esquema y migraciones",
|
|
5807
|
-
"unknown": "Sin clasificar"
|
|
5850
|
+
"unknown": "Sin clasificar",
|
|
5851
|
+
"hint": "Lo que toco el diff, deducido de los archivos modificados. La politica de fusion puede fijar su propia regla por clase, y un diff que abarca varias clases toma la mas pesada."
|
|
5808
5852
|
},
|
|
5809
5853
|
"effort": {
|
|
5810
5854
|
"prompt": "Esfuerzo de revisión",
|
|
5855
|
+
"promptHint": "Registra cuanta revision necesito realmente este pull request. Tu respuesta es la referencia con la que se calibran los umbrales de fusion automatica. Etiquetar es opcional y puedes fusionar sin hacerlo.",
|
|
5811
5856
|
"none": "Sin comentarios",
|
|
5812
5857
|
"minor": "Comentarios menores",
|
|
5813
5858
|
"major": "Retrabajo real",
|