Arid 2.2.0 — High-Signal Duplicate Intelligence
Arid 2.2 keeps the focused exact duplicate detector from 2.1 and makes its existing evidence substantially easier to understand and consume.
The detector itself remains intentionally unchanged: Arid still finds exact normalized Python duplicate code and reports DUP001. The 2.2 release adds a richer aggregate view for developers, a compact deterministic machine summary for tools and coding agents, expanded GitHub Action outputs, and bounded adaptive file-preparation parallelism by default.
Highlights
Rich human summary
Normal text scans now end with three aggregate sections:
- Summary — files analyzed, files with duplicates, source/analyzed lines, duplicate groups, occurrences, duplicate lines, and duplication percentage
- Breakdown — duplicate-group counts and shares by Context, Scope, and Distribution
- Hotspots — up to five files ranked objectively by duplicate-group participation, then occurrence count, then path
These metrics are descriptive. Arid does not assign severity, health scores, quality grades, or percentage-based quality thresholds.
Hotspots are intentionally objective participation counts rather than an opinionated refactoring score. Generated or data-heavy paths can therefore dominate a scan when they genuinely contain the most duplicate participation; normal Arid exclusions remain the mechanism for removing such paths from the analyzed corpus.
--summary-only
Use:
arid . --summary-onlyto suppress individual DUP001 finding blocks while preserving the same detection, filtering, worker behavior, metrics, and exit policy.
For JSON:
arid . --summary-only --jsonemits the compact deterministic summary-v1 contract.
Markdown and SARIF remain full finding-oriented primary formats. Supplemental --report files also remain full existing report formats even when primary output is summary-only.
summary-v1
Arid 2.2 publishes:
schemas/summary-v1.schema.json
The contract includes:
- completeness and structured errors
- effective analysis metadata
- files analyzed
- files with duplicates
- source and analyzed lines
- duplicate groups
- occurrences
- duplicate lines
- duplication percentage
- fixed Context counts
- fixed Scope counts
- fixed Distribution counts
- deterministic top-five hotspots
It intentionally excludes worker count, elapsed timing, color state, terminal layout, and human-formatted number strings so logically identical scans remain deterministic across execution environments.
summary-v1 is derived from the final reportable findings after normal baseline and focus policy. It does not create a second detector or a second definition of duplication.
Expanded GitHub Action outputs
The official Action now exposes:
occurrencesfiles-with-duplicatessummary-json
alongside the existing outputs.
summary-json follows the same logical summary-v1 contract as the CLI. The Action still performs one Arid scan and derives its outputs and optional reports from that same scan.
Adaptive parallelism by default
Omitting --workers is now equivalent to:
arid . --workers autoAutomatic selection uses available parallelism clamped to 1..=4, with a fallback to one worker when available parallelism cannot be determined.
Explicit numeric values remain exact:
arid . --workers 1
arid . --workers 2
arid . --workers 4
arid . --workers 8The automatic cap does not apply to explicit numeric values.
Parallelism remains confined to file preparation: reading, parsing, and normalization. Duplicate identity, finding order, fingerprints, metrics, baseline/focus behavior, machine contracts, and exit status remain deterministic.
Compatibility
Arid 2.2 preserves the 2.1 detector and compatibility surfaces, including:
- exact duplicate semantics
DUP001- finding fingerprints
- report-v4 schema and meaning
- baseline-v1 schema and meaning
- error-v1
- suppression-status-v1
- path-explanation-v1
- suppression semantics
- discovery semantics
- focus semantics
- baseline filtering semantics
- normalization semantics
[tool.arid]behavior- explicit
--workers 1 - explicit numeric worker behavior
--workers autosemantics- ordinary scan exit meanings
0/1/2 --no-fail-on-findings- Markdown report semantics
- SARIF semantics
- supplemental
--reportsemantics - supported platform set
The intentional 2.2 changes are:
- normal text now ends with Summary, Breakdown, and Hotspots;
--summary-onlyprovides concise text orsummary-v1JSON;- the Action exposes compact summary outputs;
- implicit worker selection now uses bounded automatic parallelism rather than serial execution.
Beta qualification
The published 2.2.0-beta.1 artifact passed the full stabilization campaign without requiring any product, packaging, compatibility, deterministic-output, machine-contract, or platform correction.
Published artifact qualification
The beta passed:
- exact GitHub prerelease and five-asset verification
- published SHA-256 verification for the Linux x86-64 standalone archive
- exact PyPI
arid==2.2.0b1installation - complete
validation/v2.2.shqualification from both standalone and PyPI artifacts - byte-identical standalone/PyPI
summary-v1 - byte-identical standalone/PyPI report-v4
- exact tagged Action version pinning
Real-world detector validation
The exact published beta passed the established real-world campaign against:
- Black
- Django
- mypy
- Rich
- Unicode, spaces, non-ASCII filenames, relative paths, and source-location path cases
Detector behavior remained compatible with the established 2.1 expectations.
Real-world summary validation
Summary, Breakdown, and Hotspots were inspected on repositories ranging from 69 to 2,927 analyzed files.
The aggregate presentation remained compact and legible across those sizes and exposed materially different duplicate profiles without changing detector semantics. For example, the real-world campaign surfaced predominantly executable/function/same-file duplication in Black and Django, a much larger mixed/hybrid component in mypy, and data-heavy declarative/cross-file duplication in Rich.
Excluding Rich's generated Unicode data with normal Arid exclusion policy produced application-focused hotspots immediately, confirming that hotspot ranking correctly describes the selected corpus rather than embedding hidden generated-code heuristics.
Color qualification also passed: semantic color output contained ANSI styling, and stripping the styling produced the same visible content as --color never after excluding the intentionally volatile elapsed-time footer.
summary-v1 qualification
The exact published beta's Django summary-v1 output:
- validated against
schemas/summary-v1.schema.json - remained byte-identical for implicit default,
--workers auto, and explicit workers 1, 2, 4, and 8 - matched independently reconstructed aggregate counts from report-v4
- matched Context, Scope, and Distribution group counts from report-v4
- reproduced hotspot ranking independently from report-v4
- excluded worker, timing, and color state as required
This validates summary-v1 as a deterministic compact contract for CI, tools, and coding-agent consumption on a real repository rather than only synthetic fixtures.
GitHub Action qualification
The beta publication workflow successfully exercised the official Action against the exact published PyPI package.
Beta stabilization identified one release-process coverage gap: the production Action E2E assertion step verified existing outputs but did not explicitly assert the three new 2.2 outputs. The release workflow was corrected to verify occurrences, files-with-duplicates, and the logical contents of summary-json.
A non-publishing five-platform Release workflow then passed with the corrected Action-output gate. This was a release-process-only correction; it did not change Arid product behavior, package contents, the published beta artifact, or the Action implementation.
Published-to-published performance
The final beta qualification compared the exact published Arid 2.1.0 Linux x86-64 standalone artifact with the exact published Arid 2.2.0-beta.1 artifact.
Each corpus used two Hyperfine passes with reversed command order, three warmups per pass, and ten measured runs per pass. Reported means average both passes.
| Corpus | 2.1 implicit | 2.2 implicit | 2.2 --workers 1
| 2.2 --workers auto
| implicit change |
|---|---|---|---|---|---|
| requests | 16.9 ms | 15.4 ms | 16.3 ms | 15.6 ms | -9.1% |
| pydantic | 239.7 ms | 129.6 ms | 237.2 ms | 126.6 ms | -45.9% |
| polaris | 501.5 ms | 293.9 ms | 497.6 ms | 295.7 ms | -41.4% |
| duplicate-heavy | 61.2 ms | 40.6 ms | 59.3 ms | 38.4 ms | -33.8% |
The published beta was faster than published 2.1.0 on every canonical corpus under the new implicit default. Forced serial 2.2 remained effectively at the 2.1 performance level, while bounded automatic parallelism delivered the intended improvement on larger corpora.
No material unexplained performance regression remains.
Install
With uv:
uv tool install "arid==2.2.0"
arid --versionOr with pip:
python -m pip install "arid==2.2.0"
arid --versionExpected version output:
arid 2.2.0
Official GitHub Action
Pin the stable release:
- uses: sponge-b0b/arid@v2.2.0
with:
paths: .Upgrade from 2.1
For ordinary CLI users, 2.2 is intended to be a straightforward upgrade. Existing duplicate semantics and report-v4 consumers remain unchanged.
Review the new behavior if you depend on:
- exact human text output, because normal text now includes the aggregate Summary/Breakdown/Hotspots view;
- implicit serial execution, because the default now uses bounded automatic file preparation;
- GitHub Action outputs, where the three new compact summary outputs are now available.
Explicit --workers 1 remains the serial control path.
Scope
Arid remains intentionally focused. Version 2.2 does not add semantic clone detection, fuzzy similarity, AI advice, severity levels, health grades, automatic refactoring, blame/ownership analysis, changed-lines-only detection, or arbitrary analytics.
The release goal is narrower:
Preserve the focused exact detector while turning its existing duplicate evidence into a concise, deterministic summary that developers can understand at a glance and tools or coding agents can consume without parsing every finding.