Scheduling
This guide covers running akm tasks — akm improve and other background
work — through the OS scheduler (cron / launchd / schtasks) safely: how
akm setup reviews task definitions before touching the scheduler, how to
verify the result, and how to migrate or repair scheduler bindings after
moving or reinstalling akm.
Review tasks during setup
Interactive setup reviews every embedded task definition — both the general-purpose core task-template set and the maintainer-oriented multi-cadence improve task set — in one pass. See the task CLI reference for the full template list.
akm setup
Before any OS scheduler change, setup shows every reviewed task's schedule and enabled state and asks one explicit activation question. Confirming runs the scheduler sync; declining leaves both task files and scheduler state unchanged.
Safety note: schedule activation always requires an explicit confirmation after reviewing the complete task summary. Nothing is written to the OS scheduler without that review step.
Verify
akm task doctor
akm task doctor reports the scheduler backend, paths, task state, and
warnings — run it after any setup pass, and again after a --rebind (below),
to confirm the scheduler state matches what you expect.
Non-interactive setup never activates schedules
akm setup --yes, config-file setup, and CI runs skip the task step
entirely: neither task definitions nor OS scheduler entries are created or
changed. Run interactive akm setup to review, prepare, and activate tasks.
Task definitions vs. scheduler state
Task definitions live under <bundle>/tasks/ as task source v4 .yml sources;
the task source reference defines their executable and
scheduling grammar. A definition cannot enable itself: the refs this host schedules live
separately in config.json under scheduler.enabled, a list of
fully-qualified refs. Use akm task enable <bundle>//tasks/<id> or akm task disable <ref> to change it without editing bundle content. An unscoped akm task sync installs exactly the listed refs from every enabled configured
bundle and removes akm-written bindings for refs that are gone or no longer
listed. Removing a bundle drops its refs from the list; disabling a bundle
leaves them inert.
Native scheduler entries are separate OS state. Activation captures the
installed akm runtime so scheduled execution does not silently switch to a
different checkout or package. Editing definitions and running ordinary akm task sync preserves that captured runtime.
A scheduled fire re-reads the guarded current source and creates a fresh
durable-v4-family freeze at executable irVersion: 5.
Scheduler sync/validation evidence is not an executable snapshot and is never reused as the later run plan.
A scheduled akm improve covers one bundle
An akm improve run improves one bundle, the one it writes to: --bundle,
else defaultWriteTarget, else the working bundle. A scheduled row sets
AKM_BUNDLE_DIR to the working bundle of the shell that synced it, so a
scheduled akm improve covers that bundle (or defaultWriteTarget, when set)
and leaves your other bundles alone, even the writable ones. To improve
another bundle on a schedule, give it a task of its own; the --bundle inside
the command is akm improve's own:
akm task add improve-team --schedule "15 3 * * *" \
--command "akm improve --bundle team --skip-if-locked --require-engines"
Rerunning setup preserves scheduler bindings
Rerunning akm setup preserves existing scheduler bindings by design — it
will not silently rebind entries that are already activated.
Upgrades
A config written before 0.9.17 has no scheduler.enabled list. The first
akm task sync (or setup, task enable, task disable, task add) after
the upgrade takes the akm-written rows already installed in the native
scheduler as this host's choice, writes the list, and says so — a scheduled
task survives an upgrade by any install method with no manual step. An
explicit empty list is a choice: sync then removes every akm-written row.
akm migrate status reports anything else that remains pending, and why.
Migrating or repairing scheduler bindings (--rebind)
If akm was moved, reinstalled under a different package prefix, or repaired after an installation problem, migrate scheduler entries deliberately:
akm task sync --rebind
akm task doctor
Use --rebind only for that explicit runtime migration or repair — it
captures the current installed runtime, replacing whatever runtime a prior
activation had captured.
If you change the AKM storage path during reconfiguration, or move or install
akm at a new runtime path, follow setup with akm task sync --rebind; setup
never silently rebinds existing entries on your behalf.
See also
- Getting Started — the first-run path this guide was split out of
- CLI Reference: task — the full
taskcommand group, includingadd,enable,disable,run,sync,doctor, andhistory - Task source reference — exact file grammar, targets, triggers, and migration