Repository navigation
v2.1.0
Data quality foundations and CORS.
API
- CORS enabled on the public API (#211, #246): browser applications can now call
/api/v1directly with a token — no more proxying through a backend (finally closes the long-standing #91) - New endpoint
GET /api/v1/species/{id}/facts(#250): the provenance trail of a species' trait values — one row per (attribute, source) claim with its evidence level and status. Every value ingested from now on is recorded with its source - Bugfix:
hybridsandsubvarietieswere swapped in plant payloads — each list was served under the other's key
Data quality (#250)
- Per-field data contract (
config/traits.yml): category, unit, plausible range, applicability and source priority for every species field - Source arbitration at ingestion: a weaker source no longer silently overwrites a stronger one (conflicting claims are kept and visible), implausible values are rejected before they reach the database, human-accepted corrections always win
- New plausibility check wired into the hourly quality sweep: flags out-of-range values and inconsistent min/max pairs (e.g.
ph_minimum > ph_maximum) - The completion ratio is now honest: only real trait fields count, a field is only "missing" when applicable to the species, and legitimate zeros/false are no longer treated as gaps
- Weekly data-quality snapshot (fill rates, implausible values, source conflicts) feeding a new management dashboard and a prioritized work queue
Notes for API clients: everything is additive — no existing payload changed shape. Authentication is unchanged.