Skip to content

absentia v1.0.0 — find the holes your code already drew

Choose a tag to compare

@skbays03 skbays03 released this 09 May 18:12
· 5 commits to main since this release

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. setUp always pairs with tearDown — a class with one but not the other is a gap. migrations/0001_*.py, 0002_*.py, 0004_*.py0003 is 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

  1. 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.
  2. Symmetry — paired identifiers like setUp/tearDown, acquire/release, subscribe/unsubscribe. Mined from the corpus, not hardcoded.
  3. Call-pair — within function bodies. Catches bus.subscribe() without a matching bus.unsubscribe() in the same function.
  4. Series — numeric (migrations/0001_*.py → flag missing 0003), letter (part_a.md / part_b.md / part_d.md → flag c), version-directory (api_v1 / v2 / v4 → flag v3), and ordinal/CRUD (test_create / test_read / test_update → flag missing test_delete).
  5. 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 N tolerance 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 main with required CI gates (lint, fingerprint-bump, sdist build).

Install

pip install absentia

Then:

cd your-project
absentia init      # generate absentia.toml + .absentia/
absentia           # launch the TUI
absentia check     # CLI mode for CI / scripts

Requires Python 3.13+. Cross-platform (macOS, Linux, Windows).

Documentation

Full changelog

The complete list of additions, changes, and fixes is in CHANGELOG.md.