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/.
79 lines
4.6 KiB
YAML
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.
|