VayuPress Docs
Docs / Reliability

Service Level Objectives — VayuPress

Version: 1.0
Last reviewed: 2026-06-13
Authority: VayuPress Maintainers


SLO Definitions

SLO Name Target Window Error Budget Measurement
signing.latency.p95 99.9% 30 days 43.2 min/month P95 of signing.Sign() calls ≤ 100ms
plugin.invocation.success 99.0% 7 days 1.68 hr/week Plugin Invoke() returns nil error
federation.inbox.lag 95.0% 24 hours 72 min/day Inbox activity processed within 60s of receipt
restore.rto.10min 100% 365 days 0 min/year Restore-from-backup completes within 10 minutes
wal.recovery.success 99.9% 30 days 43.2 min/month WAL recovery succeeds without data loss

Error Budget Policy

When an error budget reaches ≤ 20% remaining:

  • Engineering work on new features pauses.
  • Focus shifts to reliability improvements.
  • Incident post-mortem required within 48 hours.

When an error budget reaches 0%:

  • All feature work stops.
  • P0 incident declared.
  • Release gate blocked until budget recovers.

SLO Instrumentation

SLOs are tracked via internal/slo package:

tr := slo.Global.Register(slo.SLOSigningP95)
// On each signing call:
tr.Record(err == nil)
// Check budget:
if tr.BudgetExhausted() {
    logging.LogJSON(logging.LogFields{Level: "error", Component: "slo", Msg: tr.Status()})
}

Latency Targets

Operation P50 target P95 target P99 target
signing.Sign() ≤ 10ms ≤ 100ms ≤ 500ms
signing.Verify() ≤ 20ms ≤ 150ms ≤ 500ms
merkle.New(1024) ≤ 1ms ≤ 5ms ≤ 20ms
HTTP article GET ≤ 50ms ≤ 200ms ≤ 1s
Plugin hook invocation ≤ 100ms ≤ 500ms ≤ Manifest.Timeout
DB read (indexed) ≤ 1ms ≤ 10ms ≤ 50ms
DB write (WAL) ≤ 5ms ≤ 50ms ≤ 200ms

Recovery Objectives

Scenario RTO RPO Runbook
WAL corruption 30 min Last backup (≤ 24h) wal-corruption-recovery.md
Process crash < 1 min 0 (SQLite WAL persists) Systemd auto-restart
Full server loss < 10 min Last backup (≤ 24h) backup-restore.md
Plugin quarantine storm < 5 min 0 incident-response.md
Signing key compromise < 1 hour 0 (re-sign from archive) signing-model.md

Benchmark Thresholds (CI-enforced)

From testdata/bench/:

Benchmark Baseline Max regression
BenchmarkSign ~24µs/op +20%
BenchmarkVerify ~52µs/op +20%
BenchmarkMerkleNew1024 ~406µs/op +30%
BenchmarkMerkleProof ~948ns/op +10%

Regressions exceeding these thresholds block the release gate.