Files
FreeTLab c65497e58a
Build & Deploy PluriWave / Análisis de código (push) Successful in 36s
Build & Deploy PluriWave / Build APK + AAB release (push) Successful in 1m49s
docs(openspec): archive persistence-corruption-guard and promote its spec
Close the SDD cycle for the data-loss shielding change: verified pass
with warnings (0 critical, 10/10 scenarios with named tests, W1 fixed
post-verify), three stacked work units shipped plus the path-resolution
fix. The persistence-resilience capability spec is promoted to
openspec/specs/.
2026-07-11 17:34:36 +02:00

79 lines
4.6 KiB
YAML

change: persistence-corruption-guard
archived_date: 2026-07-11
status: archived
archived_from: openspec/changes/persistence-corruption-guard
verification_verdict: "PASS WITH WARNINGS"
verify_report_observations:
- id: 2363
type: verify-report
critical_issues: 0
warnings: 2 (W1 CLOSED post-verify via orchestrator fix; W2 accepted-documented, non-blocking)
suggestions: 4 (non-blocking)
artifacts_migrated:
- explore.md
- proposal.md (obs #2350)
- spec.md (obs #2351, on-disk merged to openspec/specs/persistence-resilience/spec.md, new capability domain)
- design.md (obs #2354)
- tasks.md (obs #2359, 61 checkboxes: 60 done, 1 optional/non-blocking (D4) intentionally unchecked)
- apply-progress.md (obs #2360, Phases A/B/C complete across 3 batches, Phase D 3/4 complete)
- verify-report.md (obs #2363, PASS WITH WARNINGS)
phase_status:
Phase A (Alarms, work unit 1): COMPLETE - 23/23 tasks [x]
Phase B (Custom Stations, work unit 2): COMPLETE - 17/17 tasks [x]
Phase C (Equalizer, work unit 3): COMPLETE - 17/17 tasks [x]
Phase D (Final Sweep): 3/4 tasks [x] (D4 optional on-device/emulator sanity check — no device
available in this environment; every behavior is already Dart-testable and covered by the
automated gate; explicitly skippable per its own task text)
test_results:
total_changed_lines: "~1057 across 3 work-unit commits (Alarms 514, Stations 312, EQ 231)"
flutter_analyze: "0 issues (whole-project sweep, independently reproduced at verify time)"
targeted_suites:
- persistencia_tolerante_test.dart: new file, 5 tests
- servicio_alarmas_corrupcion_test.dart: new file, 4 tests
- servicio_alarmas_cache_test.dart, servicio_alarmas_proxima_test.dart, servicio_alarmas_snooze_test.dart: pre-existing, unmodified, part of the 19/19 alarms gate
- estado_radio_test.dart: 18/18 (13 pre-existing + 5 new)
- servicio_ecualizador_test.dart: 25/25 (20 pre-existing + 5 new)
total_tests_passing: "62/62 (independently re-executed at verify time, matches apply-progress D2 claim exactly)"
commits:
- 65c1ac2: "fix(alarm): stop corrupt entries and unreadable payloads from wiping saved alarms"
- 13ad736: "fix(radio): quarantine corrupt custom-station files instead of silently emptying them"
- 45b7fc8: "fix(eq): keep valid presets when stored maps are partially corrupt"
- 316e9a7 / 48e74e6: "post-verify fix: W1 archivoCustom() path resolution moved inside IO-fail treatment + RED-GREEN regression test"
notes: |
New shared helper lib/servicios/persistencia_tolerante.dart introduced (parseListaTolerante,
parseMapaTolerante, registrarSaltoPersistencia) — shared per-entry tolerant-parse primitive
across all 3 subsystems (D1).
W1 (archivoCustom() path resolution left outside the IO try/catch in
lib/estado/estado_radio.dart) was identified during verification and FIXED post-verify by the
orchestrator (commit 316e9a7/48e74e6): the resolution call is now wrapped in its own try/catch
inside _cargarEmisorasCustom(), setting _customDegradado=true and logging via
registrarSaltoPersistencia on failure instead of throwing uncaught into
EstadoRadio._init()'s Future.wait(...). A RED-GREEN regression test was added. Full targeted
gate re-run: 53/53 green across the 4 persistence suites touched by the fix. Independently
confirmed present in source at archive time via direct read of
lib/estado/estado_radio.dart (_cargarEmisorasCustom/_archivoCustom). W1 is CLOSED.
W2 (multi-batch apply-progress "TDD Cycle Evidence" table only carries a row for the final
batch, Phase A/B evidence lives inline in tasks.md instead of the consolidated table) is
accepted as a documented, non-blocking process/tooling gap — independently corroborated via
source-diff inspection and full regression re-run, not an actual RED/GREEN discipline failure.
D4 (optional on-device/emulator sanity check) intentionally left unchecked — no device/emulator
available in this environment; every behavior in this change is already Dart-testable and
covered by the 62/62 automated gate.
ARCHIVE TOOLING NOTE: this archive run had access only to Read/Write/Edit/Glob/Engram tools
(no Bash/shell/delete-capable tool in this execution context). All 6 artifacts were copied via
exact-content Read followed by verbatim Write (fidelity spot-checked against source, including
a full tail-line match on the two longest files and a unicode-heavy table section) rather than
via Bash `cp`. The original openspec/changes/persistence-corruption-guard/ source folder could
NOT be deleted (no delete-capable tool available) — see archive-report.md "Archive Integrity"
for the follow-up action required to complete the true move.