# Changelog
All notable changes to `v-common` are documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
Entries from **0.14.0** onward were checked against source diffs.
Earlier entries (**0.5.0–0.13.8**) are based on release commits with spot-checked public API changes.
Each version starts with the **intent** (why the change was made), then lists what changed.
## Versioning note
Versions `0.11.0` and `0.12.0` were first used in mid-2024 (`UpdateOptions`, fallible `Storage`), then the version line was reset to `0.10.7`. Those numbers were reused later for the `Individual` setter API. Treat the mid-2024 `0.11.0`/`0.12.0` line as superseded.
---
## [0.25.4] - 2026-06-18
Queue consumers could skip a processing cycle when `get_info_of_part` failed for a transient reason (FS lag, part rotation). This release adds configurable retries so short glitches do not stall or skip work.
### Added
- `v-module-queue`: `Module::set_queue_part_retry(count, pause_ms)` and retry of `Consumer::queue.get_info_of_part` (default: 5 attempts, 1000 ms pause).
### Changed
- `v-module-queue` `0.1.3` → `0.1.4` (includes `v_queue` `0.3.2`).
## [0.25.3] - 2026-06-16
Patch bump to pick up a fixed `v-module-queue` build aligned with `v_queue` 0.3.2.
### Changed
- `v-module-queue` `0.1.2` → `0.1.3`.
## [0.25.2] - 2026-06-14
Follow-up dependency sync after the `v_queue` 0.3 line: keep `v-common`, `v-module-queue`, and related crates on matching queue APIs.
### Changed
- `v_queue` `0.3.0` → `0.3.1`.
- `v-module-queue` `0.1.1` → `0.1.2`.
## [0.25.1] - 2026-06-14
Small fix release of the new queue-runtime crate right after the extract.
### Changed
- `v-module-queue` `0.1.0` → `0.1.1`.
## [0.25.0] - 2026-06-14
Split the heavy “full platform” crate so queue-only modules (and future search backends) do not drag Xapian and the full stack. Queue consumer runtime becomes its own crate; Tantivy work starts as a parallel full-text path next to Xapian. Compatibility re-exports keep existing `v_common::module::*` imports working.
### Added
- Crate `v-module-queue`: queue consumer runtime without full-text / Xapian.
- Crate `v-tantivy-common`: Tantivy field registry, schema, VQL translation, `TantivyReader`.
- Re-export `v_module_queue` from `v_common`.
### Changed
- `v_queue` `0.2.7` → `0.3.0`.
- Queue runtime moved into `v-module-queue`; `v-common` keeps compatibility re-exports:
- `Module`, `PrepareError`, helpers (`get_cmd`, `init_log*`, …) via `module::module_impl`
- `ModuleInfo` via `module::info`
- `VedaQueueModule` via `module::veda_module`
- `IndvOp` via `v_api::api_client` (`pub use v_module_queue::IndvOp`)
- `sys_sig_listener` via `module::common`
- `Backend`, ticket, remote storage, onto loaders remain in `v-common`.
### Breaking
- Queue semantics follow `v_queue` 0.3.x.
- Code that depended on non-re-exported queue-runtime internals should use `v-module-queue` directly.
## [0.24.0] - 2026-03-30
End the dual Tokio 0.2 / Tokio 1 and awc 2 / awc 3 matrix. One runtime simplifies builds, Cargo features, and Tarantool client maintenance. A vendored `v_rusty_tarantool` fork targets Tokio 1 only.
### Added
- Vendored Tarantool client as `v_rusty_tarantool` `0.3.2` (Tokio 1).
- Single runtime module `runtime_wrapper::runtime_tokio`.
### Changed
- Runtime fixed to `tokio` 1.50 and `awc` 3.8 (no feature selection).
- `v-storage` `0.1.3` → `0.2.1`.
- `uuid` 0.8 → 1, `scan_fmt` 0.1 → 0.2.6, `rand` 0.7 → 0.9, `signal-hook` 0.3 → 0.4, and related bumps.
- UUID formatting updated for `uuid` 1.x (`Uuid::new_v4().to_string()`).
### Removed
- Features: `tokio_0_2`, `tokio_1`, `awc_2`, `awc_3`, `tt_2`, `tt_3`, `extended-siginfo`.
- Modules `runtime_wrapper::tokio_0_2` / `tokio_1`.
- Optional deps: dual `tokio`/`awc`/`rusty_tarantool` aliases.
- Unused `warp` dependency.
### Breaking
- Builds that selected Tokio 0.2 / awc 2 / old Tarantool features must move to Tokio 1 + awc 3 + `v_rusty_tarantool`.
- Imports of `runtime_wrapper::tokio_1` / `tokio_0_2` → `runtime_wrapper::runtime_tokio`.
## [0.23.1] - 2026-03-30
Small cleanup before the Tokio unify: SPARQL requests set Content-Type / Accept through shared header constants instead of ad-hoc strings.
### Changed
- SPARQL client uses `awc_wrapper::{CONTENT_TYPE, ACCEPT, HeaderValue}` for request headers.
## [0.23.0] - 2026-03-25
Stop pulling the remote authorization client into every `v-common` consumer. `v-az-client` stays in the workspace for services that need NNG/Iceoryx transport, but it is no longer a default dependency of the common crate.
### Changed
- Dropped direct dependency on `v-az-client` and commented out `pub use … as az_client`.
### Notes (workspace crate, while still on 0.22.0)
- `v-az-client` `0.1.1`: `authorize_batch_can_read` → `authorize(&[(&str, &str, u8)]) -> Result<(Vec<u8>, u64), String>` — one API for any access mask, not only “can read”.
## [0.22.0] - 2026-03-23
Simplify the LMDB authorization backend: drop unused stats/cache paths that added complexity, and survive LMDB map resize when another process grows the environment (common in long-running modules).
### Changed
- `v-authorization-lmdb-impl` `0.6.0` → `0.7.0`.
- LMDB auth: retry after `MdbError::MapResized` (reopen/resize).
### Removed
- Auth statistics collector and ACL cache from `v-authorization-lmdb-impl`.
- `LmdbAzContext::new_with_config(max_read_counter, stat_collector_url, stat_mode_str, use_cache)`.
### Breaking
- No stats/cache configuration through `LmdbAzContext::new_with_config`.
## [0.21.0] - 2026-03-19
Make async authorization a first-class abstraction and speed up Xapian result filtering. Instead of every call site locking `Mutex<AzContext>`, code uses `AuthorizationProvider`. Xapian authorizes hits in batches (one remote/local check per batch) instead of per document. The LMDB impl crate is renamed for clarity; `v-az-client` appears for out-of-process authorization.
### Added
- Crate `v-authorization-lmdb-impl` (rename of previous authorization impl).
- Crate `v-az-client`, re-exported as `v_common::az_client`.
- `storage::authorization_provider::AuthorizationProvider` (`Lmdb(Mutex<LmdbAzContext>)`) with async `authorize` / `authorize_and_trace`.
- Xapian batch authorization: authorize closure + `batch_size`; public `query_use_collect_with_auth_fn`.
### Changed
- Re-export `v_common::az_impl` → `v_authorization_lmdb_impl`.
- ClickHouse, SPARQL, async storage, and Xapian paths use `AuthorizationProvider` / batch authorize API.
### Breaking
- Dependency `v-authorization-impl-tt2-lmdb` → `v-authorization-lmdb-impl`.
- `AzContext` → `LmdbAzContext` in public search/storage APIs.
- `check_indv_access_read`, `check_user_in_group`, `get_individual_from_db`, `get_individual_use_storage_id`: `Option<&Mutex<AzContext>>` → `Option<&AuthorizationProvider>`.
- Client methods that took `&Mutex<AzContext>` now take `&AuthorizationProvider`.
- `exec_xapian_query_and_queue_authorize`: `&mut AzContext` → generic authorize closure + `batch_size`.
## [0.20.0] - 2026-01-29
Production path is LMDB + Tokio 0.2 Tarantool stack. Drop the multi-backend feature matrix on `v-common` and depend on a specialized authorization crate so builds stay smaller and constructors stay explicit (`new_lmdb` / `new_tarantool`).
### Changed
- Dependency `v-authorization-impl` → `v-authorization-impl-tt2-lmdb` `0.6.0`.
- Re-export `az_impl` points at the specialized crate.
- Removed features `az_lmdb`, `az_tt_2`, `az_tt_3`.
- Constructors: `AzContext::new*` → `new_lmdb` / `new_lmdb_with_config` / `new_tarantool` / `new_tarantool_with_config`.
### Breaking
- Feature flags `az_*` on `v-common` are gone.
- Call sites using ambiguous `AzContext::new` / `new_with_config` must use backend-specific names.
## [0.19.4] - 2026-01-28
Decouple “which storage Tarantool client” from “which authorization backend”. Call sites talk to one `AzContext` type; Cargo features choose LMDB or Tarantool auth independently of storage features.
### Added
- Features `az_lmdb`, `az_tt_2`, `az_tt_3` on `v-common`.
### Changed
- `v-authorization-impl` → `0.4.6`.
- Public APIs take `AzContext` instead of `LmdbAzContext` (e.g. `check_user_in_group`, `get_individual_from_db`).
- Constructors unified as `new` / `new_with_config` (backend selected by features).
### Breaking
- Implementation feature names and `Mutex<LmdbAzContext>` call sites must migrate to `AzContext` + `az_*` features.
## [0.19.3] - 2026-01-28
Prevent compiling LMDB and Tarantool authorization backends together (they were never meant to coexist). Rename Tarantool features to match Tokio / client generations (`tt_2` / `tt_3`).
### Changed
- `v-authorization-impl` through `0.4.4`.
- Feature rename in impl: `tt_1` → `tt_3`, `tt_02` → `tt_2`; default `lmdb`.
### Breaking
- Downstream feature names `tt_1` / `tt_02` → `tt_3` / `tt_2`.
## [0.19.2] - 2026-01-28
Align the authorization crate with the shared `AzContext` abstraction and the pinned `rusty_tarantool` 0.2.11 used elsewhere.
### Changed
- `v-authorization-impl` → `0.4.2` (Tokio 0.2 Tarantool path on `rusty_tarantool` 0.2.11).
## [0.19.1] - 2026-01-28
Make default features match the real deployment stack (Tokio 0.2 + awc 2 + Tarantool 0.2 client) so `cargo build` without flags works out of the box.
### Changed
- `v-authorization-impl` → `0.4.1`.
- Default features: `["tokio_0_2", "tt_2", "awc_2"]`.
- Tarantool feature model: `tt` alias, `tt_1`, `tt_02`.
## [0.19.0] - 2026-01-28
Support authorization data stored in Tarantool as an alternative to LMDB, behind a feature flag, without rewriting call sites that already use `AzContext`. Also make incomplete-session ticket errors easier to debug.
### Added
- Optional Tarantool authorization in `v-authorization-impl` (feature `tt`).
- `AzContext::{lmdb, lmdb_with_config, tarantool, tarantool_with_stat}`, `TarantoolAzContext`, `RuntimeWrapper`.
### Changed
- `v-authorization-impl` `0.2.2` → `0.3.0`.
- Improved ticket-related error logging (include ticket id on incomplete session).
## [0.18.0] - 2026-01-16
Move the LMDB authorization implementation out of `v-common` into its own crate so it can version and publish separately. Pass an auth `provider` through the API client so tickets can record which authentication backend issued them.
### Added
- Dependency `v-authorization-impl` `0.2.2`, re-exported as `v_common::az_impl`.
- `AuthClient::authenticate(..., provider: Option<&str>)`.
### Changed
- In-crate `az_impl` / `az_lmdb` replaced by external crate.
- `v-individual-model` → `0.2.6`, `v-storage` → `0.1.3`, `rusty_tarantool` 0.2.11.
### Breaking
- `authenticate` requires the new `provider` argument.
- Types under `v_common::az_impl` now come from `v-authorization-impl`.
## [0.17.1] - 2025-09-18
Dependency sync with newer `v-individual-model` / `v-storage` patch releases.
### Changed
- `v-individual-model` `0.2.0` → `0.2.1`.
- `v-storage` `0.1.1` → `0.1.2`.
## [0.17.0] - 2025-09-17
Adopt the next minor of the extracted model and storage crates after their API cleanups.
### Changed
- `v-individual-model` `0.1.1` → `0.2.0`.
- `v-storage` `0.1.0` → `0.1.1`.
## [0.16.1] - 2025-09-14
Complete ticket audit metadata: callers can pass domain/initiator into auth APIs, and tickets store `auth_origin` for where the session came from.
### Added
- `Ticket::auth_origin` and RDF/JSON mapping `ticket:authOrigin`.
### Changed
- `AuthClient::authenticate` gains `domain: Option<&str>`, `initiator: Option<&str>`.
- `AuthClient::get_ticket_trusted` gains `domain: Option<&str>`.
### Breaking
- Call sites for `authenticate` / `get_ticket_trusted` need the new arguments.
- `Ticket` literals need `auth_origin`.
## [0.16.0] - 2025-09-12
Tickets need richer audit/security context: how the user authenticated, which domain/service, and who/what started the login. Store that on the ticket individual and in JSON.
### Added
- `Ticket` fields: `auth_method`, `domain`, `initiator` (RDF: `ticket:authMethod`, `ticket:domain`, `ticket:initiator`).
### Fixed
- `Ticket::PartialEq`: compare `user_login` correctly; include address and the new metadata fields.
### Breaking
- `Ticket` literals must initialize the new fields.
## [0.15.1] - 2025-07-09
ACL binary record codecs belong in `v_authorization`, not duplicated inside `v-common`, so format changes ship with the authorization crate.
### Changed
- `v_authorization` `0.4.0` → `0.5.1`.
- ACL record helpers moved to `v_authorization::record_formats`.
### Removed
- Module `az_impl::formats` (`encode_record`, `decode_filter`, `decode_rec_to_rights`, `decode_rec_to_rightset`, `update_counters`).
### Breaking
- Import `v_authorization::record_formats::*` instead of `v_common::az_impl::formats::*`.
## [0.14.0] - 2025-07-04
Storage backends (LMDB, memory, Tarantool) are a reusable library, not only part of `v-common`. Extract them to `v-storage` and keep shared API types in `v_api::common_type` so other crates can depend on storage without the full common stack.
### Changed
- Storage extracted to external crate `v-storage` `0.1.0` (workspace copy removed after extract).
- Common API types live under `v_api::common_type`.
### Breaking
- Depend on / import storage types from `v-storage` (integrated through `v-common` call sites).
---
## Earlier history (spot-checked)
### [0.13.8] - 2025-06-29
Keep the crate building on current dependency majors (notably SQLParser 0.30) and optional richer signal info.
- Dependency refresh (Tokio, Chrono, Serde, SQLParser 0.30, Xapian, …).
- Feature `extended-siginfo`.
- SQL lexer-tree updates for SQLParser 0.30.
### [0.13.6] – [0.13.7] - 2025-05 … 2025-06
Measure Xapian query stages for performance debugging; drop the old `stopwatch` crate in favor of standard timing.
- Xapian search debug timing.
- Removed `stopwatch`; use standard timing.
### [0.13.4] – [0.13.5] - 2025-02 … 2025-03
Ontology and individual model are shared across services. Move them to `v-individual-model` so serialization/Turtle/onto evolve without bloating `v-common`.
- Ontology / individual / Turtle model moved to `v-individual-model`.
- In-crate `onto` module removed.
### [0.13.3] - 2025-02-17
Allow removing selected predicates from an individual in one storage operation instead of replace-whole-document workarounds.
- API op `IndvOp::RemovePredicates` (`remove_predicates`).
### [0.11.0] – [0.13.2] - 2024-12 (reuse of 0.11/0.12 numbers)
Fill gaps in `Individual` setters for string/datetime/decimal construction and fix predicate replace semantics; update Chrono usage and queue dependency.
- `Individual::set_datetime_from_str`, `set_decimal_from_str`, `set_decimal_from_i64`.
- `set_resources` replaces the full predicate value set.
- Chrono datetime construction updated; `v_queue` → `0.2.7`; drop `SIGWINCH`.
### [0.10.7] – [0.10.21] - 2024-07 … 2024-12 (after version reset)
Bridge Tokio generations and optional clients with features; add in-memory storage for tests/light deployments; harden ClickHouse typing and LMDB open/logging.
- Resumed `0.10.x` after superseded mid-2024 `0.11`/`0.12`.
- `RuntimeWrapper` (Tokio 0.2 or 1 via features).
- Optional awc / `rusty_tarantool` feature wiring.
- `MemoryStorage` / `VStorage::new_memory()`.
- `Individual::set_decimal_from_f64`; ClickHouse nullable SQL types; LMDB logging/open fixes.
### [0.11.0] / [0.12.0] - 2024-06 … 2024-07 (superseded)
Make storage client updates and the `Storage` trait express real errors instead of `bool` / empty results, and group optional update parameters into `UpdateOptions`.
- `UpdateOptions` for `MStorageClient`; `update`/`updates` → `Result<OpResult, ApiError>`.
- `Storage` / `VStorage` methods become fallible (`Result<_, ResultCode>`).
### [0.10.0] – [0.10.6] - 2024-05 … 2024-06
Improve authorization observability and LMDB iteration; clarify cache config naming; remove artificial limits on select buffer size.
- Auth record encoding / cache config rename (`use_authorization_cache`).
- `LmdbIterator`; az stat manager duration; removed `query_select` buffer-size limit.
### [0.8.0] – [0.9.0] - 2024-04
Speed up repeated ACL lookups with optional LMDB cache indexes; clean up LMDB storage internals for maintainability.
- Optional LMDB ACL cache indexes.
- LMDB storage internals refactor.
### [0.7.1] – [0.7.3] - 2024-04
Collect authorization timing/stats for ops monitoring; standardize module logging setup via a macro.
- AZ stat manager.
- Macro `init_module_log`.
### [0.6.0] – [0.6.14] - 2024-02
Export data as Turtle for interchange; query RDF stores over SPARQL; keep ClickHouse/SPARQL stored queries authorization-aware and SQL-correct (`FINAL`, parsers).
- Turtle export helpers.
- Async SPARQL client.
- ClickHouse / SPARQL stored-query authorization and SQL/`FINAL` handling.
### [0.5.0] – [0.5.2] - 2024-02
Callers must tell “not found” from “storage error” when reading individuals; skip useless authorize work when the individual is missing.
- `get_individual` / related storage reads return `ResultCode` instead of `bool`.
- `check_indv_access_read` checks `NotFound` first.
### Pre-0.5 (2021–2023)
Foundation period: async storage, AuthApi, ticket IP checks, VQL fixes, ClickHouse/Xapian clients, module params/aliases, stored queries (KH/Oxygraph), logout API, and many dependency/patch releases. Not expanded commit-by-commit here.
---
[0.25.4]: https://github.com/semantic-machines/v-common/compare/v0.25.3...v0.25.4
[0.25.3]: https://github.com/semantic-machines/v-common/compare/v0.25.2...v0.25.3
[0.25.2]: https://github.com/semantic-machines/v-common/compare/v0.25.1...v0.25.2
[0.25.1]: https://github.com/semantic-machines/v-common/compare/v0.25.0...v0.25.1
[0.25.0]: https://github.com/semantic-machines/v-common/compare/v0.24.0...v0.25.0
[0.24.0]: https://github.com/semantic-machines/v-common/compare/v0.23.1...v0.24.0
[0.23.1]: https://github.com/semantic-machines/v-common/compare/v0.23.0...v0.23.1
[0.23.0]: https://github.com/semantic-machines/v-common/compare/v0.22.0...v0.23.0
[0.22.0]: https://github.com/semantic-machines/v-common/compare/v0.21.0...v0.22.0
[0.21.0]: https://github.com/semantic-machines/v-common/compare/v0.20.0...v0.21.0
[0.20.0]: https://github.com/semantic-machines/v-common/compare/v0.19.4...v0.20.0
[0.19.4]: https://github.com/semantic-machines/v-common/compare/v0.19.3...v0.19.4
[0.19.3]: https://github.com/semantic-machines/v-common/compare/v0.19.2...v0.19.3
[0.19.2]: https://github.com/semantic-machines/v-common/compare/v0.19.1...v0.19.2
[0.19.1]: https://github.com/semantic-machines/v-common/compare/v0.19.0...v0.19.1
[0.19.0]: https://github.com/semantic-machines/v-common/compare/v0.18.0...v0.19.0
[0.18.0]: https://github.com/semantic-machines/v-common/compare/v0.17.1...v0.18.0
[0.17.1]: https://github.com/semantic-machines/v-common/compare/v0.17.0...v0.17.1
[0.17.0]: https://github.com/semantic-machines/v-common/compare/v0.16.1...v0.17.0
[0.16.1]: https://github.com/semantic-machines/v-common/compare/v0.16.0...v0.16.1
[0.16.0]: https://github.com/semantic-machines/v-common/compare/v0.15.1...v0.16.0
[0.15.1]: https://github.com/semantic-machines/v-common/compare/v0.14.0...v0.15.1
[0.14.0]: https://github.com/semantic-machines/v-common/compare/v0.13.8...v0.14.0
[0.13.8]: https://github.com/semantic-machines/v-common/compare/v0.13.7...v0.13.8