qualifier 0.4.0

Deterministic quality annotations for software artifacts
Documentation
# Changelog

All notable changes to this project are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) (with
the pre-1.0 caveat that any breaking change bumps the minor version).

## [0.4.0] — unreleased

This release is a substantial reshape: the CLI surface narrowed, scoring
left the format, and project bootstrap was retired. Earlier history lives
in git; this is the first changelog entry.

### Removed

- **`qualifier score` and `qualifier check`** — the scoring engine and
  CI gating commands. The format no longer carries a `score` body field
  on annotations or epochs. Scoring is reframed in SPEC §4 as one
  optional layer a tool may add via custom body fields, with a polarity
  table in §2.7.1 as the only stable hook.
- **`qualifier init` and `qualifier graph`** — project bootstrap and
  dependency-graph visualization. The graph engine (`src/graph.rs`) is
  gone. `dependency` records and the `Record::Dependency` variant
  remain in the wire format and round-trip unchanged.
- Per-kind verbs **`qualifier {comment, flag, suggest, approve, reject,
  attest}`** — collapsed into the unified `qualifier record <kind>`.

### Added

- **`qualifier record <kind> <location> [message]`** — the unified
  annotation-write verb. Accepts the built-in kinds plus any custom
  string. `<location>` carries an optional span (`src/foo.rs:42` or
  `src/foo.rs:42:58`).
- **`qualifier emit <type> <subject> --body '<JSON>'`** — low-level
  passthrough for any record type. Bodies for non-`annotation` types
  round-trip via `Record::Unknown`. Supports `--stdin` batch input.
- **`qualifier reply <target> <message>`** and **`qualifier resolve
  <target> [message]`** — both accept an id-prefix or a `<location>`,
  with disambiguation when multiple active records share a location.
- **`qualifier review`** — span-bound annotation freshness check
  (`fresh` / `drifted` / `missing`) using BLAKE3 content hashes
  computed at write time.
- **`qualifier praise`** (alias: `blame`) — record-based attribution
  for an artifact; `--vcs` delegates to git/hg.
- **Threaded `qualifier show` output** with tree-drawing characters
  for replies and resolves under their parents.
- **`--type <TYPE>` filter on `qualifier show`** for filtering by
  envelope record type, including custom URI types.
- **Open record types in the wire format**: `license`,
  `security-advisory`, `perf-measurement`, plus arbitrary URI-typed
  records preserved through `Record::Unknown`.
- **`.qualignore` file discovery** alongside `.gitignore`, and a
  `--no-ignore` flag to bypass both.
- **Grouped `qualifier --help` output** rendered via a custom clap
  `help_template` (Record observations / Inspect annotations /
  Maintain / Other).

### Changed

- **Metabox envelope is now the wire format.** Records carry a fixed
  envelope (`metabox`, `type`, `subject`, `issuer`, `issuer_type`,
  `created_at`, `id`) wrapping a type-specific `body`. Body fields
  serialize in alphabetical order (Metabox Canonical Form). The
  envelope is specced separately in `METABOX.md` so other tools can
  adopt the same shape.
- **`issuer` is a URI** (`mailto:`, `https:`, `urn:…`). `issuer_type`
  is an optional envelope field with values `human`, `ai`, `tool`,
  `unknown`.
- **"Annotation" terminology** replaces "attestation" throughout code,
  spec, and docs.
- **Project root detection** searches upward for VCS markers only
  (`.git`, `.hg`, `.jj`, `.pijul`, `_FOSSIL_`, `.svn`). The
  `qualifier.graph.jsonl` marker was removed when the graph engine
  was yanked.

### Internal

- Restructured the crate around `annotation`, `compact`, `content_hash`,
  `qual_file` as the library core; the `cli` feature gates clap,
  comfy-table, figment, and rand.
- `compact::filter_superseded` is now the canonical "active records"
  helper, used by `show`, `ls`, `praise`, `reply`, and `freshness`.

[0.4.0]: https://github.com/empathic/qualifier