Ownership is fixed at creation
A thread binds to the subject that created it and to the agent named at creation. Neither changes afterwards. Because reads are scoped to(workspace, subject), asking for someone else’s thread returns 404 rather than 403 — from that subject’s point of view the thread does not exist.
Listing
GET /v1/loom/threads returns the subject’s recent active threads, most recently updated first. Each entry carries a title derived from the first user message, a message count, a preview of the last message, and — importantly — whichever pending_* field says what the thread is waiting for.
That list endpoint is how a polling client discovers a paused run. See Runs and states.
A subject is required
Threads are partitioned by subject, so every call to them names one. In relay that meansPatchwork-Subject on each request; with a session token the subject comes from the signed sub and there is nothing to send.
Omitting it is a 400 subject_required, not a wider result set. There is no way to read across subjects: a request that does not say who it is for cannot be answered, because the honest answer would be somebody else’s conversations.