This is an automated email from the ASF dual-hosted git repository.

github-actions[bot] pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/datafusion-comet.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 27a7819a3e Publish built docs triggered by 
8166586fa767008a45665358d200ce23ec955f64
27a7819a3e is described below

commit 27a7819a3e50465b8f48a2c7c7f94d4d61f210fe
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Sep 24 10:41:20 2026 +0000

    Publish built docs triggered by 8166586fa767008a45665358d200ce23ec955f64
---
 ...id-013012468fa27c9e9fdb0a14196d357c619c68a8.svg |  2 +-
 _sources/about/versioning_policy.md.txt            | 73 +++++++++++++++++++++-
 .../contributor-guide/config_conventions.md.txt    | 48 +++++++++++++-
 _sources/contributor-guide/development.md.txt      |  6 ++
 _sources/user-guide/latest/configs.md.txt          | 13 ++++
 _sources/user-guide/latest/tuning.md.txt           |  8 +++
 about/versioning_policy.html                       | 72 +++++++++++++++++++--
 contributor-guide/config_conventions.html          | 65 ++++++++++++++++++-
 contributor-guide/development.html                 |  5 ++
 searchindex.js                                     |  2 +-
 user-guide/latest/configs.html                     | 11 ++++
 user-guide/latest/tuning.html                      |  7 +++
 12 files changed, 299 insertions(+), 13 deletions(-)

diff --git a/_images/mermaid-013012468fa27c9e9fdb0a14196d357c619c68a8.svg 
b/_images/mermaid-013012468fa27c9e9fdb0a14196d357c619c68a8.svg
index 5342794c8d..ede7c29a72 100644
--- a/_images/mermaid-013012468fa27c9e9fdb0a14196d357c619c68a8.svg
+++ b/_images/mermaid-013012468fa27c9e9fdb0a14196d357c619c68a8.svg
@@ -1 +1 @@
-<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; class="flowchart" style="max-width: 
511.73px; background-color: transparent;" viewBox="0 0 511.7299499511719 942" 
role="graphics-document document" 
aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet 
ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes 
edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes 
dash{to{stroke-dashoffset:0;}}#my-svg [...]
\ No newline at end of file
+<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; class="flowchart" style="max-width: 
511.73px; background-color: transparent;" viewBox="0 0 511.7299499511719 942" 
role="graphics-document document" 
aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet 
ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes 
edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes 
dash{to{stroke-dashoffset:0;}}#my-svg [...]
\ No newline at end of file
diff --git a/_sources/about/versioning_policy.md.txt 
b/_sources/about/versioning_policy.md.txt
index e5cb832f44..7b6e4974c8 100644
--- a/_sources/about/versioning_policy.md.txt
+++ b/_sources/about/versioning_policy.md.txt
@@ -48,7 +48,14 @@ interface that vendors implement. It is small on purpose, 
and everything outside
 The following are covered by this versioning policy:
 
 - **Configuration keys under `spark.comet.*`**: their names, types, accepted 
values, default
-  values, and semantics.
+  values, and semantics. Two classes of key are excluded — those in the 
`testing` category, and
+  those marked internal; see
+  [Testing and Internal Configurations Are 
Exempt](#testing-and-internal-configurations-are-exempt).
+  Every other key is covered wherever Comet documents it, including keys the
+  [configuration reference](../user-guide/latest/configs.md) does not list in 
its own right: the
+  per-expression `spark.comet.expression.<Name>.allowIncompatible` opt-ins, 
which the
+  [compatibility guide](../user-guide/latest/compatibility/index.md) 
documents, and the deprecated
+  alias a rename leaves behind.
 - **A small, enumerated public Java and Scala API**: the class names users 
write into Spark config
   properties, and the S3 credential provider SPI that vendors implement. The 
full list is in
   [Public Scala and Java API](#public-scala-and-java-api).
@@ -59,6 +66,9 @@ The following are covered by this versioning policy:
 The following are internal implementation details. They are not covered by 
this policy and may
 change in any release:
 
+- Configuration keys in the `testing` category, and keys marked internal. They 
exist to let Comet's
+  own suites and maintainers reach internal behavior, and they expose that 
behavior directly. See
+  [Testing and Internal Configurations Are 
Exempt](#testing-and-internal-configurations-are-exempt).
 - The protobuf format used to serialize query plans between the JVM and the 
native library. The
   JVM jar and the native library ship together and are versioned together; see
   [Native Library Coupling](#native-library-coupling).
@@ -71,6 +81,52 @@ change in any release:
   fall back to Spark. An expression that ran natively in one release may fall 
back in the next,
   and vice versa. The results stay the same; only the speed changes.
 
+### Testing and Internal Configurations Are Exempt
+
+Two kinds of configuration key sit outside this policy, and what puts a key 
outside is an explicit
+mark on its declaration in `CometConf.scala`: **a key is exempt only if it is 
in the `testing`
+category or is marked `internal()`.** Every other `spark.comet.*` key is 
covered.
+
+Absence from the [configuration reference](../user-guide/latest/configs.md) is 
not the test,
+because that page is not an exhaustive list of covered keys. The per-expression
+`spark.comet.expression.<Name>.allowIncompatible` opt-ins are read as plain 
strings with no
+`ConfigEntry` behind them, so no generated table ever lists them; the
+[compatibility guide](../user-guide/latest/compatibility/index.md) is where 
they are documented
+instead. A deprecated alias left behind by a rename has no row of its own 
either. Both are fully
+covered.
+
+The two mechanisms that do exempt a key are set independently of each other:
+
+- **The `testing` category.** Every key declares a category, and `testing` 
routes it into the
+  Development & Testing Settings table rather than in with the production 
settings. These keys
+  exist so that Comet's own suites, and contributors chasing a bug, can reach 
a state the rest of
+  the code is not built to support: disabling native scans to isolate a 
planner problem, running
+  Comet in on-heap mode, making a declined operator throw instead of quietly 
reporting itself, or
+  running a partial aggregate without its final counterpart. Setting one is a 
debugging step, not a
+  deployment choice.
+- **`internal()`.** A key marked internal is left out of the configuration 
reference entirely, so
+  Comet never publishes its name, its default, or what it does. A user has no 
supported way to
+  learn that it exists, which is the point: these are escape hatches a 
maintainer reaches for while
+  working on Comet itself.
+
+For a key caught by either mechanism, the name, type, accepted values, default 
value, and semantics
+may change in any release, including a patch release, and the key may be 
removed outright. None of
+the machinery the rest of this policy requires applies: no 
`spark.comet.legacy.*` escape hatch for a
+behavior change, no deprecated alias for a rename, no deprecation cycle before 
removal, and no
+upgrade guide entry.
+
+The exemption exists because these keys point at Comet's internals by 
construction. Guaranteeing
+them across releases would pin the implementation details they expose, which 
is the thing the rest
+of this section deliberately leaves free to change.
+
+The corollary binds contributors: **neither mechanism may be the only way to 
reach a behavior that
+production users need.** If a knob turns out to be one that deployments 
legitimately set, it belongs
+in a non-`testing` category and must not be marked internal, and the 
guarantees come with it.
+Choosing a category, and deciding whether to mark a key internal, are 
therefore policy decisions
+rather than routing details; see
+[Categories and 
Visibility](../contributor-guide/config_conventions.md#categories-and-visibility)
+in the contributor guide.
+
 ## What Each Version Component Means
 
 ### Major Releases
@@ -99,8 +155,11 @@ A minor release may:
 ### Patch Releases
 
 A patch release contains bug fixes only. It adds no configuration keys and 
makes no behavior
-changes, with one exception: correctness fixes, which are covered in
-[Correctness Fixes Are Not Breaking 
Changes](#correctness-fixes-are-not-breaking-changes).
+changes, with two exceptions: correctness fixes, which are covered in
+[Correctness Fixes Are Not Breaking 
Changes](#correctness-fixes-are-not-breaking-changes), and
+configuration keys in the `testing` category or marked internal, which are 
outside the policy
+altogether and may be added, changed, or removed in any release. See
+[Testing and Internal Configurations Are 
Exempt](#testing-and-internal-configurations-are-exempt).
 
 ## Behavior Changes and Legacy Configurations
 
@@ -125,6 +184,10 @@ Behavior changes that require this treatment include 
changing the default value
 configuration key, changing what an existing key's values mean, and changing 
the semantics of an
 `Incompatible` expression or operator whose divergence from Spark users may 
have come to depend on.
 
+Changing a `testing` or internal key is not a behavior change for this 
purpose, and needs no escape
+hatch. See
+[Testing and Internal Configurations Are 
Exempt](#testing-and-internal-configurations-are-exempt).
+
 ### Lifetime of a Legacy Configuration
 
 A `spark.comet.legacy.*` key is deprecated from the moment it is added. Its 
purpose is to buy users
@@ -147,6 +210,10 @@ The alias may only be dropped in a major release.
 Removing a configuration key outright requires a deprecation cycle: the key 
must remain available,
 with a deprecation warning, for at least one minor release before it is 
removed in a major release.
 
+Neither rule applies to a `testing` or internal key, which may be renamed 
without an alias and
+removed in any release. See
+[Testing and Internal Configurations Are 
Exempt](#testing-and-internal-configurations-are-exempt).
+
 ## Correctness Fixes Are Not Breaking Changes
 
 Comet's contract is to produce the results that Apache Spark produces. When an 
expression or
diff --git a/_sources/contributor-guide/config_conventions.md.txt 
b/_sources/contributor-guide/config_conventions.md.txt
index 5bcad087ea..6c198f740c 100644
--- a/_sources/contributor-guide/config_conventions.md.txt
+++ b/_sources/contributor-guide/config_conventions.md.txt
@@ -66,19 +66,60 @@ The symbol name is what appears in code; the key is what 
appears in user configu
 The two do not have to match segment-for-segment — brevity in the symbol is 
fine as long
 as the key remains descriptive.
 
-## Categories
+## Categories and Visibility
 
 Every `ConfigEntry` must call `.category(...)`. The category is used to route 
the key into
 the right table in the user guide's `configs.md`. Available categories are 
declared as
 `CATEGORY_*` constants at the top of `CometConf.scala`. If a new config does 
not fit an
 existing category, discuss adding a new one before landing the config.
 
+A second, independent choice is whether to call `.internal()`, which keeps the 
key out of
+`configs.md` altogether.
+
+Neither choice is cosmetic. Together they decide whether Comet's
+[versioning policy](../about/versioning_policy.md) covers the key. The 
policy's rule keys on these
+two marks and nothing else: a key is exempt only if it is in the `testing` 
category or is marked
+`internal()`, and every other `spark.comet.*` key is covered.
+
+| Category  | `internal()` | Appears in `configs.md`          | Covered by the 
versioning policy |
+| --------- | ------------ | -------------------------------- | 
-------------------------------- |
+| any other | no           | yes, in its category's table     | **yes**        
                  |
+| `testing` | no           | yes, under Development & Testing | no             
                  |
+| any       | yes          | no                               | no             
                  |
+
+Note that a key read by string rather than through a registered `ConfigEntry` 
— as the
+per-expression `spark.comet.expression.<Name>.allowIncompatible` opt-ins are — 
has no way to carry
+either mark, so it is covered. Reaching for a dynamic key is therefore not a 
way to avoid the
+guarantee; if the key is a debugging aid, give it a real `ConfigEntry` in the 
`testing` category.
+
+Being covered commits the project to the key's name, type, accepted values, 
default, and semantics
+across minor releases. Being
+[exempt](../about/versioning_policy.md#testing-and-internal-configurations-are-exempt)
 means the key
+may be renamed, retyped, redefaulted, or removed in any release, including a 
patch release, with no
+alias, no deprecation cycle, and no upgrade guide entry.
+
+So reach for `testing` or `internal()` only when the key exists to let Comet's 
own suites, or
+someone debugging Comet itself, reach a state the rest of the code is not 
built to support —
+disabling native scans, running in on-heap mode, making a declined operator 
throw. Use `internal()`
+in particular when Comet should not publish the key at all, so that nobody can 
adopt it in the first
+place.
+
+If a deployment would have a legitimate reason to set the key, it belongs in a 
non-`testing`
+category and must not be `internal()`, and the guarantees come with it. Do not 
use either mechanism
+as a way to ship a production knob without committing to it.
+
 ## Renaming an Existing Config
 
 Configs under `spark.comet.*` are stable across minor releases: users may have 
set them in
 production `spark-defaults.conf` files, Spark job submissions, or notebooks. 
Renaming a key
 must not silently break those deployments.
 
+Keys in the `testing` category, and keys marked `internal()`, are
+[exempt from the versioning 
policy](../about/versioning_policy.md#testing-and-internal-configurations-are-exempt)
+and may be renamed outright: skip the `withAlternative` call in step 1, and 
step 5 with it. The
+rest of the checklist still applies, because a stale key string left behind in 
code or docs is a
+bug either way.
+
 Use the `withAlternative` builder on `ConfigBuilder` to keep the old key 
working as a
 deprecated alias:
 
@@ -159,5 +200,10 @@ Two cases do **not** need a legacy config:
 - **Changes to which expressions and operators run natively.** Falling back to 
Spark, or ceasing
   to, changes performance rather than results.
 
+Nor does a change to a key in the `testing` category or a key marked 
`internal()`, both
+[exempt from the versioning 
policy](../about/versioning_policy.md#testing-and-internal-configurations-are-exempt):
+the default and the meaning may change in any release, with no legacy config 
and no upgrade guide
+entry. Update the suites that set it in the same PR.
+
 Removing a legacy config is a major-release change, handled the same way as 
removing a deprecated
 alias.
diff --git a/_sources/contributor-guide/development.md.txt 
b/_sources/contributor-guide/development.md.txt
index b5752e0863..2bf3bd6ec8 100644
--- a/_sources/contributor-guide/development.md.txt
+++ b/_sources/contributor-guide/development.md.txt
@@ -567,6 +567,12 @@ It is possible to debug both native and JVM code 
concurrently as described in th
 
 ## Submitting a Pull Request
 
+Use `git push` for normal updates to your PR branch. If you need to force push 
after a rebase
+or amend, use `git push --force-with-lease` instead of `git push --force` (or 
`-f`). This reduces
+the risk of accidentally overwriting another maintainer's commits when 
multiple people push
+to the same PR branch. If the lease check rejects the push, inspect and 
integrate the remote
+changes before retrying; do not switch to `--force` to bypass the check.
+
 Before submitting a pull request, follow this checklist to ensure your changes 
are ready:
 
 ### 1. Format Your Code
diff --git a/_sources/user-guide/latest/configs.md.txt 
b/_sources/user-guide/latest/configs.md.txt
index 0290e84751..9793555e09 100644
--- a/_sources/user-guide/latest/configs.md.txt
+++ b/_sources/user-guide/latest/configs.md.txt
@@ -160,6 +160,19 @@ shuffle, including applications that rely only on remote 
reliable storage or dec
 
 ## Development & Testing Settings
 
+These settings exist for Comet's own test suites and for debugging. They are 
**not covered by the
+[versioning 
policy](../../about/versioning_policy.md#testing-and-internal-configurations-are-exempt)**:
+their names, defaults, accepted values, and meanings may change in any 
release, including a patch
+release, and any of them may be removed without a deprecation cycle. Do not 
set them in
+production.
+
+Comet also marks a handful of keys internal and deliberately leaves them off 
this page entirely.
+They are maintainer escape hatches, not settings, and carry no guarantee of 
any kind. Absence from
+this page does not by itself mean that, though: the per-expression
+`spark.comet.expression.<Name>.allowIncompatible` opt-ins are documented in the
+[compatibility guide](compatibility/index.md) rather than here, and the 
versioning policy covers
+them like any other production setting.
+
 <!--BEGIN:CONFIG_TABLE[testing]-->
 <!-- prettier-ignore-start -->
 | Config | Description | Default Value |
diff --git a/_sources/user-guide/latest/tuning.md.txt 
b/_sources/user-guide/latest/tuning.md.txt
index 368f46ece6..5855d6cdc0 100644
--- a/_sources/user-guide/latest/tuning.md.txt
+++ b/_sources/user-guide/latest/tuning.md.txt
@@ -381,6 +381,14 @@ projects the file schema. The original null checks and 
residual runtime filter r
 The original join still verifies matches, including any hash collisions 
admitted by the filter.
 Standalone projections, other filter expressions, and limits prevent reader 
attachment.
 
+To preserve schema-conversion and timestamp-overflow errors, runtime reader 
pruning is disabled for
+each file whose projected or statically filtered columns require schema 
adaptations beyond direct
+column mappings or literal values. This conservative check also disables 
reader pruning for allowed
+`INT32` to `BIGINT` promotion and for projecting a subset of a struct's 
fields, even when those
+adaptations cannot fail. Nested column pruning still reads only the requested 
struct fields. Scans
+with supplied file statistics also skip reader attachment. These cases still 
use runtime filtering
+on decoded batches.
+
 Filters stay within the task's native plan and do not propagate across Spark 
exchanges or JVM/Arrow
 boundaries. A shuffled hash join can still filter probe batches after shuffle, 
but it cannot send
 its filter back to an earlier scan stage. Compare the [runtime-filter and scan 
metrics](metrics.md#hash-joins)
diff --git a/about/versioning_policy.html b/about/versioning_policy.html
index de7cfb03ea..ee407934ad 100644
--- a/about/versioning_policy.html
+++ b/about/versioning_policy.html
@@ -503,7 +503,14 @@ interface that vendors implement. It is small on purpose, 
and everything outside
 <p>The following are covered by this versioning policy:</p>
 <ul class="simple">
 <li><p><strong>Configuration keys under <code class="docutils literal 
notranslate"><span class="pre">spark.comet.*</span></code></strong>: their 
names, types, accepted values, default
-values, and semantics.</p></li>
+values, and semantics. Two classes of key are excluded — those in the <code 
class="docutils literal notranslate"><span class="pre">testing</span></code> 
category, and
+those marked internal; see
+<a class="reference internal" 
href="#testing-and-internal-configurations-are-exempt">Testing and Internal 
Configurations Are Exempt</a>.
+Every other key is covered wherever Comet documents it, including keys the
+<a class="reference internal" href="../user-guide/latest/configs.html"><span 
class="std std-doc">configuration reference</span></a> does not list in its own 
right: the
+per-expression <code class="docutils literal notranslate"><span 
class="pre">spark.comet.expression.&lt;Name&gt;.allowIncompatible</span></code> 
opt-ins, which the
+<a class="reference internal" 
href="../user-guide/latest/compatibility/index.html"><span class="std 
std-doc">compatibility guide</span></a> documents, and the deprecated
+alias a rename leaves behind.</p></li>
 <li><p><strong>A small, enumerated public Java and Scala API</strong>: the 
class names users write into Spark config
 properties, and the S3 credential provider SPI that vendors implement. The 
full list is in
 <a class="reference internal" href="#public-scala-and-java-api">Public Scala 
and Java API</a>.</p></li>
@@ -514,6 +521,9 @@ contract is defined by Apache Spark rather than by Comet. 
See
 <p>The following are internal implementation details. They are not covered by 
this policy and may
 change in any release:</p>
 <ul class="simple">
+<li><p>Configuration keys in the <code class="docutils literal 
notranslate"><span class="pre">testing</span></code> category, and keys marked 
internal. They exist to let Comet’s
+own suites and maintainers reach internal behavior, and they expose that 
behavior directly. See
+<a class="reference internal" 
href="#testing-and-internal-configurations-are-exempt">Testing and Internal 
Configurations Are Exempt</a>.</p></li>
 <li><p>The protobuf format used to serialize query plans between the JVM and 
the native library. The
 JVM jar and the native library ship together and are versioned together; see
 <a class="reference internal" href="#native-library-coupling">Native Library 
Coupling</a>.</p></li>
@@ -526,6 +536,48 @@ native block is partitioned, and how a plan is rendered 
may all change between r
 fall back to Spark. An expression that ran natively in one release may fall 
back in the next,
 and vice versa. The results stay the same; only the speed changes.</p></li>
 </ul>
+<section id="testing-and-internal-configurations-are-exempt">
+<h3>Testing and Internal Configurations Are Exempt<a class="headerlink" 
href="#testing-and-internal-configurations-are-exempt" title="Link to this 
heading">#</a></h3>
+<p>Two kinds of configuration key sit outside this policy, and what puts a key 
outside is an explicit
+mark on its declaration in <code class="docutils literal notranslate"><span 
class="pre">CometConf.scala</span></code>: <strong>a key is exempt only if it 
is in the <code class="docutils literal notranslate"><span 
class="pre">testing</span></code>
+category or is marked <code class="docutils literal notranslate"><span 
class="pre">internal()</span></code>.</strong> Every other <code 
class="docutils literal notranslate"><span 
class="pre">spark.comet.*</span></code> key is covered.</p>
+<p>Absence from the <a class="reference internal" 
href="../user-guide/latest/configs.html"><span class="std 
std-doc">configuration reference</span></a> is not the test,
+because that page is not an exhaustive list of covered keys. The per-expression
+<code class="docutils literal notranslate"><span 
class="pre">spark.comet.expression.&lt;Name&gt;.allowIncompatible</span></code> 
opt-ins are read as plain strings with no
+<code class="docutils literal notranslate"><span 
class="pre">ConfigEntry</span></code> behind them, so no generated table ever 
lists them; the
+<a class="reference internal" 
href="../user-guide/latest/compatibility/index.html"><span class="std 
std-doc">compatibility guide</span></a> is where they are documented
+instead. A deprecated alias left behind by a rename has no row of its own 
either. Both are fully
+covered.</p>
+<p>The two mechanisms that do exempt a key are set independently of each 
other:</p>
+<ul class="simple">
+<li><p><strong>The <code class="docutils literal notranslate"><span 
class="pre">testing</span></code> category.</strong> Every key declares a 
category, and <code class="docutils literal notranslate"><span 
class="pre">testing</span></code> routes it into the
+Development &amp; Testing Settings table rather than in with the production 
settings. These keys
+exist so that Comet’s own suites, and contributors chasing a bug, can reach a 
state the rest of
+the code is not built to support: disabling native scans to isolate a planner 
problem, running
+Comet in on-heap mode, making a declined operator throw instead of quietly 
reporting itself, or
+running a partial aggregate without its final counterpart. Setting one is a 
debugging step, not a
+deployment choice.</p></li>
+<li><p><strong><code class="docutils literal notranslate"><span 
class="pre">internal()</span></code>.</strong> A key marked internal is left 
out of the configuration reference entirely, so
+Comet never publishes its name, its default, or what it does. A user has no 
supported way to
+learn that it exists, which is the point: these are escape hatches a 
maintainer reaches for while
+working on Comet itself.</p></li>
+</ul>
+<p>For a key caught by either mechanism, the name, type, accepted values, 
default value, and semantics
+may change in any release, including a patch release, and the key may be 
removed outright. None of
+the machinery the rest of this policy requires applies: no <code 
class="docutils literal notranslate"><span 
class="pre">spark.comet.legacy.*</span></code> escape hatch for a
+behavior change, no deprecated alias for a rename, no deprecation cycle before 
removal, and no
+upgrade guide entry.</p>
+<p>The exemption exists because these keys point at Comet’s internals by 
construction. Guaranteeing
+them across releases would pin the implementation details they expose, which 
is the thing the rest
+of this section deliberately leaves free to change.</p>
+<p>The corollary binds contributors: <strong>neither mechanism may be the only 
way to reach a behavior that
+production users need.</strong> If a knob turns out to be one that deployments 
legitimately set, it belongs
+in a non-<code class="docutils literal notranslate"><span 
class="pre">testing</span></code> category and must not be marked internal, and 
the guarantees come with it.
+Choosing a category, and deciding whether to mark a key internal, are 
therefore policy decisions
+rather than routing details; see
+<a class="reference internal" 
href="../contributor-guide/config_conventions.html#categories-and-visibility"><span
 class="std std-ref">Categories and Visibility</span></a>
+in the contributor guide.</p>
+</section>
 </section>
 <section id="what-each-version-component-means">
 <h2>What Each Version Component Means<a class="headerlink" 
href="#what-each-version-component-means" title="Link to this 
heading">#</a></h2>
@@ -557,8 +609,11 @@ public API that keep existing vendor jars working.</p></li>
 <section id="patch-releases">
 <h3>Patch Releases<a class="headerlink" href="#patch-releases" title="Link to 
this heading">#</a></h3>
 <p>A patch release contains bug fixes only. It adds no configuration keys and 
makes no behavior
-changes, with one exception: correctness fixes, which are covered in
-<a class="reference internal" 
href="#correctness-fixes-are-not-breaking-changes">Correctness Fixes Are Not 
Breaking Changes</a>.</p>
+changes, with two exceptions: correctness fixes, which are covered in
+<a class="reference internal" 
href="#correctness-fixes-are-not-breaking-changes">Correctness Fixes Are Not 
Breaking Changes</a>, and
+configuration keys in the <code class="docutils literal notranslate"><span 
class="pre">testing</span></code> category or marked internal, which are 
outside the policy
+altogether and may be added, changed, or removed in any release. See
+<a class="reference internal" 
href="#testing-and-internal-configurations-are-exempt">Testing and Internal 
Configurations Are Exempt</a>.</p>
 </section>
 </section>
 <section id="behavior-changes-and-legacy-configurations">
@@ -581,6 +636,9 @@ pin an old Comet release.</p>
 <p>Behavior changes that require this treatment include changing the default 
value of an existing
 configuration key, changing what an existing key’s values mean, and changing 
the semantics of an
 <code class="docutils literal notranslate"><span 
class="pre">Incompatible</span></code> expression or operator whose divergence 
from Spark users may have come to depend on.</p>
+<p>Changing a <code class="docutils literal notranslate"><span 
class="pre">testing</span></code> or internal key is not a behavior change for 
this purpose, and needs no escape
+hatch. See
+<a class="reference internal" 
href="#testing-and-internal-configurations-are-exempt">Testing and Internal 
Configurations Are Exempt</a>.</p>
 <section id="lifetime-of-a-legacy-configuration">
 <h3>Lifetime of a Legacy Configuration<a class="headerlink" 
href="#lifetime-of-a-legacy-configuration" title="Link to this 
heading">#</a></h3>
 <p>A <code class="docutils literal notranslate"><span 
class="pre">spark.comet.legacy.*</span></code> key is deprecated from the 
moment it is added. Its purpose is to buy users
@@ -599,6 +657,9 @@ old key is kept working as a deprecated alias using the 
<code class="docutils li
 The alias may only be dropped in a major release.</p>
 <p>Removing a configuration key outright requires a deprecation cycle: the key 
must remain available,
 with a deprecation warning, for at least one minor release before it is 
removed in a major release.</p>
+<p>Neither rule applies to a <code class="docutils literal notranslate"><span 
class="pre">testing</span></code> or internal key, which may be renamed without 
an alias and
+removed in any release. See
+<a class="reference internal" 
href="#testing-and-internal-configurations-are-exempt">Testing and Internal 
Configurations Are Exempt</a>.</p>
 </section>
 </section>
 <section id="correctness-fixes-are-not-breaking-changes">
@@ -834,7 +895,10 @@ incompatibilities.</p>
   </div>
   <nav class="bd-toc-nav page-toc" 
aria-labelledby="pst-page-navigation-heading-2">
     <ul class="visible nav section-nav flex-column">
-<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" 
href="#comet-s-compatibility-surface">Comet’s Compatibility Surface</a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" 
href="#comet-s-compatibility-surface">Comet’s Compatibility Surface</a><ul 
class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" 
href="#testing-and-internal-configurations-are-exempt">Testing and Internal 
Configurations Are Exempt</a></li>
+</ul>
+</li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" 
href="#what-each-version-component-means">What Each Version Component 
Means</a><ul class="nav section-nav flex-column">
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" 
href="#major-releases">Major Releases</a></li>
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" 
href="#minor-releases">Minor Releases</a></li>
diff --git a/contributor-guide/config_conventions.html 
b/contributor-guide/config_conventions.html
index 66a1c237f0..085e6b0245 100644
--- a/contributor-guide/config_conventions.html
+++ b/contributor-guide/config_conventions.html
@@ -606,18 +606,73 @@ be a red flag; both spell it <code class="docutils 
literal notranslate"><span cl
 The two do not have to match segment-for-segment — brevity in the symbol is 
fine as long
 as the key remains descriptive.</p>
 </section>
-<section id="categories">
-<h2>Categories<a class="headerlink" href="#categories" title="Link to this 
heading">#</a></h2>
+<section id="categories-and-visibility">
+<h2>Categories and Visibility<a class="headerlink" 
href="#categories-and-visibility" title="Link to this heading">#</a></h2>
 <p>Every <code class="docutils literal notranslate"><span 
class="pre">ConfigEntry</span></code> must call <code class="docutils literal 
notranslate"><span class="pre">.category(...)</span></code>. The category is 
used to route the key into
 the right table in the user guide’s <code class="docutils literal 
notranslate"><span class="pre">configs.md</span></code>. Available categories 
are declared as
 <code class="docutils literal notranslate"><span 
class="pre">CATEGORY_*</span></code> constants at the top of <code 
class="docutils literal notranslate"><span 
class="pre">CometConf.scala</span></code>. If a new config does not fit an
 existing category, discuss adding a new one before landing the config.</p>
+<p>A second, independent choice is whether to call <code class="docutils 
literal notranslate"><span class="pre">.internal()</span></code>, which keeps 
the key out of
+<code class="docutils literal notranslate"><span 
class="pre">configs.md</span></code> altogether.</p>
+<p>Neither choice is cosmetic. Together they decide whether Comet’s
+<a class="reference internal" href="../about/versioning_policy.html"><span 
class="std std-doc">versioning policy</span></a> covers the key. The policy’s 
rule keys on these
+two marks and nothing else: a key is exempt only if it is in the <code 
class="docutils literal notranslate"><span class="pre">testing</span></code> 
category or is marked
+<code class="docutils literal notranslate"><span 
class="pre">internal()</span></code>, and every other <code class="docutils 
literal notranslate"><span class="pre">spark.comet.*</span></code> key is 
covered.</p>
+<div class="pst-scrollable-table-container"><table class="table">
+<thead>
+<tr class="row-odd"><th class="head"><p>Category</p></th>
+<th class="head"><p><code class="docutils literal notranslate"><span 
class="pre">internal()</span></code></p></th>
+<th class="head"><p>Appears in <code class="docutils literal 
notranslate"><span class="pre">configs.md</span></code></p></th>
+<th class="head"><p>Covered by the versioning policy</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>any other</p></td>
+<td><p>no</p></td>
+<td><p>yes, in its category’s table</p></td>
+<td><p><strong>yes</strong></p></td>
+</tr>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span 
class="pre">testing</span></code></p></td>
+<td><p>no</p></td>
+<td><p>yes, under Development &amp; Testing</p></td>
+<td><p>no</p></td>
+</tr>
+<tr class="row-even"><td><p>any</p></td>
+<td><p>yes</p></td>
+<td><p>no</p></td>
+<td><p>no</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<p>Note that a key read by string rather than through a registered <code 
class="docutils literal notranslate"><span 
class="pre">ConfigEntry</span></code> — as the
+per-expression <code class="docutils literal notranslate"><span 
class="pre">spark.comet.expression.&lt;Name&gt;.allowIncompatible</span></code> 
opt-ins are — has no way to carry
+either mark, so it is covered. Reaching for a dynamic key is therefore not a 
way to avoid the
+guarantee; if the key is a debugging aid, give it a real <code class="docutils 
literal notranslate"><span class="pre">ConfigEntry</span></code> in the <code 
class="docutils literal notranslate"><span class="pre">testing</span></code> 
category.</p>
+<p>Being covered commits the project to the key’s name, type, accepted values, 
default, and semantics
+across minor releases. Being
+<a class="reference internal" 
href="../about/versioning_policy.html#testing-and-internal-configurations-are-exempt"><span
 class="std std-ref">exempt</span></a> means the key
+may be renamed, retyped, redefaulted, or removed in any release, including a 
patch release, with no
+alias, no deprecation cycle, and no upgrade guide entry.</p>
+<p>So reach for <code class="docutils literal notranslate"><span 
class="pre">testing</span></code> or <code class="docutils literal 
notranslate"><span class="pre">internal()</span></code> only when the key 
exists to let Comet’s own suites, or
+someone debugging Comet itself, reach a state the rest of the code is not 
built to support —
+disabling native scans, running in on-heap mode, making a declined operator 
throw. Use <code class="docutils literal notranslate"><span 
class="pre">internal()</span></code>
+in particular when Comet should not publish the key at all, so that nobody can 
adopt it in the first
+place.</p>
+<p>If a deployment would have a legitimate reason to set the key, it belongs 
in a non-<code class="docutils literal notranslate"><span 
class="pre">testing</span></code>
+category and must not be <code class="docutils literal notranslate"><span 
class="pre">internal()</span></code>, and the guarantees come with it. Do not 
use either mechanism
+as a way to ship a production knob without committing to it.</p>
 </section>
 <section id="renaming-an-existing-config">
 <h2>Renaming an Existing Config<a class="headerlink" 
href="#renaming-an-existing-config" title="Link to this heading">#</a></h2>
 <p>Configs under <code class="docutils literal notranslate"><span 
class="pre">spark.comet.*</span></code> are stable across minor releases: users 
may have set them in
 production <code class="docutils literal notranslate"><span 
class="pre">spark-defaults.conf</span></code> files, Spark job submissions, or 
notebooks. Renaming a key
 must not silently break those deployments.</p>
+<p>Keys in the <code class="docutils literal notranslate"><span 
class="pre">testing</span></code> category, and keys marked <code 
class="docutils literal notranslate"><span 
class="pre">internal()</span></code>, are
+<a class="reference internal" 
href="../about/versioning_policy.html#testing-and-internal-configurations-are-exempt"><span
 class="std std-ref">exempt from the versioning policy</span></a>
+and may be renamed outright: skip the <code class="docutils literal 
notranslate"><span class="pre">withAlternative</span></code> call in step 1, 
and step 5 with it. The
+rest of the checklist still applies, because a stale key string left behind in 
code or docs is a
+bug either way.</p>
 <p>Use the <code class="docutils literal notranslate"><span 
class="pre">withAlternative</span></code> builder on <code class="docutils 
literal notranslate"><span class="pre">ConfigBuilder</span></code> to keep the 
old key working as a
 deprecated alias:</p>
 <div class="highlight-scala notranslate"><div 
class="highlight"><pre><span></span><span class="kd">val</span><span class="w"> 
</span><span class="nc">COMET_FORCE_SHJ</span><span class="p">:</span><span 
class="w"> </span><span class="nc">ConfigEntry</span><span 
class="p">[</span><span class="nc">Boolean</span><span class="p">]</span><span 
class="w"> </span><span class="o">=</span>
@@ -690,6 +745,10 @@ config only if the fix has an unusually wide blast radius, 
and say so in the PR
 <li><p><strong>Changes to which expressions and operators run 
natively.</strong> Falling back to Spark, or ceasing
 to, changes performance rather than results.</p></li>
 </ul>
+<p>Nor does a change to a key in the <code class="docutils literal 
notranslate"><span class="pre">testing</span></code> category or a key marked 
<code class="docutils literal notranslate"><span 
class="pre">internal()</span></code>, both
+<a class="reference internal" 
href="../about/versioning_policy.html#testing-and-internal-configurations-are-exempt"><span
 class="std std-ref">exempt from the versioning policy</span></a>:
+the default and the meaning may change in any release, with no legacy config 
and no upgrade guide
+entry. Update the suites that set it in the same PR.</p>
 <p>Removing a legacy config is a major-release change, handled the same way as 
removing a deprecated
 alias.</p>
 </section>
@@ -744,7 +803,7 @@ alias.</p>
     <ul class="visible nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" 
href="#key-naming">Key Naming</a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" 
href="#symbol-naming-scala">Symbol Naming (Scala)</a></li>
-<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" 
href="#categories">Categories</a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" 
href="#categories-and-visibility">Categories and Visibility</a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" 
href="#renaming-an-existing-config">Renaming an Existing Config</a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" 
href="#changing-the-behavior-of-an-existing-config">Changing the Behavior of an 
Existing Config</a></li>
 </ul>
diff --git a/contributor-guide/development.html 
b/contributor-guide/development.html
index dfddd8569a..e4200f0e7b 100644
--- a/contributor-guide/development.html
+++ b/contributor-guide/development.html
@@ -1085,6 +1085,11 @@ It is possible to debug both native and JVM code 
concurrently as described in th
 </section>
 <section id="submitting-a-pull-request">
 <h2>Submitting a Pull Request<a class="headerlink" 
href="#submitting-a-pull-request" title="Link to this heading">#</a></h2>
+<p>Use <code class="docutils literal notranslate"><span class="pre">git</span> 
<span class="pre">push</span></code> for normal updates to your PR branch. If 
you need to force push after a rebase
+or amend, use <code class="docutils literal notranslate"><span 
class="pre">git</span> <span class="pre">push</span> <span 
class="pre">--force-with-lease</span></code> instead of <code class="docutils 
literal notranslate"><span class="pre">git</span> <span class="pre">push</span> 
<span class="pre">--force</span></code> (or <code class="docutils literal 
notranslate"><span class="pre">-f</span></code>). This reduces
+the risk of accidentally overwriting another maintainer’s commits when 
multiple people push
+to the same PR branch. If the lease check rejects the push, inspect and 
integrate the remote
+changes before retrying; do not switch to <code class="docutils literal 
notranslate"><span class="pre">--force</span></code> to bypass the check.</p>
 <p>Before submitting a pull request, follow this checklist to ensure your 
changes are ready:</p>
 <section id="format-your-code">
 <h3>1. Format Your Code<a class="headerlink" href="#format-your-code" 
title="Link to this heading">#</a></h3>
diff --git a/searchindex.js b/searchindex.js
index 911d28dca5..419e14a3dd 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles": {"!": [[56, "id1"]], "%": [[54, "id1"]], "&": 
[[44, "id1"]], "*": [[54, "id2"]], "+": [[54, "id3"]], "-": [[54, "id4"]], "/": 
[[54, "id5"]], "1. Format Your Code": [[41, "format-your-code"]], "1. Install 
Comet": [[62, "install-comet"], [73, "install-comet"]], "1. Native Operators 
(nativeExecs map)": [[28, "native-operators-nativeexecs-map"]], "2. Build and 
Verify": [[41, "build-and-verify"]], "2. Clone Iceberg and Apply Diff": [[62, 
"clone-iceberg-and-apply- [...]
\ No newline at end of file
+Search.setIndex({"alltitles": {"!": [[56, "id1"]], "%": [[54, "id1"]], "&": 
[[44, "id1"]], "*": [[54, "id2"]], "+": [[54, "id3"]], "-": [[54, "id4"]], "/": 
[[54, "id5"]], "1. Format Your Code": [[41, "format-your-code"]], "1. Install 
Comet": [[62, "install-comet"], [73, "install-comet"]], "1. Native Operators 
(nativeExecs map)": [[28, "native-operators-nativeexecs-map"]], "2. Build and 
Verify": [[41, "build-and-verify"]], "2. Clone Iceberg and Apply Diff": [[62, 
"clone-iceberg-and-apply- [...]
\ No newline at end of file
diff --git a/user-guide/latest/configs.html b/user-guide/latest/configs.html
index c87f847ad2..1a8bde40c4 100644
--- a/user-guide/latest/configs.html
+++ b/user-guide/latest/configs.html
@@ -1153,6 +1153,17 @@ shuffle, including applications that rely only on remote 
reliable storage or dec
 </section>
 <section id="development-testing-settings">
 <h2>Development &amp; Testing Settings<a class="headerlink" 
href="#development-testing-settings" title="Link to this heading">#</a></h2>
+<p>These settings exist for Comet’s own test suites and for debugging. They 
are <strong>not covered by the
+<a class="reference internal" 
href="../../about/versioning_policy.html#testing-and-internal-configurations-are-exempt"><span
 class="std std-ref">versioning policy</span></a></strong>:
+their names, defaults, accepted values, and meanings may change in any 
release, including a patch
+release, and any of them may be removed without a deprecation cycle. Do not 
set them in
+production.</p>
+<p>Comet also marks a handful of keys internal and deliberately leaves them 
off this page entirely.
+They are maintainer escape hatches, not settings, and carry no guarantee of 
any kind. Absence from
+this page does not by itself mean that, though: the per-expression
+<code class="docutils literal notranslate"><span 
class="pre">spark.comet.expression.&lt;Name&gt;.allowIncompatible</span></code> 
opt-ins are documented in the
+<a class="reference internal" href="compatibility/index.html"><span class="std 
std-doc">compatibility guide</span></a> rather than here, and the versioning 
policy covers
+them like any other production setting.</p>
 <!--BEGIN:CONFIG_TABLE[testing]-->
 <!-- prettier-ignore-start -->
 <div class="pst-scrollable-table-container"><table class="table">
diff --git a/user-guide/latest/tuning.html b/user-guide/latest/tuning.html
index a85734b8e6..83f91ddf3e 100644
--- a/user-guide/latest/tuning.html
+++ b/user-guide/latest/tuning.html
@@ -1086,6 +1086,13 @@ direct-column <code class="docutils literal 
notranslate"><span class="pre">IS</s
 projects the file schema. The original null checks and residual runtime filter 
remain in place.
 The original join still verifies matches, including any hash collisions 
admitted by the filter.
 Standalone projections, other filter expressions, and limits prevent reader 
attachment.</p>
+<p>To preserve schema-conversion and timestamp-overflow errors, runtime reader 
pruning is disabled for
+each file whose projected or statically filtered columns require schema 
adaptations beyond direct
+column mappings or literal values. This conservative check also disables 
reader pruning for allowed
+<code class="docutils literal notranslate"><span 
class="pre">INT32</span></code> to <code class="docutils literal 
notranslate"><span class="pre">BIGINT</span></code> promotion and for 
projecting a subset of a struct’s fields, even when those
+adaptations cannot fail. Nested column pruning still reads only the requested 
struct fields. Scans
+with supplied file statistics also skip reader attachment. These cases still 
use runtime filtering
+on decoded batches.</p>
 <p>Filters stay within the task’s native plan and do not propagate across 
Spark exchanges or JVM/Arrow
 boundaries. A shuffled hash join can still filter probe batches after shuffle, 
but it cannot send
 its filter back to an earlier scan stage. Compare the <a class="reference 
internal" href="metrics.html#hash-joins"><span class="std 
std-ref">runtime-filter and scan metrics</span></a>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to