qualifier 0.8.0

Deterministic quality annotations for software artifacts
Documentation
+++
name = "threads"
summary = "List conversation threads (roots, replies, open/closed) across the project"
sees_also = ["reply", "resolve", "show"]
since = "0.8.0"
+++

# qualifier threads

## Purpose

List every open thread in the project: the root annotation, its live
replies, and whether it is closed. This is the entry point for triage,
planning, and "what is open on the code I'm about to touch".

## Usage

```bash
qualifier threads                           # all open threads
qualifier threads src/net                   # under src/net, or on src (an ancestor)
qualifier threads 'src/**/*.rs'             # glob (* does not cross /)
qualifier threads src/net/tcp.rs:40:80      # span overlaps 40–80, span-less on the file, or on src/net, src
qualifier threads 3f9a2c1d                  # thread containing a record with this ID prefix
qualifier threads --kind blocker,concern
qualifier threads --tag 'status:*'          # tag on root or a live reply (or closed_by, with --all)
qualifier threads --status needs-decision   # latest status:* tag on the thread
qualifier threads --changed-since main      # root subject changed vs. main (git only)
qualifier threads --all                     # include closed threads
qualifier threads --format json             # one JSON array
qualifier threads --summary                 # 0-2 line digest for session-start hooks
```

A path filter also matches threads on the path's ancestor directories: a
concern on `src/net` shows up for `qualifier threads src/net/tcp.rs:40:80`,
as does a span-less blocker on `src/net/tcp.rs`. An argument of 4+ hex
characters is an ID prefix and matches the thread containing that record —
as root, origin, history, reply, or `closed_by` — so
`qualifier threads <id> --format json` fetches one thread without pulling
the whole project. Write `./cafe` for a directory whose name is all hex.

Locations are relative to the current directory; subjects are stored
relative to the project root. From `src/`, `qualifier threads net/tcp.rs`
and `qualifier threads ../src/net/tcp.rs` both select `src/net/tcp.rs`.

## JSON shape

```json
[{"origin": "<full id>", "open": true,
  "root": { ...record... }, "closed_by": null,
  "history": [{ ...record... }],
  "replies": [{"active": true, "record": { ...record... }}],
  "latest_at": "2026-09-24T10:00:00+00:00"}]
```

Reply to or resolve `root.id` — the live head — not `origin`, which may be
superseded.