Skip to content

Milestone 0.9 — C compatibility and ecosystem validation

Status: complete Outcome: prove broad source and behavioral compatibility using real consumers, with optional durable adapters behind the sealed DurableStore Depends on: 0.8 C ABI preview + sealed adapter (complete) Blocks: 0.10 release-candidate freeze Release evidence: docs/reports/0.9.md

This is the executable specification for 0.9. The roadmap defines the release outcome; this document defines the work packages and acceptance criteria. Design detail: 0.9-cabi.md, storage-backend-expansion.md, 0.8-redb-spike.md. Decisions: ADR-022, ADR-023 (revisit on allowlist and adapter promotion).

User-visible result

At the end of 0.9, a caller can:

  • link against an expanded oxiland-capi surface (beyond the 0.8 preview) with no unexplained inventory gaps;
  • run ASK/SELECT/CONSTRUCT/DESCRIBE and SPARQL Update through C, plus digests, URI/file helpers, term accessors, and world log handlers required by selected consumers;
  • open optional durable backends redb, rocksdb, sqlite, and lmdb when compiled behind Cargo features, with wrong-backend open failing before mutate;
  • discover backend availability consistently on Rust, CLI, Python, and C;
  • copy or export between backends via RDF and Model::copy_to;
  • rely on a published downstream-consumer matrix and installed-artifact packaging smokes.

Frozen downstream consumer matrix

Consumer Role Evidence
First-party C workflows Expanded examples + FFI lifecycle CI + ASan
Differential harness Same fixtures vs Redland when available compatibility/downstream/
Selected Redland C examples Rebuild against oxiland-capi CI smoke
Ruby redland binding smoke Language-binding calling patterns CI or documented deviations

ABI claims measure Oxiland’s own layout/calling/lifecycle on installed artifacts. Binary .so swap with stock Redland is not claimed unless a matrix row proves it.

C symbol cohort order

  1. Query results graph form (CONSTRUCT/DESCRIBE) + SPARQL Update
  2. Model / node / statement / URI accessors used by bindings
  3. Parser / serializer file and counted-string variants
  4. Digests + utf8 / file-URI helpers
  5. World log handlers (callback lifetime tests)
  6. Remaining mapped symbols → verified / implemented or justified not-applicable / excluded

Storage queue

  1. Feature wiring (storage-fjall default; optional natives off by default)
  2. redb (SB-04)
  3. rocksdb, sqlite, lmdb (SB-05)
  4. Evaluation promote/defer/reject: sled, LevelDB, MDBX, SurrealKV (SB-06)
  5. Cross-surface discovery + Model::copy_to (SB-07)

Non-goals

  • Public user-supplied DurableBackend trait (pre-0.10 ADR)
  • Native storage engines in default features
  • Historical Redland storage plug-in layouts / dynamic plug-in loading
  • Remote/server stores as path-based backends
  • Freezing the 1.0 backend matrix (0.10)
  • FFI fuzz corpus as a hard release gate

Work package sequence

ID Package Depends on
WP-09-00 Milestone + design + inventory milestone unlock
WP-09-C1 Inventory triage of mapped C symbols WP-09-00
WP-09-C2 Core C surface expansion WP-09-C1
WP-09-C3 Differential harness WP-09-C2
WP-09-C4 Installed-artifact packaging smokes WP-09-C2
WP-09-C5 Downstream consumer matrix CI WP-09-C3, WP-09-C4
WP-09-C6 Performance / memory baselines WP-09-C2
WP-09-S1 Cargo feature wiring WP-09-00
WP-09-S2 redb adapter WP-09-S1
WP-09-S3 RocksDB / SQLite / LMDB adapters WP-09-S2
WP-09-S4 Evaluation packages WP-09-S1
WP-09-S5 Surfaces + copy_to WP-09-S3
WP-09-10 Inventory, docs, parity, 0.9.0 release prep all

Evidence gates

  • C symbol inventory has no unexplained gaps.
  • Selected downstream consumers pass unchanged or have published deviations.
  • No severity-high correctness or memory-safety defect remains open.
  • Source and Oxiland ABI claims are measured per supported platform.
  • Performance regressions above budgets have written decisions.
  • Every promoted storage adapter passes the shared conformance suite and its feature/platform matrix.
  • Opening a store with the wrong backend fails before files are initialized or mutated.
  • Packaging smokes use installed rather than workspace-only linkage.

Exit checklist

  • Milestone + design docs landed
  • Inventory redland-1.0.17-oxiland-0.9.json with closed C gaps
  • Expanded oxiland-capi allowlist + sanitizer/symbol CI
  • Downstream matrix documented and CI-gated
  • Optional adapters: redb, rocksdb, sqlite, lmdb
  • Evaluation promote/defer/reject records
  • Model::copy_to + cross-surface discovery
  • docs/reports/0.9.md + 0.9.0 release checklist
  • PARITY.md / ROADMAP.md mark 0.9 complete