Run a search on /search. Each result row carries a checkbox; tick one or more (or use "Select all" to grab the whole result set, capped at 50 hits per page) and a sticky action bar appears at the top of the list:
- **Add to collection** — pick any tenant collection from the dropdown, click Apply. Rule-derived members are not affected; the action only adds explicit pinning. - **Apply retention class** (owner / admin only) — pick a class, click Apply. Each doc gets the class applied via the same setDocumentRetentionClass tool the agent uses, so deny-wins on legal hold and the audit log behave identically to the single-doc UI. - **Trash with reason** — required free-text reason, then click "Trash N". Tombstones each doc one at a time; legal hold blocks tombstone (deny-wins), and the result banner reports per-doc which ones refused.
Results are reported as a banner: "30 succeeded, 2 failed" with per-doc reasons (e.g. "active legal hold blocks deletion"). A failure on one doc doesn't roll back the others — partial success is the expected shape, since governance gates are per-doc.
Capacity: - Up to 100 documents per call. Larger batches surface an error asking you to split — the cap keeps audit-log fan-out bounded so a 10,000-doc bulk action can't drown the chain in one go. - Each operation respects the same plan caps as the single-doc UI: a Free-tier tenant won't be able to bulk-add 200 docs to a collection because the document-count cap (100) would already be in play.
The agent can do the same thing from natural language: "add every regulated PDF from 2025 to the Smith matter" runs hybridSearch with that filter, then loops addDocumentToCollection per hit. The bulk action bar is the UI affordance for the same workflow without typing.