--- # nbd-4w8z title: Exclude done tickets from nbd list by default status: completed type: feature priority: high created_at: 2026-03-10T23:30:30Z updated_at: 2026-03-10T23:30:32Z blocked_by: - nbd-p9na --- ## Summary Change `nbd list` to hide `done` tickets by default. Users must explicitly opt in via `--filter status=done` or `--filter status=*` to see completed tickets. This is a **breaking change in default behavior**. Depends on: `--filter` wired into `list` (ticket 887344). ## Current behaviour `nbd list` shows ALL tickets regardless of status. ## New behaviour | Command | Shows | |---|---| | `nbd list` | todo + in_progress only (done excluded) | | `nbd list --filter status=done` | done only | | `nbd list --filter status=*` | all tickets (all statuses) | | `nbd list --filter status=todo --filter status=in_progress` | todo and in_progress | | `nbd list --filter type=bug` | non-done bug tickets (done still excluded) | | `nbd list --filter type=bug --filter status=*` | all bug tickets including done | The key rule: **if the user provides no `status` filter key, done tickets are excluded**. If the user provides any `--filter status=...` argument, the explicit status filter is used as-is with no implicit exclusion. ## Implementation (src/main.rs) In `cmd_list`, after parsing the filter and loading tickets, apply the logic: ```rust let filter = filter::parse_filters(&filter_args)?; let tickets = list_tickets(&root).await?; let tickets: Vec = tickets .into_iter() .filter(|t| { // If no status filter was provided by the user, exclude done tickets. let status_ok = if filter.has_status_filter() { // User expressed intent about status: use their filter. filter.matches_status(t) } else { // Default: hide done tickets. t.status \!= Status::Done }; // Apply remaining filter keys (type, priority, title) regardless. status_ok && filter.matches_except_status(t) }) .collect(); ``` This requires two additional methods on `TicketFilter` (add to `src/filter.rs`): ```rust /// Returns true if the ticket's status matches any of the status patterns. /// Caller is responsible for only calling this when `has_status_filter()` is true. pub fn matches_status(&self, ticket: &Ticket) -> bool; /// Returns true if the ticket matches all non-status filter groups (type, priority, title). /// The status group is intentionally excluded so callers can handle it separately. pub fn matches_except_status(&self, ticket: &Ticket) -> bool; ``` ## CLI help text update Update the `List` variant doc comment: ```rust /// List tickets sorted by priority (highest first). /// /// By default, tickets with status `done` are excluded. Use /// `--filter status=*` to include all tickets, or /// `--filter status=done` to show only completed tickets. List { #[arg(long = "filter", value_name = "KEY=VALUE")] filter: Vec, }, ``` ## Existing tests that need updating The integration test `list_shows_created_tickets` creates two tickets with default status (`todo`) and asserts both appear in `nbd list`. This test is unaffected because the default tickets are not done. However, any future test that creates a ticket and immediately lists without marking it done will still work. Check: is there any existing test that creates a done ticket and expects it in `nbd list`? If so, update that test to use `--filter status=done` or `--filter status=*`. ## New integration tests to add (tests/integration.rs) - Create two tickets: one todo, one done. `nbd list` shows only the todo one. - Create two tickets: one todo, one done. `nbd list --filter status=done` shows only the done one. - Create two tickets: one todo, one done. `nbd list --filter status=*` shows both. - Create 3 tickets: bug/todo, bug/done, task/todo. `nbd list --filter type=bug` shows only bug/todo (done excluded by default). `nbd list --filter type=bug --filter status=*` shows both bug tickets. - `nbd list --json` does not include done tickets (verify JSON array length). - `nbd list --filter status=* --json` includes done tickets. ## README update Update the "List all tickets" section in README.md: ``` ### List all tickets ```sh nbd list # excludes done tickets nbd list --filter status=* # all tickets including done nbd list --filter status=done # only completed tickets nbd list --filter type=bug # non-done bug tickets nbd list --json ``` ``` ## Files touched - `src/main.rs` — `cmd_list` implementation and `List` help text - `src/filter.rs` — `matches_status`, `matches_except_status` methods - `src/tests.rs` — unit tests for new filter methods - `tests/integration.rs` — new tests, update any affected existing tests - `README.md` — updated usage section