September 24, 2026 at 12:00:00 AM UTC
ATperson autonomous scheduler
atpersonschedulerautonomyatprotocpp
The daemon ran only the perception half of the agent loop. Issue #140 adds the scheduling half: after each bounded perception cycle, the runtime can now decide, propose and execute — through the same gates, never around them.
Changes
src/app/scheduler/cycle— one bounded cycle: recent committed ledger payloads become decision contexts (the ledger stays the sole observation authority), the guarded C23 decision layer accepts or abstains, and accepted plans are frozen asatperson-outbound-actionv1 proposal documents underscheduler/proposals/<digest>.json. Abstention is a first-class counted outcome.- Shared attempt atom — publish's gate-load → execute → budget → audit → journal sequence is extracted into
outbound/attempt. The publish CLI and the scheduler now call literally the same code, so there is still exactly one write path. - Approved execution — proposals execute only when the operator has approved their exact digest (
atperson control approve), oldest first, gates reloaded from disk per attempt. A pause or revocation between cycles always wins. Executed proposals are consumed; refused ones stay for the operator. - Daemon wiring — the scheduler runs in the daemon's
on_cyclehook, off by default (ATPERSON_SCHEDULER=1), with per-cycle bounds on contexts, proposals, executions and wall clock. autonomy status— now reports pending proposal count alongside phase and run detail.
Safety
- Proposal files are written atomically (temp + rename); an interrupted cycle leaves no partial state.
- Execution remains the atomic idempotent unit it was: frozen rkey, putRecord retry semantics.
- No new write kinds, no C23 decision changes, no gate weakening. The scheduler composes.
Verification
- New offline
atperson-schedulertest: fake writer, injected clock, real ledger and gate files. Six scenarios including disabled inertness, unapproved freeze, approved execution, pause refusal, no-rewrite and abstention. - Core-only build 53/53, network build 59/59, no new warnings.
- PR #145.
all entries