Kerno triggers each task through your own broker, the way your app does, and verifies what it changed.
Celery tasks, Graphile Worker jobs and scheduled work each become their own subject, with their own scenarios.
Kerno publishes to Redis, RabbitMQ or your own Postgres job queue, the same path your application uses.
A dynamic task name or a queue resolved at deploy time is reported with the reason, and never guessed.
Kerno reads the rows a job wrote and subscribes to what it published, then checks both against the run.
Each scenario arranges its own rows and its own correlation id, so a scheduler firing mid-run cannot skew it.
The assertions from the last run are the baseline, so a changed outcome or payload shows up as a diff.
Terminal state, task outcome, and the work a job actually did.
Consumer handling, message payloads, and chained task dispatch.
Beat entries, cron registrations, and the task behind each one.
Rows created, updated and removed, checked against your own schema.
Payloads a job emits, the queues it lands on, and their shape.
A repeat dispatch, and whether the same effect lands twice.
Write a rule the way you would explain it to a new engineer, and scope it to the repositories and paths it applies to.
Agent instruction files, service READMEs and the docs in your repository shape how every job gets tested.
Kerno learns from each run and the feedback you give it, and carries what it learns into the tests that follow.
Got any extra questions? Reach out on our community channel and we'll be happy to help.
Kerno discovers the task, triggers it by publishing to the broker the way your app does, and verifies the rows it wrote and the messages it published.
Yes. Kerno discovers queue consumers and tests how they handle messages, including the rows and messages they produce.
Yes. Kerno reads your beat entries and cron registrations, then tests the task behind each one by dispatching it the way the scheduler would.
By publishing to the broker, the same path your application uses, so the job runs the way it does in production.
Celery on Python and Graphile Worker on TypeScript and JavaScript, each triggered through your own broker. SQS handlers declared in a serverless manifest are discovered with their queue and arguments.
Yes. Committed scenarios replay in CI on every change.