tasq

The model

Four things most tools collapse into one.

Task, claim, attempt and evidence are separate records. Keeping them apart is what lets a replacement worker tell intent from execution, and execution from outcome.

Task

The outcome that is still owed. It survives the session, the process and the model that created it. A task is not a message, not a plan step and not a runtime state.

Claim

An exclusive, expiring right to work on one task. Claims are how two workers avoid starting the same thing. A refused claim tells you someone already holds it and when their hold ends.

Claims expire on purpose. A worker that crashes stops owning its task without anyone intervening.

exclusive ownership
tasq claim <id> --for 30m
# refused: Task <id> is claimed by agent-a until 14:20Z

Order without a scheduler

Record that one task waits on another with a dependency, and `tasq next` stops offering the blocked one until its blocker closes. Nothing schedules the work: the queue simply stops proposing what is not actionable yet.

dependencies
tasq depend <id> --on <other-id>
tasq next        # the blocked task is absent until its blocker is done
tasq next --priority 5   # only what you marked most important

Attempt

One execution, successful or not. An attempt succeeding is not the task being done: the command ran, which is a different claim about the world than the outcome being true.

This distinction is the entire point. Most tools treat a successful run as a completed outcome, which is how an agent ends up reporting work it did not finish.

Evidence

The receipt used to justify completion: a commit, a file, a command output, a link. Evidence-backed tasks refuse to close without their success criteria being stated up front.

Be precise about the guarantee. Tasq checks that the evidence exists, belongs to the task, and is referenced by the completion. It does not verify what the evidence asserts. That still beats an assertion, because it leaves something a human or a later process can check, but it is not proof by itself.

closing with proof
tasq evidence add <id> --kind commit --uri "git:9f2c1ab"
tasq done <id> --evidence <evidence-id>

An attempt succeeding never completes its task automatically, and validated tasks cannot be completed by evidence alone.