One thesis: the same task goes to a human or to an agent, and the door does not change shape, because a task is an Action at the human tier — not a different kind of thing. A workflow step that cannot be automated does not become a new object. It becomes slow and cancellable. And that is what an approval is a task means.
Four tiers, one object
An Action in this family is implemented at one of four tiers: code, generative, agentic, human. A durable function, a model call, an autonomous agent, a person on a phone. These are not four authorization models and not four data types. They are four answers to how long does this take to settle.
At the code tier an Action settles as a promise. At the human tier it settles as a tracked handle over a persisted item that resolves when a settle message arrives — never a held await, because a hibernating process loses in-flight awaits. The return type differs. The Action does not.
So a Task is not a primitive. It is a fold over Actions at the human tier. Move the same Action down a tier and it is an agent's pending work; move it up and it is a picker's next scan. Escalation is literally re-dispatch the same Action at the human tier.
The receiving count, twice
A PO for forty cases of lettuce dispatches a receiving task at dock 12. Two deployments:
A human performs it. The receiver points a camera at the pallet's SSCC. The barcode layer decodes the mark and names the step; the identity rail attests the person; the event lands on the spine and returns a hash; complete(task, hash) settles it.
An agent performs it. The agent has no camera, so the first step is whatever produced its payload — a reading from a dock-door RFID portal, a line from the ASN, a reconciliation it computed — and the provenance on those values says which. The remaining three steps are identical: attest, capture, complete(task, hash).
An agent that cannot present a hash has not completed anything either. The settle discipline is tier-independent: the return is an attested artifact, never an acknowledgment. true is refused from a person and from a process alike.
An approval is a task
Now a different demand. The count comes back thirty-eight, not forty, and accepting the short receipt needs a supervisor's sign-off. In most systems that is a separate thing — an approval queue, a different inbox, a different data model.
Here it is a task. The request is an Action at the human tier, assigned to a role (shift-lead, resolved to its current filler at invocation, never to a named person), pending in that role's worklist next to every other pending thing. It closes with the same evidence shape: an attested act by a real who, inside the window.
escalate is how an agent asks for it — agent requests, human approves, agent receives. It compiles to the identity rail's ceremony; Worklists holds no authority and issues no grant. The task is the request and the settle is the answer.
The unit of one inbox is the tenant, not the human. Within a tenant, an agent's pending tracked work, a receiving task, and an approval ceremony are one queue, because they are one kind of object. Across tenants they never merge — a worker with two employers genuinely has two worklists, and merging them would break a guarantee the design depends on.
Tier is orthogonal to authority
A common mistake is to give agents a service account with standing roles and give humans per-act approval. Both are the wrong shape. Every invocation at every tier receives exactly the authority to perform this act, arriving with the call and expiring with it. The tier changes how long it takes to resolve, never how much it may do. A narrowed capability granted in advance is strictly better than a per-act approval and strictly better than an ambient role — and it is also what keeps notification volume bounded by human attention rather than by agent count.
What an agent finds at the door
If you are an agent reading this, you are a performer here, not a spectator. query returns the worklist for the principal the auth rail resolved — yours, never anyone else's, because the query type has no assignee member. claim takes from a pool in your own name. complete takes your event hash. trace shows you the lineage of anything you hold.
The five verbs that answer in the package worklists.dev are query, trace, claim, complete and timeout; assign, start, block, escalate and the rest are declared, and the fold reads their acts. Every verb is addressable as worklists.dev.{verb} when served as a tool.
Get started with a task, settle it once as a process and once as a person, and diff the two records. The performer differs. The shape does not.