From 76a93e0dd02a43af76979556510ad07e14e7249c Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 7 Feb 2026 18:27:18 +0000 Subject: [PATCH 1/2] fix: add redFlagConfigs prop to remaining components in AgenticReadinessTab Added redFlagConfigs prop to components that were missing it: - HumanOnlyRedFlagsSection: Added redFlagConfigs prop - PriorityCandidatesSection: Added redFlagConfigs prop and passed to ExpandableSkillRow These components are not currently used in the main component but need the prop in case they are enabled in the future. https://claude.ai/code/session_01GNbnkFoESkRcnPr3bLCYDg --- frontend/components/tabs/AgenticReadinessTab.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/components/tabs/AgenticReadinessTab.tsx b/frontend/components/tabs/AgenticReadinessTab.tsx index 574e447..ec81854 100644 --- a/frontend/components/tabs/AgenticReadinessTab.tsx +++ b/frontend/components/tabs/AgenticReadinessTab.tsx @@ -2783,7 +2783,7 @@ function HumanOnlyByReasonSection({ drilldownData, redFlagConfigs }: { drilldown } // v3.4: Sección de Candidatos Prioritarios - Por queue_skill con drill-down a original_queue_id -function PriorityCandidatesSection({ drilldownData }: { drilldownData: DrilldownDataPoint[] }) { +function PriorityCandidatesSection({ drilldownData, redFlagConfigs }: { drilldownData: DrilldownDataPoint[]; redFlagConfigs: RedFlagConfig[] }) { const [expandedRows, setExpandedRows] = useState>(new Set()); // Filtrar skills que tienen al menos una cola AUTOMATE @@ -2907,6 +2907,7 @@ function PriorityCandidatesSection({ drilldownData }: { drilldownData: Drilldown idx={idx} isExpanded={expandedRows.has(dataPoint.skill)} onToggle={() => toggleRow(dataPoint.skill)} + redFlagConfigs={redFlagConfigs} /> ))} @@ -2937,7 +2938,7 @@ function PriorityCandidatesSection({ drilldownData }: { drilldownData: Drilldown } // v3.6: Sección de Colas HUMAN-ONLY con Red Flags - Contextualizada -function HumanOnlyRedFlagsSection({ drilldownData }: { drilldownData: DrilldownDataPoint[] }) { +function HumanOnlyRedFlagsSection({ drilldownData, redFlagConfigs }: { drilldownData: DrilldownDataPoint[]; redFlagConfigs: RedFlagConfig[] }) { const [showTable, setShowTable] = useState(false); // Extraer todas las colas From bafd8e3f6161e72e60b4c6b47a170c2eb71fd4c4 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 7 Feb 2026 18:40:10 +0000 Subject: [PATCH 2/2] feat: complete translation of remaining Spanish strings in Law10Tab and RoadmapTab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Law10Tab changes: - Fixed 3 Spanish time unit abbreviations (año→yr, mes→mo) - Changed "65K/año" to "65K/yr" (line 1444) - Changed "35K + 8K/mes" to "35K + 8K/mo" (line 1448) - Changed "12-18K/año" to "12-18K/yr" (line 1452) RoadmapTab changes (41 strings translated): - Translated DECISION_GATES object (18 keys) - converted to getDecisionGates(t) function - Translated timeline title and description (2 keys) - Translated all payback tooltip texts (5 keys) - Translated wave descriptions and recommendations (12 keys) - Translated scenario comparison texts (4 keys) - Added useTranslation() hook to RoadmapTimeline component - Updated recommendation generation to use t() with interpolation Translation keys added: - roadmap.payback.* (5 new keys) - roadmap.decisionGates.* (12 keys) - roadmap.timeline.* (2 keys) - roadmap.specificRecommendations.* (12 keys) - roadmap.scenarios.* (3 keys) - roadmap.wave2Description.* (2 keys) All components now fully support Spanish-English translation switching. https://claude.ai/code/session_01GNbnkFoESkRcnPr3bLCYDg --- frontend/components/tabs/Law10Tab.tsx | 6 +- frontend/components/tabs/RoadmapTab.tsx | 122 +++++++++++++++--------- frontend/locales/en.json | 29 +++++- frontend/locales/es.json | 29 +++++- 4 files changed, 135 insertions(+), 51 deletions(-) diff --git a/frontend/components/tabs/Law10Tab.tsx b/frontend/components/tabs/Law10Tab.tsx index 037c7a5..3c38ee1 100644 --- a/frontend/components/tabs/Law10Tab.tsx +++ b/frontend/components/tabs/Law10Tab.tsx @@ -1441,15 +1441,15 @@ function DataMaturitySummary({ data }: { data: AnalysisData }) {
  • {t('law10.dataMaturity.investment.phase2.coverage247')} - 65K/año + 65K/yr
  • {t('law10.dataMaturity.investment.phase2.aiCopilot')} - 35K + 8K/mes + 35K + 8K/mo
  • {t('law10.dataMaturity.investment.phase2.enacAuditor')} - 12-18K/año + 12-18K/yr
  • {t('law10.dataMaturity.investment.phase2.subtotalYear1')} diff --git a/frontend/components/tabs/RoadmapTab.tsx b/frontend/components/tabs/RoadmapTab.tsx index ef726c1..f420807 100644 --- a/frontend/components/tabs/RoadmapTab.tsx +++ b/frontend/components/tabs/RoadmapTab.tsx @@ -199,8 +199,7 @@ const calcularPaybackCompleto = ( texto: t('roadmap.payback.seeWave34'), clase: 'text-blue-600', esRecuperable: false, - tooltip: 'Esta inversión se recupera con las waves de automatización (W3-W4). ' + - 'El payback se calcula sobre el roadmap completo, no sobre waves habilitadoras aisladas.' + tooltip: t('roadmap.payback.recoversWithAutomation') }; } @@ -216,8 +215,7 @@ const calcularPaybackCompleto = ( texto: t('roadmap.payback.notRecoverable'), clase: 'text-red-600', esRecuperable: false, - tooltip: 'El ahorro anual no supera los costes recurrentes. ' + - `Margen neto: ${formatCurrency(margenAnual)}/año` + tooltip: t('roadmap.payback.savingsDoNotCoverRecurringWithMargin', { margin: formatCurrency(margenAnual) }) }; } @@ -245,8 +243,11 @@ const formatearPaybackResult = ( inversion: number, t: any ): PaybackInfo => { - const tooltipBase = `Implementación: ${mesesImpl} meses → Recuperación: ${mesesRec} meses. ` + - `Margen: ${formatCurrency(margenMensual * 12)}/año.`; + const tooltipBase = t('roadmap.payback.implementationRecoveryMargin', { + impl: mesesImpl, + rec: mesesRec, + margin: formatCurrency(margenMensual * 12) + }); if (meses <= 0) { return { @@ -292,7 +293,7 @@ const formatearPaybackResult = ( texto: `${meses} meses`, clase: 'text-amber-600', esRecuperable: true, - tooltip: tooltipBase + ' ⚠️ Periodo de recuperación moderado.' + tooltip: tooltipBase + ' ⚠️ ' + t('roadmap.payback.moderateRecoveryPeriod') }; } @@ -305,7 +306,7 @@ const formatearPaybackResult = ( texto: `${anos} años`, clase: 'text-orange-600', esRecuperable: true, - tooltip: tooltipBase + ' ⚠️ Periodo de recuperación largo. Considerar escenario menos ambicioso.' + tooltip: tooltipBase + ' ⚠️ ' + t('roadmap.payback.longRecoveryPeriod') }; }; @@ -1329,8 +1330,8 @@ function ScenarioComparison({ escenarios }: { escenarios: EscenarioData[] }) {
    {formatCurrency(esc.ahorroAnual)}/año
    {esc.esHabilitador && esc.potencialHabilitado > 0 && ( -
    - (habilita {formatCurrency(esc.potencialHabilitado)}) +
    + ({t('roadmap.scenarios.enablesAmount', { amount: formatCurrency(esc.potencialHabilitado) })})
    )} {!esc.esHabilitador && esc.ahorroAjustado !== esc.ahorroAnual && ( @@ -1440,16 +1441,18 @@ function ScenarioComparison({ escenarios }: { escenarios: EscenarioData[] }) { )}

    - {isEnabling ? 'Recomendación (Habilitador)' : 'Recomendación'} + {isEnabling ? t('roadmap.comparison.recommendationEnabler') : t('roadmap.comparison.recommendation')}

    - {recomendado?.recomendacion || 'Iniciar con escenario conservador para validar modelo antes de escalar.'} + {recomendado?.recomendacion || t('roadmap.scenarios.startConservative')}

    {isEnabling && recomendado?.potencialHabilitado > 0 && (

    - 💡 Valor real de esta inversión: Desbloquea {formatCurrency(recomendado.potencialHabilitado)}/año - en {recomendado.wavesHabilitadas.join(' y ')}. Sin esta base, las waves posteriores no son viables. + {t('roadmap.scenarios.enablerValue')} {t('roadmap.scenarios.enablerUnlocks', { + amount: formatCurrency(recomendado.potencialHabilitado), + waves: recomendado.wavesHabilitadas.join(' y ') + })}

    )} @@ -1475,34 +1478,38 @@ interface DecisionGate { } // v3.6: Decision Gates alineados con nueva nomenclatura y criterios de Tier -const DECISION_GATES: DecisionGate[] = [ +// Note: Decision gates are rendered using translation keys dynamically +const getDecisionGates = (t: any): DecisionGate[] => [ { id: 'gate1', afterWave: 'wave1', - question: '¿CV ≤75% en 3+ colas?', - criteria: 'Red flags eliminados, Tier 4→3', - goAction: 'Iniciar AUGMENT', - noGoAction: 'Extender FOUNDATION' + question: t('roadmap.decisionGates.gate1Question'), + criteria: t('roadmap.decisionGates.gate1Criteria'), + goAction: t('roadmap.decisionGates.gate1GoAction'), + noGoAction: t('roadmap.decisionGates.gate1NoGoAction') }, { id: 'gate2', afterWave: 'wave2', - question: '¿Score ≥5.5 en target?', - criteria: 'CV ≤90%, Transfer ≤30%', - goAction: 'Iniciar ASSIST', - noGoAction: 'Consolidar AUGMENT' + question: t('roadmap.decisionGates.gate2Question'), + criteria: t('roadmap.decisionGates.gate2Criteria'), + goAction: t('roadmap.decisionGates.gate2GoAction'), + noGoAction: t('roadmap.decisionGates.gate2NoGoAction') }, { id: 'gate3', afterWave: 'wave3', - question: '¿Score ≥7.5 en 2+ colas?', - criteria: 'CV ≤75%, FCR ≥50%', - goAction: 'Lanzar AUTOMATE', - noGoAction: 'Expandir ASSIST' + question: t('roadmap.decisionGates.gate3Question'), + criteria: t('roadmap.decisionGates.gate3Criteria'), + goAction: t('roadmap.decisionGates.gate3GoAction'), + noGoAction: t('roadmap.decisionGates.gate3NoGoAction') } ]; function RoadmapTimeline({ waves }: { waves: WaveData[] }) { + const { t } = useTranslation(); + const DECISION_GATES = getDecisionGates(t); + const waveColors: Record = { wave1: { bg: 'bg-blue-100', border: 'border-blue-400', connector: 'bg-blue-400' }, wave2: { bg: 'bg-emerald-100', border: 'border-emerald-400', connector: 'bg-emerald-400' }, @@ -1512,8 +1519,8 @@ function RoadmapTimeline({ waves }: { waves: WaveData[] }) { return (
    -

    Roadmap de Transformación 2026-2027

    -

    Cada wave depende del éxito de la anterior. Los puntos de decisión permiten ajustar según resultados reales.

    +

    {t('roadmap.timeline.title')}

    +

    {t('roadmap.timeline.subtitle')}

    {/* Timeline horizontal con waves y gates */}
    @@ -1713,8 +1720,15 @@ export function RoadmapTab({ data }: RoadmapTabProps) { // Generar texto dinámico para Wave 2 const wave2Description = skillsListos > 0 - ? `${bestSkill?.skill || 'Skill principal'} es el skill con mejor Score (${bestSkillScore.toFixed(1)}/10, categoría "Copilot"). Volumen ${bestSkillVolume.toLocaleString()}/año = mayor impacto económico.` - : `Ningún skill alcanza actualmente Score ≥6. El mejor candidato es ${bestSkill?.skill || 'N/A'} con Score ${bestSkillScore.toFixed(1)}/10. Requiere optimización previa en Wave 1.`; + ? t('roadmap.wave2Description.ready', { + skill: bestSkill?.skill || 'Skill principal', + score: bestSkillScore.toFixed(1), + volume: bestSkillVolume.toLocaleString() + }) + : t('roadmap.wave2Description.notReady', { + skill: bestSkill?.skill || 'N/A', + score: bestSkillScore.toFixed(1) + }); const wave2Skills = skillsListos > 0 ? skillsCopilot.map(s => s.skill) @@ -2244,27 +2258,47 @@ export function RoadmapTab({ data }: RoadmapTabProps) { if (automateCount >= 3) { return { - action: 'Lanzar Wave 4 (AUTOMATE) en piloto', - rationale: `${automateCount} colas ya tienen Score ≥7.5 con volumen de ${tierVolumes.AUTOMATE.toLocaleString()} int/mes.`, - nextStep: `Iniciar piloto de automatización en las 2-3 colas de mayor volumen con ahorro potencial de ${formatCurrency(potentialSavings.AUTOMATE)}/año.` + action: t('roadmap.specificRecommendations.launchWave4'), + rationale: t('roadmap.specificRecommendations.launchWave4Rationale', { + count: automateCount, + volume: tierVolumes.AUTOMATE.toLocaleString() + }), + nextStep: t('roadmap.specificRecommendations.launchWave4NextStep', { + amount: formatCurrency(potentialSavings.AUTOMATE) + }) }; } else if (assistCount >= 5 || pctHighTier >= 30) { return { - action: 'Iniciar Wave 3 (ASSIST) con Copilot', - rationale: `${assistCount} colas tienen Score 5.5-7.5, representando ${Math.round((tierVolumes.ASSIST / totalVolume) * 100)}% del volumen.`, - nextStep: `Desplegar Copilot IA en colas Tier 2 para elevar score a ≥7.5 y habilitar Wave 4. Inversión: ${formatCurrency(wave3Setup)}.` + action: t('roadmap.specificRecommendations.initiateWave3'), + rationale: t('roadmap.specificRecommendations.initiateWave3Rationale', { + count: assistCount, + pct: Math.round((tierVolumes.ASSIST / totalVolume) * 100) + }), + nextStep: t('roadmap.specificRecommendations.initiateWave3NextStep', { + amount: formatCurrency(wave3Setup) + }) }; } else if (humanOnlyCount > totalQueues * 0.5) { return { - action: 'Priorizar Wave 1 (FOUNDATION)', - rationale: `${humanOnlyCount} colas (${Math.round((humanOnlyCount / totalQueues) * 100)}%) tienen Red Flags que impiden automatización.`, - nextStep: `Estandarizar procesos antes de invertir en IA. La automatización sin fundamentos sólidos fracasa en 80%+ de casos.` + action: t('roadmap.specificRecommendations.prioritizeWave1'), + rationale: t('roadmap.specificRecommendations.prioritizeWave1Rationale', { + count: humanOnlyCount, + pct: Math.round((humanOnlyCount / totalQueues) * 100) + }), + nextStep: t('roadmap.specificRecommendations.prioritizeWave1NextStep') }; } else { return { - action: 'Ejecutar Wave 1-2 secuencialmente', - rationale: `Operación mixta: ${automateCount} colas Tier 1, ${assistCount} Tier 2, ${tierCounts.AUGMENT.length} Tier 3, ${humanOnlyCount} Tier 4.`, - nextStep: `Comenzar con FOUNDATION para eliminar red flags, seguido de AUGMENT para elevar scores. Inversión inicial: ${formatCurrency(wave1Setup + wave2Setup)}.` + action: t('roadmap.specificRecommendations.executeWave12'), + rationale: t('roadmap.specificRecommendations.executeWave12Rationale', { + automate: automateCount, + assist: assistCount, + augment: tierCounts.AUGMENT.length, + human: humanOnlyCount + }), + nextStep: t('roadmap.specificRecommendations.executeWave12NextStep', { + amount: formatCurrency(wave1Setup + wave2Setup) + }) }; } }; @@ -2498,7 +2532,7 @@ export function RoadmapTab({ data }: RoadmapTabProps) { return { display: '>500%', tooltip: `ROI calculado: ${roi}%`, showCap: true }; } if (roi > 300) { - return { display: `${roi}%`, tooltip: 'ROI alto - validar con piloto', showCap: false }; + return { display: `${roi}%`, tooltip: t('roadmap.payback.roiValidateWithPilot'), showCap: false }; } return { display: `${roi}%`, tooltip: '', showCap: false }; }; diff --git a/frontend/locales/en.json b/frontend/locales/en.json index 5d9de52..96a0527 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -545,8 +545,11 @@ "immediate": "Immediate", "recoversWithAutomation": "This investment is recovered with automation waves (W3-W4). Payback is calculated on the complete roadmap, not on enabling waves in isolation.", "savingsDoNotCoverRecurring": "Annual savings do not cover recurring costs.", + "savingsDoNotCoverRecurringWithMargin": "Annual savings do not cover recurring costs. Net margin: {{margin}}/year", + "implementationRecoveryMargin": "Implementation: {{impl}} months → Recovery: {{rec}} months. Margin: {{margin}}/year.", "moderateRecoveryPeriod": "Moderate recovery period.", - "longRecoveryPeriod": "Long recovery period. Consider less ambitious scenario." + "longRecoveryPeriod": "Long recovery period. Consider less ambitious scenario.", + "roiValidateWithPilot": "High ROI - validate with pilot" }, "waves": { "wave1Name": "Wave 1", @@ -645,7 +648,10 @@ "roiNote": "ROI: (3y Savings - 3y Total Cost) / 3y Total Cost × 100. Adjusted applies risk: W1-2: 75-90%, W3: 60%, W4: 50%.", "enablerNote": "Enabler: Waves that unlock ROI of subsequent waves. Their payback is evaluated with the complete roadmap.", "enablerValue": "Real value of this investment:", - "enablerUnlocks": "Unlocks {{amount}}/year in {{waves}}. Without this foundation, subsequent waves are not viable." + "enablerUnlocks": "Unlocks {{amount}}/year in {{waves}}. Without this foundation, subsequent waves are not viable.", + "unlocks": "Unlocks {{waves}}", + "enablesAmount": "enables {{amount}}", + "startConservative": "Start with conservative scenario to validate model before scaling." }, "decisionGates": { "gate1Question": "CV ≤75% in 3+ queues?", @@ -689,6 +695,7 @@ "risk": "Risk", "scenario": "Scenario", "recommendation": "Recommendation", + "recommendationEnabler": "Recommendation (Enabler)", "enabler": "Enabler", "recommended": "Recommended" }, @@ -779,6 +786,24 @@ "wave1": "Queues that reach Score 3.5-5.5 post Wave 1", "wave2": "Queues that reach Score ≥5.5 post Wave 2", "wave3": "Queues that reach Score ≥7.5 post Wave 3" + }, + "wave2Description": { + "ready": "{{skill}} is the skill with the best Score ({{score}}/10, \"Copilot\" category). Volume {{volume}}/year = greatest economic impact.", + "notReady": "No skill currently reaches Score ≥6. The best candidate is {{skill}} with Score {{score}}/10. Requires prior optimization in Wave 1." + }, + "specificRecommendations": { + "launchWave4": "Launch Wave 4 (AUTOMATE) pilot", + "launchWave4Rationale": "{{count}} queues already have Score ≥7.5 with volume of {{volume}} int/month.", + "launchWave4NextStep": "Start automation pilot in the 2-3 highest-volume queues with savings potential of {{amount}}/year.", + "initiateWave3": "Initiate Wave 3 (ASSIST) with Copilot", + "initiateWave3Rationale": "{{count}} queues have Score 5.5-7.5, representing {{pct}}% of volume.", + "initiateWave3NextStep": "Deploy AI Copilot in Tier 2 queues to raise score to ≥7.5 and enable Wave 4. Investment: {{amount}}.", + "prioritizeWave1": "Prioritize Wave 1 (FOUNDATION)", + "prioritizeWave1Rationale": "{{count}} queues ({{pct}}%) have Red Flags that prevent automation.", + "prioritizeWave1NextStep": "Standardize processes before investing in AI. Automation without solid foundations fails in 80%+ of cases.", + "executeWave12": "Execute Wave 1-2 sequentially", + "executeWave12Rationale": "Mixed operation: {{automate}} Tier 1 queues, {{assist}} Tier 2, {{augment}} Tier 3, {{human}} Tier 4.", + "executeWave12NextStep": "Start with FOUNDATION to eliminate red flags, followed by AUGMENT to raise scores. Initial investment: {{amount}}." } }, "opportunities": { diff --git a/frontend/locales/es.json b/frontend/locales/es.json index 7f684bb..20a882a 100644 --- a/frontend/locales/es.json +++ b/frontend/locales/es.json @@ -545,8 +545,11 @@ "immediate": "Inmediato", "recoversWithAutomation": "Esta inversión se recupera con las waves de automatización (W3-W4). El payback se calcula sobre el roadmap completo, no sobre waves habilitadoras aisladas.", "savingsDoNotCoverRecurring": "El ahorro anual no supera los costes recurrentes.", + "savingsDoNotCoverRecurringWithMargin": "El ahorro anual no supera los costes recurrentes. Margen neto: {{margin}}/año", + "implementationRecoveryMargin": "Implementación: {{impl}} meses → Recuperación: {{rec}} meses. Margen: {{margin}}/año.", "moderateRecoveryPeriod": "Periodo de recuperación moderado.", - "longRecoveryPeriod": "Periodo de recuperación largo. Considerar escenario menos ambicioso." + "longRecoveryPeriod": "Periodo de recuperación largo. Considerar escenario menos ambicioso.", + "roiValidateWithPilot": "ROI alto - validar con piloto" }, "waves": { "wave1Name": "Wave 1", @@ -645,7 +648,10 @@ "roiNote": "ROI: (Ahorro 3a - Coste Total 3a) / Coste Total 3a × 100. Ajustado aplica riesgo: W1-2: 75-90%, W3: 60%, W4: 50%.", "enablerNote": "💡 Habilitador: Waves que desbloquean ROI de waves posteriores. Su payback se evalúa con el roadmap completo.", "enablerValue": "💡 Valor real de esta inversión:", - "enablerUnlocks": "Desbloquea {{amount}}/año en {{waves}}. Sin esta base, las waves posteriores no son viables." + "enablerUnlocks": "Desbloquea {{amount}}/año en {{waves}}. Sin esta base, las waves posteriores no son viables.", + "unlocks": "Desbloquea {{waves}}", + "enablesAmount": "habilita {{amount}}", + "startConservative": "Iniciar con escenario conservador para validar modelo antes de escalar." }, "decisionGates": { "gate1Question": "¿CV ≤75% en 3+ colas?", @@ -689,6 +695,7 @@ "risk": "Riesgo", "scenario": "Escenario", "recommendation": "Recomendación", + "recommendationEnabler": "Recomendación (Habilitador)", "enabler": "Habilitador", "recommended": "Recomendado" }, @@ -779,6 +786,24 @@ "wave1": "Colas que alcancen Score 3.5-5.5 post Wave 1", "wave2": "Colas que alcancen Score ≥5.5 post Wave 2", "wave3": "Colas que alcancen Score ≥7.5 post Wave 3" + }, + "wave2Description": { + "ready": "{{skill}} es el skill con mejor Score ({{score}}/10, categoría \"Copilot\"). Volumen {{volume}}/año = mayor impacto económico.", + "notReady": "Ningún skill alcanza actualmente Score ≥6. El mejor candidato es {{skill}} con Score {{score}}/10. Requiere optimización previa en Wave 1." + }, + "specificRecommendations": { + "launchWave4": "Lanzar Wave 4 (AUTOMATE) en piloto", + "launchWave4Rationale": "{{count}} colas ya tienen Score ≥7.5 con volumen de {{volume}} int/mes.", + "launchWave4NextStep": "Iniciar piloto de automatización en las 2-3 colas de mayor volumen con ahorro potencial de {{amount}}/año.", + "initiateWave3": "Iniciar Wave 3 (ASSIST) con Copilot", + "initiateWave3Rationale": "{{count}} colas tienen Score 5.5-7.5, representando {{pct}}% del volumen.", + "initiateWave3NextStep": "Desplegar Copilot IA en colas Tier 2 para elevar score a ≥7.5 y habilitar Wave 4. Inversión: {{amount}}.", + "prioritizeWave1": "Priorizar Wave 1 (FOUNDATION)", + "prioritizeWave1Rationale": "{{count}} colas ({{pct}}%) tienen Red Flags que impiden automatización.", + "prioritizeWave1NextStep": "Estandarizar procesos antes de invertir en IA. La automatización sin fundamentos sólidos fracasa en 80%+ de casos.", + "executeWave12": "Ejecutar Wave 1-2 secuencialmente", + "executeWave12Rationale": "Operación mixta: {{automate}} colas Tier 1, {{assist}} Tier 2, {{augment}} Tier 3, {{human}} Tier 4.", + "executeWave12NextStep": "Comenzar con FOUNDATION para eliminar red flags, seguido de AUGMENT para elevar scores. Inversión inicial: {{amount}}." } }, "opportunities": {