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-capisurface (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, andlmdbwhen 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¶
- Query results graph form (CONSTRUCT/DESCRIBE) + SPARQL Update
- Model / node / statement / URI accessors used by bindings
- Parser / serializer file and counted-string variants
- Digests + utf8 / file-URI helpers
- World log handlers (callback lifetime tests)
- Remaining mapped symbols →
verified/implementedor justifiednot-applicable/excluded
Storage queue¶
- Feature wiring (
storage-fjalldefault; optional natives off by default) redb(SB-04)rocksdb,sqlite,lmdb(SB-05)- Evaluation promote/defer/reject: sled, LevelDB, MDBX, SurrealKV (SB-06)
- Cross-surface discovery +
Model::copy_to(SB-07)
Non-goals¶
- Public user-supplied
DurableBackendtrait (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.jsonwith closed C gaps - Expanded
oxiland-capiallowlist + 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.mdmark 0.9 complete