From 6bffe2da7d6ba5b692f1c1ff38a7cf185a16bba0 Mon Sep 17 00:00:00 2001 From: "DESKTOP-T2JJTNM\\dansu" Date: Tue, 21 Jul 2026 18:22:21 -0700 Subject: [PATCH] README: state the current release and document the v3.3 archive peek The front page advertised capabilities through v3.2 and named no current version, so a visitor arriving after the 3.3.0 tag saw a 3.2 page. Add a current-release line beside the CI badge, and a feature bullet for PeekScratchArchive alongside the existing version-marked entries. The current-release line also states that the (v3.0)/(v3.1)/(v3.2) markers in the feature list record when a capability landed rather than the current version, so adding a (v3.3) entry does not make the earlier ones read as stale. --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 4e3f409..76bb53f 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [![tests](https://github.com/dansupergameprogrammer/superfaiss/actions/workflows/tests.yml/badge.svg)](https://github.com/dansupergameprogrammer/superfaiss/actions/workflows/tests.yml) +**Current release: [v3.3.0](https://github.com/dansupergameprogrammer/superfaiss/releases/tag/v3.3.0)** — what each release added is in [CHANGELOG.md](CHANGELOG.md). Version markers in the feature list below record when a capability landed, not the current version. + Fast, deterministic, allocation-free k-nearest-neighbor search for game runtimes — over banks you bake in your pipeline or grow at play time. One bank answers many questions: score the whole vector or any weighted slice of it, decompose every hit's @@ -214,6 +216,17 @@ suite enforces that SIMD and mirror results are bit-identical on a device. in this library. These are the primitives the UE plugin's Bank Inspector tool is built on ([superfaiss-unreal](https://github.com/dansupergameprogrammer/superfaiss-unreal)); nothing about them is UE-specific. [API.md](docs/API.md). +- **Archive peek without a load (v3.3).** `PeekScratchArchive` reads a serialized scratch + archive's header and channel table straight out of a byte span and reports its geometry plus + `archiveBytes` — exactly the number of bytes a `Load` will consume — without allocating an + arena, reading the payload, or touching a bank. It applies the same header rules `Load` does, + from one shared validator, so a peek and a load cannot drift apart about what a well-formed + archive is: whatever a peek rejects, a load rejects. A span shorter than the archive it + declares is `BadFormat`; a longer one is not, because whatever follows belongs to the caller. + That is the point — a host that appends its own trailer after the archive (a channel-name + frame, say) uses `archiveBytes` to locate and validate that trailer *before* committing the + load, rather than discovering a broken trailer with the rows already replaced. Reading the + header twice is free; unwinding a load is not. [API.md](docs/API.md). ## What it deliberately is not