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}
+&lt;RC_COMMIT_SHA&gt;
+
+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__)(/|$)' &amp;&amp; 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 &lt;OS/ARCH&gt;
+- C/C++, Java/JNI, and Python tests on &lt;OS/ARCH&gt;
+- 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:

Reply via email to