# The work door, written down — worklists.dev

- [A task is the causal parent of its events](https://worklists.dev/blog/a-task-is-the-causal-parent-of-its-events/) — 2026-08-20
  An event says what happened; it has never said what it was for. A task supplies the missing parent, so the record reads "this was scanned because this task said to" — and the join is a hash, not a foreign key.
- [A worklist is a query, never a store](https://worklists.dev/blog/a-worklist-is-a-query-never-a-store/) — 2026-08-20
  There is no Task table with a status column. A task's status is a fold over its own acts, a worklist is a predicate over those folds, and the materialized list exists only because the ledger can regenerate it.
- [Assign is the push, claim is the pull](https://worklists.dev/blog/assign-is-the-push-claim-is-the-pull/) — 2026-08-20
  Two verbs move a task to a performer, and they are not the same act. assign is a routing decision somebody maintains; claim is a performer taking the next thing. A pull is not management, and the line between them decides what is free.
- ["`complete` takes an event hash, not a boolean"](https://worklists.dev/blog/complete-takes-an-event-hash/) — 2026-08-20
  A workforce system knows a button was pressed. A task closed with an event hash knows that an attested who scanned at an attested place inside the window. The type signature is the whole product.
- [Dispatch converts demand; it never invents it](https://worklists.dev/blog/dispatch-converts-demand-it-never-invents-it/) — 2026-08-20
  Every task on this door can name what dispatched it — a document, an exception, a plan or a schedule. dispatch is the compile-down from demand to work, and the reason a work door belongs next to an event spine at all.
- [Object → performer is the product; performer → objects is refused](https://worklists.dev/blog/object-to-performer-is-the-product/) — 2026-08-20
  "Who touched this pallet?" is the question a work door exists to answer. "What has this person done?" is the same join read backward, and it is refused where queries are constructed — in the grain, the group-by, the parameters and the rendered keys.
- [The same task goes to a human or an agent](https://worklists.dev/blog/the-same-task-goes-to-a-human-or-an-agent/) — 2026-08-20
  A task is an Action at the human tier. The same object runs as code, as a model call, as an agent, or as a person on a phone; the tier changes how long it takes to settle, never its shape. An approval is a task.
- [Timeout is a state, not a silence](https://worklists.dev/blog/timeout-is-a-state-not-a-silence/) — 2026-08-20
  On an append-only ledger a state change with no actor must be explicit. A breached deadline is written by an alarm, never by a person; a block belongs to whoever raised it; and escalate is a separate act by a separate party.
