absentia v1.0.0 — find the holes your code already drew
absentia v1.0.0 — find the holes your code already drew
First stable release. absentia mines the patterns your codebase already follows and surfaces the places that don't follow them — without an LLM, without a rule database, deterministically.
9 endpoints have
@audit, the tenth doesn't — that's a gap.setUpalways pairs withtearDown— a class with one but not the other is a gap.migrations/0001_*.py,0002_*.py,0004_*.py—0003is a gap. A class defined but never instantiated, inherited, or referenced anywhere — that's a gap too.
What's in 1.0
Five mining strategies
- Frequency — "8/10 do X, this one doesn't." Mines 11 feature kinds: decorators, calls, kwarg names, parent classes, sibling tests, docstring presence, type-annotation presence,
__post_init__,__all__, registered entry-points. - Symmetry — paired identifiers like
setUp/tearDown,acquire/release,subscribe/unsubscribe. Mined from the corpus, not hardcoded. - Call-pair — within function bodies. Catches
bus.subscribe()without a matchingbus.unsubscribe()in the same function. - Series — numeric (
migrations/0001_*.py→ flag missing0003), letter (part_a.md/part_b.md/part_d.md→ flagc), version-directory (api_v1/v2/v4→ flagv3), and ordinal/CRUD (test_create / test_read / test_update→ flag missingtest_delete). - Closure — defined-but-never-used classes. Language-agnostic: combines feature-based reference index (
calls/parent_class/decorator) with corpus-text identifier scan to suppress false positives.
Seventeen extractors covering sixteen languages
Python, JavaScript, TypeScript, TSX, Rust, Go, Java, Ruby, C#, C, C++, PHP, Kotlin, Scala, Lua, Bash, Swift. All extractors fuzz-tested + verified against representative real-world corpora during the v1.0 audit.
Performance
- Linux kernel (65,004 files / 686,923 entities / ~30M lines of C): ~24 s warm / ~48 s cold at default jobs (5) on a 10-core M-series MacBook
- Throughput: ~7,200 entities/sec single-process, ~14,400 entities/sec at default jobs
- Mining stage hits ~12 s on the kernel (down from ~5 minutes pre-mypyc — a ~25× speedup)
mypyc-compiled wheels for the Python × OS × arch matrix (cp313/cp314 × Linux x86_64+aarch64 × macOS arm64 × Windows AMD64). Sdist falls through cleanly on platforms without a pre-built wheel — pure-Python fallback compiles via mypyc at install time.
Two consumers of the engine
- TUI (default
absentia) — Textual-based, with Gaps / Rules / Groups / Stats / Suppressions views, multi-select bulk suppress, command palette (Ctrl+P), six export formats, settings panel, watch mode, command-line $EDITOR handoff. - Batch CLI (
absentia check) — for CI, scripts, and editor integrations. JSON output,--max-gaps Ntolerance gate, per-stage progress UI.
Security & supply-chain
- OIDC trusted publishing to PyPI — no long-lived API tokens stored anywhere. GitHub Actions mints short-lived ID tokens; PyPI verifies against pre-registered Trusted Publisher entries.
- Apache 2.0 licensed.
- Branch-protected
mainwith required CI gates (lint, fingerprint-bump, sdist build).
Install
pip install absentiaThen:
cd your-project
absentia init # generate absentia.toml + .absentia/
absentia # launch the TUI
absentia check # CLI mode for CI / scriptsRequires Python 3.13+. Cross-platform (macOS, Linux, Windows).
Documentation
- Quickstart tutorial
- What is negative-space search?
- How mining works
- Why no LLM?
- CLI reference · TUI keybindings · Configuration
Full changelog
The complete list of additions, changes, and fixes is in CHANGELOG.md.