Qualifier
Continuous Annotation, stored as files. Record concerns, suggestions, and
feedback against code the moment you see them — humans and bots writing the
same format. No server, no database, just .qual files next to your source.
The annotation is pinned to that file and line, stored as a content-addressed
JSONL record in src/.qual, and git blame/git log/git diff all work on
it. Append-only, so concurrent edits don't conflict structurally.
What it's for
Quality work is batched behind PRs and gates. You notice a problem on Tuesday but the PR isn't until Friday. Inline comments disappear into merged PRs. Three sprints later nobody remembers what was flagged, what was fixed, and what was quietly ignored.
Qualifier is ambient review: annotate any file, any time, whether it changed today or three years ago. Annotations thread into conversations, survive merges and rebases, and surface drift automatically when the code underneath them changes.
Quick tour
# Record a concern at a specific line
# See it
# Reply (id-prefix or location)
# Close it
# Find drift in span-bound annotations after the source changed
CLI
Record observations
| Command | Description |
|---|---|
qualifier record <kind> <location> [message] |
Record an annotation |
qualifier reply <target> <message> |
Reply to an existing record |
qualifier resolve <target> [message] |
Resolve (close) a record |
qualifier emit <type> <subject> --body '<JSON>' |
Emit a raw record of any type |
<kind> is one of concern, comment, suggestion, pass, fail,
blocker, praise, waiver, resolve, or any custom string. <location>
is a path with an optional span (src/foo.rs:42, src/foo.rs:42:58).
<target> is an id-prefix (≥4 chars) or a <location>.
Inspect annotations
| Command | Description |
|---|---|
qualifier show <artifact> |
Show annotations for an artifact (threaded) |
qualifier ls [--kind K] |
List artifacts (optionally by kind) |
qualifier praise <artifact> |
Show who annotated and why (alias: blame) |
qualifier review [subject] |
Check freshness of span-bound annotations |
Maintain
| Command | Description |
|---|---|
qualifier compact <artifact> |
Prune superseded records or snapshot to an epoch |
All read commands accept --format json for machine-readable output.
Records
Annotations are the primary record type, but .qual is a substrate. The
Metabox envelope wraps any type-specific body — annotations,
epochs (compaction snapshots), dependencies, licenses, security advisories,
performance measurements, or any custom URI-typed record. Tools that don't
understand a body type still round-trip the record unchanged.
A two-record .qual file:
{"metabox":"1","type":"annotation","subject":"src/auth.rs","issuer":"mailto:alice@example.com","issuer_type":"human","created_at":"2026-02-24T10:00:00Z","id":"a1b2…","body":{"kind":"concern","summary":"SQL injection risk in login handler"}}
{"metabox":"1","type":"annotation","subject":"src/auth.rs","issuer":"urn:anthropic:claude","issuer_type":"ai","created_at":"2026-02-24T11:00:00Z","id":"e5f6…","body":{"kind":"comment","references":"a1b2…","summary":"Switched to parameterized queries in 8f3c2a1"}}
Records are immutable and content-addressed (BLAKE3). Updates use supersession chains rather than mutation. Compaction prunes superseded records or collapses history into epoch records.
File layout
.qual files can sit per-directory (src/.qual — recommended), per-file
(src/parser.rs.qual), or per-project (.qual at the root). All layouts
coexist. Discovery respects .gitignore and .qualignore; pass
--no-ignore to bypass.
For collaborative repos, configure your VCS to use union merges on .qual
files (e.g. *.qual merge=union in .gitattributes for git) so concurrent
appends don't collide.
Agent integration
--format jsononshowandlsfor structured outputqualifier record --stdinandqualifier emit --stdinaccept JSONL on stdinbody.suggested_fixcarries actionable remediationbody.spantargets specific line ranges--issuer-type aidistinguishes agent-authored records in display
Documentation
- SPEC.md — full format specification
- METABOX.md — the envelope format
- CHANGELOG.md — release notes
License
MIT OR Apache-2.0