Skip to content
Rowsafe
Docs

Protection status

One conservative yes-or-no answer to "could this database be restored right now?", for people, scripts and AI agents.

Protected means: if you had to restore this database right now, you could, to within minutes of now. Rowsafe checks it continuously, and it is deliberately strict.

rowsafe status app
app is PROTECTED.

Last backup:        7.2h ago
Last WAL archived:  41s ago
Recoverable from:   Sun, 14 Sep 2026 01:00:12 UTC
Last passing drill: 3d ago

The conditions

A database is protected only when all of these hold:

ConditionWhy
The database is activeArchiving has been proven to reach your bucket.
The agent reported the archiving status in the last 10 minutes, without an errorUnknown counts as failing.
No archiving failure in the last 15 minutesRecent changes might not be in the bucket.
A backup finished in the last 26 hoursRestores would replay a very long log.
The latest restore drill passed, less than 8 days agoOnly a drill proves the backups restore.

When one fails, the status lists every reason:

app is NOT PROTECTED:
  - WAL archiving failed at 2026-09-24T09:12:03Z (within the last 15m0s)
  - no passing restore drill in the last 8 days

Last backup:        7.2h ago
...

For scripts and AI agents

rowsafe status NAME exits with:

Exit codeMeaning
0Protected
3Not protected
1Error (for example not logged in, or the database doesn't exist)

So you can gate a risky step on it:

rowsafe status app && ./migrate.sh

Use --json for every detail, including the start of the recovery window. AI agents get the same check through the safety_check MCP tool.

Fleet health

Without a name, rowsafe status checks everything: offline agents, stale backups, failing archiving, failed drills, databases waiting for a restart, and more. Each problem comes with the command to run next.

2 hosts, 3 databases (3 active): 0 critical, 0 warning(s). All good: every active database has recent backups, WAL archiving works and drills pass.

It exits 0 when nothing is critical or a warning, and 3 otherwise.

Edit on GitHub