Two trigger types · Declared in your project config · Reviewed like any change
daily-digest · 0 0 9 * * 1-5
Weekdays at 09:00, America/Los_Angeles
| Trigger | Cron | Timezone | Agent | Session |
|---|---|---|---|---|
| daily-digest | 0 0 9 * * 1-5Weekdays at 09:00 | America/Los_Angeles | machine | fresh |
| invoice-sweep | 0 30 6 1 * *The 1st of the month at 06:30 | Europe/Berlin | finance | reuse |
| oncall-handoff | 0 0 17 * * 5Fridays at 17:00 | UTC | support | fresh |
| roadmap-review | 0 0 8 * * 1Mondays at 08:00 | America/New_York | planner | pinned |
# fires on the clocktriggers: - slug: daily-digest type: cron agent: machine cron: "0 0 9 * * 1-5" timezone: America/Los_Angeles session_mode: fresh prompt: | Summarize yesterday’s commits. Open a change request against main. # fires on an event - slug: new-lead type: webhook agent: sales secret_env: WEBHOOK_SECRET prompt: >- A new lead arrived: {{ body.name }} ({{ body.email }}). Add it to the CRM.# add it, ship it, and the schedule is live$ machine triggers add daily-digest --type cron \ --cron "0 0 9 * * 1-5" \ --timezone America/Los_Angeles \ --prompt "Summarize yesterday. Open a CR."$ machine ship→ project config pushed. daily-digest is scheduled. # every trigger, and when it last fired$ machine triggers ls # no need to wait for 09:00 to find out$ machine triggers fire daily-digest→ session startedA prompt fills in {{ token.dotted.path }} from whatever fired it. A webhook fire gets {{ body.* }} and the request headers. A cron fire gets {{ cron.schedule }}, {{ cron.timezone }} and {{ cron.scheduled_for }}. A missing value renders as nothing: no error, and no stray braces in the message your agent reads.
POST /v1/webhooks/projects/{projectId}/{slug}
X-Hub-Signature-256: sha256=<hmac>
HMAC-SHA256 over the raw request body, compared in constant time. Machine reads its own signature header or the GitHub-compatible X-Hub-Signature-256, so a repo webhook works with no adapter.