Skip to content

Commit c740fa2

Browse files
committed
release: CA-O 2.2.16 con aviso de pendientes que dice cuales y como resolverlos
- overclock-auto-blocked-recovery a plantilla de 5 args: N, etiquetas, 05 ESTABILIDAD, Revertir/Mantener/Descartar - 1 test nuevo; suite 1873 passed, 0 failed; pipeline 4/4 exit 0
1 parent d9e226a commit c740fa2

10 files changed

Lines changed: 110 additions & 41 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
Formato basado en [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/).
44

55
## [Unreleased]
6+
## [2.2.16] - 2026-10-13
7+
### Corregido
8+
- **El aviso de ajustes pendientes ya dice cuales y como resolverlos.** Nombra cada ajuste pendiente, cuantos son y manda a la seccion 05 ESTABILIDAD con Revertir/Mantener/Descartar, en vez del generico "Resuelvelos primero".
9+
### Probado
10+
- Suite 1873 passed, 0 failed (Security 274, Benchmark 17, Infrastructure 202, Core 943, UI 377, Integration 60).
611
## [2.2.15] - 2026-10-13
712
### Cambiado
813
- **Temporales: cae todo lo de hace mas de 10 minutos.** Windows Temp, Delivery Optimization, Windows Update, caches de app, CodeCache de navegadores, shaders de GPU y descargador NVIDIA borran con retencion de 10 min (antes 1 dia, y 4 ni miraban la edad). Conservan su umbral con motivo: Outlook 7d, CBS/dumps 30d, Prefetch 30d (vaciarlo empeora el arranque).

‎README.md‎

Lines changed: 25 additions & 25 deletions
Large diffs are not rendered by default.

‎Version.props‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<Project>
22
<!-- Single source of truth for versioning (FASE 28). All other files derive from here. -->
33
<PropertyGroup>
4-
<Version>2.2.15</Version>
5-
<AssemblyVersion>2.2.15.0</AssemblyVersion>
6-
<FileVersion>2.2.15.0</FileVersion>
7-
<PackageVersion>2.2.15</PackageVersion>
8-
<ProductVersion>2.2.15</ProductVersion>
9-
<InformationalVersion>2.2.15+$(GHTag)</InformationalVersion>
4+
<Version>2.2.16</Version>
5+
<AssemblyVersion>2.2.16.0</AssemblyVersion>
6+
<FileVersion>2.2.16.0</FileVersion>
7+
<PackageVersion>2.2.16</PackageVersion>
8+
<ProductVersion>2.2.16</ProductVersion>
9+
<InformationalVersion>2.2.16+$(GHTag)</InformationalVersion>
1010
</PropertyGroup>
1111
</Project>
1212

‎docs/ARCHITECTURE.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ Nunca se registran secretos, credenciales ni contenido de entrada del usuario (s
114114
- **i18n**: diccionario tipado es-ES/en-US (`Localizer`); migración a `.resw` planificada sin cambiar llamadas (`Localizer.Get(key)`).
115115
- **HAGS/VBS/MPO/etc.**: nunca tratados como ganancias universales; HAGS es WorkloadDependent+Conditional+RequiresReboot, VBS es Critical+SecurityTradeoff+ExpertOnly.
116116

117-
## Pruebas (1872 passed, 0 failed — Release)
117+
## Pruebas (1873 passed, 0 failed — Release)
118118

119119
| Suite | Cubre | Count |
120120
|---|---|---|
@@ -123,5 +123,5 @@ Nunca se registran secretos, credenciales ni contenido de entrada del usuario (s
123123
| `CA-O.Integration.Tests` | `E2EFlowsTests` 9 pruebas (8 casos numerados + benchmark: Abrir→Analizar→Persistir→Vanguard→Restore→Benchmark) + `TransactionJournalRecovery` + contrato docs + `PrivilegedServicePackagingTests` (payload self-contained) | 60 |
124124
| `CA-O.Infrastructure.Tests` | `HistoryRobustness` (malformed), `SnapshotRepository` (TX identity), `SystemContextCache` dual-TTL | 202 |
125125
| `CA-O.Benchmark.Tests` | `SystemBenchmarkRunner` (suelo 3%, mediana) | 17 |
126-
| `CA-O.UI.Tests` | `ViewModelTests` (Analyze/Dashboard con `SystemAnalysisService` + `Correlation`), Overclock (filas visuales + mood de tuning), tours por pagina (83 pasos, destinos verificados), auto-tuning con propuesta, puerta de restore point | 376 |
127-
| **Total** | **Gates 1-5 `verify.ps1` + `build-release` con `gui-installer`** | **1872** |
126+
| `CA-O.UI.Tests` | `ViewModelTests` (Analyze/Dashboard con `SystemAnalysisService` + `Correlation`), Overclock (filas visuales + mood de tuning), tours por pagina (83 pasos, destinos verificados), auto-tuning con propuesta, puerta de restore point, aviso recovery con nombres | 377 |
127+
| **Total** | **Gates 1-5 `verify.ps1` + `build-release` con `gui-installer`** | **1873** |

‎installer/CA-O.iss‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
; (lee la versión de BuildConstants.cs y firma con CAO_SIGN_THUMBPRINT si existe)
44

55
#ifndef AppVersion
6-
#define AppVersion "2.2.15"
6+
#define AppVersion "2.2.16"
77
#endif
88
#ifndef RepoRoot
99
#define RepoRoot ".."

‎src/CA-O.Setup/Program.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// Instalador CA-O de un solo exe: ventana con progreso (sin consola).
66
// Descarga el paquete, deriva al setup gráfico bonito y sale; si no hay
77
// GUI, instala por aquí con la misma ventana de progreso.
8-
var productVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString(3) ?? "2.2.15";
8+
var productVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString(3) ?? "2.2.16";
99
var logFile = Path.Combine(Path.GetTempPath(), "CA-O-Setup.log");
1010
try { File.AppendAllText(logFile, $"\n[{DateTime.Now:O}] Setup iniciado\n"); } catch { }
1111

‎src/CA-O.Shared/Constants/BuildConstants.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ namespace CAO.Shared.Constants;
1111
public static class BuildConstants
1212
{
1313
// Version - SINGLE SOURCE OF TRUTH
14-
public const string ProductVersion = "2.2.15";
14+
public const string ProductVersion = "2.2.16";
1515
public const string ProductVersionMajor = "2";
1616
public const string ProductVersionMinor = "2";
17-
public const string ProductVersionPatch = "15";
17+
public const string ProductVersionPatch = "16";
1818

1919
// Product Identity
2020
public const string ProductName = "CA-O";

‎src/CA-O.UI/Resources/Localizer.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public static class Localizer
133133
["overclock-auto-tuning-knob"] = "Ajustando {0} (techo {1})...",
134134
["overclock-auto-proposal"] = "Propuesta lista: {0} validado(s), {1} omitido(s). Revisa y pulsa Aplicar perfil.",
135135
["overclock-auto-blocked-anticheat"] = "Overclock automático detenido: hay anti-cheat en el equipo. No se ha tocado nada.",
136-
["overclock-auto-blocked-recovery"] = "Overclock automático detenido: hay ajustes pendientes tras un reinicio. Resuélvelos primero.",
136+
["overclock-auto-blocked-recovery"] = "Overclock automático detenido: {0} ajuste(s) pendiente(s) tras un reinicio ({1}). Ve a la sección 05 ESTABILIDAD de esta misma página y usa {2} (vuelve al último valor bueno) / {3} (lo da por bueno) / {4} (lo olvida).",
137137
["overclock-probe-metric-unavailable"] = "metrica no legible en este equipo",
138138
["overclock-recovery-none"] = "No hay ningun ajuste de overclock sin cerrar.",
139139
["overclock-recovery-pending"] = "{0} ajuste(s) siguen abiertos tras un reinicio. Decide que hacer con cada uno.",
@@ -588,7 +588,7 @@ public static class Localizer
588588
["overclock-auto-tuning-knob"] = "Tuning {0} (ceiling {1})...",
589589
["overclock-auto-proposal"] = "Proposal ready: {0} validated, {1} skipped. Review it and press Apply profile.",
590590
["overclock-auto-blocked-anticheat"] = "Automatic overclock stopped: anti-cheat detected on this machine. Nothing was touched.",
591-
["overclock-auto-blocked-recovery"] = "Automatic overclock stopped: settings are still pending after a restart. Resolve them first.",
591+
["overclock-auto-blocked-recovery"] = "Automatic overclock stopped: {0} setting(s) still pending after a restart ({1}). Go to section 05 ESTABILIDAD on this same page and use {2} (back to the last good value) / {3} (accept the current value) / {4} (forget the attempt).",
592592
["overclock-probe-metric-unavailable"] = "metric not readable on this machine",
593593
["overclock-recovery-none"] = "No overclock run is left open.",
594594
["overclock-recovery-pending"] = "{0} setting(s) are still open after a restart. Decide what to do with each.",

‎src/CA-O.UI/ViewModels/OverclockViewModel.cs‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,22 @@ await ProfileStore.SaveAsync(new ValidatedOverclockProfile(
13881388
}
13891389
}
13901390

1391+
/// <summary>
1392+
/// Names the open runs that block a new write, in the same words the 05
1393+
/// ESTABILIDAD section shows them (row.Knob), plus how to clear them.
1394+
/// The button labels come from their own keys so no language hardcodes
1395+
/// Revertir/Mantener/Descartar here. Any future caller gated on
1396+
/// PendingRecoveries must reuse this instead of Get(key).
1397+
/// </summary>
1398+
private string BuildBlockedRecoveryMessage() =>
1399+
Localizer.Format(
1400+
"overclock-auto-blocked-recovery",
1401+
PendingRecoveries.Count,
1402+
string.Join(", ", PendingRecoveries.Select(r => r.Knob)),
1403+
Localizer.Get("overclock-recovery-revert"),
1404+
Localizer.Get("overclock-recovery-keep"),
1405+
Localizer.Get("overclock-recovery-discard"));
1406+
13911407
/// <summary>
13921408
/// Automatic overclock: walks every actionable knob through the same bisection
13931409
/// <see cref="StartTuningAsync"/> runs (same engine, same checkpoints, no new
@@ -1418,7 +1434,7 @@ private async Task StartAutoTuningAsync(CancellationToken ct)
14181434
await LoadPendingRecoveriesAsync(ct).ConfigureAwait(true);
14191435
if (PendingRecoveries.Count > 0)
14201436
{
1421-
ApplySummary = Localizer.Get("overclock-auto-blocked-recovery");
1437+
ApplySummary = BuildBlockedRecoveryMessage();
14221438
StatusLine = ApplySummary;
14231439
CrashLog.Step("auto.blocked-recovery");
14241440
return;

‎tests/CA-O.UI.Tests/OverclockAutoTuningTests.cs‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using CAO.Infrastructure.Overclock;
77
using CAO.Infrastructure.Overclock.Gaming;
88
using CAO.Shared;
9+
using CAO.UI;
910
using CAO.UI.ViewModels;
1011
using Xunit;
1112

@@ -117,6 +118,41 @@ public async Task AutoTuning_BlockedByPendingRecovery_WritesNothing()
117118
Assert.False(vm.IsBusy);
118119
}
119120

121+
[Fact]
122+
public async Task AutoTuning_BlockedByPendingRecovery_NamesThem_AndTellsHowToResolve()
123+
{
124+
var backend = new TuningBackend(writable: true);
125+
var stores = new TuningStores();
126+
var vm = OverclockTestHarness.Create(
127+
new OverclockReadOnlyRegistry(backend),
128+
[backend],
129+
openRuns: [OpenRun("amd.gpu.powerLimit"), OpenRun("amd.gpu.memoryClock")],
130+
probe: new ScriptedProbe(),
131+
profileStore: stores.ProfileStore,
132+
checkpointStore: stores.CheckpointStore,
133+
journal: stores.Journal);
134+
135+
await vm.RefreshCommand.ExecuteAsync(null);
136+
Assert.Equal(2, vm.PendingRecoveries.Count);
137+
138+
await vm.StartAutoTuningCommand.ExecuteAsync(null);
139+
140+
Assert.Empty(stores.Profiles);
141+
Assert.Empty(stores.Journal.Phases);
142+
Assert.Equal(vm.ApplySummary, vm.StatusLine);
143+
foreach (var row in vm.PendingRecoveries)
144+
{
145+
Assert.Contains(row.Knob, vm.ApplySummary, StringComparison.Ordinal);
146+
}
147+
148+
Assert.Contains("05", vm.ApplySummary, StringComparison.Ordinal);
149+
Assert.Contains("ESTABILIDAD", vm.ApplySummary, StringComparison.Ordinal);
150+
Assert.Contains(Localizer.Get("overclock-recovery-revert"), vm.ApplySummary, StringComparison.Ordinal);
151+
Assert.Contains(Localizer.Get("overclock-recovery-keep"), vm.ApplySummary, StringComparison.Ordinal);
152+
Assert.Contains(Localizer.Get("overclock-recovery-discard"), vm.ApplySummary, StringComparison.Ordinal);
153+
Assert.False(vm.IsBusy);
154+
}
155+
120156
[Fact]
121157
public async Task AutoTuning_Cancel_LeavesCleanState_AndResumes()
122158
{
@@ -212,6 +248,18 @@ private static (OverclockViewModel ViewModel, TuningStores Stores) BuildAuto(boo
212248
return (vm, stores);
213249
}
214250

251+
private static TuningCheckpoint OpenRun(string knob) => new()
252+
{
253+
RunId = Guid.NewGuid(),
254+
BackendId = "ghost-backend",
255+
Knob = knob,
256+
Component = nameof(OverclockComponent.Gpu),
257+
AppliedValue = 110d,
258+
LastKnownGoodValue = 100d,
259+
Phase = CheckpointPhase.Started,
260+
UpdatedAtUtc = DateTimeOffset.UtcNow.AddHours(-1),
261+
};
262+
215263
private sealed class TuningStores
216264
{
217265
public List<ValidatedOverclockProfile> Profiles { get; } = [];

0 commit comments

Comments
 (0)