Releases: carstenerickson/aadr-resolve
v0.4.2
Patch release — bug fixes from the full-project code review.
Fixed
- Dirty integer cells no longer crash the load.
date_calbp,date_sd_bp,persistent_genetic_id, andsnps_hit_1240kcoerce any non-integer, fractional, or infinite cell to<NA>instead of raising — a malformed value in a future/non-public release degrades gracefully. - The cross-version flows reject two files that share a version label (
cohort,join,lookup). Previously a same-class collision (e.g. a release and its.p1patch, which infer the same label) silently overwrote one panel's per-version data. - Output-write I/O errors exit 2 (
IO_FAILURE), not 3. An unwritable-opath or disk-full report write now maps to a clean message instead of a traceback + invariant-violation exit. - The stdout group-change histogram no longer omits
convention_restructure_prefix_drop(now derived from the enum so a new class can't be silently dropped). - The
--schema-overridehint and help list every registered class (derived from the registry, can't go stale).
Full changelog: https://github.com/carstenerickson/aadr-resolve/blob/v0.4.2/CHANGELOG.md
v0.4.1
Fixed
- v54.1 trailing-tab files loaded with every field shifted one column right. The published v54.1
.anno(1240K + HO) carries a trailing tab on the header and every data row, so the loader consumed the first data column as a row index —genetic_idreturned the Master ID anddate_calbpthe date SD (e.g.ElMironresolved todate_calbp=39instead of18775). Silent corruption across the whole v54.1 release; completes the v54.1 story from 0.3.1 (#4), which made the file load but left the data shifted. (#15)
Changed
- Hardened header-based layout selection against truncated headers (an override is only chosen when the headers can actually contain its relocated columns), and unified the override-key lookup. (#9)
- Documented class F coverage as a cross-panel proxy — the HO panel (~600K sites) is mapped to
coverage_1240k/snps_hit_1240k, so 1240k-calibrated thresholds shouldn't be applied unadjusted. No behavior change. (#10)
Docs
- Added
docs/RELEASE.md(release + trusted-publishing process). (#11)
Full changelog: https://github.com/carstenerickson/aadr-resolve/blob/v0.4.1/CHANGELOG.md
v0.4.0
Added
- Per-version column overrides. One schema class can serve AADR releases that place fields at different columns under a shared detection signature. The layout is selected from the file's actual header content (not its filename version label), so a release with a shifted layout reads correctly even when its label is wrong or can't be inferred; overrides are validated at load time, and the
schemadiagnostic reports the header-detected layout. - Class F: the early Human Origins schema (v44.3, v50.0 HO) — an 18-column minimal layout, previously unloadable.
- Guard against cross-panel version-label collisions (the 1240K and HO panels of one release): cohort/lookup now fail with a clear error instead of silently dropping a panel's data.
Fixed
- v50.0 1240K dates were read from the wrong column (
I0626_allresolved todate_calbp=173instead of3850). Fixed via a class-Aversion_overridesentry for v50.0.
Full changelog: https://github.com/carstenerickson/aadr-resolve/blob/v0.4.0/CHANGELOG.md
v0.3.1
Fixed
- Class C now loads the published v54.1
.annofiles. The released v54.1 1240K and HO annotations carry a trailing tab, so the loader drops the phantom column and detection sees 35 columns — but class C accepted only 36, so real public files failed withSchemaDetectionError. Class C now acceptsn_columns: [35, 36]; the trailing column is unmapped, so every field stays at the same position. The schema generator and.annofixtures were brought in line, and a regression test covers the 35-column trailing-tab form.
Changed
- Documented the pip 23+ / setuptools 61+ requirement for editable installs.
- The PyPI publish workflow now refuses to release unless the
ci.ymlrun for the released commit concluded successfully.
Full changelog: https://github.com/carstenerickson/aadr-resolve/blob/v0.3.1/CHANGELOG.md
v0.2.0
Reporting layer + polish minor. Builds on v0.1.0 to close the biggest doc/code gap: the HLD-pinned stdout summary block, per-event TSV streaming sidecar, and run-level JSON summary sidecar are now implemented end-to-end on cohort + diff.
See CHANGELOG.md for the full feature list and docs/REPORT_JSON_SCHEMA.md for the JSON sidecar schema.
Highlights
- Stdout summary block on
cohort+diff: rich multi-section run summary (loaded files, bridge counts, resolution / event histograms, group-change histogram, turnover verdict, elapsed time). Suppress with--quiet. --report-json PATHsidecar oncohort+diff: ~few-KB run-level JSON, loads cheaply viajson.load. Written even on gate failures so CI can inspect failure shapes.--report PATHstreamed per-event TSV sidecar ondiff, constant memory regardless of corpus size.- Per-adjacent-pair
group_id_change_class_v{old}_to_v{new}columns in the cohort manifest (LLD §4.1 step 11d). - CI coverage gate at 85% (LLD §5.6; actual 91.7%).
- Actions bumped past Node.js 20 deprecation (June 2026 cutover).
Bug fixes
diff --report PATHsidecar no longer backslash-escapes embedded JSON quotes; output now matches the v0.1 inline--tsvmode.
Install
pip install --upgrade aadr-resolveRequires Python 3.11+.
v0.1.0
Initial release of aadr-resolve — AADR cross-version GeneticID / MasterID join utility for ancient-DNA and population-genetics workflows.
See README.md for usage and CHANGELOG.md for the full feature list.
Highlights
- Five subcommands:
lookup,cohort,diff,join,schema - Five bench-verified schema classes A–E covering v44.3 → v66.0
- MID-rename bridge: GID-stable auto-detection + manual override
- Library-token chain algorithm preserving multi-row-per-individual semantics
- Six-class Group ID change classifier
- Three exit-1 validation gates: turnover, substantive-regroup, cohort-coverage
- Library API:
AnnoFrame+resolve_master_ids+resolve_genetic_ids+ full 8-class exception hierarchy - Stable 5-exit-code contract
- CI matrix: Ubuntu + macOS × Python 3.11/3.12/3.13
- 153 passing tests including a WHGA self-dogfood pass against a hand-built v44.3 → v66.0 cross-reference
Install
pip install aadr-resolveRequires Python 3.11+.