Wake an agent on a schedule, let it do one thing, and put it back to sleep.
that a scheduled agent ran at all, and ran exactly once
a durable record of every wake -- fired, skipped, overlapped or timed out -- each with its reason
A scheduled agent fails as a SILENCE. A wake that never fired because the host was down, a wake that overlapped the run before it and corrupted shared state, and a wake that hung forever holding its slot are INDISTINGUISHABLE from outside: in every case nothing happened and nothing said so. Cron has no memory -- a missed minute is simply gone -- so "not due yet" and "due, and never ran" read identically, and the operator finds out days later by noticing absent output rather than by being told.
Wake something on a schedule, let it do one thing, and put it back to sleep.
A simple scheduler for one-off jobs. Store schedules in a JSON file (~/.aither/awrise/jobs.json). Runs jobs that are due using run-due. Idempotent: running it twice in the same window won't execute the same job twice.
```bash
pip install -e .
```bash
awrise add --name backup --every 1h --run "rsync -a src/ dest/"
awrise add --name check --every 15m --run "curl http://example.com/health"
awrise add --name deploy --every 2h --run "./deploy.sh"
Intervals: 15m (minutes), 2h (hours), 1d (days).
```bash
awrise list
Output:
```
Name Interval Command Last Run Status
---- -------- ------- -------- ------
backup 1h rsync -a src/ dest/ never pending
check 15m curl http://example.com/health never pending
deploy 2h ./deploy.sh never pending
```bash
awrise run-due
This is idempotent. Run it from a cron job, a systemd timer, or anywhere. It executes all jobs whose last_run timestamp is more than interval ago. Records the execution time so running it twice in the same window won't run the same job twice.
Jobs that fail record the failure and do NOT block other jobs.
```bash
awrise run-due --quiet # Suppress output
```bash
awrise remove --name backup
Store schedules in ~/.aither/awrise/jobs.json by default. Override with:
```bash
export AWRISE_HOME=/custom/path
```bash
awrise --self-test
Verifies: - Interval parsing (valid and invalid formats) - Idempotency (running twice in same window doesn't execute twice) - Empty command rejection - Job list/add/remove
The simplest useful scheduler: no daemon, no background process. Store state in JSON. The caller (cron, systemd, your own loop) decides when to call run-due.
Portable tools you adopt one at a time. Each one works alone.