Skip to content

0.8.0 staging: public API re-architecture & streamlining (breaking) #232

Description

Staging / tracking issue for the 0.8.0 cycle — a breaking re-architecture to streamline the public API into a cleaner, smaller, more consistent surface. Breaking changes are expected here (they are NOT permitted in 0.6.0).

Living checklist; items are added/triaged as we go.

Context — tiering principle & scope (drafted 2026-06-15)

Principle. Expose generously; the cost lives at only two boundaries — the stable (semver-locked) surface and persisted formats (each format is a permanent magic + loader + fuzz target + metadata-probe + "never break" commitment). So tier rather than cut: a small stable core plus a generous experimental tier (composed by opting into the feature). Adding to the stable surface later is non-breaking; removing is breaking — so keep the stable+persisted boundary stingy and let it accrete only what's profiled.

Scope — most re-tiering is NOT breaking and need not wait for 0.8.0. 0.2.0 (the only published release) shipped just Rank / RankQuant / Bitmap / SignBitmap (+ the deprecated *Index aliases). Everything added since 0.2.0 is unpublished, so re-tiering it is free now — it belongs in the pre-publish / 0.6.0 (#231) window, not the 0.8.0 breaking cycle. This issue (0.8.0) is only for changes that touch the 0.2.0-published surface.

Verified current state (2026-06-15, src/lib.rs):

Genuinely 0.8.0-breaking (touches the 0.2.0-published surface) — the real scope of this issue: the deprecated *Index alias removal, and any reshape of the four core types / the search_* family / SearchResults (all in the checklist below).

Format-governance rule (the expensive boundary): a type may be public/composable long before it earns a persisted format. Default = derive-at-load (no magic); add a new on-disk format only when a type is (a) stable and (b) load-time rebuild or mmap-ability is a real bottleneck. (Per the permanent read constraint below, existing magics — including legacy .tv* — never break.)

Candidate changes (to triage)

  • Remove the deprecated pre-0.2 *Index type aliases (RankIndex / RankQuantIndex / BitmapIndex / SignBitmapIndex / …).
  • Streamline the search_* family (search / search_asymmetric / *_subset / *_batched_serial / *_into / with_sign_probe) into a more consistent, discoverable API.
  • Revisit the flat-buffer SearchResults representation as the stable result shape.
  • Decide graduation of the experimental surface (stateless Contingency / Projection / bucket-code → stable; MultiBucketBitmap keep vs remove).
  • Finalize the RankQuantFastscan public API + persistence surface (after its promotion lands).

Constraint — the read contract is permanent

The on-disk read contract never breaks: any file the crate has ever written must keep loading (current .ov* + legacy .tv*). Breaking changes in 0.8.0 apply to the API / write surface, not to historical file readability.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions