v0.297.0: burn-down round 2 — 24 small rows (R-591 R-568 R-567 R-363 R-547 R-10 R-552 R-251 R-104 R-619 R-362 R-675 R-256 R-257 R-240 R-365 R-425 R-565 R-564 R-603 R-454 R-208 R-457-swept) + the banner countdown and deepCopyStack twins; MinAgent 0.131.0
gates / gates (push) Failing after 50s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-05 20:12:56 +02:00
parent 114ff2761a
commit 1453cfc69b
68 changed files with 3953 additions and 116 deletions
@@ -133,3 +133,22 @@ func (m *Manager) persistRestoreRecordLocked() {
m.logger.Printf("[WARN] [backup] could not persist the restore record to %s: %v (kept in memory)", m.opRecordPath, err)
}
}
// ClearInterruptedRestore drops an app's standing interrupted-restore notice and persists the record
// (R-552). Called when the app is REMOVED: the notice asks the household to run the restore again,
// and for an app that no longer exists that is a card about nothing, shown for ever — before this,
// only a new restore of the same app (BeginRestoreOp) ever cleared it. Reports whether a notice was
// there. Pinned by TestClearInterruptedRestore_DropsTheNoticeAndPersists.
func (m *Manager) ClearInterruptedRestore(stack string) bool {
if m == nil || stack == "" {
return false
}
m.mu.Lock()
defer m.mu.Unlock()
if _, ok := m.opInterrupted[stack]; !ok {
return false
}
delete(m.opInterrupted, stack)
m.persistRestoreRecordLocked()
return true
}