Write the recovery material.
Upload new object versions and inspect only the intended destination.
A small launchd job looked complete until macOS refused to execute it. Debugging the permission boundary exposed the more important question: could I prove recovery?
I had a sync script, a scheduled launch agent, and a versioned destination. On paper, the project was protected. In practice, the schedule failed before the first object moved.
This is the story of that failure—and why backup design is really recovery design. Paths, bucket labels, identities, and logs shown here are generalized.
Each part had one visible job.
Upload new object versions and inspect only the intended destination.
Withhold object deletion, version deletion, and lifecycle-configuration permissions. Versioning helps recovery from some mistakes; it is not complete ransomware protection.
The manual run worked; the background job did not.
This is a build observation, not a guarantee for every macOS version or source folder. Apple privacy controls and the process's granted access determine the result.
| Evidence | What it actually proves |
|---|---|
| Timer configuration | The operating system has a launch instruction |
| Run log and exit state | The process started and reported an outcome |
| S3 object history | Versions reached the destination |
| Denied deletion probe | The scheduled identity cannot erase protected history |
| Restore to a separate folder | Recovery works without overwriting the source |