# Changelog

## Score

- CAI 69 → 70 (+1.0)
- Rubric changed (rubric-2026.09.9 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 82 → 82 (-0.0)
- Architecture 97 → 96 (-1.4)
- Maturity 76 → 78 (+2.2)
- Readiness 93 → 75 (-18.5)
- Security 59 → 62 (+3.5)
- Accessibility 72 → 75 (+2.8)
- Performance 82 (new)

## Resolved (152)

- BitmapIndexPlugin::streaming_build_and_write (cognitive 16) (rust/lance-index/src/scalar/bitmap.rs)
- Change coupling: feature_flags.rs ↔ transaction.rs (rust/lance-table/src/feature_flags.rs)
- ClassTooLong: BitmapIndexPlugin (rust/lance-index/src/scalar/bitmap.rs)
- ComplexAllNullScheduler::initialize (cognitive 16) (rust/lance-encoding/src/encodings/logical/primitive.rs)
- Dataset::open_vector_index (cognitive 17) (rust/lance/src/index.rs)
- Dataset::open_vector_index (cyclomatic 20) (rust/lance/src/index.rs)
- Duplicated block (10 lines × 2) (rust/lance-index/src/vector/v3/shuffler.rs)
- Duplicated block (10 lines × 2) (rust/lance-linalg/src/simd/f32.rs)
- Duplicated block (10 lines × 2) (rust/lance/src/dataset/mem_wal/scanner/planner.rs)
- Duplicated block (10 lines × 3) (rust/lance-encoding/src/decoder.rs)
- Duplicated block (11 lines × 2) (rust/lance-index/src/scalar/bloomfilter.rs)
- Duplicated block (11 lines × 2) (rust/lance/src/dataset/mem_wal/memtable/scanner/builder.rs)
- Duplicated block (11 lines × 2) (rust/lance/src/dataset/mem_wal/scanner/point_lookup.rs)
- Duplicated block (11 lines × 2) (rust/lance/src/dataset/scanner.rs)
- Duplicated block (11 lines × 3) (rust/lance-linalg/src/distance/cosine.rs)
- Duplicated block (12 lines × 2) (rust/lance-linalg/src/simd/f32.rs)
- Duplicated block (12 lines × 2) (rust/lance/src/dataset/mem_wal/scanner/planner.rs)
- Duplicated block (12 lines × 4) (rust/lance/src/dataset/fragment.rs)
- Duplicated block (12 lines × 4) (rust/lance/src/io/commit/conflict_resolver.rs)
- Duplicated block (12–13 lines × 2) (rust/lance/src/dataset/write/merge_insert.rs)
- …and 132 more

## New (330)

- Ambiguous distinction between `update_columns` and `update_columns_with_offsets`. Without documentation, it is unclear if the latter is a performance optimization, a different join strategy, or a bug-prone variant. They appear to do the same high-level operation (updating columns via join) but with a signature difference that isn't self-explanatory.
- ClassTooLong: CompoundQueryExec (rust/lance/src/io/exec/fts.rs)
- ClassTooLong: InvertedIndexParams (rust/lance-index/src/scalar/inverted/tokenizer.rs)
- ClassTooLong: LsmFtsSearchPlanner (rust/lance/src/dataset/mem_wal/scanner/fts_search.rs)
- ClassTooLong: Manifest (rust/lance-table/src/format/manifest.rs)
- ClassTooLong: MinHashLshIndex (rust/lance-index/src/scalar/minhash_lsh/index.rs)
- ClassTooLong: U64Segment (rust/lance-table/src/rowids/segment.rs)
- Critical CVE: [GHSA redacted] (java/pom.xml)
- Dataset::open_vector_index_from_metadata (cognitive 20) (rust/lance/src/index.rs)
- Dataset::open_vector_index_from_metadata (cyclomatic 22) (rust/lance/src/index.rs)
- Documentation: no project overview (rust/arrow-stats/README.md)
- Duplicated block (10 lines × 2) (java/src/main/java/org/lance/fragment/RowIdMeta.java)
- Duplicated block (10 lines × 2) (rust/lance-index/src/scalar/inverted.rs)
- Duplicated block (10 lines × 2) (rust/lance-index/src/scalar/label_list.rs)
- Duplicated block (10 lines × 2) (rust/lance-index/src/vector/bq/pairwise.rs)
- Duplicated block (10 lines × 2) (rust/lance-linalg/src/simd/f32.rs)
- Duplicated block (10 lines × 2) (rust/lance-table/src/transaction/manifest_build.rs)
- Duplicated block (10 lines × 2) (rust/lance/src/index/frag_reuse.rs)
- Duplicated block (10 lines × 3) (rust/lance-encoding/src/decoder.rs)
- Duplicated block (10–11 lines × 2) (java/src/main/java/org/lance/OpenDatasetBuilder.java)
- …and 310 more

## Changes since last survey

- 204 commits — 131 feature/other, 73 fixes

## By area

- rust/lance — 70 commits
- rust/lance-index — 29 commits
- (root) — 22 commits
- python/python — 17 commits
- rust/lance-table — 12 commits
- rust/lance-encoding — 11 commits
- docs/src — 10 commits
- rust/lance-linalg — 9 commits
- rust/lance-io — 5 commits
- .github/workflows — 4 commits
- java/src — 4 commits
- rust/lance-namespace-impls — 3 commits
- rust/lance-core — 2 commits
- rust/lance-datafusion — 2 commits
- benchmarks/auto-ivf-dot — 1 commit
- java/lance-jni — 1 commit
- java/pom.xml — 1 commit
- test_data/v8.0.0 — 1 commit

## Notable commits

- fix: fix!: derive merge_columns field ids from the dataset manifest (#9547)
- fix: fix(core): parse fixed-offset timezones in timestamp logical types (#8950)
- fix: fix(datafusion): coerce numeric literals to and from Float16 (#8847)
- fix: fix(datafusion): report the scan range in scan statistics (#9411)
- fix: fix(datafusion): size the memory pool by the effective partition count (#9183)
- fix: fix(dataset): correct BlobFile seek semantics (#9358)
- fix: fix(dataset): fix open branch URI with tag to non-latest version (#9227)
- fix: fix(dataset): handle lance dataset blobs on deep clone (#9185)
- fix: fix(dataset): keep carried index bases through chained shallow clones (#9176)
- fix: fix(dataset): reject a zero add_columns batch size instead of panicking (#9233)
- fix: fix(dataset): reuse the prefetch window in BlobFile::read (#9330)
- fix: fix(dataset): stop the fragment-reuse index blocking row id migration (#9099)
- fix: fix(deps): update rustls for RUSTSEC-2026-0285 (#9212)
- fix: fix(encoding): derive full-zip max_visible_def like the writer (#9254)
- fix: fix(encoding): emit NIL control words when rep/def levels are non-empty but zero-width (#9018)
- fix: fix(encoding): preserve special slots when recording validity (#9268)
- fix: fix(encoding): skip full-width block bitpacking (#9598)
- fix: fix(encoding): split legacy decode batches before i32 offset overflow (#9225)
- fix: fix(exec): preserve exact KNN ordering through late materialization (#9469)
- fix: fix(format): move FLAG_UNKNOWN off the tagged FRI bit (#9420)
- …and 184 more
