Estimate: 14m · Depends on: 2.5.3, 2.5.9
Wire the [Filter] affordance into a working filter bar over the tree: a Popover (or inline bar) exposing kind (issue-type multi-select), status (the project's workflow statuses), assignee (workspace members + "Unassigned"), and a text quick-filter (identifier + title). Each filter feeds getProjectTree's context-preserving filter (2.5.1) so matches keep their ancestor chain.
Durable shape: state lives in the URL. Filters serialize to query params (e.g. ?kind=bug&status=in_progress&assignee=…&q=…) so a filtered view is shareable / bookmarkable / reload-safe, and the Server Component reads them directly — this is the exact serialization Epic 6's saved filters will persist, so v1's filter URL is the forward-compatible substrate, not a throwaway. A "clear filters" affordance resets to the full tree; an active-filter count shows on the Filter button. Reuse the shared pickers (Combobox / StatusPicker options source / member combobox) — no new picker components.
design/work-items/filter.mock.html + design-notes.md — produced by the type: design subtask 2.5.9 (in depends_on); match its popover layout, the four filter groups, the active-count badge, and the clear affordance.getProjectTree filter contract; 2.5.3 route (where the bar mounts)components/ui/Combobox / Popover; StatusPicker option source; the workspace-member combobox used by AssigneePicker; ISSUE_TYPE_METAnext/navigation useSearchParams / useRouter URL-state pattern; the workflow-settings filter UI for prior art