# 0.8 compatibility report — C ABI preview
Status: complete for milestone scope (tip); registry publish pending tag
Milestone: [0.8](../milestones/0.8.md)
Decisions: [ADR-022](../DECISIONS.md), [ADR-023](../DECISIONS.md)
Design: [0.8-cabi.md](../design/0.8-cabi.md),
[0.8-redb-spike.md](../design/0.8-redb-spike.md)
## Claim
Oxiland **0.8.0** tip ships an auditable **C source-compat preview**
(`crates/oxiland-capi`) over the safe Rust facade, plus a sealed durable-store
adapter with Fjall behind it. This is **preview allowlist** evidence
(headers, pkg-config, sanitizer/symbol CI, representative C example)—**not**
ABI drop-in compatibility for existing Redland binaries and **not** complete
`librdf` symbol closure.
crates.io and PyPI publish remain **pending the `v0.8.0` tag**; until then
registries still serve **0.7.0**. Milestone-scope completion on tip is separate
from registry publish.
## Evidence
| ADR-022 / ADR-023 accepted | `docs/DECISIONS.md` |
| Sealed DurableStore + Fjall extraction | `src/storage/{durable,fjall,format_v1,mod}.rs` |
| Backend conformance harness | `tests/backend_conformance.rs` |
| Backend registry | `OpenOptions::new`, `compiled_backends()`, `StorageBackend::from_name` known-uncompiled errors; CLI/Python/C aligned |
| `oxiland-capi` crate | `cdylib` + `staticlib`, `include/librdf.h`, `oxiland.pc.in`, `symbols.version` |
| Preview allowlist | Milestone frozen list; FFI lifecycle tests in `crates/oxiland-capi/tests/` |
| Representative C example | `crates/oxiland-capi/examples/preview_workflow.c` |
| CI C ABI job | example build, symbol allowlist, ASan |
| Inventory | [`redland-1.0.17-oxiland-0.8.json`](https://github.com/eddiethedean/oxiland/blob/main/compatibility/inventory/redland-1.0.17-oxiland-0.8.json) with `c_abi` / `c_state` |
| User docs | [C ABI guide](../users/c-abi.md), [limitations](../users/c-abi-limitations.md) |
| redb spike record | `docs/design/0.8-redb-spike.md` (evaluation for 0.9) |
## C accounting (0.8)
Header-derived public `librdf_*` functions (383): preview allowlist symbols are
`c_state=verified` (45); remaining applicable symbols are `mapped` (deferred to
0.9) or retain safe-API `not-applicable` / `excluded` dispositions. See the 0.8
inventory notes.
## Non-goals confirmed
- No ABI layout/calling guarantees for existing Redland shared libraries
- No complete C symbol inventory without unexplained gaps (0.9)
- No downstream Redland language-binding / application matrix (0.9)
- No optional durable adapters (redb, RocksDB, SQLite, LMDB) in the default
or preview build
- No public user-supplied `DurableBackend` trait
## Version alignment
Rust crate `oxiland`, `oxiland-cli`, `oxiland-capi` (unpublished preview;
`publish = false`), and the Python package are versioned **0.8.0** on tip. The
Rust public API additions for this milestone are additive (`compiled_backends`,
`OpenOptions::new` / `backend`). Registry publish of crates.io/PyPI **0.8.0**
is gated on the release tag, not on tip milestone evidence alone.
## Residual risks
- Preview headers omit unsupported Redland APIs; linking against a fuller
Redland program requires 0.9 symbol work.
- Handle double-free after allocator reuse remains undefined; the preview
detects some second-frees of unregistered pointers only.
- Query result preview covers ASK/SELECT bindings paths; CONSTRUCT/DESCRIBE
graph results are not exposed on the C `query_results` API yet.
- Optional backends remain known-but-not-compiled until 0.9 adapters land.