tix-tracker 0.11.0

A terminal issue tracker: markdown + YAML frontmatter issues with a kanban TUI and CLI
Documentation
# Testing

`mise run ready` is the full gate: version sync, formatting, clippy, the module
size guard, the test suite, and the doctests. This page explains how the suite is
built and how to run parts of it quickly.

## Layout

| layer | location | runner |
|---|---|---|
| unit + in-process integration | `src/**/tests/` (including the TUI state suite) | lib test binary |
| CLI, MCP, sync, domain and parity integration | `tests/*.rs`, grouped into six crates by `tests/suite_*.rs` | integration binaries |

Integration tests are **not** auto-discovered. `Cargo.toml` sets
`autotests = false` and declares six `[[test]]` targets: `suite_cli`,
`suite_mcp`, `suite_sync`, `suite_core`, `suite_planning`, and `suite_parity`.
Each group file lists its members with `#[path = "<file>.rs"] mod <file>;`, so a
test still runs under its original module name (e.g.
`suite_cli::cli::create_rejects_an_unknown_status`). Adding a new `tests/foo.rs`
means adding `#[path = "foo.rs"] mod foo;` to the most appropriate group —
otherwise it is never compiled.

Grouping exists because every separate test file used to be its own link of the
full library; 100 links dominated cold builds and filled `target/debug` (tix
#1745).

## Profiles and linker

`[profile.dev]` and `[profile.test]` set `debug = 0`. That keeps `target/` about
5x smaller and roughly halves a cold build; panic messages keep file/line, but
backtrace frames lose source locations. If you need full backtraces locally, run
with `CARGO_PROFILE_TEST_DEBUG=2` (and accept the larger rebuild).

`.cargo/config.toml` links Linux targets with `lld`. If your checkout has no
`lld`, override the rustflags for your run or remove that target table locally.

## Running

```sh
mise run test                     # nextest + doctests
mise run ready                    # full gate
cargo nextest run                 # the whole suite, parallel across binaries
cargo test --doc                  # nextest does not run doctests
cargo test --lib                  # unit + in-process suite only
cargo nextest run -E 'test(suite_cli::cli)'   # one group/module
```

All mise tasks are file tasks in `.mise/tasks/` (not `[tasks.*]` in
`mise.toml`), so `mise run test` forwards no arguments and runs exactly the same
commands documented here.

`cargo test` still works and is the fallback, but it runs the six integration
binaries one at a time; nextest runs them concurrently (`mise run ready` uses
nextest).

### Timing-sensitive tests

The suite contains assertions such as `elapsed < 500ms` over 10,000-issue
workloads. `.config/nextest.toml` puts those (`ten_thousand`, `10000`, `budget`,
`under_500ms`, `within_the_structural`, `one_pass` in the test name) into a
single-threaded `timing-sensitive` test group, so they do not measure scheduler
contention. Add a timing budget to a test whose name does not match that filter
by extending the override in `.config/nextest.toml`.

## What was measured and not adopted

`[profile.test] opt-level = 1` shortened the test phase from 54.5s to 42.6s, but
the rebuild cost ~2 extra minutes and grew `target/` to 3.2G; the suite is run
far more often than the 10k-issue budgets change, so the default `opt-level = 0`
stays. Revisit if those budget tests become the dominant cost.

## CI

CI should run `mise run ready-ci`, which sets `CARGO_INCREMENTAL=0` (incremental
artifacts do not pay off on a clean runner) and delegates to `ready`. Cache
`target/` between runs, keyed by the lockfile and toolchain; with `debug = 0`
the cached tree is small (~2G instead of ~11G). `mise run coverage` summarises
line coverage (`cargo llvm-cov nextest --summary-only -j 4`) when deciding
whether a test adds unique coverage. Current baseline: **89.7% lines / 91.0%
functions / 90.4% regions** (tix #1745, 4,443 tests).

The redundant harness that motivated the tooling search is gone: the former
`tests/tui_state.rs` (304 in-process `App` tests) now lives beside the other
`src/app/tests` modules. Literal duplicate test names across the suite: 0.