Skip to content

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

@Fieldnote-Echo

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions