v0.295.0: a box that was off at its backup time catches up once (R-871, decision 109); the missed-backup banner (decision 110); a late daily timer after a host suspend is skipped
gates / gates (push) Successful in 31s

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 09:27:16 +02:00
parent e730a629fd
commit 635c33d381
24 changed files with 2074 additions and 18 deletions
@@ -178,6 +178,24 @@
until the household creates its recovery code (zero-knowledge escrow: their code is the only key).
The pause is the design; what was missing was ASKING. Same mechanism as the R-241 bar above —
dismissable for the visit, back at the next one, gone for good when the escrow completes. */}}
{{/* R-871 (v0.295.0, `09` decision 110) — the missed-backup banner: when the last daily backup is over 26 h old,
why (the box was off at the backup time, from the box's own record) and a suggested time. Closing it lasts until
the NEXT missed backup time (durable, the night ledger); a successful night removes it. Never changes the time. */ -}}
{{if .MissedBackupBanner}}
<div class="alerts-container">
<div class="alert-banner alert-banner-warning" id="missed-backup-banner">
<span class="alert-icon"><svg class="ico"><use href="#i-triangle-alert"/></svg></span>
<span class="alert-message">{{.MissedBackupMessage}} {{.MissedBackupHint}}</span>
<span class="alert-actions">
<a href="/backups#window_start" class="btn btn-sm btn-primary">{{T "layout.missed_backup_change"}}</a>
<form method="POST" action="/backups/missed-banner/dismiss" style="display:inline">
{{.CSRFField}}<input type="hidden" name="back" value="{{.MissedBackupBack}}">
<button type="submit" class="btn btn-sm btn-outline">{{T "layout.missed_backup_close"}}</button>
</form>
</span>
</div>
</div>
{{end -}}
{{if .EscrowBanner}}
<div class="alerts-container">
<div class="alert-banner alert-banner-warning">