Skip to content

docs: add Tier 6 to the roadmap after an external review - #17

Open
tonytonycoder11 wants to merge 1 commit into
mainfrom
docs/roadmap-tier-6-adoption
Open

docs: add Tier 6 to the roadmap after an external review#17
tonytonycoder11 wants to merge 1 commit into
mainfrom
docs/roadmap-tier-6-adoption

Conversation

@tonytonycoder11

Copy link
Copy Markdown
Contributor

An external review raised a set of items against Kdrant. This triages them into a new Tier 6 (M26 to M30) and records, next to each declined item, the reason it was declined, so the same suggestions do not have to be re-litigated later.

The filter is deliberately narrow: an item earns a milestone only if it closes a gap between what Kdrant offers and what an adopter can actually use. Nothing here is added for completeness.

Accepted

Milestone Why it earns a place
M26 · Metadata-filter translation kdrant-spring-ai and kdrant-langchain4j accept the frameworks' filter types but never translate them. Filtered retrieval is the common RAG case, so today an application that filters cannot swap its backend without rewriting its retrieval layer. This is the whole distance between "an adapter exists" and "a drop-in replacement".
M27 · ensureCollection, ordered scroll, batchUpdate Each blocks a concrete workflow: a rerunnable GitOps bootstrap, and a resumable scroll-backed ETL. The blocker for ensureCollection, the enriched CollectionInfo read-back, already shipped in 0.2.0.
M28 · Observability batteries configureClient makes this reachable; a team standing up a service should not have to build it. kmemo-micrometer already proves the shape on the sibling project.
M29 · Contract tests vs the Qdrant OpenAPI schema The highest-value item left in M22. Qdrant ships minors quickly, and a renamed or newly-required field currently becomes a runtime failure in a user's service instead of a build failure here.
M30 · Migration guide, cookbook, published numbers Every capability listed is already built and documented nowhere as a pattern, and the JMH harness produces no public numbers. The cheapest adoption work left.

Two adjustments worth calling out, because they changed the suggestion rather than accepting it:

  • Pool tuning (maxConnectionsPerRoute, keepAliveTime) was suggested for KdrantConfig. It lands on the REST-engine factory instead: those are CIO concerns, and KdrantConfig is transport-neutral by the M12 decision that kept upsertBatchSize out for exactly the same reason.
  • Benchmarks in CI were suggested as a per-PR gate. The deterministic footprint table runs per PR; the JMH latency figures run on a schedule. Shared runners are too noisy to gate microbenchmarks, and a flaky gate only teaches people to ignore it.

Also in M26: an expression that cannot be translated must fail loudly, never silently drop the clause. A dropped filter returns confidently wrong documents, which is far more expensive than an error.

Declined, with reasons recorded in the roadmap

  • A Flow-based paged search. search returns a bounded top-k by design, and paging it with offset makes the server re-run the ANN search for every page. scroll is already the Flow for reading many, and M27 gives it the deterministic ordering that use case actually needs.
  • A bundled kdrant-jdk facade. The 1.0 position stands. A hand-written facade is permanent public API to maintain for a market that has not asked yet; revisit on evidence.
  • HTTP/2 as the throughput answer. Ktor CIO's HTTP/2 support is not the settled story the suggestion assumes, and the honest reply to "gRPC is faster" is M30's published numbers, not an unmeasured protocol claim.
  • ADRs as a separate directory. The rationale is worth writing down; the ceremony is not. It goes in STABILITY.md.

One thing to verify separately

The roadmap justified deferring Kover with "0.9.1 is not compatible with the Kotlin 2.4 Gradle plugin", but libs.versions.toml already pins kover = "0.9.9" with the plugin declared and never applied, most likely a Dependabot bump that was never re-tested. The build was not run as part of this change, so M29 asks for a re-verification against the current Kotlin 2.4.10 / Gradle 9.6.1 toolchain rather than claiming it is unblocked.

Scope

Documentation only: ROADMAP.md and the README Roadmap section. No code, no CHANGELOG.md entry, since nothing shipped. Checked against ROADMAP-CONVENTIONS.md: no without a version, tier and milestone headings conform, and the README now carries the Shipped / Next / Later labels the standard calls for. Its Shipped paragraph also now names 1.1.0, which it had not been updated to.

Kdrant's M25 and Kmemo's M17 are the same KMP migration on the same toolchain; M25 now says so, and gains the concrete substitution list. The companion change is NaCode-Studios/Kmemo.

An external review raised a set of items against Kdrant. This records the ones
worth building as M26 to M30, and writes down why the rest were declined, so
the same suggestions do not have to be re-litigated later.

Promoted out of the deferred list, each because it blocks a concrete workflow:
metadata-filter translation for the Spring AI and LangChain4j adapters, which
is the whole distance between an adapter existing and being a drop-in (M26);
ensureCollection, ordered scroll and batchUpdate, for rerunnable bootstrap and
resumable ETL (M27); Micrometer and X-Request-Id, today reachable only as a
seam (M28); and contract tests against the Qdrant OpenAPI schema, which
protect every other guarantee as Qdrant ships minors (M29). M30 collects the
documentation that lowers the switching cost, all of it describing features
that already ship.

Declined, with the reason recorded next to each: a Flow-based paged search,
since offset makes the server re-run the ANN search per page and scroll is
already the Flow for reading many; pool settings on KdrantConfig, which stays
transport-neutral by the M12 decision, so they land on the REST factory
instead; a bundled JDK facade, unchanged from the 1.0 position; HTTP/2 as the
answer to throughput, which is not the settled story it is assumed to be; and
a separate ADR directory, whose rationale belongs in STABILITY.md.

M25 gains the concrete substitution list for the KMP migration. The recorded
Kover blocker names 0.9.1 while the version catalog already pins 0.9.9 with
the plugin declared and never applied, so M29 asks for a re-verification
rather than assuming it is still blocked.

The README Roadmap section gains the Next paragraph the conventions call for,
and its Shipped paragraph now names 1.1.0 rather than stopping at 1.0.0.
@tonytonycoder11 tonytonycoder11 moved this to In progress in Kdrant Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

1 participant