This is an automated email from the ASF dual-hosted git repository.
JingsongLi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/paimon-vector-index.git
The following commit(s) were added to refs/heads/main by this push:
new facb7e0 docs: add release and candidate verification guides (#63)
facb7e0 is described below
commit facb7e0ab79341ac3242397b733a8de3f7000eec
Author: Jingsong Lee <[email protected]>
AuthorDate: Sun Jul 26 14:28:09 2026 +0800
docs: add release and candidate verification guides (#63)
---
docs/api.html | 2 +-
docs/creating-a-release.html | 237 ++++++++++++++++++++++++++++++++
docs/development.html | 4 +-
docs/diskann.html | 2 +-
docs/index.html | 2 +
docs/ivf-flat.html | 2 +-
docs/ivf-pq.html | 2 +-
docs/ivf-rq.html | 2 +-
docs/ivf-sq.html | 2 +-
docs/releases.html | 79 +++++++++++
docs/verifying-a-release-candidate.html | 191 +++++++++++++++++++++++++
tools/deploy_java_staging.sh | 8 +-
12 files changed, 521 insertions(+), 12 deletions(-)
diff --git a/docs/api.html b/docs/api.html
index 576bbf7..1940e72 100644
--- a/docs/api.html
+++ b/docs/api.html
@@ -18,7 +18,7 @@
<a class="skip-link" href="#main">Skip to content</a>
<header class="site-header"><div class="header-inner">
<a class="brand" href="index.html" aria-label="Paimon Vector Index
documentation home"><span class="brand-mark">VI</span><span>Paimon Vector
Index</span></a>
- <nav class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html" aria-current="page">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html">IVF-RQ</a><a
href="ivf-sq.html">IVF-SQ</a><a href="diskann.html">DiskANN</a></nav>
+ <nav class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html" aria-current="page">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html">IVF-RQ</a><a
href="ivf-sq.html">IVF-SQ</a><a href="diskann.html">DiskANN</a><a
href="releases.html">Releases</a></nav>
<div class="header-actions"><button class="icon-button" type="button"
data-theme-toggle aria-label="Switch color theme">◐</button><button
class="nav-toggle" type="button" data-nav-toggle aria-expanded="false"
aria-label="Open navigation">☰</button></div>
</div></header>
diff --git a/docs/creating-a-release.html b/docs/creating-a-release.html
new file mode 100644
index 0000000..a16f397
--- /dev/null
+++ b/docs/creating-a-release.html
@@ -0,0 +1,237 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information regarding copyright
ownership.
+ The ASF licenses this file to you under the Apache License, Version 2.0.
+-->
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="description" content="Release Manager guide for Apache Paimon
Vector Index source and language releases.">
+ <title>Creating a Release · Paimon Vector Index</title>
+ <link rel="stylesheet" href="styles.css">
+ <script src="docs.js" defer></script>
+</head>
+<body>
+ <a class="skip-link" href="#main">Skip to content</a>
+ <header class="site-header"><div class="header-inner">
+ <a class="brand" href="index.html" aria-label="Paimon Vector Index
documentation home"><span class="brand-mark">VI</span><span>Paimon Vector
Index</span></a>
+ <nav class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html">IVF-RQ</a><a
href="ivf-sq.html">IVF-SQ</a><a href="diskann.html">DiskANN</a><a
href="releases.html" aria-current="page">Releases</a></nav>
+ <div class="header-actions"><button class="icon-button" type="button"
data-theme-toggle aria-label="Switch color theme">◐</button><button
class="nav-toggle" type="button" data-nav-toggle aria-expanded="false"
aria-label="Open navigation">☰</button></div>
+ </div></header>
+
+ <main id="main"><div class="page-shell">
+ <section class="hero detail-hero">
+ <p class="eyebrow">Release Manager guide · ASF release policy</p>
+ <h1>Creating a release</h1>
+ <p class="hero-lead">Prepare a reproducible source candidate, stage the
Java and Python convenience artifacts, coordinate the community vote, and
publish only the candidate that was approved.</p>
+ <div class="badge-row"><span class="badge strong">Signed source
archive</span><span class="badge">72-hour vote</span><span
class="badge">RC-is-final bits</span><span class="badge">Local Java
signing</span></div>
+ </section>
+
+ <div class="doc-layout">
+ <aside class="toc" aria-label="On this page"><strong>On this
page</strong><a href="#overview">Overview</a><a href="#setup">One-time
setup</a><a href="#prepare">Prepare</a><a href="#candidate">Build the RC</a><a
href="#vote">Vote</a><a href="#retry">Replace an RC</a><a
href="#finalize">Finalize</a><a href="#announce">Announce</a></aside>
+ <article class="article">
+ <section class="article-section" id="overview">
+ <h2>Overview</h2>
+ <div class="callout warning"><strong>Release the voted commit,
unchanged</strong>The final <code>vVERSION</code> tag must point to the same
commit as the successful <code>vVERSION-rcN</code> tag. Never rebuild or modify
the source archive after the vote.</div>
+ <ol>
+ <li>Agree on the release and select a Release Manager.</li>
+ <li>Prepare dependency declarations, versions, and the release
branch.</li>
+ <li>Sign an RC tag, run the release workflow, create the source
archive, and stage Java.</li>
+ <li>Upload the source candidate and call a vote lasting at least
72 hours.</li>
+ <li>Fix issues and create a new RC when required.</li>
+ <li>After a successful vote, promote the exact RC and release
staged artifacts.</li>
+ <li>Publish release notes, update this page, and announce the
release.</li>
+ </ol>
+ <div class="table-wrap"><table><thead><tr><th>Component</th><th>RC
tag behavior</th><th>Final tag behavior</th></tr></thead><tbody>
+ <tr><td>Source</td><td>RM creates, signs, and uploads the archive
to ASF dist dev</td><td>The approved files move unchanged to ASF dist
release</td></tr>
+ <tr><td>Rust</td><td><code>cargo publish
--dry-run</code></td><td>Publishes <code>paimon-vindex-core</code> to
crates.io</td></tr>
+ <tr><td>Java</td><td>CI builds four JNI libraries; the RM signs
and deploys the JAR to Nexus staging locally</td><td>The RM closes and releases
the approved Nexus repository</td></tr>
+ <tr><td>Python</td><td>Builds four wheels and publishes
<code>VERSIONrcN</code> to TestPyPI after Rust, Java, and wheel jobs
pass</td><td>Publishes <code>VERSION</code> to PyPI</td></tr>
+ </tbody></table></div>
+ <p>This procedure follows the <a
href="https://www.apache.org/legal/release-policy.html">ASF Release Policy</a>.
The source archive is the release; registry packages are convenience
artifacts.</p>
+ </section>
+
+ <section class="article-section" id="setup">
+ <h2>One-time Release Manager setup</h2>
+ <h3>Signing key and ASF distribution repositories</h3>
+ <ol>
+ <li>Create a long-lived GPG signing key associated with your
<code>@apache.org</code> identity and publish it to a public key server.</li>
+ <li>Append the public key and signatures to the Paimon <a
href="https://downloads.apache.org/paimon/KEYS">KEYS</a> file through the ASF
distribution SVN repository.</li>
+ <li>Configure Git to use the same key and confirm that <code>git
tag -s</code> and <code>gpg --verify</code> work.</li>
+ </ol>
+ <div class="code-block"><span class="code-label">Shell · inspect
signing setup</span><pre><code>gpg --list-secret-keys --keyid-format LONG
+git config user.signingkey
+svn --version</code></pre></div>
+ <h3>Publishing credentials</h3>
+ <p>The GitHub repository needs <code>CARGO_REGISTRY_TOKEN</code>,
<code>TEST_PYPI_API_TOKEN</code>, and <code>PYPI_API_TOKEN</code>. Java is
deliberately deployed from the RM machine: configure GPG plus Maven server ID
<code>apache.releases.https</code>, and authenticate <code>gh</code> for access
to the RC workflow artifacts. See <a
href="../tools/README.md">tools/README.md</a> for Nexus credential options.</p>
+ </section>
+
+ <section class="article-section" id="prepare">
+ <h2>Prepare the release</h2>
+ <p>Work from a fresh clone and substitute the intended values. A
release branch represents a minor release line; RC attempts are tags on that
branch.</p>
+ <div class="code-block"><span class="code-label">Shell · example
values</span><pre><code>RELEASE_VERSION="0.3.0"
+SHORT_RELEASE_VERSION="0.3"
+NEXT_VERSION="0.4.0"
+RC_NUM="1"
+RELEASE_BRANCH="release-${SHORT_RELEASE_VERSION}"
+RC_TAG="v${RELEASE_VERSION}-rc${RC_NUM}"
+RELEASE_TAG="v${RELEASE_VERSION}"</code></pre></div>
+
+ <h3>Refresh dependency declarations on main</h3>
+ <p>Install <code>cargo-deny</code>, check every workspace crate,
generate the dependency TSV files, review the changes, and commit them before
cutting the branch.</p>
+ <div class="code-block"><span
class="code-label">Shell</span><pre><code>git checkout main
+git pull --ff-only origin main
+cargo install cargo-deny
+python3 tools/dependencies.py check
+python3 tools/dependencies.py generate
+git add DEPENDENCIES.rust.tsv \
+ core/DEPENDENCIES.rust.tsv ffi/DEPENDENCIES.rust.tsv
jni/DEPENDENCIES.rust.tsv
+git commit -m "chore: update dependency list for release ${RELEASE_VERSION}"
+git push origin main</code></pre></div>
+
+ <h3>Cut the release branch and advance main</h3>
+ <div class="code-block"><span
class="code-label">Shell</span><pre><code>git checkout -b "${RELEASE_BRANCH}"
origin/main
+git push origin "${RELEASE_BRANCH}"
+
+git checkout main
+cd tools
+OLD_VERSION="${RELEASE_VERSION}" \
+NEW_VERSION="${NEXT_VERSION}-SNAPSHOT" \
+ ./update_branch_version.sh
+cd ..
+git push origin main</code></pre></div>
+ <p>If the current Java version already carries
<code>-SNAPSHOT</code>, the helper accepts either the clean or snapshot old
version. Cargo and Python use the clean SemVer value.</p>
+ </section>
+
+ <section class="article-section" id="candidate">
+ <h2>Build and stage a release candidate</h2>
+ <h3>Set release versions and tag the candidate</h3>
+ <div class="code-block"><span
class="code-label">Shell</span><pre><code>git checkout "${RELEASE_BRANCH}"
+git pull --ff-only origin "${RELEASE_BRANCH}"
+cd tools
+OLD_VERSION="${RELEASE_VERSION}-SNAPSHOT" \
+NEW_VERSION="${RELEASE_VERSION}" \
+ ./update_branch_version.sh
+cd ..
+git push origin "${RELEASE_BRANCH}"
+
+git tag -s "${RC_TAG}" -m "Apache Paimon Vector Index ${RELEASE_VERSION}
RC${RC_NUM}"
+git tag -v "${RC_TAG}"
+git push origin "${RC_TAG}"</code></pre></div>
+ <p>Wait for the tag-triggered <a
href="https://github.com/apache/paimon-vector-index/actions/workflows/release.yml">Release
workflow</a>. Rust must pass its publish dry-run; Java must build the Linux
x86-64, Linux aarch64, macOS aarch64, and Windows x86-64 JNI libraries; Python
must build the same platform set and publish the RC wheels to TestPyPI.</p>
+
+ <h3>Create and upload the source candidate</h3>
+ <div class="code-block"><span
class="code-label">Shell</span><pre><code>git checkout "${RC_TAG}"
+cd tools
+RELEASE_VERSION="${RELEASE_VERSION}" ./create_source_release.sh
+cd ..
+
+svn checkout https://dist.apache.org/repos/dist/dev/paimon/ \
+ paimon-dist-dev --depth=immediates
+mkdir "paimon-dist-dev/paimon-vector-index-${RELEASE_VERSION}-rc${RC_NUM}"
+cp tools/release/apache-paimon-vector-index-${RELEASE_VERSION}-src.* \
+ "paimon-dist-dev/paimon-vector-index-${RELEASE_VERSION}-rc${RC_NUM}/"
+svn add "paimon-dist-dev/paimon-vector-index-${RELEASE_VERSION}-rc${RC_NUM}"
+svn commit -m "Add Paimon Vector Index ${RELEASE_VERSION} RC${RC_NUM}" \
+ paimon-dist-dev</code></pre></div>
+ <p>The script archives committed Git objects, excludes
development-only files, writes a reproducible gzip stream, creates an armored
detached signature, and records a SHA-512 checksum.</p>
+
+ <h3>Stage the Java convenience artifact</h3>
+ <p>Find the numeric run ID of the successful RC-tag
<code>Release</code> workflow, then validate the exact CI native artifacts
before any remote deploy.</p>
+ <div class="code-block"><span class="code-label">Shell · dry-run,
then deploy</span><pre><code>./tools/deploy_java_staging.sh \
+ --release-version "${RELEASE_VERSION}" \
+ --rc "${RC_NUM}" \
+ --run-id 12345678901 \
+ --dry-run
+
+./tools/deploy_java_staging.sh \
+ --release-version "${RELEASE_VERSION}" \
+ --rc "${RC_NUM}" \
+ --run-id 12345678901</code></pre></div>
+ <p>Record the resulting <code>orgapachepaimon-XXXX</code> Nexus
repository ID. Leave the repository staged until the vote finishes.</p>
+ </section>
+
+ <section class="article-section" id="vote">
+ <h2>Call the vote</h2>
+ <p>Send a plain-text message to <code>[email protected]</code>.
Following the <a href="https://www.apache.org/foundation/voting.html">ASF
voting process</a>, the vote must remain open for at least 72 hours and pass
with at least three binding +1 votes and more binding +1 than -1 votes.</p>
+ <div class="code-block"><span class="code-label">Vote
template</span><pre><code>Subject: [VOTE] Release Apache Paimon Vector Index
${RELEASE_VERSION} (RC${RC_NUM})
+
+Please review and vote on Apache Paimon Vector Index
+${RELEASE_VERSION}, release candidate ${RC_NUM}.
+
+[ ] +1 Approve
+[ ] 0 No opinion
+[ ] -1 Do not approve (please explain)
+
+Source candidate:
+https://dist.apache.org/repos/dist/dev/paimon/paimon-vector-index-${RELEASE_VERSION}-rc${RC_NUM}/
+
+Git tag and commit:
+https://github.com/apache/paimon-vector-index/releases/tag/${RC_TAG}
+<RC_COMMIT_SHA>
+
+KEYS:
+https://downloads.apache.org/paimon/KEYS
+
+Java staging repository:
+https://repository.apache.org/content/repositories/orgapachepaimon-XXXX/
+
+Python RC:
+https://test.pypi.org/project/paimon-vindex/${RELEASE_VERSION}rc${RC_NUM}/
+
+Verification guide:
+https://github.com/apache/paimon-vector-index/blob/${RC_TAG}/docs/verifying-a-release-candidate.html
+
+The vote will remain open for at least 72 hours.</code></pre></div>
+ <p>After the deadline, tally binding and non-binding votes
separately and send <code>[RESULT][VOTE] Release Apache Paimon Vector Index
VERSION (RCN)</code>.</p>
+ </section>
+
+ <section class="article-section" id="retry">
+ <h2>Replace a rejected candidate</h2>
+ <ol>
+ <li>Apply fixes to the release branch through normal review.</li>
+ <li>Drop the old Nexus staging repository.</li>
+ <li>Remove or retain the superseded dist-dev directory according
to the vote thread, but never overwrite its files.</li>
+ <li>Increment <code>RC_NUM</code>, create a new signed RC tag,
rebuild every candidate artifact, and start a new vote.</li>
+ </ol>
+ </section>
+
+ <section class="article-section" id="finalize">
+ <h2>Finalize an approved release</h2>
+ <h3>Tag and promote the exact RC</h3>
+ <div class="code-block"><span
class="code-label">Shell</span><pre><code>git checkout "${RC_TAG}"
+git tag -s "${RELEASE_TAG}" \
+ -m "Release Apache Paimon Vector Index ${RELEASE_VERSION}"
+test "$(git rev-parse "${RC_TAG}^{commit}")" = \
+ "$(git rev-parse "${RELEASE_TAG}^{commit}")"
+git tag -v "${RELEASE_TAG}"
+git push origin "${RELEASE_TAG}"
+
+svn mv -m "Release Paimon Vector Index ${RELEASE_VERSION}" \
+
"https://dist.apache.org/repos/dist/dev/paimon/paimon-vector-index-${RELEASE_VERSION}-rc${RC_NUM}"
\
+
"https://dist.apache.org/repos/dist/release/paimon/paimon-vector-index-${RELEASE_VERSION}"</code></pre></div>
+ <p>The final tag publishes Rust to crates.io and Python to PyPI. In
Nexus, close the previously recorded Java staging repository, inspect all
validation rules, then release it to Maven Central. Do not stage a new Java
build.</p>
+ <h3>Verify and publish release notes</h3>
+ <ul>
+ <li>The source archive, signature, and checksum are visible
through Apache mirrors.</li>
+ <li><code>paimon-vindex-core VERSION</code> is on crates.io.</li>
+
<li><code>org.apache.paimon:paimon-vector-index-java:VERSION</code> is on Maven
Central.</li>
+ <li><code>paimon-vindex VERSION</code> is on PyPI for all
supported platforms.</li>
+ <li>A GitHub release exists for <code>vVERSION</code>, with
reviewed generated notes.</li>
+ </ul>
+ </section>
+
+ <section class="article-section" id="announce">
+ <h2>Update and announce</h2>
+ <p>Wait at least one hour after source publication, then update <a
href="releases.html">the releases page</a> with the mirrored source-download,
notes, and registry links. After mirrors and registries have converged,
announce the release from an <code>@apache.org</code> address to
<code>[email protected]</code> and <code>[email protected]</code>.
Remove superseded releases from the live distribution area when required by ASF
policy; they remain in the Apache archive.</p>
+ <nav class="pager" aria-label="Release documentation"><a
href="releases.html"><small>Previous</small>← Releases</a><a
href="verifying-a-release-candidate.html"><small>Next</small>Verify an RC
→</a></nav>
+ </section>
+ </article>
+ </div>
+ </div></main>
+ <footer class="site-footer"><div class="footer-inner"><span>Apache Paimon
Vector Index</span><span>Release Manager guide</span></div></footer>
+</body>
+</html>
diff --git a/docs/development.html b/docs/development.html
index 8eaae98..6383e8d 100644
--- a/docs/development.html
+++ b/docs/development.html
@@ -18,7 +18,7 @@
<a class="skip-link" href="#main">Skip to content</a>
<header class="site-header"><div class="header-inner">
<a class="brand" href="index.html" aria-label="Paimon Vector Index
documentation home"><span class="brand-mark">VI</span><span>Paimon Vector
Index</span></a>
- <nav class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html" aria-current="page">Development</a><a
href="ivf-flat.html">IVF-FLAT</a><a href="ivf-pq.html">IVF-PQ</a><a
href="ivf-rq.html">IVF-RQ</a><a href="ivf-sq.html">IVF-SQ</a><a
href="diskann.html">DiskANN</a></nav>
+ <nav class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html" aria-current="page">Development</a><a
href="ivf-flat.html">IVF-FLAT</a><a href="ivf-pq.html">IVF-PQ</a><a
href="ivf-rq.html">IVF-RQ</a><a href="ivf-sq.html">IVF-SQ</a><a
href="diskann.html">DiskANN</a><a href="releases.html">Releases</a></nav>
<div class="header-actions"><button class="icon-button" type="button"
data-theme-toggle aria-label="Switch color theme">◐</button><button
class="nav-toggle" type="button" data-nav-toggle aria-expanded="false"
aria-label="Open navigation">☰</button></div>
</div></header>
@@ -185,7 +185,7 @@ PAIMON_VINDEX_LIB_PATH=../target/release pytest
-v</code></pre></div>
<h2>Storage format and compatibility</h2>
<p>Changes to headers, flags, sections, sort order, or graph
encoding must update both format fixtures and documentation. The normative v1
field definitions live in <a
href="../core/STORAGE_FORMAT.md">core/STORAGE_FORMAT.md</a>.</p>
<div class="card-grid"><article class="card"><h3>Reader
compatibility</h3><p>Unknown versions, required flags, non-zero reserved bytes,
negative counts, and out-of-bounds sections must fail rather than be
guessed.</p></article><article class="card"><h3>Stable
fixtures</h3><p><code>core/tests/fixtures</code> stores byte-exact hexadecimal
fixtures for every v1 index family. DiskANN additionally freezes compact
multi-page, 4-bit interleaved, FOR row-ID, and raw row-ID variants.</p [...]
- <nav class="pager" aria-label="Related documentation"><a
href="api.html"><small>Previous</small>← API and language bindings</a><a
href="index.html"><small>Back</small>Index overview →</a></nav>
+ <nav class="pager" aria-label="Related documentation"><a
href="api.html"><small>Previous</small>← API and language bindings</a><a
href="releases.html"><small>Next</small>Releases →</a></nav>
</section>
</article>
</div>
diff --git a/docs/diskann.html b/docs/diskann.html
index 1f8067e..168973c 100644
--- a/docs/diskann.html
+++ b/docs/diskann.html
@@ -18,7 +18,7 @@
<a class="skip-link" href="#main">Skip to content</a>
<header class="site-header"><div class="header-inner">
<a class="brand" href="index.html" aria-label="Paimon Vector Index
documentation home"><span class="brand-mark">VI</span><span>Paimon Vector
Index</span></a>
- <nav class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html">IVF-RQ</a><a
href="ivf-sq.html">IVF-SQ</a><a href="diskann.html"
aria-current="page">DiskANN</a></nav>
+ <nav class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html">IVF-RQ</a><a
href="ivf-sq.html">IVF-SQ</a><a href="diskann.html"
aria-current="page">DiskANN</a><a href="releases.html">Releases</a></nav>
<div class="header-actions"><button class="icon-button" type="button"
data-theme-toggle aria-label="Switch color theme">◐</button><button
class="nav-toggle" type="button" data-nav-toggle aria-expanded="false"
aria-label="Open navigation">☰</button></div>
</div></header>
diff --git a/docs/index.html b/docs/index.html
index 91f85ec..e4844c6 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -31,6 +31,7 @@
<a href="ivf-rq.html">IVF-RQ</a>
<a href="ivf-sq.html">IVF-SQ</a>
<a href="diskann.html">DiskANN</a>
+ <a href="releases.html">Releases</a>
</nav>
<div class="header-actions">
<button class="icon-button" type="button" data-theme-toggle
aria-label="Switch color theme">◐</button>
@@ -86,6 +87,7 @@
<article class="card"><h3>Search and filtering</h3><p>Understand
automatic width, explicit IVF <code>nprobe</code>, DiskANN
<code>l_search</code> calibration, warm-up, and Roaring64 filters.</p><a
class="card-link" href="api.html#params">Explore the search API →</a></article>
<article class="card"><h3>Development and
benchmarks</h3><p>Repository modules, Rust checks, cross-language smoke tests,
ANN benchmarks, and storage compatibility.</p><a class="card-link"
href="development.html">Open the development guide →</a></article>
<article class="card"><h3>DiskANN deployment and
tuning</h3><p>Understand the memory, local, remote, and object-store profiles,
resident-memory model, build parameters, and production-readiness
boundary.</p><a class="card-link" href="diskann.html">Open the DiskANN guide
→</a></article>
+ <article class="card"><h3>Releases and verification</h3><p>Download
signed source releases, create a release candidate, or independently verify one
before voting.</p><a class="card-link" href="releases.html">Open the release
guides →</a></article>
</div>
</section>
diff --git a/docs/ivf-flat.html b/docs/ivf-flat.html
index fbcb649..6631731 100644
--- a/docs/ivf-flat.html
+++ b/docs/ivf-flat.html
@@ -9,7 +9,7 @@
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,
initial-scale=1"><meta name="description" content="IVF-FLAT usage, design,
search pipeline, tuning, capacity, and v1 storage layout."><title>IVF-FLAT ·
Paimon Vector Index</title><link rel="stylesheet" href="styles.css"><script
src="docs.js" defer></script></head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
- <header class="site-header"><div class="header-inner"><a class="brand"
href="index.html" aria-label="Paimon Vector Index documentation home"><span
class="brand-mark">VI</span><span>Paimon Vector Index</span></a><nav
class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html"
aria-current="page">IVF-FLAT</a><a href="ivf-pq.html">IVF-PQ</a><a
href="ivf-rq.html">IVF-R [...]
+ <header class="site-header"><div class="header-inner"><a class="brand"
href="index.html" aria-label="Paimon Vector Index documentation home"><span
class="brand-mark">VI</span><span>Paimon Vector Index</span></a><nav
class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html"
aria-current="page">IVF-FLAT</a><a href="ivf-pq.html">IVF-PQ</a><a
href="ivf-rq.html">IVF-R [...]
<main id="main"><div class="page-shell">
<section class="hero detail-hero"><p class="eyebrow">Exact scan inside
selected lists</p><h1>IVF-FLAT</h1><p class="hero-lead">Use IVF coarse
partitions to reduce the candidate set, then retain and scan full
<code>f32</code> vectors inside each selected list. IVF-FLAT is the clearest
baseline for separating partition recall loss from quantization loss.</p><div
class="badge-row"><span class="badge strong">No in-list
quantization</span><span class="badge">About 4d bytes / vector</span> [...]
<div class="doc-layout">
diff --git a/docs/ivf-pq.html b/docs/ivf-pq.html
index a0dfdb3..00050c2 100644
--- a/docs/ivf-pq.html
+++ b/docs/ivf-pq.html
@@ -9,7 +9,7 @@
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,
initial-scale=1"><meta name="description" content="IVF-PQ usage, residual
encoding, optional OPQ, tuning, capacity, and v1 storage layout."><title>IVF-PQ
· Paimon Vector Index</title><link rel="stylesheet" href="styles.css"><script
src="docs.js" defer></script></head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
- <header class="site-header"><div class="header-inner"><a class="brand"
href="index.html" aria-label="Paimon Vector Index documentation home"><span
class="brand-mark">VI</span><span>Paimon Vector Index</span></a><nav
class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html" aria-current="page">IVF-PQ</a><a href="ivf-rq.html">IVF-R
[...]
+ <header class="site-header"><div class="header-inner"><a class="brand"
href="index.html" aria-label="Paimon Vector Index documentation home"><span
class="brand-mark">VI</span><span>Paimon Vector Index</span></a><nav
class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html" aria-current="page">IVF-PQ</a><a href="ivf-rq.html">IVF-R
[...]
<main id="main"><div class="page-shell">
<section class="hero detail-hero"><p class="eyebrow">Product-quantized
inverted lists</p><h1>IVF-PQ</h1><p class="hero-lead">Split each
<code>d</code>-dimensional vector into <code>m</code> subspaces and store only
one centroid ID per subspace. The unified configuration currently uses 8-bit
codes, reducing the main vector payload from <code>4d</code> bytes to about
<code>m</code> bytes.</p><div class="badge-row"><span class="badge strong">High
compression</span><span class="badge">8- [...]
<div class="doc-layout">
diff --git a/docs/ivf-rq.html b/docs/ivf-rq.html
index dcddf75..4d1cdf6 100644
--- a/docs/ivf-rq.html
+++ b/docs/ivf-rq.html
@@ -9,7 +9,7 @@
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,
initial-scale=1"><meta name="description" content="IVF-RQ multi-bit rotated
residual codes, two-stage distance estimation, tuning, benchmarks, and v1
storage layout."><title>IVF-RQ · Paimon Vector Index</title><link
rel="stylesheet" href="styles.css"><script src="docs.js" defer></script></head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
- <header class="site-header"><div class="header-inner"><a class="brand"
href="index.html" aria-label="Paimon Vector Index documentation home"><span
class="brand-mark">VI</span><span>Paimon Vector Index</span></a><nav
class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html" aria-current="page">IVF-R
[...]
+ <header class="site-header"><div class="header-inner"><a class="brand"
href="index.html" aria-label="Paimon Vector Index documentation home"><span
class="brand-mark">VI</span><span>Paimon Vector Index</span></a><nav
class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html" aria-current="page">IVF-R
[...]
<main id="main"><div class="page-shell">
<section class="hero detail-hero"><p class="eyebrow">Multi-bit rotated
residual quantization</p><h1>IVF-RQ</h1><p class="hero-lead">Partition vectors
with IVF, spread each residual through a deterministic orthogonal transform,
and store centered scalar levels as bit planes. A cheap sign-plane estimate
rejects weak candidates before the remaining planes are evaluated.</p><div
class="badge-row"><span class="badge strong">4 bits / dimension by
default</span><span class="badge">1–8 build [...]
<div class="doc-layout">
diff --git a/docs/ivf-sq.html b/docs/ivf-sq.html
index 436f88b..e16def2 100644
--- a/docs/ivf-sq.html
+++ b/docs/ivf-sq.html
@@ -8,7 +8,7 @@
<html lang="en">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,
initial-scale=1"><meta name="description" content="IVF-SQ residual scalar
quantization, tuning, I/O behavior, and stable v1 storage
layout."><title>IVF-SQ · Paimon Vector Index</title><link rel="stylesheet"
href="styles.css"><script src="docs.js" defer></script></head>
<body>
- <header class="site-header"><div class="header-inner"><a class="brand"
href="index.html" aria-label="Paimon Vector Index documentation home"><span
class="brand-mark">VI</span><span>Paimon Vector Index</span></a><nav
class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html">IVF-RQ</a><a href="ivf-sq
[...]
+ <header class="site-header"><div class="header-inner"><a class="brand"
href="index.html" aria-label="Paimon Vector Index documentation home"><span
class="brand-mark">VI</span><span>Paimon Vector Index</span></a><nav
class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html">IVF-RQ</a><a href="ivf-sq
[...]
<main>
<section class="hero detail-hero"><p class="eyebrow">Per-list residual
scalar quantization</p><h1>IVF-SQ</h1><p class="hero-lead">Store one unsigned
byte per residual dimension and scan the selected IVF lists directly. IVF-SQ
targets the gap between raw IVF-FLAT and aggressively compressed IVF-PQ/RQ
without paying for a graph in every list.</p><div class="badge-row"><span
class="badge strong">1 byte / dimension</span><span class="badge">Per-list
bounds</span><span class="badge">SIMD [...]
<div class="article-layout">
diff --git a/docs/releases.html b/docs/releases.html
new file mode 100644
index 0000000..1e34440
--- /dev/null
+++ b/docs/releases.html
@@ -0,0 +1,79 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information regarding copyright
ownership.
+ The ASF licenses this file to you under the Apache License, Version 2.0.
+-->
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="description" content="Apache Paimon Vector Index releases,
source downloads, language packages, and release guides.">
+ <title>Releases · Paimon Vector Index</title>
+ <link rel="stylesheet" href="styles.css">
+ <script src="docs.js" defer></script>
+</head>
+<body>
+ <a class="skip-link" href="#main">Skip to content</a>
+ <header class="site-header"><div class="header-inner">
+ <a class="brand" href="index.html" aria-label="Paimon Vector Index
documentation home"><span class="brand-mark">VI</span><span>Paimon Vector
Index</span></a>
+ <nav class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html">IVF-RQ</a><a
href="ivf-sq.html">IVF-SQ</a><a href="diskann.html">DiskANN</a><a
href="releases.html" aria-current="page">Releases</a></nav>
+ <div class="header-actions"><button class="icon-button" type="button"
data-theme-toggle aria-label="Switch color theme">◐</button><button
class="nav-toggle" type="button" data-nav-toggle aria-expanded="false"
aria-label="Open navigation">☰</button></div>
+ </div></header>
+
+ <main id="main"><div class="page-shell">
+ <section class="hero detail-hero">
+ <p class="eyebrow">Source releases · language packages · release
history</p>
+ <h1>Releases</h1>
+ <p class="hero-lead">Download official Apache source releases, find the
corresponding Rust, Java, and Python packages, or follow the release-manager
and release-candidate verification guides.</p>
+ <div class="badge-row"><span class="badge strong">ASF source
releases</span><span class="badge">Signed and checksummed</span><span
class="badge">Rust / Java / Python</span><span class="badge">SemVer</span></div>
+ </section>
+
+ <div class="doc-layout">
+ <aside class="toc" aria-label="On this page"><strong>On this
page</strong><a href="#channels">Distribution channels</a><a
href="#upcoming">Upcoming</a><a href="#release-020">0.2.0</a><a
href="#release-010">0.1.0</a><a href="#guides">Release guides</a></aside>
+ <article class="article">
+ <section class="article-section" id="channels">
+ <h2>Distribution channels</h2>
+ <div class="callout warning"><strong>The source archive is the
Apache release</strong>Registry packages and native wheels are convenience
binaries. The signed source archive approved by the community vote is the
authoritative release.</div>
+ <div
class="table-wrap"><table><thead><tr><th>Component</th><th>Location</th><th>Coordinates</th></tr></thead><tbody>
+ <tr><td>Source</td><td><a
href="https://www.apache.org/dyn/closer.lua/paimon/">Apache
mirrors</a></td><td><code>apache-paimon-vector-index-VERSION-src.tgz</code></td></tr>
+ <tr><td>Rust</td><td><a
href="https://crates.io/crates/paimon-vindex-core">crates.io</a></td><td><code>paimon-vindex-core</code></td></tr>
+ <tr><td>Java</td><td><a
href="https://repo.maven.apache.org/maven2/org/apache/paimon/paimon-vector-index-java/">Maven
Central</a></td><td><code>org.apache.paimon:paimon-vector-index-java</code></td></tr>
+ <tr><td>Python</td><td><a
href="https://pypi.org/project/paimon-vindex/">PyPI</a></td><td><code>paimon-vindex</code></td></tr>
+ <tr><td>C and C++</td><td>Official source archive</td><td>Build
<code>paimon-vindex-ffi</code> and use <code>include/</code></td></tr>
+ </tbody></table></div>
+ <p>Release signatures are checked against the Paimon <a
href="https://downloads.apache.org/paimon/KEYS">KEYS</a> file. Superseded
source releases remain available from the <a
href="https://archive.apache.org/dist/paimon/">Apache archive</a>.</p>
+ </section>
+
+ <section class="article-section" id="upcoming">
+ <h2>Upcoming: 0.3.0</h2>
+ <p>The repository is currently developing the 0.3.0 line. Until an
ASF vote passes and the signed source archive appears under Apache downloads,
code and packages from this line are development artifacts rather than an
Apache release.</p>
+ </section>
+
+ <section class="article-section" id="release-020">
+ <h2>0.2.0</h2>
+ <p>Released 7 July 2026. This release added batched vector-index
training and hardened the multi-language release pipeline, Java staging, source
JAR contents, and native wheel builds.</p>
+ <p><a
href="https://www.apache.org/dyn/closer.lua/paimon/paimon-vector-index-0.2.0/apache-paimon-vector-index-0.2.0-src.tgz?action=download">Source
release</a> · <a
href="https://github.com/apache/paimon-vector-index/releases/tag/v0.2.0">Release
notes</a> · <a href="https://crates.io/crates/paimon-vindex-core/0.2.0">Rust
crate</a> · <a
href="https://repo.maven.apache.org/maven2/org/apache/paimon/paimon-vector-index-java/0.2.0/">Java
artifacts</a> · <a href="https://pypi.org/pro [...]
+ </section>
+
+ <section class="article-section" id="release-010">
+ <h2>0.1.0</h2>
+ <p>Released 22 June 2026. The first release established the Rust
vector-index core, seek-based persisted readers, C/C++, Java/JNI, and Python
APIs, bitmap filtering, batch search, storage-format validation, and the
initial ANN benchmark suite.</p>
+ <p><a
href="https://www.apache.org/dyn/closer.lua/paimon/paimon-vector-index-0.1.0/apache-paimon-vector-index-0.1.0-src.tgz?action=download">Source
release</a> · <a
href="https://github.com/apache/paimon-vector-index/releases/tag/v0.1.0">Release
notes</a> · <a href="https://crates.io/crates/paimon-vindex-core/0.1.0">Rust
crate</a> · <a
href="https://repo.maven.apache.org/maven2/org/apache/paimon/paimon-vector-index-java/0.1.0/">Java
artifacts</a> · <a href="https://pypi.org/pro [...]
+ </section>
+
+ <section class="article-section" id="guides">
+ <h2>Release guides</h2>
+ <div class="card-grid">
+ <article class="card"><h3>Creating a release</h3><p>Prepare
versions and dependency manifests, build and stage an RC, call the vote, and
promote an approved release.</p><a class="card-link"
href="creating-a-release.html">Release Manager guide →</a></article>
+ <article class="card"><h3>Verifying a release
candidate</h3><p>Check provenance, signatures, checksums, archive contents,
builds, tests, and staged language artifacts before voting.</p><a
class="card-link" href="verifying-a-release-candidate.html">Verification guide
→</a></article>
+ </div>
+ <nav class="pager" aria-label="Related documentation"><a
href="development.html"><small>Related</small>← Development</a><a
href="creating-a-release.html"><small>Next</small>Creating a release →</a></nav>
+ </section>
+ </article>
+ </div>
+ </div></main>
+ <footer class="site-footer"><div class="footer-inner"><span>Apache Paimon
Vector Index</span><span>Releases</span></div></footer>
+</body>
+</html>
diff --git a/docs/verifying-a-release-candidate.html
b/docs/verifying-a-release-candidate.html
new file mode 100644
index 0000000..72473d8
--- /dev/null
+++ b/docs/verifying-a-release-candidate.html
@@ -0,0 +1,191 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information regarding copyright
ownership.
+ The ASF licenses this file to you under the Apache License, Version 2.0.
+-->
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="description" content="How to verify an Apache Paimon Vector
Index release candidate before voting.">
+ <title>Verifying a Release Candidate · Paimon Vector Index</title>
+ <link rel="stylesheet" href="styles.css">
+ <script src="docs.js" defer></script>
+</head>
+<body>
+ <a class="skip-link" href="#main">Skip to content</a>
+ <header class="site-header"><div class="header-inner">
+ <a class="brand" href="index.html" aria-label="Paimon Vector Index
documentation home"><span class="brand-mark">VI</span><span>Paimon Vector
Index</span></a>
+ <nav class="site-nav" data-site-nav aria-label="Documentation"><a
href="index.html">Overview</a><a href="api.html">API</a><a
href="development.html">Development</a><a href="ivf-flat.html">IVF-FLAT</a><a
href="ivf-pq.html">IVF-PQ</a><a href="ivf-rq.html">IVF-RQ</a><a
href="ivf-sq.html">IVF-SQ</a><a href="diskann.html">DiskANN</a><a
href="releases.html" aria-current="page">Releases</a></nav>
+ <div class="header-actions"><button class="icon-button" type="button"
data-theme-toggle aria-label="Switch color theme">◐</button><button
class="nav-toggle" type="button" data-nav-toggle aria-expanded="false"
aria-label="Open navigation">☰</button></div>
+ </div></header>
+
+ <main id="main"><div class="page-shell">
+ <section class="hero detail-hero">
+ <p class="eyebrow">Vote participant guide · verify independently</p>
+ <h1>Verifying a Release Candidate</h1>
+ <p class="hero-lead">Confirm the candidate's provenance and integrity,
inspect its legal and source-only contents, build it from the archive, test the
language surfaces, and report exactly what you checked with your vote.</p>
+ <div class="badge-row"><span class="badge strong">Source is
authoritative</span><span class="badge">GPG + SHA-512</span><span
class="badge">Build from archive</span><span class="badge">Binding or
non-binding</span></div>
+ </section>
+
+ <div class="doc-layout">
+ <aside class="toc" aria-label="On this page"><strong>On this
page</strong><a href="#inputs">Inputs</a><a href="#integrity">Integrity</a><a
href="#contents">Archive contents</a><a href="#build">Build and test</a><a
href="#artifacts">Convenience artifacts</a><a href="#vote">Vote</a></aside>
+ <article class="article">
+ <section class="article-section" id="inputs">
+ <h2>Collect the candidate inputs</h2>
+ <p>Use the URLs and commit SHA from the vote email. Substitute the
actual version and RC number; download all files from the ASF dist-dev
candidate directory rather than from an untrusted mirror.</p>
+ <div class="code-block"><span class="code-label">Shell ·
example</span><pre><code>RELEASE_VERSION="0.3.0"
+RC_NUM="1"
+RC_TAG="v${RELEASE_VERSION}-rc${RC_NUM}"
+RC_DIR="paimon-vector-index-${RELEASE_VERSION}-rc${RC_NUM}"
+ARCHIVE="apache-paimon-vector-index-${RELEASE_VERSION}-src.tgz"
+
+curl -O "https://dist.apache.org/repos/dist/dev/paimon/${RC_DIR}/${ARCHIVE}"
+curl -O
"https://dist.apache.org/repos/dist/dev/paimon/${RC_DIR}/${ARCHIVE}.asc"
+curl -O
"https://dist.apache.org/repos/dist/dev/paimon/${RC_DIR}/${ARCHIVE}.sha512"
+curl -O https://downloads.apache.org/paimon/KEYS</code></pre></div>
+ <div class="callout warning"><strong>Keep the evidence
linked</strong>The source archive, detached signature, checksum, signed Git
tag, commit SHA, Java staging repository, and TestPyPI version must all
identify the same release version and candidate.</div>
+ </section>
+
+ <section class="article-section" id="integrity">
+ <h2>Verify signature, checksum, and Git provenance</h2>
+ <div class="code-block"><span
class="code-label">Shell</span><pre><code>gpg --import KEYS
+gpg --verify "${ARCHIVE}.asc" "${ARCHIVE}"
+
+# Linux
+sha512sum -c "${ARCHIVE}.sha512"
+
+# macOS
+shasum -a 512 -c "${ARCHIVE}.sha512"</code></pre></div>
+ <p>A good cryptographic signature is necessary but not sufficient:
confirm that its fingerprint belongs to the Release Manager in the downloaded
Paimon KEYS file.</p>
+ <div class="code-block"><span class="code-label">Shell · signed tag
and commit</span><pre><code>git clone
https://github.com/apache/paimon-vector-index.git candidate-git
+git -C candidate-git fetch --tags
+git -C candidate-git tag -v "${RC_TAG}"
+git -C candidate-git rev-parse "${RC_TAG}^{commit}"</code></pre></div>
+ <p>The last SHA must equal the commit announced in the vote email.
Inspect the changes since the previous release and check that the tag is
attached to the intended release branch.</p>
+ </section>
+
+ <section class="article-section" id="contents">
+ <h2>Inspect the source archive</h2>
+ <div class="code-block"><span
class="code-label">Shell</span><pre><code>tar tzf "${ARCHIVE}" | sed -n '1,80p'
+tar tzf "${ARCHIVE}" | grep -E \
+ '(^|/)(\.git|\.github|\.idea|target|build|__pycache__)(/|$)' && exit
1 || true
+
+tar xzf "${ARCHIVE}"
+cd "paimon-vector-index-${RELEASE_VERSION}"</code></pre></div>
+ <p>Review the extracted tree rather than a Git checkout. At minimum
verify:</p>
+ <ul>
+ <li>There is exactly one top-level directory named
<code>paimon-vector-index-VERSION</code>.</li>
+ <li><code>LICENSE</code>, <code>NOTICE</code>, source headers,
README files, dependency declarations, and required build files are present and
correct.</li>
+ <li>No Git metadata, CI configuration, editor state, build output,
generated native libraries, credentials, or unrelated binary files are
included.</li>
+ <li>All bundled third-party material is compatible with the Apache
License 2.0 and recorded where required.</li>
+ <li>The release contains source sufficient to build the Rust core
and the C/C++, Java, and Python bindings.</li>
+ </ul>
+ <div class="code-block"><span class="code-label">Shell · repository
checks included in the archive</span><pre><code>python3
tools/check_license_headers.py
+python3 tools/dependencies.py check
+cargo deny check licenses</code></pre></div>
+ </section>
+
+ <section class="article-section" id="build">
+ <h2>Build and test from the archive</h2>
+ <p>Record the operating system, architecture, Rust, Python, JDK,
Maven, CMake, and compiler versions used. Run as much of the following matrix
as your environment supports.</p>
+ <h3>Rust workspace</h3>
+ <div class="code-block"><span
class="code-label">Shell</span><pre><code>cargo fmt --all -- --check
+cargo clippy --workspace --all-targets -- -D warnings
+cargo test --workspace
+cargo build --workspace --release
+cargo publish -p paimon-vindex-core --dry-run</code></pre></div>
+
+ <h3>C and C++</h3>
+ <div class="code-block"><span class="code-label">Shell ·
Linux</span><pre><code>cargo build --release -p paimon-vindex-ffi
+
+cmake -S c -B c/build \
+ -DPAIMON_VINDEX_FFI_LIB="$PWD/target/release/libpaimon_vindex_ffi.so"
+cmake --build c/build
+LD_LIBRARY_PATH="$PWD/target/release" c/build/test_vindex
+
+cmake -S cpp -B cpp/build \
+ -DPAIMON_VINDEX_FFI_LIB="$PWD/target/release/libpaimon_vindex_ffi.so"
+cmake --build cpp/build
+LD_LIBRARY_PATH="$PWD/target/release"
cpp/build/test_vindex_cpp</code></pre></div>
+ <p>Use <code>libpaimon_vindex_ffi.dylib</code> on macOS or
<code>paimon_vindex_ffi.dll</code> on Windows and the platform's equivalent
library-loader configuration.</p>
+
+ <h3>Java / JNI</h3>
+ <div class="code-block"><span class="code-label">Shell ·
Linux</span><pre><code>mvn -f java/pom.xml test
+cargo build --release -p paimon-vindex-jni
+
+java -cp java/target/test-classes:java/target/classes \
+ org.apache.paimon.index.vector.VectorIndexNativeValidationTest \
+ "$PWD/target/release/libpaimon_vindex_jni.so"
+java -cp java/target/test-classes:java/target/classes \
+ org.apache.paimon.index.vector.VectorIndexNativePanicBoundaryTest \
+ "$PWD/target/release/libpaimon_vindex_jni.so"
+java -cp java/target/test-classes:java/target/classes \
+ org.apache.paimon.index.vector.VectorIndexNativeHandleSafetyTest \
+ "$PWD/target/release/libpaimon_vindex_jni.so"</code></pre></div>
+
+ <h3>Python</h3>
+ <div class="code-block"><span
class="code-label">Shell</span><pre><code>cargo build --release -p
paimon-vindex-ffi
+python3 -m venv .venv
+. .venv/bin/activate
+cd python
+PAIMON_VINDEX_LIB_PATH=../target/release pip install -e ".[test]"
+PAIMON_VINDEX_LIB_PATH=../target/release pytest -v</code></pre></div>
+ <p>Also inspect test failures and warnings. A successful compiler
exit alone does not establish that the candidate is suitable for release.</p>
+ </section>
+
+ <section class="article-section" id="artifacts">
+ <h2>Test the staged convenience artifacts</h2>
+ <div class="callout"><strong>Do not substitute binary testing for
source verification</strong>These checks establish that the convenience
artifacts correspond to a usable release. The community vote still approves the
signed source archive.</div>
+ <h3>Rust</h3>
+ <p>RC tags intentionally do not publish to crates.io. The
source-tree <code>cargo publish --dry-run</code> above must pass, and a
temporary consumer can point to the signed RC tag:</p>
+ <div class="code-block"><span
class="code-label">Cargo.toml</span><pre><code>[dependencies]
+paimon-vindex-core = {
+ git = "https://github.com/apache/paimon-vector-index",
+ tag = "v${RELEASE_VERSION}-rc${RC_NUM}"
+}</code></pre></div>
+
+ <h3>Java Nexus staging</h3>
+ <p>Use the exact <code>orgapachepaimon-XXXX</code> repository from
the vote email. Resolve
<code>org.apache.paimon:paimon-vector-index-java:VERSION</code> from that URL,
run a small API smoke test, and inspect the binary JAR:</p>
+ <div class="code-block"><span
class="code-label">Shell</span><pre><code>jar tf
paimon-vector-index-java-${RELEASE_VERSION}.jar | sort
+
+# Expected native entries:
+# native/linux/x86_64/libpaimon_vindex_jni.so
+# native/linux/aarch64/libpaimon_vindex_jni.so
+# native/macos/aarch64/libpaimon_vindex_jni.dylib
+# native/windows/x86_64/paimon_vindex_jni.dll</code></pre></div>
+ <p>Verify the main JAR plus source and Javadoc JARs, POM,
signatures, and checksums. Confirm that the source JAR does not embed native
libraries and that the POM version has no <code>-SNAPSHOT</code> suffix.</p>
+
+ <h3>Python TestPyPI</h3>
+ <div class="code-block"><span class="code-label">Shell · isolated
environment</span><pre><code>python3 -m venv rc-wheel
+. rc-wheel/bin/activate
+python -m pip install \
+ --index-url https://test.pypi.org/simple/ \
+ --extra-index-url https://pypi.org/simple/ \
+ "paimon-vindex==${RELEASE_VERSION}rc${RC_NUM}"
+python -c "import paimon_vindex; print('OK')"</code></pre></div>
+ <p>Check that TestPyPI provides Linux x86-64, Linux aarch64, macOS
arm64, and Windows x86-64 wheels, and test the wheel matching your platform
against a small build/search/read round trip.</p>
+ </section>
+
+ <section class="article-section" id="vote">
+ <h2>Report your vote</h2>
+ <p>Reply to the vote thread with +1, 0, or -1, state whether the
vote is binding, and list the checks and platforms you actually completed.
Explain any failure precisely enough for the Release Manager to reproduce
it.</p>
+ <div class="code-block"><span class="code-label">Example
vote</span><pre><code>+1 (binding/non-binding)
+
+Verified:
+- RC tag signature and announced commit
+- source signature and SHA-512 checksum
+- LICENSE, NOTICE, dependency licenses, and source-only archive contents
+- Rust workspace tests and cargo publish dry-run on <OS/ARCH>
+- C/C++, Java/JNI, and Python tests on <OS/ARCH>
+- Java Nexus and TestPyPI smoke tests</code></pre></div>
+ <nav class="pager" aria-label="Release documentation"><a
href="creating-a-release.html"><small>Previous</small>← Creating a
release</a><a href="releases.html"><small>Back</small>Releases →</a></nav>
+ </section>
+ </article>
+ </div>
+ </div></main>
+ <footer class="site-footer"><div class="footer-inner"><span>Apache Paimon
Vector Index</span><span>Release Candidate verification</span></div></footer>
+</body>
+</html>
diff --git a/tools/deploy_java_staging.sh b/tools/deploy_java_staging.sh
index 736524c..201106a 100755
--- a/tools/deploy_java_staging.sh
+++ b/tools/deploy_java_staging.sh
@@ -49,8 +49,8 @@ libraries; the script verifies the run, downloads the native
artifacts, and then
runs the local Maven deploy.
Required:
- --release-version VERSION Release version in java/pom.xml, for example
0.2.0.
- --rc N RC number, for example 1 for v0.2.0-rc1.
+ --release-version VERSION Release version in java/pom.xml, for example
0.3.0.
+ --rc N RC number, for example 1 for v0.3.0-rc1.
--run-id RUN_ID GitHub Actions run id containing native-*
artifacts.
Options:
@@ -66,11 +66,11 @@ Options:
-h, --help Show this help.
Validate with the real RC artifacts before publishing:
- ./tools/deploy_java_staging.sh --release-version 0.2.0 --rc 1 \
+ ./tools/deploy_java_staging.sh --release-version 0.3.0 --rc 1 \
--run-id 12345678901 --dry-run
Publish staging after the dry run succeeds:
- ./tools/deploy_java_staging.sh --release-version 0.2.0 --rc 1 \
+ ./tools/deploy_java_staging.sh --release-version 0.3.0 --rc 1 \
--run-id 12345678901
Maven/GPG requirements: