From e02fdfebee5ace1354e0673111b0d6f0b44ba23a Mon Sep 17 00:00:00 2001 From: holo Date: Sun, 28 Jun 2026 22:52:34 +0800 Subject: [PATCH] chore(release): prepare 0.6.5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cut the 0.6.5 release and bump every user-facing version reference ahead of tagging. Since 0.6.4 the engine gained three changes, all already merged and CI-green on main: - #251 (feat) — default `dikw init` scaffold now ships a Gitee `bge-m3` embedder + `bge-reranker-v2-m3` reranker keyed by one `GITEE_API_KEY`, and rerank/embed degrade-logging is unified (transient leg failures log at ERROR, enabled-but-unconfigured / deferred-embed log at WARNING; permanent provider errors still fail fast). - #250 (fix) — eval snapshot cache key now includes the ingest-time `cjk_tokenizer` and reads every search-time retrieval knob from the live config, so retrieval ablations on a shared `cache_root` under the default `--cache read_write` stop silently reusing the prior run's config. - #249 (feat) — eval per-query + negative rows surface `top1_score` and `top1_vec_cosine` (reranker-independent, via an eval-internal probe) so expect_none / OOD robustness is measurable from absolute relevance. Mechanics (mirrors the prepare-0.6.4 PR #247): - Version bump `0.6.4 -> 0.6.5` (`pyproject.toml` + `uv.lock` self-entry). - CHANGELOG: rename `## Unreleased` -> `## 0.6.5 — …` (Added/Changed/Fixed), open a fresh empty `## Unreleased`. The 0.6.5 heading is awk-extractable by `release.yml`'s notes extractor. - Docs/examples: bump the GHCR image tags (`docs/deployment-docker.md`), the pip-install pin (`docs/getting-started.md`), the compose `.env` default + error-message example (`examples/docker/.env.example`, `docker-compose.yml`), and the bug-report version placeholder. - `examples/docker/Dockerfile` intentionally NOT bumped — `release.yml`'s `sync-dockerfile` job auto-bumps it after the tag publishes to PyPI; its current 0.6.4 is published, so the Dockerfile guard stays green. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- CHANGELOG.md | 31 +++++++++++++++++++++++++++ docs/deployment-docker.md | 4 ++-- docs/getting-started.md | 2 +- examples/docker/.env.example | 2 +- examples/docker/docker-compose.yml | 2 +- pyproject.toml | 2 +- uv.lock | 2 +- 8 files changed, 39 insertions(+), 8 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 77c4c83..82c4e71 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -34,7 +34,7 @@ body: attributes: label: Version description: Output of `dikw version`. - placeholder: "0.6.4" + placeholder: "0.6.5" validations: required: true - type: dropdown diff --git a/CHANGELOG.md b/CHANGELOG.md index a539945..6cc8750 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,23 @@ on each entry call out exactly what shape changes break. ## Unreleased +## 0.6.5 — Default scaffold ships Gitee embed + rerank; eval cache keys retrieval config and surfaces absolute relevance scores + +### Added + +- **Eval rows surface absolute relevance scores for OOD calibration.** + (#249) Each retrieval-eval per-query and negative row now carries + `top1_score` (the top hit's score) and `top1_vec_cosine` — the + reranker/fusion-independent raw top-1 vector cosine, captured by an + eval-internal `HybridSearcher.top_vector_cosine` probe (the production + `search()` path and its ranking are untouched). Fusion scores (RRF is + rank-based; combsum/combmnz are per-leg min-max normalized) can't carry an + absolute magnitude, so `expect_none` / out-of-distribution robustness was + previously immeasurable from rank order alone; the absolute cosine makes it + observable (covered query high, OOD query low). The vector probe is skipped + for pure-`bm25` ablations so they stay embedding-free. A score-based OOD + *metric* is deferred — this release only surfaces the signals. + ### Changed - **Default scaffold ships Gitee embed + rerank; unified rerank/embed @@ -26,6 +43,20 @@ on each entry call out exactly what shape changes break. bad key/model) still fail fast on both the read path (→ 500) and the write path (ingest aborts) — the fail-fast-on-misconfig invariant is unchanged. +### Fixed + +- **Eval snapshot cache keys the ingest-time tokenizer and reads query-time + retrieval config live.** (#250) The eval corpus-snapshot cache key omitted + `RetrievalConfig`, so under the default `--cache read_write` changing any + retrieval knob (`rrf_k` / weights / `fusion` / `rerank_enabled` / `graph_*`) + and re-running silently hit the stale snapshot and reused the *previous* + config — no error, wrong numbers, exactly on the retrieval-ablation workflow. + The cache key now includes the only ingest-time retrieval field, + `cjk_tokenizer` (a change forces re-ingest); every search-time knob is read + from the live config on each `_run_queries`, so ablations sharing one + `cache_root` are now both fast and correct. A defensive guard re-raises if a + cache hit's baked tokenizer ever disagrees with the live one. + ## 0.6.4 — K-layer system prompts extracted to packaged `.md`; product self-reference unified to `dikw` ### Changed diff --git a/docs/deployment-docker.md b/docs/deployment-docker.md index ea953b1..4ef5c83 100644 --- a/docs/deployment-docker.md +++ b/docs/deployment-docker.md @@ -42,8 +42,8 @@ keeps the quick-start under a screenful. against it too: ```bash - docker run --rm -v ./base:/base ghcr.io/opendikw/dikw-core:0.6.4 init /base - docker run --rm ghcr.io/opendikw/dikw-core:0.6.4 version + docker run --rm -v ./base:/base ghcr.io/opendikw/dikw-core:0.6.5 init /base + docker run --rm ghcr.io/opendikw/dikw-core:0.6.5 version ``` There is intentionally **no floating `:latest`** — downstream pins an diff --git a/docs/getting-started.md b/docs/getting-started.md index 68174c7..b5076e9 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -23,7 +23,7 @@ dikw init my-base --description "my research base" cd my-base ``` -Pin an exact version (`uv pip install 'dikw-core[postgres]==0.6.4'`) so your +Pin an exact version (`uv pip install 'dikw-core[postgres]==0.6.5'`) so your client stays on the same release as the server it talks to — `dikw client` runs a [version handshake](server.md) and hard-fails on a mismatch. diff --git a/examples/docker/.env.example b/examples/docker/.env.example index a416985..e700401 100644 --- a/examples/docker/.env.example +++ b/examples/docker/.env.example @@ -2,7 +2,7 @@ # released version (https://github.com/OpenDIKW/dikw-core/releases); compose # fails closed until it's set, so the debug environment never rides a stale # default. Bump deliberately when you want to debug against a newer release. -DIKW_VERSION=0.6.4 +DIKW_VERSION=0.6.5 # Required — leave blank to force compose to fail-closed until set. # Generate strong values, e.g. `openssl rand -base64 24` for both. diff --git a/examples/docker/docker-compose.yml b/examples/docker/docker-compose.yml index c14bec3..1dfb701 100644 --- a/examples/docker/docker-compose.yml +++ b/examples/docker/docker-compose.yml @@ -26,7 +26,7 @@ services: # (``docker compose up --build``); it does NOT auto-pull. Its ``args`` # forward the same DIKW_VERSION so a local build matches the pinned tag # instead of the Dockerfile's ARG default. - image: ghcr.io/opendikw/dikw-core:${DIKW_VERSION:?set DIKW_VERSION in .env to a released version, e.g. 0.6.4} + image: ghcr.io/opendikw/dikw-core:${DIKW_VERSION:?set DIKW_VERSION in .env to a released version, e.g. 0.6.5} build: context: . dockerfile: Dockerfile diff --git a/pyproject.toml b/pyproject.toml index f987ef1..b21433d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "dikw-core" -version = "0.6.4" +version = "0.6.5" description = "AI-native knowledge engine across the DIKW pyramid (Data → Information → Knowledge → Wisdom)" readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index bd61013..57f0b99 100644 --- a/uv.lock +++ b/uv.lock @@ -263,7 +263,7 @@ wheels = [ [[package]] name = "dikw-core" -version = "0.6.4" +version = "0.6.5" source = { editable = "." } dependencies = [ { name = "anthropic" },