Author, test, debug, and operate Absurd durable workflows. Use when working with WorkflowContext, tasks-orchestrator, parallelTasks, issue-lifecycle, multi-lens-review, Absurd queues, checkpoints, events, retries, idempotency, worker recovery, absurd-sdk, or uvx absurdctl.
69
84%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Use this skill when the project uses Absurd, the Postgres-native durable workflow engine, or when the user mentions uvx absurdctl, queues, durable tasks, runs, retries, sleeping tasks, or events.
For code changes, read authoring and recovery before editing. It covers replay, decomposed checkpoints, immutable events, external idempotency, fan-out, and process-recovery tests. The operational playbook below remains the starting point for live task inspection.
t_, r_, c_, e_, w_).Important distinction:
task_id = the whole workflow across all attemptsrun_id = one specific execution attemptRun the released CLI through uvx absurdctl; do not prepend the repository to
PATH or invoke a checkout-local binary.
Absurd connection precedence is:
--database > ABSURD_DATABASE_URL > PGDATABASE > postgresql://localhost/absurdFor non-URI connections, PGHOST, PGPORT, PGUSER, and PGPASSWORD are also honored.
Prefer uvx absurdctl state inspection before source inspection. Usually you do not need to read application code first.
If the user explicitly asks you to use uvx absurdctl to inspect or fix a workflow, do that first instead of starting with rg / source browsing.
When the user wants to debug a task, start with these commands in order:
uvx absurdctl list-queuesuvx absurdctl list-tasks --queue=default --limit=20Notes:
list-tasks defaults to 50 rows if --limit is omitted.pending, running, sleeping, completed, failed, cancelled.uvx absurdctl list-tasks --queue=default --status=failed --limit=20
uvx absurdctl list-tasks --queue=default --status=sleeping --limit=20uvx absurdctl dump-task --task-id=<task-id>
uvx absurdctl dump-task --run-id=<run-id>dump-task is the most important inspection command. It shows things like:
faileddump-task --task-id=<task-id>--run-id.sleepingdump-task --task-id=<task-id>runningdump-task --task-id=<task-id>Do not assume you need to start or modify a worker.
pending to sleeping, running, or completed, a worker is already active.pending, then investigate whether a worker for that queue is actually running.After you know the task name, search the codebase for its registration.
TypeScript / JavaScript:
rg -n "registerTask\(|name:\s*['\"]<task-name>['\"]" .Python:
rg -n "register_task\(|@.*register_task|['\"]<task-name>['\"]" .If the task is waiting for an event, also search for the event name.
Use -P key=value for strings and -P key:=json for typed JSON values.
uvx absurdctl spawn-task my-task -q default -P foo=bar
uvx absurdctl spawn-task my-task -q default -P count:=42 -P enabled:=true
uvx absurdctl spawn-task my-task -q default -P user.name=Alice -P user.age:=30Use --params when the user already has a JSON object:
uvx absurdctl spawn-task my-task -q default --params '{"foo":"bar","count":42}'uvx absurdctl retry-task <task-id>
uvx absurdctl retry-task <task-id> --max-attempts 5
uvx absurdctl retry-task -q default <task-id> --spawn-newGuidance:
retry-task retries the existing task--spawn-new creates a brand-new task with the original inputsuvx absurdctl cancel-task <task-id>
uvx absurdctl cancel-task -q default <task-id>uvx absurdctl emit-event order.completed -q default -P orderId=123
uvx absurdctl emit-event approval.granted:42 -q default -P approved:=trueIf the event payload should be structured JSON:
uvx absurdctl emit-event shipment.packed:42 -q default --payload '{"trackingNumber":"XYZ"}'Use these on a blank or controlled database, or when the user explicitly asks:
uvx absurdctl init --ref 0.4.0
uvx absurdctl schema-version
uvx absurdctl migrate --to 0.4.0
uvx absurdctl create-queue defaultThe schema version is pinned by repository policy. Do not run unversioned
init or migrate against a MoltNet database.
Be careful with state-changing commands. Unless the user clearly wants them, avoid running these blindly on a shared or production database:
initmigratecreate-queuedrop-queuecleanupcancel-taskretry-taskemit-eventspawn-taskIf the environment is ambiguous, ask which database / queue is safe to operate on.
defaultuvx absurdctl list-queues
uvx absurdctl list-tasks --queue=default --status=failed --limit=20
uvx absurdctl dump-task --task-id=<task-id>uvx absurdctl list-tasks --queue=default --status=sleeping --limit=20
uvx absurdctl dump-task --task-id=<task-id>
uvx absurdctl emit-event <event-name> -q default -P key=valueuvx absurdctl spawn-task my-task -q default -P foo=bar
uvx absurdctl list-tasks --queue=default --task-name=my-task --limit=5
uvx absurdctl dump-task --task-id=<task-id>Fast path when the user says “spawn a task and debug it”:
uvx absurdctl spawn-task my-task -q default -P foo=bar
uvx absurdctl list-tasks --queue=default --task-name=my-task --limit=5
uvx absurdctl dump-task --task-id=<task-id>
# then either:
uvx absurdctl emit-event <event-name> -q default -P key=value
# or:
uvx absurdctl retry-task <task-id>uvx absurdctl <command> --help for full options.dump-task --task-id is usually the best starting point once you know the task.5daa9ca
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.