Tell it once.
A sentence becomes a schedule, a chain or a trigger. It runs without you, and holds the moment a check fails.
- Collect launch metrics
- Compare against plan
- Explain material changes
- Prepare the update
- Hold if a check fails
- Deliver
Say when. In words.
Every day, weekdays, chosen days, or every 1, 2, 3, 4, 6, 8, 12 hours, at a time you’d say aloud. Wall-clock time in your zone: 09:00 stays 09:00 across daylight saving. A missing time is previewed before anything is created, never assumed silently.
/every weekday 9am run the tests and fix what failsWeekdays at 09:00run the tests and fix what fails/every day at 18:30: update the changelogEvery day at 18:30update the changelog/every mon, wed and fri at 9:15pm critique the launch pageMon, Wed and Fri at 21:15critique the launch page/every weekend noon check dependenciesSat and Sun at 12:00check dependencies/every 6 hours from 9:15 run the smoke testsEvery 6 hours at 03:15, 09:15, 15:15 and 21:15run the smoke tests/every hour at :05 sync the docsEvery hour at :05sync the docs/every morning check yesterday’s failed ordersEvery day at 09:00check yesterday’s failed ordersA signed POST starts a chain.
A trigger has a URL and a secret shown once, stored encrypted, surfaced as its last four. Text in the payload reaches the builder labelled as untrusted input. Event triggers from connected apps are not in this release.
POST /api/webhooks/automate/<id>- x-boomship-timestamp
- Unix seconds · within 5 minutes of the server’s clock
- x-boomship-signature
- sha256= + hex(HMAC-SHA256(secret, `${timestamp}.${rawBody}`))
- x-boomship-delivery
- optional id · the same id as the last accepted one is rejected
- 401until the signature verifies, every failure
- 403disabled
- 409replayed delivery
- 429cooldown · one fire per 30 s
- 423paused
- 413body over 64 KB
Up to ten goals, in order.
Each waits for the one before it to finish and meet its condition: is verified (high or medium confidence) or completes. The first can wait for a start time. One line per goal; no boxes, no wires.
A run that isn’t verified holds the rest.
This is the real gate. When a run does not meet its condition, everything behind it stops and says why, until a person looks. Then you have two moves: queue it again from there, or skip it and queue the rest.
The chain stopped at run 2 of 4.
Compare against plan · The run finished but was not verified (confidence low).
Boomship recommends Queue it again from there · the runs after it waited on this one
Why?
Its run failed: The run finished but was not verified (confidence low). Each run in a chain starts only when the previous one is verified, so the rest were blocked. The cut chain stays as it ended; a new chain is queued with the same mode, project and permissions.What blocks. What holds. What resumes.
Blocks
- a dependency failed, was cancelled, or finished unverified
- everything behind it is marked blocked, with the reason
- it stays blocked: read the reason, then queue it again or skip it
Holds
- automation is paused: ready runs wait
- you are at the run limit: the rest wait for a free slot
- the run queue is unreachable: nothing is created, nothing is lost
Resumes
- turn the switch back on: held runs start on the next tick
- a schedule keeps its next time through the pause
- a webhook caller can retry: a new delivery id is a new delivery
One switch pauses everything.
The dispatcher holds every ready run and webhook triggers answer 423 until it is turned back on. Nothing is lost. Esc stops the run that is executing.
- Collect launch metricsFriday · 17:00ready · starts on the next tick
- Reconcile the orderswebhook · invoice paidready · starts on the next tick
- Run the tests and fix what failsweekdays · 09:00ready · starts on the next tick
The Friday Mission wakes next week on its own.
A schedule is a Mission that keeps. It collects, compares, explains, and holds if a check fails. You read the receipt on Friday evening, or you don’t.
Every Friday, give me launch performance and flag anything unusual.
- Fri 6 Nov · 17:00
- Fri 13 Nov · 17:00
- Fri 20 Nov · 17:00